diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..f39b26725 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +[*.cs] +indent_style = space +indent_size = 4 diff --git a/SixLabors.Primitives.ruleset b/SixLabors.Primitives.ruleset new file mode 100644 index 000000000..4106b892c --- /dev/null +++ b/SixLabors.Primitives.ruleset @@ -0,0 +1,6 @@ + + + + + + diff --git a/SixLabors.Primitives.sln b/SixLabors.Primitives.sln new file mode 100644 index 000000000..1d728f98c --- /dev/null +++ b/SixLabors.Primitives.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + appveyor.yml = appveyor.yml + build.cmd = build.cmd + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A07-F879-4811-9C41-5CBDC6BAFDB7}" + ProjectSection(SolutionItems) = preProject + src\Shared\AssemblyInfo.Common.cs = src\Shared\AssemblyInfo.Common.cs + src\Shared\stylecop.json = src\Shared\stylecop.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.Build.0 = Release|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.Build.0 = Release|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.Build.0 = Release|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {999EDFB3-9FE4-4E09-B669-CB02E597EC20} = {9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D} + {87E262FA-57FE-4AA7-853C-9DD91E769D4B} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {32D7A12E-B392-42CE-8EFB-1B685680F5B8} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + EndGlobalSection + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection +EndGlobal diff --git a/SixLabors.Primitives.sln.DotSettings b/SixLabors.Primitives.sln.DotSettings new file mode 100644 index 000000000..613ba3882 --- /dev/null +++ b/SixLabors.Primitives.sln.DotSettings @@ -0,0 +1,5 @@ + + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..e534e5855 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,31 @@ +version: 0.0.{build} +image: Visual Studio 2017 + +install: + - choco install gitversion.portable -pre -y + +before_build: + - cmd: dotnet --version + - ps: gitversion /l console /output buildserver + +build_script: + - cmd: build.cmd + - cmd: tests\CodeCoverage\CodeCoverage.cmd + +after_build: + - cmd: appveyor PushArtifact "artifacts\SixLabors.Primitives.%GitVersion_NuGetVersion%.nupkg" + +deploy: + - provider: NuGet + server: https://www.myget.org/F/sixlabors/api/v2/package + symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package + api_key: + secure: SyrSERGrjkK21TSCsHtqke5279SMxXCg2NXKjR2qaErP0khEplwxPwE8Ch5bxzyf + artifact: /.*\.nupkg/ + on: + branch: master + +# prevent the double build when a branch has an active PR +skip_branch_with_pr: true + +test: off diff --git a/build.cmd b/build.cmd new file mode 100644 index 000000000..727bdf880 --- /dev/null +++ b/build.cmd @@ -0,0 +1,38 @@ +@echo Off + +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet restore /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet restore +) + +ECHO Building nuget packages +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet build -c Release +) +if not "%errorlevel%"=="0" goto failure + +dotnet test ./tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj + + +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build +) + +if not "%errorlevel%"=="0" goto failure + +:success +ECHO successfully built project +REM exit 0 +goto end + +:failure +ECHO failed to build. +REM exit -1 +goto end + +:end \ No newline at end of file diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..cadf5c5da --- /dev/null +++ b/codecov.yml @@ -0,0 +1,21 @@ +codecov: + notify: + require_ci_to_pass: true +comment: off +coverage: + precision: 2 + range: + - 70.0 + - 100.0 + round: down + status: + changes: false + patch: true + project: true +parsers: + gcov: + branch_detection: + conditional: true + loop: true + macro: false + method: false \ No newline at end of file diff --git a/gitversion.yml b/gitversion.yml new file mode 100644 index 000000000..e07c90f0d --- /dev/null +++ b/gitversion.yml @@ -0,0 +1,13 @@ +# to create a new package you create a new release/tag +# in github appveyor will build it without the -cixxx tag +# it will then be deployable cleanly to nuget.org + +branches: + master: + tag: ci + mode: ContinuousDeployment + increment: Minor + prevent-increment-of-merged-branch-version: false + track-merge-target: true +ignore: + sha: [] \ No newline at end of file diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs new file mode 100644 index 000000000..081b01994 --- /dev/null +++ b/src/Shared/AssemblyInfo.Common.cs @@ -0,0 +1,38 @@ +// +// Copyright (c) Scott Williams and contributors. +// Licensed under the Apache License, Version 2.0. +// + +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; + +// 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: AssemblyDescription("A cross-platform library for processing of image files; written in C#")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Scott Williams")] +[assembly: AssemblyProduct("SixLabors.Shapes")] +[assembly: AssemblyCopyright("Copyright (c) Scott Williams and contributors.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +// 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")] +[assembly: AssemblyInformationalVersion("1.0.0.0")] + +// Ensure the internals can be tested. +[assembly: InternalsVisibleTo("SixLabors.Shapes.Tests")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Benchmarks")] diff --git a/src/Shared/stylecop.json b/src/Shared/stylecop.json new file mode 100644 index 000000000..df3c8c9d8 --- /dev/null +++ b/src/Shared/stylecop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Scott Williams", + "copyrightText": "Copyright (c) Scott Williams and contributors.\nLicensed under the Apache License, Version 2.0." + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Constants.cs b/src/SixLabors.Primitives/Constants.cs new file mode 100644 index 000000000..44f68f898 --- /dev/null +++ b/src/SixLabors.Primitives/Constants.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + /// + /// Common constants used throughout the project + /// + internal static class Constants + { + /// + /// The epsilon for comparing floating point numbers. + /// + public static readonly float Epsilon = 0.001f; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs new file mode 100644 index 000000000..d5611bb23 --- /dev/null +++ b/src/SixLabors.Primitives/Ellipse.cs @@ -0,0 +1,183 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + + /// + /// Represents an ellipse. + /// + public struct Ellipse : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Ellipse Empty = default(Ellipse); + + /// + /// The center point. + /// + private Point center; + + /// + /// Initializes a new instance of the struct. + /// + /// The center point. + /// The x-radius. + /// The y-radius. + public Ellipse(Point center, float radiusX, float radiusY) + { + this.center = center; + this.RadiusX = radiusX; + this.RadiusY = radiusY; + } + + /// + /// Gets the x-radius of this . + /// + public float RadiusX { get; } + + /// + /// Gets the y-radius of this . + /// + public float RadiusY { get; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + public static bool operator ==(Ellipse left, Ellipse right) + { + return left.Equals(right); + } + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + public static bool operator !=(Ellipse left, Ellipse right) + { + return !left.Equals(right); + } + + /// + /// Returns the center point of the given + /// + /// The ellipse + /// + public static Vector2 Center(Ellipse ellipse) + { + return new Vector2(ellipse.center.X, ellipse.center.Y); + } + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + public bool Contains(int x, int y) + { + if (this.RadiusX <= 0 || this.RadiusY <= 0) + { + return false; + } + + // TODO: SIMD? + // This is a more general form of the circle equation + // X^2/a^2 + Y^2/b^2 <= 1 + Point normalized = new Point(x - this.center.X, y - this.center.Y); + int nX = normalized.X; + int nY = normalized.Y; + + return ((double)(nX * nX) / (this.RadiusX * this.RadiusX)) + + ((double)(nY * nY) / (this.RadiusY * this.RadiusY)) + <= 1.0; + } + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Ellipse [ Empty ]"; + } + + return + $"Ellipse [ RadiusX={this.RadiusX}, RadiusY={this.RadiusX}, Centre={this.center.X},{this.center.Y} ]"; + } + + /// + public override bool Equals(object obj) + { + if (obj is Ellipse) + { + return this.Equals((Ellipse)obj); + } + + return false; + } + + /// + public bool Equals(Ellipse other) + { + return this.center.Equals(other.center) + && this.RadiusX.Equals(other.RadiusX) + && this.RadiusY.Equals(other.RadiusY); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(Ellipse ellipse) + { + unchecked + { + int hashCode = ellipse.center.GetHashCode(); + hashCode = (hashCode * 397) ^ ellipse.RadiusX.GetHashCode(); + hashCode = (hashCode * 397) ^ ellipse.RadiusY.GetHashCode(); + return hashCode; + } + } + } +} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs new file mode 100644 index 000000000..d33484338 --- /dev/null +++ b/src/SixLabors.Primitives/LongRational.cs @@ -0,0 +1,355 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + using System.Text; + + /// + /// Represents a number that can be expressed as a fraction + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + internal struct LongRational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// + /// The number above the line in a vulgar fraction showing how many of the parts + /// indicated by the denominator are taken. + /// + /// + /// The number below the line in a vulgar fraction; a divisor. + /// + public LongRational(long numerator, long denominator) + : this(numerator, denominator, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The number above the line in a vulgar fraction showing how many of the parts + /// indicated by the denominator are taken. + /// + /// + /// The number below the line in a vulgar fraction; a divisor. + /// + /// + /// Whether to attempt to simplify the fractional parts. + /// + public LongRational(long numerator, long denominator, bool simplify) + : this() + { + this.Numerator = numerator; + this.Denominator = denominator; + + if (simplify) + { + this.Simplify(); + } + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public LongRational(double value, bool bestPrecision) + : this() + { + if (double.IsNaN(value)) + { + this.Numerator = this.Denominator = 0; + return; + } + + if (double.IsPositiveInfinity(value)) + { + this.Numerator = 1; + this.Denominator = 0; + return; + } + + if (double.IsNegativeInfinity(value)) + { + this.Numerator = -1; + this.Denominator = 0; + return; + } + + this.Numerator = 1; + this.Denominator = 1; + + double val = Math.Abs(value); + double df = this.Numerator / (double)this.Denominator; + double epsilon = bestPrecision ? double.Epsilon : .000001; + + while (Math.Abs(df - val) > epsilon) + { + if (df < val) + { + this.Numerator++; + } + else + { + this.Denominator++; + this.Numerator = (int)(val * this.Denominator); + } + + df = this.Numerator / (double)this.Denominator; + } + + if (value < 0.0) + { + this.Numerator *= -1; + } + + this.Simplify(); + } + + /// + /// Gets the numerator of a number. + /// + public long Numerator + { + get; + private set; + } + + /// + /// Gets the denominator of a number. + /// + public long Denominator + { + get; + private set; + } + + /// + /// Gets a value indicating whether this instance is indeterminate. + /// + public bool IsIndeterminate + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == 0; + } + } + + /// + /// Gets a value indicating whether this instance is an integer (n, 1) + /// + public bool IsInteger => this.Denominator == 1; + + /// + /// Gets a value indicating whether this instance is equal to negative infinity (-1, 0) + /// + public bool IsNegativeInfinity + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == -1; + } + } + + /// + /// Gets a value indicating whether this instance is equal to positive infinity (1, 0) + /// + public bool IsPositiveInfinity + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == 1; + } + } + + /// + /// Gets a value indicating whether this instance is equal to 0 (0, 1) + /// + public bool IsZero + { + get + { + if (this.Denominator != 1) + { + return false; + } + + return this.Numerator == 0; + } + } + + /// + public bool Equals(LongRational other) + { + if (this.Denominator == other.Denominator) + { + return this.Numerator == other.Numerator; + } + + if (this.Numerator == 0 && this.Denominator == 0) + { + return other.Numerator == 0 && other.Denominator == 0; + } + + if (other.Numerator == 0 && other.Denominator == 0) + { + return this.Numerator == 0 && this.Denominator == 0; + } + + return (this.Numerator * other.Denominator) == (this.Denominator * other.Numerator); + } + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + if (this.IsIndeterminate) + { + return "[ Indeterminate ]"; + } + + if (this.IsPositiveInfinity) + { + return "[ PositiveInfinity ]"; + } + + if (this.IsNegativeInfinity) + { + return "[ NegativeInfinity ]"; + } + + if (this.IsZero) + { + return "0"; + } + + if (this.IsInteger) + { + return this.Numerator.ToString(provider); + } + + StringBuilder sb = new StringBuilder(); + sb.Append(this.Numerator.ToString(provider)); + sb.Append("/"); + sb.Append(this.Denominator.ToString(provider)); + return sb.ToString(); + } + + /// + /// Finds the greatest common divisor of two values. + /// + /// The first value + /// The second value + /// The + private static long GreatestCommonDivisor(long left, long right) + { + return right == 0 ? left : GreatestCommonDivisor(right, left % right); + } + + /// + /// Simplifies the + /// + private void Simplify() + { + if (this.IsIndeterminate) + { + return; + } + + if (this.IsNegativeInfinity) + { + return; + } + + if (this.IsPositiveInfinity) + { + return; + } + + if (this.IsInteger) + { + return; + } + + if (this.IsZero) + { + return; + } + + if (this.Numerator == 0) + { + this.Denominator = 0; + return; + } + + if (this.Numerator == this.Denominator) + { + this.Numerator = 1; + this.Denominator = 1; + } + + long gcd = GreatestCommonDivisor(Math.Abs(this.Numerator), Math.Abs(this.Denominator)); + if (gcd > 1) + { + this.Numerator = this.Numerator / gcd; + this.Denominator = this.Denominator / gcd; + } + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(LongRational rational) + { + return ((rational.Numerator * 397) ^ rational.Denominator).GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Primitives/MathF.cs new file mode 100644 index 000000000..a15b7fb20 --- /dev/null +++ b/src/SixLabors.Primitives/MathF.cs @@ -0,0 +1,293 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Runtime.CompilerServices; + + /// + /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. + /// + // ReSharper disable InconsistentNaming + internal static class MathF + { + /// + /// Represents the ratio of the circumference of a circle to its diameter, specified by the constant, π. + /// + public const float PI = (float)Math.PI; + + /// + /// Returns the absolute value of a single-precision floating-point number. + /// + /// + /// A number that is greater than or equal to , but less than or equal to . + /// + /// + /// A single-precision floating-point number, x, such that 0 ≤ x ≤. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Abs(float f) + { + return Math.Abs(f); + } + + /// + /// Returns the angle whose tangent is the quotient of two specified numbers. + /// + /// The y coordinate of a point. + /// The x coordinate of a point. + /// + /// An angle, θ, measured in radians, such that -π≤θ≤π, and tan(θ) = y / x, where + /// (x, y) is a point in the Cartesian plane. Observe the following: For (x, y) in + /// quadrant 1, 0 < θ < π/2.For (x, y) in quadrant 2, π/2 < θ≤π.For (x, y) in quadrant + /// 3, -π < θ < -π/2.For (x, y) in quadrant 4, -π/2 < θ < 0.For points on the boundaries + /// of the quadrants, the return value is the following:If y is 0 and x is not negative, + /// θ = 0.If y is 0 and x is negative, θ = π.If y is positive and x is 0, θ = π/2.If + /// y is negative and x is 0, θ = -π/2.If y is 0 and x is 0, θ = 0. If x or y is + /// , or if x and y are either or + /// , the method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Atan2(float y, float x) + { + return (float)Math.Atan2(y, x); + } + + /// + /// Returns the smallest integral value that is greater than or equal to the specified single-precision floating-point number. + /// + /// A single-precision floating-point number. + /// + /// The smallest integral value that is greater than or equal to . + /// If is equal to , , + /// or , that value is returned. + /// Note that this method returns a instead of an integral type. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Ceiling(float f) + { + return (float)Math.Ceiling(f); + } + + /// + /// Returns the cosine of the specified angle. + /// + /// An angle, measured in radians. + /// + /// The cosine of . If is equal to , , + /// or , this method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Cos(float f) + { + return (float)Math.Cos(f); + } + + /// + /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + /// + /// The angle in degrees. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DegreeToRadian(float degree) + { + return degree * (PI / 180F); + } + + /// + /// Returns e raised to the specified power. + /// + /// A number specifying a power. + /// + /// The number e raised to the power . + /// If equals or , that value is returned. + /// If equals , 0 is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Exp(float f) + { + return (float)Math.Exp(f); + } + + /// + /// Returns the largest integer less than or equal to the specified single-precision floating-point number. + /// + /// A single-precision floating-point number. + /// + /// The largest integer less than or equal to . + /// If is equal to , , + /// or , that value is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Floor(float f) + { + return (float)Math.Floor(f); + } + + /// + /// Returns the larger of two single-precision floating-point numbers. + /// + /// The first of two single-precision floating-point numbers to compare. + /// The second of two single-precision floating-point numbers to compare. + /// + /// Parameter or , whichever is larger. + /// If , or , or both and are + /// equal to , is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Max(float val1, float val2) + { + return Math.Max(val1, val2); + } + + /// + /// Returns the smaller of two single-precision floating-point numbers. + /// + /// The first of two single-precision floating-point numbers to compare. + /// The second of two single-precision floating-point numbers to compare. + /// + /// Parameter or , whichever is smaller. + /// If , , or both and are equal + /// to , is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Min(float val1, float val2) + { + return Math.Min(val1, val2); + } + + /// + /// Returns a specified number raised to the specified power. + /// + /// A single-precision floating-point number to be raised to a power. + /// A single-precision floating-point number that specifies a power. + /// The number raised to the power . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Pow(float x, float y) + { + return (float)Math.Pow(x, y); + } + + /// + /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + /// + /// The angle in radians. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float RadianToDegree(float radian) + { + return radian / (PI / 180F); + } + + /// + /// Rounds a single-precision floating-point value to the nearest integral value. + /// + /// A single-precision floating-point number to be rounded. + /// + /// The integer nearest . + /// If the fractional component of is halfway between two integers, one of which is even and the other odd, then the even number is returned. + /// Note that this method returns a instead of an integral type. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Round(float f) + { + return (float)Math.Round(f); + } + + /// + /// Rounds a single-precision floating-point value to the nearest integer. + /// A parameter specifies how to round the value if it is midway between two numbers. + /// + /// A single-precision floating-point number to be rounded. + /// Specification for how to round if it is midway between two other numbers. + /// + /// The integer nearest . If is halfway between two integers, one of which is even + /// and the other odd, then determines which of the two is returned. + /// Note that this method returns a instead of an integral type. + /// + /// + /// is not a valid value of . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Round(float f, MidpointRounding mode) + { + return (float)Math.Round(f, mode); + } + + /// + /// Returns the sine of the specified angle. + /// + /// An angle, measured in radians. + /// + /// The sine of . + /// If is equal to , , + /// or , this method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sin(float f) + { + return (float)Math.Sin(f); + } + + /// + /// Returns the result of a normalized sine cardinal function for the given value. + /// SinC(x) = sin(pi*x)/(pi*x). + /// + /// A single-precision floating-point number to calculate the result for. + /// + /// The sine cardinal of . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float SinC(float f) + { + if (Abs(f) > Constants.Epsilon) + { + f *= PI; + return Clean(Sin(f) / f); + } + + return 1F; + } + + /// + /// Returns the square root of a specified number. + /// + /// The number whose square root is to be found. + /// + /// One of the values in the following table. + /// parameter Return value Zero or positive The positive square root of . + /// Negative Equals + /// Equals + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sqrt(float f) + { + return (float)Math.Sqrt(f); + } + + /// + /// Ensures that any passed float is correctly rounded to zero + /// + /// The value to clean. + /// + /// The + /// . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static float Clean(float x) + { + if (Abs(x) < Constants.Epsilon) + { + return 0F; + } + + return x; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs new file mode 100644 index 000000000..6da436cfb --- /dev/null +++ b/src/SixLabors.Primitives/Matrix.cs @@ -0,0 +1,360 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// A Matrix object for applying matrix transforms to primitives. + /// + public struct Matrix : IEquatable + { + private Matrix3x2 backingMatrix; + + private static readonly Matrix _identity = new Matrix + { + backingMatrix = Matrix3x2.Identity + }; + + /// + /// Returns the multiplicative identity matrix. + /// + public static Matrix Identity => _identity; + + /// + /// Returns whether the matrix is the identity matrix. + /// + public bool IsIdentity => this.backingMatrix.IsIdentity; + + /// + /// Gets or sets the translation component of this matrix. + /// + public Vector2 Translation => this.backingMatrix.Translation; + + /// + /// Constructs a Matrix3x2 from the given components. + /// + public Matrix(float m11, float m12, + float m21, float m22, + float m31, float m32) + { + this.backingMatrix = new Matrix3x2(m11, m12, m21, m22, m31, m32); + } + + /// + /// Creates a translation matrix from the given vector. + /// + /// The translation position. + /// A translation matrix. + public static Matrix CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); + + /// + /// Creates a translation matrix from the given X and Y components. + /// + /// The X position. + /// The Y position. + /// A translation matrix. + public static Matrix CreateTranslation(float xPosition, float yPosition) => Matrix3x2.CreateTranslation(xPosition, yPosition); + + /// + /// Creates a scale matrix from the given X and Y components. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// A scaling matrix. + public static Matrix CreateScale(float xScale, float yScale) => Matrix3x2.CreateScale(xScale, yScale); + + /// + /// Creates a scale matrix that is offset by a given center point. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// The center point. + /// A scaling matrix. + public static Matrix CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); + + /// + /// Creates a scale matrix from the given vector scale. + /// + /// The scale to use. + /// A scaling matrix. + public static Matrix CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); + + /// + /// Creates a scale matrix from the given vector scale with an offset from the given center point. + /// + /// The scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); + + /// + /// Creates a scale matrix that scales uniformly with the given scale. + /// + /// The uniform scale to use. + /// A scaling matrix. + public static Matrix CreateScale(float scale) => Matrix3x2.CreateScale(scale); + + /// + /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. + /// + /// The uniform scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// A skew matrix. + public static Matrix CreateSkew(float radiansX, float radiansY) => Matrix3x2.CreateSkew(radiansX, radiansY); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// A skew matrix. + public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY)); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// The center point. + /// A skew matrix. + public static Matrix CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// The center point. + /// A skew matrix. + public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY), centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in radians. + /// A rotation matrix. + public static Matrix CreateRotation(float radians) => System.Numerics.Matrix3x2.CreateRotation(radians); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in degrees. + /// A rotation matrix. + public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees)); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in radians. + /// The center point. + /// A rotation matrix. + public static Matrix CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in degrees. + /// The center point. + /// A rotation matrix. + public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees), centerPoint); + + /// + /// Calculates the determinant for this matrix. + /// The determinant is calculated by expanding the matrix with a third column whose values are (0,0,1). + /// + /// The determinant. + public float GetDeterminant() => this.backingMatrix.GetDeterminant(); + + /// + /// Attempts to invert the given matrix. If the operation succeeds, the inverted matrix is stored in the result parameter. + /// + /// The source matrix. + /// The output matrix. + /// True if the operation succeeded, False otherwise. + public static bool Invert(Matrix matrix, out Matrix result) + { + Matrix3x2 m; + var b = System.Numerics.Matrix3x2.Invert(matrix.backingMatrix, out m); + result = m; + return b; + } + + /// + /// Linearly interpolates from matrix1 to matrix2, based on the third parameter. + /// + /// The first source matrix. + /// The second source matrix. + /// The relative weighting of matrix2. + /// The interpolated matrix. + public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount) => Matrix3x2.Lerp(matrix1.backingMatrix, matrix2.backingMatrix, amount); + + /// + /// Negates the given matrix by multiplying all values by -1. + /// + /// The source matrix. + /// The negated matrix. + public static Matrix Negate(Matrix value) => -value.backingMatrix; + + /// + /// Adds each matrix element in value1 with its corresponding element in value2. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the summed values. + public static Matrix Add(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; + + /// + /// Subtracts each matrix element in value2 from its corresponding element in value1. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the resulting values. + public static Matrix Subtract(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; + + /// + /// Multiplies two matrices together and returns the resulting matrix. + /// + /// The first source matrix. + /// The second source matrix. + /// The product matrix. + public static Matrix Multiply(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; + + /// + /// Scales all elements in a matrix by the given scalar factor. + /// + /// The source matrix. + /// The scaling value to use. + /// The resulting matrix. + public static Matrix Multiply(Matrix value1, float value2) => value1.backingMatrix * value2; + + /// + /// Negates the given matrix by multiplying all values by -1. + /// + /// The source matrix. + /// The negated matrix. + public static Matrix operator -(Matrix value) => -value.backingMatrix; + + /// + /// Adds each matrix element in value1 with its corresponding element in value2. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the summed values. + public static Matrix operator +(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; + + /// + /// Subtracts each matrix element in value2 from its corresponding element in value1. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the resulting values. + public static Matrix operator -(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; + + /// + /// Multiplies two matrices together and returns the resulting matrix. + /// + /// The first source matrix. + /// The second source matrix. + /// The product matrix. + public static Matrix operator *(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; + + /// + /// Scales all elements in a matrix by the given scalar factor. + /// + /// The source matrix. + /// The scaling value to use. + /// The resulting matrix. + public static Matrix operator *(Matrix value1, float value2) => value1.backingMatrix * value2; + + /// + /// Returns a boolean indicating whether the given matrices are equal. + /// + /// The first source matrix. + /// The second source matrix. + /// True if the matrices are equal; False otherwise. + public static bool operator ==(Matrix value1, Matrix value2) => value1.backingMatrix == value2.backingMatrix; + + /// + /// Returns a boolean indicating whether the given matrices are not equal. + /// + /// The first source matrix. + /// The second source matrix. + /// True if the matrices are not equal; False if they are equal. + public static bool operator !=(Matrix value1, Matrix value2) + { + return value1.backingMatrix != value2.backingMatrix; + + } + + /// + /// Returns a boolean indicating whether the matrix is equal to the other given matrix. + /// + /// The other matrix to test equality against. + /// True if this matrix is equal to other; False otherwise. + public bool Equals(Matrix other) + { + return this.backingMatrix == other.backingMatrix; + } + + /// + /// Returns a boolean indicating whether the given Object is equal to this matrix instance. + /// + /// The Object to compare against. + /// True if the Object is equal to this matrix; False otherwise. + public override bool Equals(object obj) + { + if (obj is Matrix) + { + return Equals((Matrix)obj); + } + + return false; + } + + /// + /// Returns a String representing this matrix instance. + /// + /// The string representation. + public override string ToString() => this.backingMatrix.ToString(); + + /// + /// Returns the hash code for this instance. + /// + /// The hash code. + public override int GetHashCode() => this.backingMatrix.GetHashCode(); + + /// + /// Creates a with the values of the specified . + /// + /// The matrix. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Matrix3x2(Matrix matrix) => matrix.backingMatrix; + + /// + /// Creates a with the values of the specified . + /// + /// The matrix. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; + } +} diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs new file mode 100644 index 000000000..243cb8eb3 --- /dev/null +++ b/src/SixLabors.Primitives/Point.cs @@ -0,0 +1,257 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Represents an ordered pair of integer x- and y-coordinates that defines a point in + /// a two-dimensional plane. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Point : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Point Empty = default(Point); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal and vertical position of the point. + public Point(int value) + : this() + { + this.X = LowInt16(value); + this.Y = HighInt16(value); + } + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the point. + /// The vertical position of the point. + public Point(int x, int y) + : this() + { + this.X = x; + this.Y = y; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The size + public Point(Size size) + { + this.X = size.Width; + this.Y = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public int X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public int Y { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator PointF(Point point) => new PointF(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(Point point) => new Vector2(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Size(Point point) => new Size(point.X, point.Y); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point operator +(Point point, Size size) => Add(point, size); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point operator -(Point point, Size size) => Subtract(point, size); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Point left, Point right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Point left, Point right) => !left.Equals(right); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Subtract(Point point, Size size) => new Point(unchecked(point.X - size.Width), unchecked(point.Y - size.Height)); + + /// + /// Converts a to a by performing a ceiling operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Ceiling(PointF point) => new Point(unchecked((int)MathF.Ceiling(point.X)), unchecked((int)MathF.Ceiling(point.Y))); + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); + + /// + /// Converts a to a by performing a truncate operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The vector + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); + + /// + /// Rotates a point around the given rotation matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + + /// + /// Skews a point using the given skew matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + + /// + /// Translates this by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(int dx, int dy) + { + unchecked + { + this.X += dx; + this.Y += dy; + } + } + + /// + /// Translates this by the specified amount. + /// + /// The used offset this . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(Point point) => this.Offset(point.X, point.Y); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Point [ Empty ]"; + } + + return $"Point [ X={this.X}, Y={this.Y} ]"; + } + + /// + public override bool Equals(object obj) => obj is Point && this.Equals((Point)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Point other) => this.X == other.X && this.Y == other.Y; + + private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); + + private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); + + private int GetHashCode(Point point) => point.X ^ point.Y; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs new file mode 100644 index 000000000..a49a1996b --- /dev/null +++ b/src/SixLabors.Primitives/PointF.cs @@ -0,0 +1,233 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in + /// a two-dimensional plane. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct PointF : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly PointF Empty = default(PointF); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the point. + /// The vertical position of the point. + public PointF(float x, float y) + : this() + { + this.X = x; + this.Y = y; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The size + public PointF(SizeF size) + { + this.X = size.Width; + this.Y = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public float X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public float Y { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The vector. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator PointF(Vector2 vector) => new PointF(vector.X, vector.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(PointF point) => new Vector2(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified by truncating each of the coordinates. + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Point(PointF point) => Point.Truncate(point); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator +(PointF point, SizeF size) => Add(point, size); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(PointF left, PointF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(PointF left, PointF right) => !left.Equals(right); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); + + /// + /// Rotates a point around the given rotation matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Rotate(PointF point, Matrix rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); + + /// + /// Skews a point using the given skew matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Skew(PointF point, Matrix skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + + /// + /// Translates this by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(float dx, float dy) + { + this.X += dx; + this.Y += dy; + } + + /// + /// Translates this by the specified amount. + /// + /// The used offset this . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(PointF point) => this.Offset(point.X, point.Y); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "PointF [ Empty ]"; + } + + return $"PointF [ X={this.X}, Y={this.Y} ]"; + } + + /// + public override bool Equals(object obj) => obj is PointF && this.Equals((PointF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(PointF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(PointF point) => point.X.GetHashCode() ^ point.Y.GetHashCode(); + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rational.cs b/src/SixLabors.Primitives/Rational.cs new file mode 100644 index 000000000..3d7003b4e --- /dev/null +++ b/src/SixLabors.Primitives/Rational.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + + /// + /// Represents a number that can be expressed as a fraction. + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + public struct Rational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// The to create the rational from. + public Rational(uint value) + : this(value, 1) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + public Rational(uint numerator, uint denominator) + : this(numerator, denominator, true) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + /// Specified if the rational should be simplified. + public Rational(uint numerator, uint denominator, bool simplify) + { + LongRational rational = new LongRational(numerator, denominator, simplify); + + this.Numerator = (uint)rational.Numerator; + this.Denominator = (uint)rational.Denominator; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + public Rational(double value) + : this(value, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public Rational(double value, bool bestPrecision) + { + LongRational rational = new LongRational(Math.Abs(value), bestPrecision); + + this.Numerator = (uint)rational.Numerator; + this.Denominator = (uint)rational.Denominator; + } + + /// + /// Gets the numerator of a number. + /// + public uint Numerator { get; } + + /// + /// Gets the denominator of a number. + /// + public uint Denominator { get; } + + /// + /// Determines whether the specified instances are considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator ==(Rational left, Rational right) + { + return Rational.Equals(left, right); + } + + /// + /// Determines whether the specified instances are not considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator !=(Rational left, Rational right) + { + return !Rational.Equals(left, right); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// + /// The . + /// + public static Rational FromDouble(double value) + { + return new Rational(value, false); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// Whether to use the best possible precision when parsing the value. + /// + /// The . + /// + public static Rational FromDouble(double value, bool bestPrecision) + { + return new Rational(value, bestPrecision); + } + + /// + public override bool Equals(object obj) + { + if (obj is Rational) + { + return this.Equals((Rational)obj); + } + + return false; + } + + /// + public bool Equals(Rational other) + { + LongRational left = new LongRational(this.Numerator, this.Denominator); + LongRational right = new LongRational(other.Numerator, other.Denominator); + + return left.Equals(right); + } + + /// + public override int GetHashCode() + { + LongRational self = new LongRational(this.Numerator, this.Denominator); + return self.GetHashCode(); + } + + /// + /// Converts a rational number to the nearest . + /// + /// + /// The . + /// + public double ToDouble() + { + return this.Numerator / (double)this.Denominator; + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + LongRational rational = new LongRational(this.Numerator, this.Denominator); + return rational.ToString(provider); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs new file mode 100644 index 000000000..9c9a0599e --- /dev/null +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -0,0 +1,467 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores a set of four integers that represent the location and size of a rectangle. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Rectangle : IEquatable + { + /// + /// Represents a that has X, Y, Width, and Height values set to zero. + /// + public static readonly Rectangle Empty = default(Rectangle); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the rectangle. + /// The vertical position of the rectangle. + /// The width of the rectangle. + /// The height of the rectangle. + public Rectangle(int x, int y, int width, int height) + { + this.X = x; + this.Y = y; + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The which specifies the rectangles point in a two-dimensional plane. + /// + /// + /// The which specifies the rectangles height and width. + /// + public Rectangle(Point point, Size size) + { + this.X = point.X; + this.Y = point.Y; + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public int X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public int Y { get; set; } + + /// + /// Gets or sets the width of this . + /// + public int Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public int Height { get; set; } + + /// + /// Gets or sets the coordinates of the upper-left corner of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Point Location + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Point(this.X, this.Y); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.X = value.X; + this.Y = value.Y; + } + } + + /// + /// Gets or sets the size of this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Size Size + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Size(this.Width, this.Height); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Gets the y-coordinate of the top edge of this . + /// + public int Top + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y; + } + } + + /// + /// Gets the x-coordinate of the right edge of this . + /// + public int Right + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return unchecked(this.X + this.Width); + } + } + + /// + /// Gets the y-coordinate of the bottom edge of this . + /// + public int Bottom + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return unchecked(this.Y + this.Height); + } + } + + /// + /// Gets the x-coordinate of the left edge of this . + /// + public int Left + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X; + } + } + + /// + /// Creates a with the coordinates of the specified . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator RectangleF(Rectangle rectangle) => new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector4(Rectangle rectangle) => new Vector4(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Rectangle left, Rectangle right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Rectangle left, Rectangle right) => !left.Equals(right); + + /// + /// Creates a new with the specified location and size. + /// The left coordinate of the rectangle + /// The top coordinate of the rectangle + /// The right coordinate of the rectangle + /// The bottom coordinate of the rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + + // ReSharper disable once InconsistentNaming + public static Rectangle FromLTRB(int left, int top, int right, int bottom) => new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); + + /// + /// Returns the center point of the given + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Center(Rectangle rectangle) => new Point(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); + + /// + /// Creates a rectangle that represents the intersection between and + /// . If there is no intersection, an empty rectangle is returned. + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Intersect(Rectangle a, Rectangle b) + { + int x1 = Math.Max(a.X, b.X); + int x2 = Math.Min(a.Right, b.Right); + int y1 = Math.Max(a.Y, b.Y); + int y2 = Math.Min(a.Bottom, b.Bottom); + + if (x2 >= x1 && y2 >= y1) + { + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + return Empty; + } + + /// + /// Creates a that is inflated by the specified amount. + /// + /// The rectangle + /// The amount to inflate the width by + /// The amount to inflate the height by + /// A new + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Inflate(Rectangle rectangle, int x, int y) + { + Rectangle r = rectangle; + r.Inflate(x, y); + return r; + } + + /// + /// Converts a to a by performing a ceiling operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Ceiling(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)MathF.Ceiling(rectangle.X), + (int)MathF.Ceiling(rectangle.Y), + (int)MathF.Ceiling(rectangle.Width), + (int)MathF.Ceiling(rectangle.Height)); + } + } + + /// + /// Converts a to a by performing a truncate operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Truncate(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)rectangle.X, + (int)rectangle.Y, + (int)rectangle.Width, + (int)rectangle.Height); + } + } + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Round(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)MathF.Round(rectangle.X), + (int)MathF.Round(rectangle.Y), + (int)MathF.Round(rectangle.Width), + (int)MathF.Round(rectangle.Height)); + } + } + + /// + /// Creates a rectangle that represents the union between and . + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Union(Rectangle a, Rectangle b) + { + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.Right, b.Right); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Bottom, b.Bottom); + + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + /// + /// Creates a Rectangle that represents the intersection between this Rectangle and the . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Intersect(Rectangle rectangle) + { + Rectangle result = Intersect(rectangle, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The width + /// The height + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(int width, int height) + { + unchecked + { + this.X -= width; + this.Y -= height; + + this.Width += 2 * width; + this.Height += 2 * height; + } + } + + /// + /// Inflates this by the specified amount. + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(Size size) => this.Inflate(size.Width, size.Height); + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(int x, int y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; + + /// + /// Determines if the specified point is contained within the rectangular region defined by this . + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(Point point) => this.Contains(point.X, point.Y); + + /// + /// Determines if the rectangular region represented by is entirely contained + /// within the rectangular region represented by this . + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(Rectangle rectangle) => + (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && + (this.Y <= rectangle.Y) && (rectangle.Bottom <= this.Bottom); + + /// + /// Determines if the specfied intersects the rectangular region defined by + /// this . + /// + /// The other Rectange + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IntersectsWith(Rectangle rectangle) => + (rectangle.X < this.Right) && (this.X < rectangle.Right) && + (rectangle.Y < this.Bottom) && (this.Y < rectangle.Bottom); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(Point point) => this.Offset(point.X, point.Y); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(int dx, int dy) + { + unchecked + { + this.X += dx; + this.Y += dy; + } + } + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Rectangle [ Empty ]"; + } + + return $"Rectangle [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is Rectangle && this.Equals((Rectangle)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; + + private int GetHashCode(Rectangle rectangle) + { + unchecked + { + int hashCode = rectangle.X; + hashCode = (hashCode * 397) ^ rectangle.Y; + hashCode = (hashCode * 397) ^ rectangle.Width; + hashCode = (hashCode * 397) ^ rectangle.Height; + return hashCode; + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs new file mode 100644 index 000000000..c7d8b0ebb --- /dev/null +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -0,0 +1,400 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores a set of four single precision floating points that represent the location and size of a rectangle. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct RectangleF : IEquatable + { + /// + /// Represents a that has X, Y, Width, and Height values set to zero. + /// + public static readonly RectangleF Empty = default(RectangleF); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the rectangle. + /// The vertical position of the rectangle. + /// The width of the rectangle. + /// The height of the rectangle. + public RectangleF(float x, float y, float width, float height) + { + this.X = x; + this.Y = y; + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The which specifies the rectangles point in a two-dimensional plane. + /// + /// + /// The which specifies the rectangles height and width. + /// + public RectangleF(PointF point, SizeF size) + { + this.X = point.X; + this.Y = point.Y; + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public float X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public float Y { get; set; } + + /// + /// Gets or sets the width of this . + /// + public float Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public float Height { get; set; } + + /// + /// Gets or sets the coordinates of the upper-left corner of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public PointF Location + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new PointF(this.X, this.Y); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.X = value.X; + this.Y = value.Y; + } + } + + /// + /// Gets or sets the size of this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public SizeF Size + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new SizeF(this.Width, this.Height); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => (this.Width <= 0) || (this.Height <= 0); + + /// + /// Gets the y-coordinate of the top edge of this . + /// + public float Top + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y; + } + } + + /// + /// Gets the x-coordinate of the right edge of this . + /// + public float Right + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X + this.Width; + } + } + + /// + /// Gets the y-coordinate of the bottom edge of this . + /// + public float Bottom + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y + this.Height; + } + } + + /// + /// Gets the x-coordinate of the left edge of this . + /// + public float Left + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X; + } + } + + /// + /// Creates a with the coordinates of the specified by truncating each coordinate. + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Rectangle(RectangleF rectangle) => Rectangle.Truncate(rectangle); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(RectangleF left, RectangleF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(RectangleF left, RectangleF right) => !left.Equals(right); + + /// + /// Creates a new with the specified location and size. + /// The left coordinate of the rectangle + /// The top coordinate of the rectangle + /// The right coordinate of the rectangle + /// The bottom coordinate of the rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + + // ReSharper disable once InconsistentNaming + public static RectangleF FromLTRB(float left, float top, float right, float bottom) => new RectangleF(left, top, right - left, bottom - top); + + /// + /// Returns the center point of the given + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Center(RectangleF rectangle) => new PointF(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); + + /// + /// Creates a rectangle that represents the intersection between and + /// . If there is no intersection, an empty rectangle is returned. + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Intersect(RectangleF a, RectangleF b) + { + float x1 = MathF.Max(a.X, b.X); + float x2 = MathF.Min(a.Right, b.Right); + float y1 = MathF.Max(a.Y, b.Y); + float y2 = MathF.Min(a.Bottom, b.Bottom); + + if (x2 >= x1 && y2 >= y1) + { + return new RectangleF(x1, y1, x2 - x1, y2 - y1); + } + + return Empty; + } + + /// + /// Creates a that is inflated by the specified amount. + /// + /// The rectangle + /// The amount to inflate the width by + /// The amount to inflate the height by + /// A new + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Inflate(RectangleF rectangle, float x, float y) + { + RectangleF r = rectangle; + r.Inflate(x, y); + return r; + } + + /// + /// Creates a rectangle that represents the union between and . + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Union(RectangleF a, RectangleF b) + { + float x1 = MathF.Min(a.X, b.X); + float x2 = MathF.Max(a.Right, b.Right); + float y1 = MathF.Min(a.Y, b.Y); + float y2 = MathF.Max(a.Bottom, b.Bottom); + + return new RectangleF(x1, y1, x2 - x1, y2 - y1); + } + + /// + /// Creates a RectangleF that represents the intersection between this RectangleF and the . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Intersect(RectangleF rectangle) + { + RectangleF result = Intersect(rectangle, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The width + /// The height + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(float width, float height) + { + this.X -= width; + this.Y -= height; + + this.Width += 2 * width; + this.Height += 2 * height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(SizeF size) => this.Inflate(size.Width, size.Height); + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(float x, float y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; + + /// + /// Determines if the specified point is contained within the rectangular region defined by this . + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(PointF point) => this.Contains(point.X, point.Y); + + /// + /// Determines if the rectangular region represented by is entirely contained + /// within the rectangular region represented by this . + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(RectangleF rectangle) => + (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && + (this.Y <= rectangle.Y) && (rectangle.Bottom <= this.Bottom); + + /// + /// Determines if the specfied intersects the rectangular region defined by + /// this . + /// + /// The other Rectange + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IntersectsWith(RectangleF rectangle) => + (rectangle.X < this.Right) && (this.X < rectangle.Right) && + (rectangle.Y < this.Bottom) && (this.Y < rectangle.Bottom); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(PointF point) => this.Offset(point.X, point.Y); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(float dx, float dy) + { + this.X += dx; + this.Y += dy; + } + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "RectangleF [ Empty ]"; + } + + return $"RectangleF [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is RectangleF && this.Equals((RectangleF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + + private int GetHashCode(RectangleF rectangle) + { + unchecked + { + int hashCode = rectangle.X.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Y.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Width.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Height.GetHashCode(); + return hashCode; + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SignedRational.cs b/src/SixLabors.Primitives/SignedRational.cs new file mode 100644 index 000000000..07fd105da --- /dev/null +++ b/src/SixLabors.Primitives/SignedRational.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + + /// + /// Represents a number that can be expressed as a fraction. + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + public struct SignedRational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// The to create the rational from. + public SignedRational(int value) + : this(value, 1) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + public SignedRational(int numerator, int denominator) + : this(numerator, denominator, true) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + /// Specified if the rational should be simplified. + public SignedRational(int numerator, int denominator, bool simplify) + { + LongRational rational = new LongRational(numerator, denominator, simplify); + + this.Numerator = (int)rational.Numerator; + this.Denominator = (int)rational.Denominator; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + public SignedRational(double value) + : this(value, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public SignedRational(double value, bool bestPrecision) + { + LongRational rational = new LongRational(value, bestPrecision); + + this.Numerator = (int)rational.Numerator; + this.Denominator = (int)rational.Denominator; + } + + /// + /// Gets the numerator of a number. + /// + public int Numerator { get; } + + /// + /// Gets the denominator of a number. + /// + public int Denominator { get; } + + /// + /// Determines whether the specified instances are considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator ==(SignedRational left, SignedRational right) + { + return SignedRational.Equals(left, right); + } + + /// + /// Determines whether the specified instances are not considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator !=(SignedRational left, SignedRational right) + { + return !SignedRational.Equals(left, right); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// + /// The . + /// + public static SignedRational FromDouble(double value) + { + return new SignedRational(value, false); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// Whether to use the best possible precision when parsing the value. + /// + /// The . + /// + public static SignedRational FromDouble(double value, bool bestPrecision) + { + return new SignedRational(value, bestPrecision); + } + + /// + public override bool Equals(object obj) + { + if (obj is SignedRational) + { + return this.Equals((SignedRational)obj); + } + + return false; + } + + /// + public bool Equals(SignedRational other) + { + LongRational left = new LongRational(this.Numerator, this.Denominator); + LongRational right = new LongRational(other.Numerator, other.Denominator); + + return left.Equals(right); + } + + /// + public override int GetHashCode() + { + LongRational self = new LongRational(this.Numerator, this.Denominator); + return self.GetHashCode(); + } + + /// + /// Converts a rational number to the nearest . + /// + /// + /// The . + /// + public double ToDouble() + { + return this.Numerator / (double)this.Denominator; + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + LongRational rational = new LongRational(this.Numerator, this.Denominator); + return rational.ToString(provider); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SixLabors.Primitives.csproj b/src/SixLabors.Primitives/SixLabors.Primitives.csproj new file mode 100644 index 000000000..3a1265cff --- /dev/null +++ b/src/SixLabors.Primitives/SixLabors.Primitives.csproj @@ -0,0 +1,40 @@ + + + + Low level primitives for use across Six Labors projects.. + SixLabors.Primitives + $(packageversion) + 0.1.0-alpha1 + Six Labors + netstandard1.1 + true + true + SixLabors.Primitives + SixLabors.Primitives + rectangle;point;size,primitives + https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://github.com/SixLabors/Primitives + http://www.apache.org/licenses/LICENSE-2.0 + git + https://github.com/SixLabors/Primitives + false + false + false + false + false + false + false + false + false + full + + + + + + + + + + + \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs new file mode 100644 index 000000000..1605232b1 --- /dev/null +++ b/src/SixLabors.Primitives/Size.cs @@ -0,0 +1,225 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Runtime.CompilerServices; + + /// + /// Stores an ordered pair of integers, which specify a height and width. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Size : IEquatable + { + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly Size Empty = default(Size); + + /// + /// Initializes a new instance of the struct. + /// + /// The width and height of the size + public Size(int value) + : this() + { + this.Width = value; + this.Height = value; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The width of the size. + /// The height of the size. + public Size(int width, int height) + { + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The size + public Size(Size size) + : this() + { + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The point + public Size(Point point) + { + this.Width = point.X; + this.Height = point.Y; + } + + /// + /// Gets or sets the width of this . + /// + public int Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public int Height { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the dimensions of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator SizeF(Size size) => new SizeF(size.Width, size.Height); + + /// + /// Converts the given into a . + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Point(Size size) => new Point(size.Width, size.Height); + + /// + /// Computes the sum of adding two sizes. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size operator +(Size left, Size right) => Add(left, right); + + /// + /// Computes the difference left by subtracting one size from another. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size operator -(Size left, Size right) => Subtract(left, right); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Size left, Size right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Size left, Size right) => !left.Equals(right); + + /// + /// Performs vector addition of two objects. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Add(Size left, Size right) => new Size(unchecked(left.Width + right.Width), unchecked(left.Height + right.Height)); + + /// + /// Contracts a by another + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); + + /// + /// Converts a to a by performing a ceiling operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Ceiling(SizeF size) => new Size(unchecked((int)MathF.Ceiling(size.Width)), unchecked((int)MathF.Ceiling(size.Height))); + + /// + /// Converts a to a by performing a round operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); + + /// + /// Converts a to a by performing a round operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Size [ Empty ]"; + } + + return $"Size [ Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(Size size) => size.Width ^ size.Height; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs new file mode 100644 index 000000000..a11d2e443 --- /dev/null +++ b/src/SixLabors.Primitives/SizeF.cs @@ -0,0 +1,190 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores an ordered pair of single precision floating points, which specify a height and width. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct SizeF : IEquatable + { + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly SizeF Empty = default(SizeF); + + /// + /// Initializes a new instance of the struct. + /// + /// The width of the size. + /// The height of the size. + public SizeF(float width, float height) + { + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The size + public SizeF(SizeF size) + : this() + { + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The point + public SizeF(PointF point) + { + this.Width = point.X; + this.Height = point.Y; + } + + /// + /// Gets or sets the width of this . + /// + public float Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public float Height { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the dimensions of the specified by truncating each of the dimensions. + /// + /// The size. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Size(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + + /// + /// Converts the given into a . + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator PointF(SizeF size) => new PointF(size.Width, size.Height); + + /// + /// Computes the sum of adding two sizes. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF operator +(SizeF left, SizeF right) => Add(left, right); + + /// + /// Computes the difference left by subtracting one size from another. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); + + /// + /// Compares two objects for equality. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(SizeF left, SizeF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(SizeF left, SizeF right) => !left.Equals(right); + + /// + /// Performs vector addition of two objects. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF Add(SizeF left, SizeF right) => new SizeF(left.Width + right.Width, left.Height + right.Height); + + /// + /// Contracts a by another + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "SizeF [ Empty ]"; + } + + return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is SizeF && this.Equals((SizeF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + + private int GetHashCode(SizeF size) => size.Width.GetHashCode() ^ size.Height.GetHashCode(); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/stylecop.json b/src/SixLabors.Primitives/stylecop.json new file mode 100644 index 000000000..de88a8bfe --- /dev/null +++ b/src/SixLabors.Primitives/stylecop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Six Labors", + "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." + } + } +} \ No newline at end of file diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd new file mode 100644 index 000000000..498e55b36 --- /dev/null +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -0,0 +1,21 @@ +@echo off + +cd tests\CodeCoverage + +nuget restore packages.config -PackagesDirectory . + +cd .. +cd .. + +dotnet restore SixLabors.Primitives.sln +dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true + +rem The -threshold options prevents this taking ages... +rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Shapes.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Shapes.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" + +if %errorlevel% neq 0 exit /b %errorlevel% + +SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% +pip install codecov +codecov -f "SixLabors.Primitives.Coverage.xml" \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf new file mode 100644 index 000000000..0916f4d61 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf @@ -0,0 +1,166 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f387\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp +\f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive +\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}} +{\*\rsidtbl \rsid11275983\rsid14818796\rsid15367925\rsid16724145}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun} +{\creatim\yr2012\mo1\dy5\hr7\min52}{\revtim\yr2012\mo2\dy21\hr8\min10}{\version3}{\edmins2}{\nofpages1}{\nofwords157}{\nofchars900}{\*\company Microsoft}{\nofcharsws1055}{\vern49273}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale60\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot15367925\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14818796 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Copyright (c) 2011}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16724145 -2012}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Shaun Wilde +\par Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is fu +rnished to do so, subject to the following conditions: +\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +\par THE SOFTWARE IS 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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11275983 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000e00b +b50e14f0cc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll new file mode 100644 index 000000000..4e5b94aaf Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets new file mode 100644 index 000000000..caf2b79ba --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets @@ -0,0 +1,10 @@ + + + + + $(MSBuildExtensionsPath32)\OpenCover + $(OpenCoverMSBuildTasksPath)\OpenCover.MSBuild.dll + + + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config new file mode 100644 index 000000000..cfe9c46fb --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj new file mode 100644 index 000000000..400bb251a --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} + Library + Properties + Bom + Bom + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs new file mode 100644 index 000000000..ad91490d3 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Bom +{ + public class BomManager + { + public int MethodToTest(IEnumerable collection) + { + return (collection ?? new int[0]).Sum(); + } + } +} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..cc769d0e4 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/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("Bom")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Bom")] +[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("2b4e3956-c04a-42f8-a367-87bc16ffa08d")] + +// 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/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln new file mode 100644 index 000000000..f5edc5b2d --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bom", "Bom\Bom.csproj", "{0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BomTest", "BomTest\BomTest.csproj", "{E25E828A-5D71-4E95-AEBC-7AD21315DFEC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{A3CD3B1D-4C14-4A8C-A57F-A265BC49FB29}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.Build.0 = Release|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs new file mode 100644 index 000000000..486e2b389 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Bom; +using NUnit.Framework; + +namespace BomTest +{ + [TestFixture] + public class BomManagerTests + { + [Test] + public void Sum_Is_Zero_When_No_Entries() + { + var bomManager = new BomManager(); + Assert.AreEqual(0, bomManager.MethodToTest(new Collection())); + } + + [Test] + [TestCase(new[] { 0 }, 0)] + [TestCase(new[] { 1 }, 1)] + [TestCase(new[] { 1, 2, 3 }, 6)] + public void Sum_Is_Calculated_Correctly_When_Entries_Supplied(int[] data, int expected) + { + var bomManager = new BomManager(); + Assert.AreEqual(expected, bomManager.MethodToTest(new Collection(data))); + } + + [Test] + public void Sum_Is_Zero_When_Null_Collection() + { + var bomManager = new BomManager(); + Assert.AreEqual(0, bomManager.MethodToTest(null)); + } + } +} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj new file mode 100644 index 000000000..4942e9f28 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC} + Library + Properties + BomTest + BomTest + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} + Bom + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..60d4b26d9 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/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("BomTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BomTest")] +[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("688e9792-727d-4e39-a0ae-93461aa13b49")] + +// 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/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config new file mode 100644 index 000000000..c714ef3a2 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat new file mode 100644 index 000000000..02415f7e3 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat @@ -0,0 +1,5 @@ +.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user "-filter:+[Bom]* -[*Test]*" "-target:.\packages\NUnit.Runners.2.6.4\tools\nunit-console-x86.exe" "-targetargs:/noshadow .\BomTest\bin\Debug\BomTest.dll" + +.\packages\ReportGenerator.2.1.8.0\tools\ReportGenerator.exe "-reports:results.xml" "-targetdir:.\coverage" + +pause \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt new file mode 100644 index 000000000..cc71c4a16 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt @@ -0,0 +1,137 @@ +Version 4.6.519 +#528 -safemode:on to address incomplete coverage due to thread based buffers (feature) +#521 add exclude paths (feature) +#376 protect buffer allocation in multithreaded environment (fix) +#335 allow short wait timeout to be configured (feature) +#310 improved reporting - hide branches due to iterators (feature) +#352 improved reporting - hide branches due to async (feature) +#363 calculate npath comlexity (feature) +#282 exclude by process (feature) +#246 auto crash reports (feature) +#329 address ArgumentOutOfRangeException (potentially related to #274) (fix for VS2015) +#335 error on unrecognized arguments/prefixes (fix) +#328 exclude types when declaredtype is excluded (fix-feature) +#302 ignore branches in known autogenerated sequences (feature) + +Version 4.6.166 +#323 push releases and candidates to github via appveyor (prj-mgmt) +#315 update nuget package (fix for VS2015) +#320 update packages (fix for VS2015) +#304 add switch to control timeout wait (feature) +#307 add -version to args (feature) +#305 add corclr_profiler_path support (feature) +#303 support for test cases and theories during track by test (feature) +#295 exclude assembly by attribute (feature) +#288 report (to console) if can't ready body of method (diag) +#287 fix crash (fix) +#283 Add visited class/method to summary entity (feature) +#274 Use thread based buffers for performance improvement (fix) + +Version 4.5.3723 +#244 support ApplicationUnderTest.Launch to propagate required OPENCOVER environment variables (feature) +#256 support Microsoft Fakes (feature) - beta support until we bed feature in (feature) +#248 address issue with Mono.Cecil and latest PDB (.NET 4.6) version (fix) +#252 use AppVeyor for building code and pull requests (prj-mgmt) + +Version 4.5.3522 +#243 null reference exception when excluding branch point in using finally block (fix) + +Version 4.5.3427 +#234 improved IIS support (fix) +#237 handle multiple files for a method e.g. during code contract re-writes (fix) +#228 add MDB support (feature) +#226 remove branch points on methods without sequence points (fix) +#225 Enable filters to use regular expressions (feature) +#218 Auto tag release notes (prj-mgmt) +#116 output results to accumulate with previous coverage file activate by -mergeoutput (feature) + +Version 4.5.3207 +#209 The number of WaitHandles must be less than or equal to 64 (fix) +#208 Line Number for Branch Points (feature) +#207 "using" statement causes incorrect Branch Coverage (fix) +#201 NETWORK SERVICE support (feature) + +Version 4.5.2506 +#188 Bring back COR_PRF_DISABLE_ALL_NGEN_IMAGES +#190 Compiler generated "Empty" Branch Points feature high close on next release +#191 SequencePoint FileID [CodeContractClass/For] + +Version 4.5.2316 +#170 - Overflow fixed +#188 - re-introduced COR_PRF_DISABLE_ALL_NGEN_IMAGES +#174 / #176 - pass arguments as multiple variable + +Version 4.5.1923 +#168 - skip auto implemented properties +#164 - allow registryless loading +#163 - improved error messages + +Version 4.5.1604 +#156 - prepend targetdir when applying test strategies (silverlight) + +Version 4.5.1528 +#158 - fix app domain crash due to timeout of proxy + +Version 4.5.1403 +#154 - Add xUnit to the list of supported strategies for the Cover by Test feature +#150 - fix for Xslt issue +Build Environment now uses BDD tests to ensure the packages have all assemblies required to run + +Version 4.5.1314 +#148 - Fix issue with nuget and zip packages and missing Autofac assembly. + +Version 4.5.1313 +#118 - Fix communication issue between profiler and host when many processes are vying for the channel + - improved thread management + - only check if method needs tracing if coverbytest option is utilised + +Version 4.5.1310 +#128 - Add threshold limits (optional commandline) to reduce reporting of visits +#135 - Add performance counters (admin privileges required) around the memory processing queues + +Version 4.5.1302 +Update version number to reflect 4.5 support +Fix bug in summaries + +Version 4.0.1229 +Supports .NET 4.5 (not windows store apps) +#120 - Built in Summary Reports - useful for build systems + +Version 4.0.1128 +#125 - Hide compiler generated method when no source remains after skipping +#107 - fix 'sporadic' crash when dealing with Generic methods. + +Version 4.0.1118 +#137 - Fix instrumentation issue when dealing with typed clauses +#107 - fix 'sporadic' crash when dealing with Generic methods. + +Version 4.0.1107 +#133 - Remove skipped File/Module/Class/Methods from report +#130 - Support for 'returntargetcode' switch in msbuild task +#126, #127, #132 - ReportGenerator upgrades +#122 - filter from file instead of command line list option (#123 patch) + +Version 4.0.804 +#117 - fix filter crash with anonymous types +#110 - fix timeout issues due to performance woes in dealing with large number of types/methods + +Version 4.0.724 +#94 - remove thread that "may" have been the cause of the nunit-agent.exe closedown issue - switched to a shared memory buffer per child process/profiler object instantiated +#108 - merge pull request - ToolPath property for MSBuild command + +Version 4.0.519 +#102 - add msbuild parts to zip and nuget package +#99 - exclude anonymous functions if containing method is excluded +#97 - fix crash based on receiving corrupt data (sequence point with id==0) +#88 - only use COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST if oldStyle instrumentation + +Version 4.0.408 +#83 - build a zip package +#88 - provide a switch for "old school" instrumentation +#95 - fix for namespaces with spaces + +Version 4.0.301.10 +#78 - fix for endfault/endfinally +#71 - detect disabled service + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf new file mode 100644 index 000000000..a078a647e --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf @@ -0,0 +1,1138 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\f40\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f81\fbidi \fswiss\fcharset238\fprq2 Helvetica CE;}{\f82\fbidi \fswiss\fcharset204\fprq2 Helvetica Cyr;} +{\f84\fbidi \fswiss\fcharset161\fprq2 Helvetica Greek;}{\f85\fbidi \fswiss\fcharset162\fprq2 Helvetica Tur;}{\f86\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);}{\f87\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);} +{\f88\fbidi \fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f89\fbidi \fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}{\f381\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f384\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f385\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f388\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f389\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f431\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f432\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\f434\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f435\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f438\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f439\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);} +{\f441\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;} +{\f448\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f449\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; +\caccentone\ctint255\cshade191\red54\green95\blue145;\caccentone\ctint255\cshade255\red79\green129\blue189;\ctexttwo\ctint255\cshade191\red23\green54\blue93;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128; +\ctextone\ctint255\cshade255\red0\green0\blue0;\red51\green51\blue51;\red43\green145\blue175;\cbackgroundone\ctint255\cshade191\red191\green191\blue191;}{\*\defchp \f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs28\alang1025 \ltrch\fcs0 \b\fs28\cf17\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid13184707 heading 1;}{\s2\ql \li0\ri0\sb200\sl276\slmult1 +\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 \b\fs26\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext0 \slink16 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 2;}{\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs22\alang1025 \ltrch\fcs0 \b\fs22\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink17 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 3;}{\*\cs10 \additive +\sunhideused \spriority1 Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\fs28\cf17\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid13184707 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af0\afs26 \ltrch\fcs0 +\b\fs26\cf18\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink2 \slocked \spriority9 \styrsid12068581 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf18\loch\f31502\hich\af31502\dbch\af31501 +\sbasedon10 \slink3 \slocked \spriority9 \styrsid12068581 Heading 3 Char;}{\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 +\b\fs28\cf17\lang1033\langfe1041\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 \sbasedon1 \snext0 \ssemihidden \sunhideused \sqformat \spriority39 \styrsid7372180 TOC Heading;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 +\sbasedon10 \sunhideused \styrsid8939988 Hyperlink;}{\s20\ql \li0\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 1;}{\s21\ql \li220\ri0\sa100\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 +toc 2;}{\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 3;}{\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\contextualspace \rtlch\fcs1 +\af0\afs52\alang1025 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink24 \sqformat \spriority10 \styrsid7372180 Title;}{\*\cs24 \additive +\rtlch\fcs1 \af0\afs52 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\kerning28\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink23 \slocked \spriority10 \styrsid7372180 Title Char;}{\s25\ql \li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext25 \sqformat \spriority34 \styrsid6453762 List Paragraph;}{\s26\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang3081\langfe3081\cgrid\langnp3081\langfenp3081 \sbasedon0 \snext26 \ssemihidden \sunhideused \styrsid11687369 Normal (Web);}{\*\cs27 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid11687369 apple-converted-space;}{\* +\ts28\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af37\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon11 \snext28 \spriority59 \styrsid5114927 +Table Grid;}{\*\cs29 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf20 \sbasedon10 \styrsid11032164 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid740077246\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid382339409}{\list\listtemplateid1903328102\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 +\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext +\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid401637325}{\list\listtemplateid508579338 +\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916433\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid405616751}{\list\listtemplateid1306685724\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid484125747}{\list\listtemplateid1826631064{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers +\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 +\ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid723678808} +{\list\listtemplateid-842228772\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1138174080\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 +\fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li6840\lin6840 }{\listname ;}\listid950892184}{\list\listtemplateid-1038568524\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel +\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 +\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1199853486} +{\list\listtemplateid-1235995406\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 +\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li6480\lin6480 }{\listname ;}\listid1997226378}{\list\listtemplateid-2031863006\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1313997542 +\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6840\lin6840 }{\listname ;}\listid2120176231}}{\*\listoverridetable{\listoverride\listid405616751\listoverridecount0\ls1}{\listoverride\listid2120176231\listoverridecount0\ls2} +{\listoverride\listid950892184\listoverridecount0\ls3}{\listoverride\listid484125747\listoverridecount0\ls4}{\listoverride\listid1997226378\listoverridecount0\ls5}{\listoverride\listid723678808\listoverridecount0\ls6}{\listoverride\listid1199853486 +\listoverridecount0\ls7}{\listoverride\listid382339409\listoverridecount0\ls8}{\listoverride\listid401637325\listoverridecount0\ls9}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid97460\rsid221265\rsid284426\rsid537180\rsid664540\rsid735477\rsid735614\rsid738226\rsid879886\rsid935281\rsid1070110\rsid1510934\rsid1583585\rsid1586953\rsid1598011\rsid1775295\rsid1841268\rsid1903893\rsid1926955\rsid1967093\rsid2060806 +\rsid2177067\rsid2243939\rsid2312332\rsid2783484\rsid2827362\rsid2846494\rsid2890017\rsid2959880\rsid2981254\rsid3290111\rsid3490457\rsid3741585\rsid3829756\rsid4010500\rsid4327818\rsid4477453\rsid4484449\rsid4522593\rsid4545630\rsid5050788\rsid5114927 +\rsid5794820\rsid5921453\rsid6438937\rsid6453762\rsid6518571\rsid6886783\rsid7160127\rsid7237901\rsid7289096\rsid7292194\rsid7372180\rsid7816154\rsid8091909\rsid8145172\rsid8329235\rsid8339308\rsid8475156\rsid8479050\rsid8651410\rsid8728997\rsid8847473 +\rsid8852142\rsid8939988\rsid9049101\rsid9068514\rsid9132688\rsid9137041\rsid9332253\rsid9639182\rsid9639869\rsid10224112\rsid10314410\rsid10845574\rsid11032164\rsid11212548\rsid11687369\rsid11802269\rsid12024666\rsid12060006\rsid12068581\rsid12129336 +\rsid12348517\rsid12584760\rsid13184707\rsid13261933\rsid13513498\rsid13586263\rsid13596290\rsid13722641\rsid13847658\rsid14041828\rsid14097242\rsid14228117\rsid14243083\rsid14371182\rsid14497238\rsid14513928\rsid14565649\rsid14684873\rsid14885541 +\rsid15205038\rsid15221525\rsid15280621\rsid15795287\rsid15819295\rsid15938139\rsid16071677\rsid16142742\rsid16259852\rsid16349201\rsid16469695\rsid16712264}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 +\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun Wilde}{\creatim\yr2012\mo1\dy3\hr1\min4}{\revtim\yr2016\mo1\dy31\hr14\min3}{\printim\yr2016\mo1\dy31\hr14\min2}{\version61}{\edmins4613}{\nofpages11}{\nofwords3439}{\nofchars19608} +{\*\company Microsoft}{\nofcharsws23001}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot284426\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180\contextualspace \rtlch\fcs1 \af0\afs52\alang1025 \ltrch\fcs0 +\fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13184707 \hich\af31502\dbch\af31501\loch\f31502 OpenCover Usage Guide}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 {\*\bkmkstart _Toc442012125}\hich\af31502\dbch\af31501\loch\f31502 Intro{\*\bkmkend _Toc442012125} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 The following guide describes how to use }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 HYPERLINK "https://github.com/OpenCover/opencover"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 +{\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f004f00700065006e0043006f007600650072002f006f00700065006e0063006f007600650072000000795881f4 +3b1d7f48af2c825dc485276300000000a5ab000000000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 OpenCover}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 HYPERLINK "http://nuget.org/packages/OpenCover/" }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6200000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f004f00700065006e0043006f007600650072002f000000795881f43b1d7f48 +af2c825dc485276300000000a5ab0000004500000000ff00ffe65b0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid221265\charrsid221265 NUGET}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 ) }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 to gather coverage statistics of your application. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid879886\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid879886 C}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 an handle 32 and 64 bit .NET processes running on the .NET 2 and .NET 4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 frameworks. }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid879886 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 b)\tab}W}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 ill gather sequence and branch coverage informatio +n of your assemblies that match the filters and for which the PDB files can be found.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 c)\tab}Can gather coverage reports of Silverlight applications +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 d)\tab}Can gather coverage reports of Windows Service applications. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 e)\tab}Can record which tests where executing at a particular time when a coverage point was visited \endash + only MSTest and NUnit supported (requests accepted for others).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 Currently OpenCover has no }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid735477 full }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 presentation of results other than the XML output file; }{\field{\*\fldinst { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 HYPERLINK "http://www.palmmedia.de/Net/ReportGenerator" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7000000068007400740070003a002f002f007700770077002e00700061006c006d006d0065006400690061002e00640065002f004e00650074002f005200650070006f0072007400470065006e006500720061007400 +6f0072000000795881f43b1d7f48af2c825dc485276300000000a5ab00006c0000000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 ReportGenerator}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 + HYPERLINK "http://nuget.org/packages/ReportGenerator/" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f005200650070006f0072007400470065006e0065007200610074006f007200 +2f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000005600000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid879886\charrsid879886 NUGET}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 )}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 is currently the recommended tool for visualizing the results. +\par NOTE: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 When there is n}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 o PDB for an assembly then no coverage data will be gathered; this is different to }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid879886 HYPERLINK "https://github.com/sawilde/partcover.net4" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0073006100770069006c00640065002f00700061007200740063006f007600650072002e006e00650074003400 +0000795881f43b1d7f48af2c825dc485276300000000a5ab0000da0000000000ff00ff1f000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 PartCover}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 which will default to IL coverage under this situation but it + was considered as not required as this is supposed to be a code-coverage tool which can relate such coverage to }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\i\insrsid1775295\charrsid4484449 your}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 code. +\par }\pard\plain \ltrpar\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 +\b\fs28\cf17\lang1033\langfe1041\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 \hich\af31502\dbch\af31501\loch\f31502 Table of Contents +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 TOC \\o "1-3" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012125"}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Intro}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012125 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 1}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012126"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Command Arguments}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012126 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012127"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Mandatory}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012127 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012128"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012128 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012129"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Handling Spaces}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012129 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 5}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012130"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Understanding Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012130 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012131"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012131 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012132"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Regular Expressions in Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012132 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012133"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012133 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012134"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against IIS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012134 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012135"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Running against an application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +\tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012135 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012136"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012136 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012137"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against a Silverlight application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012137 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012138"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012138 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012139"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against a Service application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012139 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012140"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012140 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012141"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludeb\hich\af31506\dbch\af31501\loch\f31506 +yattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012141 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012142"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012142 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012143"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Shimming support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012143 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012144"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Microsoft Moles support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012144 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012145"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Microsoft Fakes support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012145 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012146"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 TypeMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012146 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012147"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 JustMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012147 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012148"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Build system integration}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 + PAGEREF _Toc442012148 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012149"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 all-users (32-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012149 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012150"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 all-users (64-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012150 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012151"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 single-user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012151 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012152"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 R\hich\af31506\dbch\af31501\loch\f31506 eporting}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012152 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012153"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 FAQ}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012153 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012154"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Why do I have no results?}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012154 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012155"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 All my tests are failing and I am getting MissingMethodException}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012155 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid16712264 11}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 }}\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1 +\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 +{\*\bkmkstart _Toc442012126}\hich\af31502\dbch\af31501\loch\f31502 Command Arguments{\*\bkmkend _Toc442012126} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988 OpenCover has a number of arguments that can be used to control the code coverage gathering. If an argument requires s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988\charrsid8939988 paces}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid8939988\charrsid8939988 then use "}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8939988 \rquote s to wrap the argument, where they are applicable they will be indicated with an optional syntax [].}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid4484449 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12068581 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012127}\hich\af31502\dbch\af31501\loch\f31502 Mandatory{\*\bkmkend _Toc442012127} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 ["]-target:<}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 target application}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 >["] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid16349201 +The name of the target application or service that will be started; this can also be a path to the target application. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 Alternatively use }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid8728997\charrsid5050788 -?}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 to show command line help, or }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2060806\charrsid2060806 -version}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 + to print the current version and exit.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012128}\hich\af31502\dbch\af31501\loch\f31502 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid8939988 {\*\bkmkend _Toc442012128} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16349201 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 ["]-targetdir:["] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 +The path to the target directory; if the target argument already contains a path then this argument can be used to provide an alternate path wh}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 ere PDB files may be found. }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid16349201 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8728997\charrsid5050788 -targetargs:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Arguments to be passed to the target process.}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1841268 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 [\'93]-searchdirs:[;[\'93] + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 \tab Additional locations to check for PDB files.\page +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -register[:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid9639182 |path32|path64}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Use this switch to register and d +e-register the code coverage profiler. Alternatively use the optional }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid9639182 user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 + argument to do per-user registration where the user account does not have administrative permissions. }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 +\par If access to registry is limited then try the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path64}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid9639182 , depending on your application (32- or 64-bit), to use an alternate method to load the profiler; unfortunately you cannot profile 32- and 64-bit processes at the same time using these switches.}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid9639182\charrsid9639182 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Alternatively use an administrative account to register the profi}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 lers using t +he regsvr32 utility; this is the recommended option when running on a build server especially if \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 \endash register:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 does not work. + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid13513498 -returntargetcode[:] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953\charrsid2783484 +Return the target process return code instead of the OpenCover console return code. Use the offset to return the OpenCover console at a value outside the range returned by the target process. }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid1586953\charrsid1586953 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid15205038 -safemode:on|off|yes|no +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Use this switch to disable safe mode (default is }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \b\insrsid15205038\charrsid15205038 on}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 /yes). When in safe mode the profiler will use a common buffer for all threads which may have performance impacts if you code or tests use threads he +avily. When safe mode is disabled, there may on occasions be some data loss if the runtime closes the application under profile before the profiler has been able to retrieve the visit count data. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid5050788\charrsid13513498 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12068581\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5050788 +The location and name of the output xml file. If no value is supplied then the current directory will be used and the outpu}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 t filename will be results.xml.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid2312332 -threshold: +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 +Limits the number of visit counts recorded/reported for an instrumentation point. May have some performance gains as it can reduce the number of messages sent fr +om the profiler. Coverage results should not be affected but will have an obvious impact on the Visit Counts reported.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 +\par +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid664540\charrsid13513498 -filter:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["] +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 A list of filters to apply to selectively include or +exclude assemblies and classes from coverage results. Filters have their own form}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid9332253 at }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540 \'b1[module}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\b\insrsid664540\charrsid9332253 -filter]class-filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 . If no filter(s) are supplied then a default include all filter is applied +[*]*. As can be seen you can use an * as a wildcard. +\par +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540\charrsid13261933 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 : Also an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 exclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (-) +filter takes precedence over an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 inclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid13261933 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (+) filter.}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9639869 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid9639869\charrsid9639869 -regex +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 \tab +\par \tab Filters are supplied using regular expressions rather than wildcards. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14243083\charrsid13513498 -nodefaultfilters +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 A list of default exclusion filters are usually applied}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid10314410\charrsid2783484 , this option can be used to turn them off. The default filters are:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 +\par }\pard \ltrpar\ql \li1440\ri0\widctlpar\wrapdefault\faauto\rin0\lin1440\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -[mscorlib]* +\par -[mscorlib.*]* +\par -[System]* +\par -[System.*]* +\par -[Microsoft.VisualBasic]* +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid13513498 -mergebyhash +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +Under some scenarios e.g. using MSTest, an assembly may be loaded many times from different locations. This option is used to merge the coverage results for an assembly regardless of where it was loaded as +suming the assembly has the same file-hash in each location. +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 -skipautoprops}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid2846494 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 +\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid2846494 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 Neither track nor record Auto-Implemented properties. +\par +\par i.e. skip getters and setters like these +\par +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 public}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 bool}{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 Service \{ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 get}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; }{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 set}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; \}}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid2846494 +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 -showunvisited +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 Show a list of unvisited methods and classes after the coverage run is finished}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid664540 and the results are presented.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15205038 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid9639182 [\'93]-}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid15205038 excludeddirs:[;[\'93 +] +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Any assembly found in an excluded folder (or its children) will be ignored, regardless of any inclusive +filter matches.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2846494 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14228117\charrsid2783484 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyattribute:[;][;]} +{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2783484\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 +Exclude a class or method by filter(s) that match attributes that have been applied that have been applied.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid4327818 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyfile:[;][;] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid4327818 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 Exclude a class (or methods) by filter(s)}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid13513498 that match the filenames.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 -hideskipped:}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid3490457\charrsid15280621 File|Filter|Attribute|MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 +MissingPdb }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid664540 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 Excl +udedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 [}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457 {\*\bkmkstart OLE_LINK1}{\*\bkmkstart OLE_LINK2};}{ +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 File|}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid15280621 Filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |Attribute}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid15280621\charrsid15280621 |MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 MissingPdb }{ +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15205038 {\*\bkmkend OLE_LINK1}{\*\bkmkend OLE_LINK2}|ExcludedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 ] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 Remove information from output file (}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \i\insrsid12060006\charrsid8475156 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ) that relates to classes/modules that have been skipped (filtered) due to the use of}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 + the following switches}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3741585 excludeb}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid12060006\charrsid8475156 yfile}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ,}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid3741585\charrsid3741585 \_}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid3741585 e}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 xcludebyattribut}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 e:}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid3741585 and}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 filter}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \i\insrsid8475156\charrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 or where the PDB is missing}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 . +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5794820 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5794820 -coverbytest}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid5794820\charrsid13513498 :[;][;] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1967093 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 +Gather coverage by test by analysing the assemblies that match these filters for Test m}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 ethods. Currently only }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8339308 MSTest and }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid5794820 NUnit tests}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 are supported; other frameworks can be added on request \endash please raise support request on GitHub.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -log:[Off|Fatal|Error|Warn|Info|Debug|Verbose|All] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 Change the logging level, default is set to Info. }{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid13513498\charrsid13513498 Logging is based on log4net logging levels and appenders}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 . +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -service +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15795287 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid15795287\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid15795287 : \'93Administrator\'94 privileges recommended. +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 +The value provided in the target parameter is the name of a service rather than a name of a process. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8145172\charrsid8145172 -servicestarttimeout:[1m|23s|1m23s] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8145172 Overrides the default time to wait for the profiled service t +o start. The examples above correspond to a timeout of 1 minute, 23 seconds and 1 minutes and 23 seconds accordingly. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid14513928 oldstyle}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14513928 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 Use old style instru}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid3490457 mentation \endash the instrumentation}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 is not Silverlight friendly and is provided to support environments where mscorlib instrumentation is not working. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2312332\charrsid2312332 -enableperformancecounters +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid2312332\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid2312332 : \'93Administrator\'94 privileges}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15795287 required}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 . +\par Allows the monitoring in \'93Performance Monitor\'94 of the following }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 values}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 : +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li1080\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1080\itap0\pararsid2312332\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid2312332\charrsid2312332 \'93messages remaining on the queue}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 \'94 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 2)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 \'93number of messages processed\'94 +}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 +\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7816154 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 These values are usually cleared at the end of a performance run.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154\charrsid7816154 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 {\*\bkmkstart _Toc442012129}\hich\af31502\dbch\af31501\loch\f31502 Handling Spaces}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid14513928 {\*\bkmkend _Toc442012129} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 If your argument needs to escape quotes i.e. to pass arguments with spaces to the target process then you can use \\". +\par e.g. +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid4484449\charrsid8847473 -targetargs:"\\"c:\\program files\\" arg2 arg3" + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 Or +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8847473\charrsid8847473 \'93-targetargs:\\"c:\\program files\\ +" arg2 arg3" +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid4484449 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 {\*\bkmkstart _Toc442012130}\hich\af31502\dbch\af31501\loch\f31502 Understanding Filters +{\*\bkmkend _Toc442012130} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2827362 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 Filters are core to understanding how OpenCover works and how it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 is determined}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 + which assemblies are to be instrumented to provide coverage results. +\par Filters can be inclusive and exclusive represented by + and }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 \endash prefix }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 respectively, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 where e}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid2827362 xclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (-) filters take precedence}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 over inclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (+)}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid2827362 filters. +\par The next }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 part of a filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 +is the module-filter and usually this happens to be the same name as the assembly but without the extension and this rule will normally apply 99.999% of the time. If this filter isn\rquote +t working look in the coverage XML and compare the found entries against the filter.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 The final part of the filter is the class-filter and this also }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 includes}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 the namespace part of the class as well. + +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 {\*\bkmkstart _Toc442012131}\hich\af31502\dbch\af31501\loch\f31502 Examples{\*\bkmkend _Toc442012131} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +[Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +*]* -[Open.Test]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid3290111\charrsid3290111 +\par +[Open]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 -[Open]Data.*\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid3290111\charrsid3290111 +\par +[Open]* -[Open]*Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes ending with Attribute. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012132}\hich\af31502\dbch\af31501\loch\f31502 Regular Expressions in Filters +{\*\bkmkend _Toc442012132} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 It is also possible to use regular expressions instead of wildcards but to do so require that you use the \endash regex swit +ch when specifying the filters. NOTE: When using this feature it is required that all filters use regular expressions rather than wildcards. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid9639869 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012133}\hich\af31502\dbch\af31501\loch\f31502 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid9639869 {\*\bkmkend _Toc442012133}\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid9639869 +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 \\.}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 +\af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 \\}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 .Test}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 ) -[(Open)](Data\\..*)\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 +Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 +\af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 +Include all classes in module Open but exclude all classes ending with Attribute.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639869 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid3290111 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 {\*\bkmkstart _Toc442012134}\hich\af31502\dbch\af31501\loch\f31502 Running against IIS +{\*\bkmkend _Toc442012134} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 Normally I\rquote d suggest running against }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 HYPERLINK "http://www.microsoft.com/en-us/download/details.aspx?id=1038" }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9200000068007400740070003a002f002f007700770077002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f0064006f0077006e006c006f00610064002f006400 +65007400610069006c0073002e0061007300700078003f00690064003d0031003000330038000000795881f43b1d7f48af2c825dc485276300000000a5ab0000000000000039000065960800}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid10224112\charrsid10224112 IISEXPPRESS}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 as I think it is easier to automate. However for those}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14565649 + who really want to run against a full blown IIS then the following instructions (supplied by a }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid14565649\charrsid14565649 user) will hopefully suffice.}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cf21\insrsid11687369\charrsid14565649 +\par \'93}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 The trick is to start OpenCover to run the}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid14565649 w3wp.exe process in debug mode}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\insrsid11687369\charrsid14565649 e.g. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe -targetargs:-debug\~\line -targetdir:C:\\Inetpub\\wwwwoot\\MyWebApp +\\bin\\ -filter:+[*]* -register:user +\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 There are some prerequisites tho}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 ugh:}{ +\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 \hich\af31506\dbch\af0\loch\f31506 1.\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid14565649\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ll applications running under the site must }{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 make use of the same app pool; y}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ou'll get error}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 s in the EventLog otherwise. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 \hich\af31506\dbch\af0\loch\f31506 2.\tab}}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 inetserver needs to be stopped, before starting w3wp.exe in debug mode. You can use the following command: +\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net stop w3svc /y +\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 +fter testing/code coverage completion you can close the w3wp.exe proce}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 s}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 s and start the inetserver again: +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net start w3svc +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 {\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 +This procedure was tested on a Win2008 machine with IIS7.5}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 You can also run multiple OpenCover instances against separate IIS sites by using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\cf21\insrsid12584760 \endash }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\cf21\insrsid12584760\charrsid12584760 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 option when running IIS to choose the siteid e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760\charrsid12584760 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12584760 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 +OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetargs:"-debug -s 1" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetdir:%WebSite_Path% }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -filter:+[*]* }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -output:%CoverageResult_Path%}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12584760 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12584760 Then you can use ReportGenerator to merge the coverage results. }{ +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012135}\hich\af31502\dbch\af31501\loch\f31502 Running against an application +{\*\bkmkend _Toc442012135} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid7237901 This most common usage }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 of any code coverage utility such as OpenCover }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7237901 is in a testing environment}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid12068581 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7237901 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13513498 {\*\bkmkstart _Toc442012136}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012136} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13513498 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid13513498\charrsid7237901 OpenCover.Console.exe -register:user -target:..\\..\\..\\tools\\NUnit-2.5.10.11092\\bin\\net-2.0\\nunit-console-x86.exe -targetargs:"OpenCover.Test +.dll /noshadow" -filter:"+[Open*]* -[OpenCover.T*]*" -output:opencovertests.xml +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012137}\hich\af31502\dbch\af31501\loch\f31502 Running against a Silverlight application +{\*\bkmkend _Toc442012137} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid16469695 To run against a Silverlight application it is necessary to ensure the site hosting the application is runni +ng beforehand. To profile a Silverlight application it is necessary to launch a browser against the site and as the PDB files are not packaged in the XAP files it is necessary to give the console a hint where to look for the PDB files}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1510934 (using the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 \endash targetdir}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 option)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 . +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12068581 {\*\bkmkstart _Toc442012138}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012138} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "-target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid16469695\charrsid12068581 C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid16469695\charrsid12068581 -targetar}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 gs:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 http://localhost:4128/SampleSilverlightTestPage.aspx}{ +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 -t}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid8728997 argetdir:..}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 \\SampleSilverlight\\SampleSilverlight\\Bin\\Debug"}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012139}\hich\af31502\dbch\af31501\loch\f31502 Running against a Service application +{\*\bkmkend _Toc442012139} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid7289096 It is preferable to run the service in a console mode if it has one rather than as a service however if you do decide to use it against a service then you will nee +d to make sure you use an account that can access the windows synchronisation objects in the Global namespace (rather than Local namespace). \'93Local System\'94 seems to work quite well and so do user accounts w}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid8479050 ith the appropriate permissions;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 \'93Local Service\'94 is}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 usually}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 + problematic and is not recommended. The console host will also need to be run from an account that can access the Global namespace as such an Administrator account or an Administrative prompt is recommended}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 +.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 {\*\bkmkstart _Toc442012140}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012140} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16349201 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 +OpenCover Sample Service" -service }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid8479050 \endash }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 register}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8479050 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid8479050 NOTE}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 +: Rather than use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 \endash register}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 switch, it is usually simpler to use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8479050\charrsid8479050 regsvr32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 utility to pre-register the two profiler assemblies (32 and 64-bit) beforehand.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid738226 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkstart _Toc442012141}\hich\af31502\dbch\af31501\loch\f31502 Using +\hich\af31502\dbch\af31501\loch\f31502 the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid4327818\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyattribute}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid4327818 \hich\af31502\dbch\af31501\loch\f31502 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkend _Toc442012141} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid4327818 Normally you would include/exclude modules and classes by using the inclusion/exclusion filters, however there may be situations where you can\rquote t get coverage via testing and you wish to ignore the uncovered method. + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 First create a \'93public\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 + attribute that you can apply to class/method/property which you use to mark up something to ignore. You can have more than one and you can add other data to provide a reason why you are excluding it. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 e.g. +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 [}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 +AttributeUsage}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 (}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 +\f40\fs16\insrsid738226\charrsid738226 .Class|}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 .Method|}{\rtlch\fcs1 \af40\afs16 +\ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226 .Property)] +\par }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \b\f40\fs16\cf2\insrsid738226\charrsid1775295 public}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf2\insrsid738226\charrsid738226 class} +{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 ExcludeFromCoverageAttribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 +\f40\fs16\insrsid738226\charrsid738226 : }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 Attribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 \{\} +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\insrsid738226 +\par +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 Then you apply this attribute to the class/method/property that you wish to exclude. + +\par Then you add this attribute to the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid1510934 excludebyattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 + option using namespaces and wildcards where necessary. +\par e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 +-excludebyattribute:*.ExcludeFromCoverage* +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 NOTE: Use with care as you could exclude a method which you should be testing}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 ;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 {\*\bkmkstart _Toc442012142}\hich\af31502\dbch\af31501\loch\f31502 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 \hich\af31502\dbch\af31501\loch\f31502 option}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012142} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid738226 This is a useful option to use to ignore a}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 uto}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 generated files}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid738226 . This works on file and pathnames. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 + the following would ignore all code in files ending in }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9049101\charrsid9049101 generated.cs}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 -excludebyfile}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid738226\charrsid738226 :}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 *\\}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid2177067 *.generated.cs}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +NOTE: Use with care as you could exclude a method which you should be testing; also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid5114927 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012143}\hich\af31502\dbch\af31501\loch\f31502 Shimming support}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid5114927\charrsid5114927 {\*\bkmkend _Toc442012143} +\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 +\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\pard\plain \ltrpar\qj \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5114927\yts28 \rtlch\fcs1 \af0\afs22\alang1025 +\ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 In comput +er programming, a shim is a small library that transparently intercepts API calls and changes the arguments passed, handles the operation itself, or redirects the operation elsewhere. Shims typically come about when the behavior of an API changes, thereby + +causing compatibility issues for older applications which still rely on the older functionality. In such cases, the older API can still be supported by a thin compatibility layer on top of the newer code. Web polyfills are a related concept. Shims can als +o be used for running programs on different software platforms than they were developed for. +\par - }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 HYPE +RLINK "http://en.wikipedia.org/wiki/Shim_%28computing%29" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7c00000068007400740070003a002f002f0065006e002e00770069006b006900700065006400690061002e006f00720067002f00770069006b0069002f005300680069006d005f0025003200380063006f006d007000 +7500740069006e0067002500320039000000795881f43b1d7f48af2c825dc485276300000000a5ab00000465a901000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid5114927\charrsid5114927 wikipedia}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 \cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 +\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 +\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\row }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5114927 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid5114927 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 Depending on the provider of the Shimming utility will determine on how the OpenCover will be used alongside it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid2243939\charrsid2243939 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012144}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Moles support +{\*\bkmkend _Toc442012144} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 To use Moles with OpenCover requires that you first inform Moles that you are using OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid5921453 Before you run moles you need to set an environment variable +\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 +set CLRMONITOR_EXTERNAL_PROFILERS=\{1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8\} +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 Then use OpenCover to run the moles runner +\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012145}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Fakes support +{\*\bkmkend _Toc442012145} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 OpenCover has support for }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 HYPERLINK "https://msdn.microsoft.com/en-us/library/hh549175.aspx" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 +{\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b86000000680074007400700073003a002f002f006d00730064006e002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f006c006900620072006100720079002f00 +680068003500340039003100370035002e0061007300700078000000795881f43b1d7f48af2c825dc485276300000000a5ab00003000000000eb08}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid2243939\charrsid2243939 Microsoft Fakes}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 just use OpenCover to execute vstest.cons +ole.exe and it will detect if the Microsoft Fakes profiler is going to be activated and it will do the rest. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid5921453 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 {\*\bkmkstart _Toc442012146}\hich\af31502\dbch\af31501\loch\f31502 TypeMock support +{\*\bkmkend _Toc442012146} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 The }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 developers}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 at TypeMock add}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 ed}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid5921453 OpenCover support several years ago; please review their documentation to get both TypeMock and OpenCover to work correctly with the versions you have installed. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8091909 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\bkmkstart _Toc442012147}\hich\af31502\dbch\af31501\loch\f31502 JustMock support +{\*\bkmkend _Toc442012147} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 The developers at JustMock have also added support for OpenCover; please review their }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 + HYPERLINK "http://www.telerik.com/help/justmock/integration-opencover.html" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9800000068007400740070003a002f002f007700770077002e00740065006c006500720069006b002e0063006f006d002f00680065006c0070002f006a007500730074006d006f0063006b002f0069006e0074006500 +670072006100740069006f006e002d006f00700065006e0063006f007600650072002e00680074006d006c000000795881f43b1d7f48af2c825dc485276300000000a5ab0000002f00000700}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid8091909\charrsid8091909 documentation}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 to get both JustMock and OpenCover to work correctly with the versions you have installed.}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid8091909\charrsid2243939 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 {\*\bkmkstart _Toc442012148}\hich\af31502\dbch\af31501\loch\f31502 Build system integration}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012148} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 It is not unexpected that OpenCover will be used in a build environment and that the build will be running under a system account under these scenarios it is recommended that you pre-register the prof +iler DLLs using the regsvr32 utility where applicable for your environment. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid1926955\charrsid1903893 regsvr32 x86\\OpenCover.Profiler.dll\line regsvr32 x64\\OpenCover.Profiler.dll +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 To assist your build environment when you install OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 using the MSI}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 it will store in the registry a lo +cation of the installation folder. The location in the registry depends on whether it is a single-user or}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 an}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 all-user installation and}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1903893 also}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 if you}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 are on a 32/64 bit environment. +\par See the following examples based on default settings:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012149}\hich\af31502\dbch\af31501\loch\f31502 all-users +\hich\af31502\dbch\af31501\loch\f31502 (32-bit){\*\bkmkend _Toc442012149} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012150}\hich\af31502\dbch\af31501\loch\f31502 all-users (64-bit) +{\*\bkmkend _Toc442012150} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\Wow6432Node\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES(X86)%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012151}\hich\af31502\dbch\af31501\loch\f31502 single-user{\*\bkmkend _Toc442012151} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKCU\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %LOCALAPPDATA%\\Apps\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 {\*\bkmkstart _Toc442012152}\hich\af31502\dbch\af31501\loch\f31502 Reporting{\*\bkmkend _Toc442012152} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7160127 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 It is recommended that ReportGenerator (also available on Nuget) is used to view the coverage results however if you want to make your own reporting then a sample XSLT has been made available by }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 Pavan Tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 (}{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 HYPERLINK "}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 +https://github.com/pawan52tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 " }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0070006100770061006e00350032007400690077006100720069000000795881f43b1d7f48af2c825dc4852763 +00000000a5ab0000006f000000005b5a088700ff00}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid7160127\charrsid2981254 https://github.com/pawan52tiwari}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 ). It is simple to use with the supplied powershell script. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid7160127\charrsid7160127 powershell -noexit -file ..\\..\\transform\\transform.ps1 -xsl ..\\..\\transform\\simple_report.xslt -xml opencovertests.xml -output simple_output.html +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 Feel free to extend it to your own requirements. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012153}\hich\af31502\dbch\af31501\loch\f31502 FAQ{\*\bkmkend _Toc442012153} +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 {\*\bkmkstart _Toc442012154}\hich\af31502\dbch\af31501\loch\f31502 Why do I have no results?}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkend _Toc442012154} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 There are two common reasons why this may happen.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid8847473 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 1) Instrumentation skipped due to filters. +\par The usual reason for no results}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 because OpenCover cannot locate the PDBs for assemblies that match the filters to be profiled i.e. gather c +overage results from. When each assembly is loaded the location and reason the assembly wasn\rquote t profiled is provided in the coverage results file e.g. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8852142 {\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 +\f2\fs14\insrsid8852142\charrsid8852142 \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 C:\\Personal\\opencover.git +\\working\\main\\bin\\Debug\\OpenCover.Test.dll\line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 OpenCover.Test\line \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid7372180 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 The two most common reasons}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8329235 provided}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 are }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter} +{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 is obviously connected to the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8852142\charrsid1510934 \endash filter:}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid8852142 argument and that the ModuleName was not matched}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid2827362\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 is usually because the PDB is not where the assembly is being loaded from}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 +. The most common reason is }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 due to }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 test tools such as NUnit or MSTest which copy the assembly under test to a new location}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid8329235 ; t}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 his can be corrected by either using the /no}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 shadow or /noisolation option. An alternative is to use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 +\i\insrsid8329235\charrsid1510934 \endash targetdir:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 argument to provide an alternative location for OpenCover to use.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 The other reasons are only applicable to classes and are related to the use of \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyattribute}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \i\insrsid8329235\charrsid1510934 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyfile:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 options. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 2) Failure to register the profiler assemblies. +\par The profiler assemblies are COM objects and need to be registered in the Registry before the target process is run. +\par This can }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 usually }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 be solved in }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 one of }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 two ways}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid13596290 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid8847473\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid8847473 Use the }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8847473\charrsid1510934 \endash register[:user] }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 switch +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 b)\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 Pre-register the assemblies using the regsvr32 utility}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid5921453\charrsid5921453 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012155}\hich\af31502\dbch\af31501\loch\f31502 +All my tests are failing and I am getting MissingMethodException{\*\bkmkend _Toc442012155} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 This has been seen on a few systems}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6453762 where the following command has been executed to improve performance (or something similar)}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid14513928 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen install /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 The}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3490457 re}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 are two ways to fix or handle this issue +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid6453762\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid6453762 Undo the previous command - }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen uninstall /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 .}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 + +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 2)\tab}Use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid6453762\charrsid1510934 \endash oldstyle}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid6453762 switch, note however that this is not Silverlight friendly. }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762\charrsid6453762 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; +\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; +\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; +\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; +\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; +\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; +\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; +\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; +\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000d03b +4506d45bd1010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000d03b4506d45bd101 +d03b4506d45bd101000000000000000000000000dc00c600d3004b00c000350050003100c600d400d200d600d1004400c2005900cd00d3004700c300490041003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000d03b4506d45b +d101d03b4506d45bd1010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b38314341 +364346322d444246332d344339422d423643342d3338393842373331413332307d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt new file mode 100644 index 000000000..7e5988f73 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt @@ -0,0 +1,21 @@ +Welcome to OpenCover. + +OpenCover is an open source (MIT licence) code coverage utility for all .NET +Frameworks (2 and above, including Silverlight). It can handle all .NET +languages as long as the compiled assemblies use the .NET Runtime. + +It is most commonly used to gather coverage data of code that is being +exercised by unit testing i.e. nunit, mstest etc. + +We recommend that you view the documents that have also been installed +alongside the utility to get started or you can look at the documentation +provided on the wiki https://github.com/OpenCover/opencover/wiki/Usage. + +Currently OpenCover has no visualization of its results and we recommend that +your use ReportGenerator (2.1.8 and above) to view the results against your code. + +A sample project showing a possible way to use OpenCover with ReportGenerator +has also been provided for your convenience. + +If you have any issues or feature requests with OpenCover please raise them +with the project owners on https://github.com/opencover/opencover. diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll new file mode 100644 index 000000000..230786aa2 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll new file mode 100644 index 000000000..e4a596a97 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll new file mode 100644 index 000000000..f2d05ec7a Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll new file mode 100644 index 000000000..7a1487314 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll new file mode 100644 index 000000000..755cacb13 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll new file mode 100644 index 000000000..fe7874d9e Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll new file mode 100644 index 000000000..78897c07b Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll new file mode 100644 index 000000000..bf3acf179 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe new file mode 100644 index 000000000..b1c416d53 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config new file mode 100644 index 000000000..d65cb4ca4 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config @@ -0,0 +1,26 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll new file mode 100644 index 000000000..cb691377e Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll new file mode 100644 index 000000000..1accffc18 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config new file mode 100644 index 000000000..d6c61f707 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config @@ -0,0 +1,39 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll new file mode 100644 index 000000000..47cd9ad41 Binary files /dev/null and b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll differ diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt new file mode 100644 index 000000000..e8367515a --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt @@ -0,0 +1,332 @@ + + + + + + + + + +

Code Coverage Report

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Generated on: + + +
+ Parser: + + Pawan Tiwari's Parser +
+ Assemblies: + + +
+ Files: + + +
+ Coverage: + + % +
+ Covered lines: + + +
+ UnCovered lines: + + +
+ Coverable lines: + + +
+ Total lines: + + Yet To be discovered + +
+

+ Assemblies +

+

+ Collapse all classes | Expand all classes +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Details +
+ + + + + + + + + + + + + + + + + + + + + +
+ Classes: + + +
+ Covered lines: + + +
+ Coverable lines: + + +
+ Coverage: + + + + % + + + 0 + + +
+
+
+ + % + + + + + + + + +
+   + +   +
+
+

+ Class Name: +

+
+ % + + + + + + + +
+   + +   +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class: + + +
+ Assembly: + + +
+ File(s): + + + + + + + +
+ Coverage: + + + % +
+ Covered lines: + + +
+ Coverable lines: + + +
+ Total lines: + + 51 +
+
+ + + + + + + + + + + + + + + + + +
+ Method + + Cyclomatic Complexity + + Sequence Coverage + + Branch Coverage + + Static Method +
+ + + + + + + + + + +
+
+ +
+
diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 new file mode 100644 index 000000000..72008aafa --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +Param( + [Parameter(Mandatory=$True,Position=1)] + [string]$xsl, + + [Parameter(Mandatory=$True)] + [string]$xml, + + [Parameter(Mandatory=$True)] + [string]$output +) + +$xslt = New-Object System.Xml.Xsl.XslCompiledTransform; +$xslt.Load($xsl); +$xslt.Transform($xml, $output); + +Write-Host "The file has been transformed." diff --git a/tests/CodeCoverage/packages.config b/tests/CodeCoverage/packages.config new file mode 100644 index 000000000..973b7f81b --- /dev/null +++ b/tests/CodeCoverage/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs new file mode 100644 index 000000000..b6dd64511 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -0,0 +1,192 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests.Numerics +{ + using System; + using System.Globalization; + using System.Numerics; + using System.Reflection; + using Xunit; + + public class PointFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(PointF.Empty, new PointF()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(0.0, 0.0)] + public void NonDefaultConstructorTest(float x, float y) + { + var p1 = new PointF(x, y); + + Assert.Equal(x, p1.X); + Assert.Equal(y, p1.Y); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(PointF.Empty.IsEmpty); + Assert.True(new PointF().IsEmpty); + Assert.True(new PointF(0, 0).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + public void IsEmptyRandomTest(float x, float y) + { + Assert.False(new PointF(x, y).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void CoordinatesTest(float x, float y) + { + var p = new PointF(x, y); + Assert.Equal(x, p.X); + Assert.Equal(y, p.Y); + + p.X = 10; + Assert.Equal(10, p.X); + + p.Y = -10.123f; + Assert.Equal(-10.123, p.Y, 3); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, int.MaxValue, int.MinValue)] + [InlineData(float.MinValue, float.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(0, 0, 0, 0)] + public void ArithmeticTestWithSize(float x, float y, int x1, int y1) + { + var p = new PointF(x, y); + var s = new Size(x1, y1); + + var addExpected = new PointF(x + x1, y + y1); + var subExpected = new PointF(x - x1, y - y1); + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, PointF.Add(p, s)); + Assert.Equal(subExpected, PointF.Subtract(p, s)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTestWithSizeF(float x, float y) + { + var p = new PointF(x, y); + var s = new SizeF(y, x); + + var addExpected = new PointF(x + y, y + x); + var subExpected = new PointF(x - y, y - x); + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, PointF.Add(p, s)); + Assert.Equal(subExpected, PointF.Subtract(p, s)); + } + + [Fact] + public void RotateTest() + { + var p = new PointF(13, 17); + Matrix matrix = Matrix.CreateRotationDegrees(45, PointF.Empty); + + var pout = PointF.Rotate(p, matrix); + + Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); + } + + [Fact] + public void SkewTest() + { + var p = new PointF(13, 17); + Matrix matrix = Matrix.CreateSkewDegrees(45, 45, PointF.Empty); + + var pout = PointF.Skew(p, matrix); + Assert.Equal(new PointF(30, 30), pout); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(float x, float y) + { + var pLeft = new PointF(x, y); + var pRight = new PointF(y, x); + + if (x == y) + { + Assert.True(pLeft == pRight); + Assert.False(pLeft != pRight); + Assert.True(pLeft.Equals(pRight)); + Assert.True(pLeft.Equals((object)pRight)); + Assert.Equal(pLeft.GetHashCode(), pRight.GetHashCode()); + return; + } + + Assert.True(pLeft != pRight); + Assert.False(pLeft == pRight); + Assert.False(pLeft.Equals(pRight)); + Assert.False(pLeft.Equals((object)pRight)); + } + + [Fact] + public static void EqualityTest_NotPointF() + { + var point = new PointF(0, 0); + Assert.False(point.Equals(null)); + Assert.False(point.Equals(0)); + + // If PointF implements IEquatable (e.g. in .NET Core), then structs that are implicitly + // convertible to var can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToPointF = typeof(IEquatable).IsAssignableFrom(point.GetType()); + Assert.Equal(expectsImplicitCastToPointF, point.Equals(new Point(0, 0))); + + Assert.False(point.Equals((object)new Point(0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var point = new PointF(10, 10); + Assert.Equal(point.GetHashCode(), new PointF(10, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new PointF(20, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new PointF(10, 20).GetHashCode()); + } + + [Fact] + public void ToStringTest() + { + var p = new PointF(5.1F, -5.123F); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); + } + + [Fact] + public void ToStringEmptyTest() + { + var p = new PointF(0, 0); + Assert.Equal("PointF [ Empty ]", p.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs new file mode 100644 index 000000000..150e21987 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -0,0 +1,252 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using System.Numerics; + + using Xunit; + + public class PointTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Point.Empty, new Point()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(new Size(x, y)); + + Assert.Equal(p1, p2); + } + + [Theory] + [InlineData(int.MaxValue)] + [InlineData(int.MinValue)] + [InlineData(0)] + public void SingleIntConstructorTest(int x) + { + var p1 = new Point(x); + var p2 = new Point(unchecked((short)(x & 0xFFFF)), unchecked((short)((x >> 16) & 0xFFFF))); + + Assert.Equal(p1, p2); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(Point.Empty.IsEmpty); + Assert.True(new Point().IsEmpty); + Assert.True(new Point(0, 0).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + public void IsEmptyRandomTest(int x, int y) + { + Assert.False(new Point(x, y).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void CoordinatesTest(int x, int y) + { + var p = new Point(x, y); + Assert.Equal(x, p.X); + Assert.Equal(y, p.Y); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void PointFConversionTest(int x, int y) + { + PointF p = new Point(x, y); + Assert.Equal(new PointF(x, y), p); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void SizeConversionTest(int x, int y) + { + var sz = (Size)new Point(x, y); + Assert.Equal(new Size(x, y), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(int x, int y) + { + Point addExpected, subExpected, p = new Point(x, y); + var s = new Size(y, x); + + unchecked + { + addExpected = new Point(x + y, y + x); + subExpected = new Point(x - y, y - x); + } + + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, Point.Add(p, s)); + Assert.Equal(subExpected, Point.Subtract(p, s)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void PointFMathematicalTest(float x, float y) + { + var pf = new PointF(x, y); + Point pCeiling, pTruncate, pRound; + + unchecked + { + pCeiling = new Point((int)MathF.Ceiling(x), (int)MathF.Ceiling(y)); + pTruncate = new Point((int)x, (int)y); + pRound = new Point((int)MathF.Round(x), (int)MathF.Round(y)); + } + + Assert.Equal(pCeiling, Point.Ceiling(pf)); + Assert.Equal(pRound, Point.Round(pf)); + Assert.Equal(pTruncate, (Point)pf); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void OffsetTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(y, x); + + p1.Offset(p2); + + Assert.Equal(unchecked(p2.X + p2.Y), p1.X); + Assert.Equal(p1.X, p1.Y); + + p2.Offset(x, y); + Assert.Equal(p1, p2); + } + + [Fact] + public void RotateTest() + { + var p = new Point(13, 17); + Matrix matrix = Matrix.CreateRotationDegrees(45, Point.Empty); + + var pout = Point.Rotate(p, matrix); + + Assert.Equal(new Point(-3, 21), pout); + } + + [Fact] + public void SkewTest() + { + var p = new Point(13, 17); + Matrix3x2 matrix = Matrix.CreateSkewDegrees(45, 45, Point.Empty); + + var pout = Point.Skew(p, matrix); + Assert.Equal(new Point(30, 30), pout); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(x / 2 - 1, y / 2 - 1); + var p3 = new Point(x, y); + + Assert.True(p1 == p3); + Assert.True(p1 != p2); + Assert.True(p2 != p3); + + Assert.True(p1.Equals(p3)); + Assert.False(p1.Equals(p2)); + Assert.False(p2.Equals(p3)); + + Assert.True(p1.Equals((object)p3)); + Assert.False(p1.Equals((object)p2)); + Assert.False(p2.Equals((object)p3)); + + Assert.Equal(p1.GetHashCode(), p3.GetHashCode()); + } + + [Fact] + public static void EqualityTest_NotPoint() + { + var point = new Point(0, 0); + Assert.False(point.Equals(null)); + Assert.False(point.Equals(0)); + Assert.False(point.Equals(new PointF(0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var point = new Point(10, 10); + Assert.Equal(point.GetHashCode(), new Point(10, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new Point(20, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new Point(10, 20).GetHashCode()); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(1, -2, 3, -4)] + public void ConversionTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + RectangleF rectF = rect; + Assert.Equal(x, rectF.X); + Assert.Equal(y, rectF.Y); + Assert.Equal(width, rectF.Width); + Assert.Equal(height, rectF.Height); + } + + [Fact] + public void ToStringTest() + { + var p = new Point(5, -5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); + } + + [Fact] + public void ToStringEmptyTest() + { + var p = new Point(0, 0); + Assert.Equal("Point [ Empty ]", p.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RationalTests.cs b/tests/SixLabors.Primitives.Tests/RationalTests.cs new file mode 100644 index 000000000..e59505cf5 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RationalTests.cs @@ -0,0 +1,115 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using Xunit; + + /// + /// Tests the struct. + /// + public class RationalTests + { + /// + /// Tests the equality operators for equality. + /// + [Fact] + public void AreEqual() + { + Rational r1 = new Rational(3, 2); + Rational r2 = new Rational(3, 2); + + Assert.Equal(r1, r2); + Assert.True(r1 == r2); + + Rational r3 = new Rational(7.55); + Rational r4 = new Rational(755, 100); + Rational r5 = new Rational(151, 20); + + Assert.Equal(r3, r4); + Assert.Equal(r4, r5); + } + + /// + /// Tests the equality operators for inequality. + /// + [Fact] + public void AreNotEqual() + { + Rational first = new Rational(0, 100); + Rational second = new Rational(100, 100); + + Assert.NotEqual(first, second); + Assert.True(first != second); + } + + /// + /// Tests whether the Rational constructor correctly assign properties. + /// + [Fact] + public void ConstructorAssignsProperties() + { + Rational rational = new Rational(7, 55); + Assert.Equal(7U, rational.Numerator); + Assert.Equal(55U, rational.Denominator); + + rational = new Rational(755, 100); + Assert.Equal(151U, rational.Numerator); + Assert.Equal(20U, rational.Denominator); + + rational = new Rational(755, 100, false); + Assert.Equal(755U, rational.Numerator); + Assert.Equal(100U, rational.Denominator); + + rational = new Rational(-7.55); + Assert.Equal(151U, rational.Numerator); + Assert.Equal(20U, rational.Denominator); + + rational = new Rational(7); + Assert.Equal(7U, rational.Numerator); + Assert.Equal(1U, rational.Denominator); + } + + [Fact] + public void Fraction() + { + Rational first = new Rational(1.0 / 1600); + Rational second = new Rational(1.0 / 1600, true); + Assert.False(first.Equals(second)); + } + + [Fact] + public void ToDouble() + { + Rational rational = new Rational(0, 0); + Assert.Equal(double.NaN, rational.ToDouble()); + + rational = new Rational(2, 0); + Assert.Equal(double.PositiveInfinity, rational.ToDouble()); + } + + [Fact] + public void ToStringRepresention() + { + Rational rational = new Rational(0, 0); + Assert.Equal("[ Indeterminate ]", rational.ToString()); + + rational = new Rational(double.PositiveInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new Rational(double.NegativeInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new Rational(0, 1); + Assert.Equal("0", rational.ToString()); + + rational = new Rational(2, 1); + Assert.Equal("2", rational.ToString()); + + rational = new Rational(1, 2); + Assert.Equal("1/2", rational.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RectangleFTests.cs b/tests/SixLabors.Primitives.Tests/RectangleFTests.cs new file mode 100644 index 000000000..4dc7d9d35 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RectangleFTests.cs @@ -0,0 +1,267 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + using System.Reflection; + + using Xunit; + + /// + /// Tests the struct. + /// + public class RectangleFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(RectangleF.Empty, new RectangleF()); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void NonDefaultConstructorTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var p = new PointF(x, y); + var s = new SizeF(width, height); + var rect2 = new RectangleF(p, s); + + Assert.Equal(rect1, rect2); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void FromLTRBTest(float left, float top, float right, float bottom) + { + var expected = new RectangleF(left, top, right - left, bottom - top); + var actual = RectangleF.FromLTRB(left, top, right, bottom); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void DimensionsTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + var p = new PointF(x, y); + var s = new SizeF(width, height); + + Assert.Equal(p, rect.Location); + Assert.Equal(s, rect.Size); + Assert.Equal(x, rect.X); + Assert.Equal(y, rect.Y); + Assert.Equal(width, rect.Width); + Assert.Equal(height, rect.Height); + Assert.Equal(x, rect.Left); + Assert.Equal(y, rect.Top); + Assert.Equal(x + width, rect.Right); + Assert.Equal(y + height, rect.Bottom); + } + + [Fact] + public void IsEmptyTest() + { + Assert.True(RectangleF.Empty.IsEmpty); + Assert.True(new RectangleF().IsEmpty); + Assert.True(new RectangleF(1, -2, -10, 10).IsEmpty); + Assert.True(new RectangleF(1, -2, 10, -10).IsEmpty); + Assert.True(new RectangleF(1, -2, 0, 0).IsEmpty); + + Assert.False(new RectangleF(0, 0, 10, 10).IsEmpty); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(float.MaxValue, float.MinValue)] + public static void LocationSetTest(float x, float y) + { + var point = new PointF(x, y); + var rect = new RectangleF(10, 10, 10, 10) { Location = point }; + Assert.Equal(point, rect.Location); + Assert.Equal(point.X, rect.X); + Assert.Equal(point.Y, rect.Y); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(float.MaxValue, float.MinValue)] + public static void SizeSetTest(float x, float y) + { + var size = new SizeF(x, y); + var rect = new RectangleF(10, 10, 10, 10) { Size = size }; + Assert.Equal(size, rect.Size); + Assert.Equal(size.Width, rect.Width); + Assert.Equal(size.Height, rect.Height); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void EqualityTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var rect2 = new RectangleF(width, height, x, y); + + Assert.True(rect1 != rect2); + Assert.False(rect1 == rect2); + Assert.False(rect1.Equals(rect2)); + Assert.False(rect1.Equals((object)rect2)); + } + + [Fact] + public static void EqualityTestNotRectangleF() + { + var rectangle = new RectangleF(0, 0, 0, 0); + Assert.False(rectangle.Equals(null)); + Assert.False(rectangle.Equals(0)); + + // If RectangleF implements IEquatable (e.g. in .NET Core), then classes that are implicitly + // convertible to RectangleF can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToRectangleF = typeof(IEquatable).IsAssignableFrom(rectangle.GetType()); + Assert.Equal(expectsImplicitCastToRectangleF, rectangle.Equals(new Rectangle(0, 0, 0, 0))); + + Assert.False(rectangle.Equals((object)new Rectangle(0, 0, 0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var rect1 = new RectangleF(10, 10, 10, 10); + var rect2 = new RectangleF(10, 10, 10, 10); + Assert.Equal(rect1.GetHashCode(), rect2.GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(20, 10, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 20, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 10, 20, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 10, 10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void ContainsTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + float X = (x + width) / 2; + float Y = (y + height) / 2; + var p = new PointF(X, Y); + var r = new RectangleF(X, Y, width / 2, height / 2); + + Assert.False(rect.Contains(X, Y)); + Assert.False(rect.Contains(p)); + Assert.False(rect.Contains(r)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue / 2, float.MinValue / 2, float.MinValue / 2, float.MaxValue / 2)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void InflateTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + var inflatedRect = new RectangleF(x - width, y - height, width + 2 * width, height + 2 * height); + + rect.Inflate(width, height); + Assert.Equal(inflatedRect, rect); + + var s = new SizeF(x, y); + inflatedRect = RectangleF.Inflate(rect, x, y); + + rect.Inflate(s); + Assert.Equal(inflatedRect, rect); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue / 2, float.MinValue / 2)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void IntersectTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var rect2 = new RectangleF(y, x, width, height); + var expectedRect = RectangleF.Intersect(rect1, rect2); + rect1.Intersect(rect2); + Assert.Equal(expectedRect, rect1); + Assert.False(rect1.IntersectsWith(expectedRect)); + } + + [Fact] + public static void IntersectIntersectingRectsTest() + { + var rect1 = new RectangleF(0, 0, 5, 5); + var rect2 = new RectangleF(1, 1, 3, 3); + var expected = new RectangleF(1, 1, 3, 3); + + Assert.Equal(expected, RectangleF.Intersect(rect1, rect2)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void UnionTest(float x, float y, float width, float height) + { + var a = new RectangleF(x, y, width, height); + var b = new RectangleF(width, height, x, y); + + float x1 = Math.Min(a.X, b.X); + float x2 = Math.Max(a.X + a.Width, b.X + b.Width); + float y1 = Math.Min(a.Y, b.Y); + float y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + var expectedRectangle = new RectangleF(x1, y1, x2 - x1, y2 - y1); + + Assert.Equal(expectedRectangle, RectangleF.Union(a, b)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void OffsetTest(float x, float y, float width, float height) + { + var r1 = new RectangleF(x, y, width, height); + var expectedRect = new RectangleF(x + width, y + height, width, height); + var p = new PointF(width, height); + + r1.Offset(p); + Assert.Equal(expectedRect, r1); + + expectedRect.Offset(p); + r1.Offset(width, height); + Assert.Equal(expectedRect, r1); + } + + [Fact] + public void ToStringTest() + { + var r = new RectangleF(5, 5.1F, 1.3F, 1); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); + } + + [InlineData(0, 0, 0, 0)] + [InlineData(5, -5, 0.2, -1.3)] + public void ToStringTestEmpty(float x, float y, float width, float height) + { + var r = new RectangleF(x, y, width, height); + Assert.Equal("RectangleF [ Empty ]", r.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RectangleTests.cs b/tests/SixLabors.Primitives.Tests/RectangleTests.cs new file mode 100644 index 000000000..24ac4fae1 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RectangleTests.cs @@ -0,0 +1,308 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + + using Xunit; + + /// + /// Tests the struct. + /// + public class RectangleTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Rectangle.Empty, new Rectangle()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void NonDefaultConstructorTest(int x, int y, int width, int height) + { + var rect1 = new Rectangle(x, y, width, height); + var rect2 = new Rectangle(new Point(x, y), new Size(width, height)); + + Assert.Equal(rect1, rect2); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void FromLTRBTest(int left, int top, int right, int bottom) + { + var rect1 = new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); + var rect2 = Rectangle.FromLTRB(left, top, right, bottom); + + Assert.Equal(rect1, rect2); + } + + [Fact] + public void EmptyTest() + { + Assert.True(Rectangle.Empty.IsEmpty); + Assert.True(new Rectangle(0, 0, 0, 0).IsEmpty); + Assert.True(new Rectangle().IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void NonEmptyTest(int x, int y, int width, int height) + { + Assert.False(new Rectangle(x, y, width, height).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + public void DimensionsTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + Assert.Equal(new Point(x, y), rect.Location); + Assert.Equal(new Size(width, height), rect.Size); + + Assert.Equal(x, rect.X); + Assert.Equal(y, rect.Y); + Assert.Equal(width, rect.Width); + Assert.Equal(height, rect.Height); + Assert.Equal(x, rect.Left); + Assert.Equal(y, rect.Top); + Assert.Equal(unchecked(x + width), rect.Right); + Assert.Equal(unchecked(y + height), rect.Bottom); + + var p = new Point(width, height); + var s = new Size(x, y); + rect.Location = p; + rect.Size = s; + + Assert.Equal(p, rect.Location); + Assert.Equal(s, rect.Size); + + Assert.Equal(width, rect.X); + Assert.Equal(height, rect.Y); + Assert.Equal(x, rect.Width); + Assert.Equal(y, rect.Height); + Assert.Equal(width, rect.Left); + Assert.Equal(height, rect.Top); + Assert.Equal(unchecked(x + width), rect.Right); + Assert.Equal(unchecked(y + height), rect.Bottom); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(int.MaxValue, int.MinValue)] + public static void LocationSetTest(int x, int y) + { + var point = new Point(x, y); + var rect = new Rectangle(10, 10, 10, 10) { Location = point }; + Assert.Equal(point, rect.Location); + Assert.Equal(point.X, rect.X); + Assert.Equal(point.Y, rect.Y); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(int.MaxValue, int.MinValue)] + public static void SizeSetTest(int x, int y) + { + var size = new Size(x, y); + var rect = new Rectangle(10, 10, 10, 10) { Size = size }; + Assert.Equal(size, rect.Size); + Assert.Equal(size.Width, rect.Width); + Assert.Equal(size.Height, rect.Height); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + public void EqualityTest(int x, int y, int width, int height) + { + var rect1 = new Rectangle(x, y, width, height); + var rect2 = new Rectangle(width / 2, height / 2, x, y); + + Assert.True(rect1 != rect2); + Assert.False(rect1 == rect2); + Assert.False(rect1.Equals(rect2)); + Assert.False(rect1.Equals((object)rect2)); + } + + [Fact] + public static void EqualityTestNotRectangle() + { + var rectangle = new Rectangle(0, 0, 0, 0); + Assert.False(rectangle.Equals(null)); + Assert.False(rectangle.Equals(0)); + Assert.False(rectangle.Equals(new RectangleF(0, 0, 0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var rect1 = new Rectangle(10, 10, 10, 10); + var rect2 = new Rectangle(10, 10, 10, 10); + Assert.Equal(rect1.GetHashCode(), rect2.GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(20, 10, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 20, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 10, 20, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 10, 10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(0, 0, 0, 0)] + public void RectangleFConversionTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + Rectangle rCeiling, rTruncate, rRound; + + unchecked + { + rCeiling = new Rectangle((int)Math.Ceiling(x), (int)Math.Ceiling(y), + (int)Math.Ceiling(width), (int)Math.Ceiling(height)); + rTruncate = new Rectangle((int)x, (int)y, (int)width, (int)height); + rRound = new Rectangle((int)Math.Round(x), (int)Math.Round(y), + (int)Math.Round(width), (int)Math.Round(height)); + } + + Assert.Equal(rCeiling, Rectangle.Ceiling(rect)); + Assert.Equal(rTruncate, Rectangle.Truncate(rect)); + Assert.Equal(rRound, Rectangle.Round(rect)); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void ContainsTest(int x, int y, int width, int height) + { + var rect = new Rectangle(unchecked(2 * x - width), unchecked(2 * y - height), width, height); + var p = new Point(x, y); + var r = new Rectangle(x, y, width / 2, height / 2); + + Assert.False(rect.Contains(x, y)); + Assert.False(rect.Contains(p)); + Assert.False(rect.Contains(r)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void InflateTest(int x, int y, int width, int height) + { + Rectangle inflatedRect, rect = new Rectangle(x, y, width, height); + unchecked + { + inflatedRect = new Rectangle(x - width, y - height, width + 2 * width, height + 2 * height); + } + + Assert.Equal(inflatedRect, Rectangle.Inflate(rect, width, height)); + + rect.Inflate(width, height); + Assert.Equal(inflatedRect, rect); + + var s = new Size(x, y); + unchecked + { + inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + 2 * x, rect.Height + 2 * y); + } + + rect.Inflate(s); + Assert.Equal(inflatedRect, rect); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void IntersectTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + var expectedRect = Rectangle.Intersect(rect, rect); + rect.Intersect(rect); + Assert.Equal(expectedRect, rect); + Assert.False(rect.IntersectsWith(expectedRect)); + } + + [Fact] + public static void IntersectIntersectingRectsTest() + { + var rect1 = new Rectangle(0, 0, 5, 5); + var rect2 = new Rectangle(1, 1, 3, 3); + var expected = new Rectangle(1, 1, 3, 3); + + Assert.Equal(expected, Rectangle.Intersect(rect1, rect2)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, 0, 0, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void UnionTest(int x, int y, int width, int height) + { + var a = new Rectangle(x, y, width, height); + var b = new Rectangle(width, height, x, y); + + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.X + a.Width, b.X + b.Width); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + var expectedRectangle = new Rectangle(x1, y1, x2 - x1, y2 - y1); + + Assert.Equal(expectedRectangle, Rectangle.Union(a, b)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, 0, 0, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void OffsetTest(int x, int y, int width, int height) + { + var r1 = new Rectangle(x, y, width, height); + var expectedRect = new Rectangle(x + width, y + height, width, height); + var p = new Point(width, height); + + r1.Offset(p); + Assert.Equal(expectedRect, r1); + + expectedRect.Offset(p); + r1.Offset(width, height); + Assert.Equal(expectedRect, r1); + } + + [Fact] + public void ToStringTest() + { + var r = new Rectangle(5, -5, 0, 1); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var r = new Rectangle(0, 0, 0, 0); + Assert.Equal("Rectangle [ Empty ]", r.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs new file mode 100644 index 000000000..bc7a5b810 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs @@ -0,0 +1,122 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using Xunit; + + /// + /// Tests the struct. + /// + public class SignedRationalTests + { + /// + /// Tests the equality operators for equality. + /// + [Fact] + public void AreEqual() + { + SignedRational r1 = new SignedRational(3, 2); + SignedRational r2 = new SignedRational(3, 2); + + Assert.Equal(r1, r2); + Assert.True(r1 == r2); + + SignedRational r3 = new SignedRational(7.55); + SignedRational r4 = new SignedRational(755, 100); + SignedRational r5 = new SignedRational(151, 20); + + Assert.Equal(r3, r4); + Assert.Equal(r4, r5); + } + + /// + /// Tests the equality operators for inequality. + /// + [Fact] + public void AreNotEqual() + { + SignedRational first = new SignedRational(0, 100); + SignedRational second = new SignedRational(100, 100); + + Assert.NotEqual(first, second); + Assert.True(first != second); + } + + /// + /// Tests whether the Rational constructor correctly assign properties. + /// + [Fact] + public void ConstructorAssignsProperties() + { + SignedRational rational = new SignedRational(7, -55); + Assert.Equal(7, rational.Numerator); + Assert.Equal(-55, rational.Denominator); + + rational = new SignedRational(-755, 100); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(20, rational.Denominator); + + rational = new SignedRational(-755, -100, false); + Assert.Equal(-755, rational.Numerator); + Assert.Equal(-100, rational.Denominator); + + rational = new SignedRational(-151, -20); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(-20, rational.Denominator); + + rational = new SignedRational(-7.55); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(20, rational.Denominator); + + rational = new SignedRational(7); + Assert.Equal(7, rational.Numerator); + Assert.Equal(1, rational.Denominator); + } + + [Fact] + public void Fraction() + { + SignedRational first = new SignedRational(1.0 / 1600); + SignedRational second = new SignedRational(1.0 / 1600, true); + Assert.False(first.Equals(second)); + } + + [Fact] + public void ToDouble() + { + SignedRational rational = new SignedRational(0, 0); + Assert.Equal(double.NaN, rational.ToDouble()); + + rational = new SignedRational(2, 0); + Assert.Equal(double.PositiveInfinity, rational.ToDouble()); + + rational = new SignedRational(-2, 0); + Assert.Equal(double.NegativeInfinity, rational.ToDouble()); + } + + [Fact] + public void ToStringRepresention() + { + SignedRational rational = new SignedRational(0, 0); + Assert.Equal("[ Indeterminate ]", rational.ToString()); + + rational = new SignedRational(double.PositiveInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new SignedRational(double.NegativeInfinity); + Assert.Equal("[ NegativeInfinity ]", rational.ToString()); + + rational = new SignedRational(0, 1); + Assert.Equal("0", rational.ToString()); + + rational = new SignedRational(2, 1); + Assert.Equal("2", rational.ToString()); + + rational = new SignedRational(1, 2); + Assert.Equal("1/2", rational.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj new file mode 100644 index 000000000..a300a0b06 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj @@ -0,0 +1,34 @@ + + + + 0.0.0 + netcoreapp1.1 + SixLabors.Shapes.Tests + SixLabors.Shapes.Tests + true + false + false + false + false + false + false + full + + + + + + + + + + + + + + + + + + + diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Primitives.Tests/SizeFTests.cs new file mode 100644 index 000000000..baa16c7e4 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SizeFTests.cs @@ -0,0 +1,163 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + using System.Reflection; + using Xunit; + + public class SizeFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(SizeF.Empty, new SizeF()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorAndDimensionsTest(float width, float height) + { + var s1 = new SizeF(width, height); + var p1 = new PointF(width, height); + var s2 = new SizeF(s1); + + Assert.Equal(s1, s2); + Assert.Equal(s1, new SizeF(p1)); + Assert.Equal(s2, new SizeF(p1)); + + Assert.Equal(width, s1.Width); + Assert.Equal(height, s1.Height); + + s1.Width = 10; + Assert.Equal(10, s1.Width); + + s1.Height = -10.123f; + Assert.Equal(-10.123, s1.Height, 3); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(SizeF.Empty.IsEmpty); + Assert.True(new SizeF().IsEmpty); + Assert.True(new SizeF(0, 0).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + public void IsEmptyRandomTest(float width, float height) + { + Assert.False(new SizeF(width, height).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(float width, float height) + { + var s1 = new SizeF(width, height); + var s2 = new SizeF(height, width); + var addExpected = new SizeF(width + height, width + height); + var subExpected = new SizeF(width - height, height - width); + + Assert.Equal(addExpected, s1 + s2); + Assert.Equal(addExpected, SizeF.Add(s1, s2)); + + Assert.Equal(subExpected, s1 - s2); + Assert.Equal(subExpected, SizeF.Subtract(s1, s2)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(float width, float height) + { + var sLeft = new SizeF(width, height); + var sRight = new SizeF(height, width); + + if (width == height) + { + Assert.True(sLeft == sRight); + Assert.False(sLeft != sRight); + Assert.True(sLeft.Equals(sRight)); + Assert.True(sLeft.Equals((object)sRight)); + Assert.Equal(sLeft.GetHashCode(), sRight.GetHashCode()); + return; + } + + Assert.True(sLeft != sRight); + Assert.False(sLeft == sRight); + Assert.False(sLeft.Equals(sRight)); + Assert.False(sLeft.Equals((object)sRight)); + } + + [Fact] + public static void EqualityTest_NotSizeF() + { + var size = new SizeF(0, 0); + Assert.False(size.Equals(null)); + Assert.False(size.Equals(0)); + + // If SizeF implements IEquatable (e.g in .NET Core), then classes that are implicitly + // convertible to SizeF can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToSizeF = typeof(IEquatable).IsAssignableFrom(size.GetType()); + Assert.Equal(expectsImplicitCastToSizeF, size.Equals(new Size(0, 0))); + + Assert.False(size.Equals((object)new Size(0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var size = new SizeF(10, 10); + Assert.Equal(size.GetHashCode(), new SizeF(10, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new SizeF(20, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new SizeF(10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void ConversionTest(float width, float height) + { + var s1 = new SizeF(width, height); + var p1 = (PointF)s1; + var s2 = new Size(unchecked((int)width), unchecked((int)height)); + + Assert.Equal(new PointF(width, height), p1); + Assert.Equal(p1, (PointF)s1); + Assert.Equal(s2, (Size)s1); + } + + [Fact] + public void ToStringTest() + { + var sz = new SizeF(10, 5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "SizeF [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var sz = new SizeF(0, 0); + Assert.Equal("SizeF [ Empty ]", sz.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Primitives.Tests/SizeTests.cs new file mode 100644 index 000000000..3eabf6221 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SizeTests.cs @@ -0,0 +1,195 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using Xunit; + + /// + /// Tests the struct. + /// + public class SizeTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Size.Empty, new Size()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorTest(int width, int height) + { + var s1 = new Size(width, height); + var s2 = new Size(new Point(width, height)); + + Assert.Equal(s1, s2); + + s1.Width = 10; + Assert.Equal(10, s1.Width); + + s1.Height = -10; + Assert.Equal(-10, s1.Height); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(Size.Empty.IsEmpty); + Assert.True(new Size().IsEmpty); + Assert.True(new Size(0, 0).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + public void IsEmptyRandomTest(int width, int height) + { + Assert.False(new Size(width, height).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DimensionsTest(int width, int height) + { + var p = new Size(width, height); + Assert.Equal(width, p.Width); + Assert.Equal(height, p.Height); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void PointFConversionTest(int width, int height) + { + SizeF sz = new Size(width, height); + Assert.Equal(new SizeF(width, height), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void SizeConversionTest(int width, int height) + { + var sz = (Point)new Size(width, height); + Assert.Equal(new Point(width, height), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(int width, int height) + { + var sz1 = new Size(width, height); + var sz2 = new Size(height, width); + Size addExpected, subExpected; + + unchecked + { + addExpected = new Size(width + height, height + width); + subExpected = new Size(width - height, height - width); + } + + Assert.Equal(addExpected, sz1 + sz2); + Assert.Equal(subExpected, sz1 - sz2); + Assert.Equal(addExpected, Size.Add(sz1, sz2)); + Assert.Equal(subExpected, Size.Subtract(sz1, sz2)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void PointFMathematicalTest(float width, float height) + { + var szF = new SizeF(width, height); + Size pCeiling, pTruncate, pRound; + + unchecked + { + pCeiling = new Size((int)MathF.Ceiling(width), (int)MathF.Ceiling(height)); + pTruncate = new Size((int)width, (int)height); + pRound = new Size((int)MathF.Round(width), (int)MathF.Round(height)); + } + + Assert.Equal(pCeiling, Size.Ceiling(szF)); + Assert.Equal(pRound, Size.Round(szF)); + Assert.Equal(pTruncate, (Size)szF); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(int width, int height) + { + var p1 = new Size(width, height); + var p2 = new Size(unchecked(width - 1), unchecked(height - 1)); + var p3 = new Size(width, height); + + Assert.True(p1 == p3); + Assert.True(p1 != p2); + Assert.True(p2 != p3); + + Assert.True(p1.Equals(p3)); + Assert.False(p1.Equals(p2)); + Assert.False(p2.Equals(p3)); + + Assert.True(p1.Equals((object)p3)); + Assert.False(p1.Equals((object)p2)); + Assert.False(p2.Equals((object)p3)); + + Assert.Equal(p1.GetHashCode(), p3.GetHashCode()); + } + + [Fact] + public static void EqualityTest_NotSize() + { + var size = new Size(0, 0); + Assert.False(size.Equals(null)); + Assert.False(size.Equals(0)); + Assert.False(size.Equals(new SizeF(0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var size = new Size(10, 10); + Assert.Equal(size.GetHashCode(), new Size(10, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new Size(20, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new Size(10, 20).GetHashCode()); + } + + [Fact] + public void ToStringTest() + { + var sz = new Size(10, 5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Size [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var sz = new Size(0, 0); + Assert.Equal("Size [ Empty ]", sz.ToString()); + } + } +} \ No newline at end of file