Skip to content

Commit

Permalink
Merge branch 'constructor-performance' into 'main'
Browse files Browse the repository at this point in the history
Improve constructor performance

See merge request Wacton/Unicolour!68
  • Loading branch information
waacton committed Oct 18, 2024
2 parents ad28462 + 0a629a0 commit dc70ed5
Show file tree
Hide file tree
Showing 18 changed files with 192 additions and 24 deletions.
20 changes: 20 additions & 0 deletions .run/Example.Console.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Console" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/Example.Console/bin/Debug/net8.0/win-x64/Wacton.Unicolour.Example.Console.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/Example.Console/bin/Debug/net8.0/win-x64" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Example.Console/Example.Console.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="net8.0" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
20 changes: 20 additions & 0 deletions .run/Example.Diagrams.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Diagrams" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/Example.Diagrams/bin/Debug/net8.0/Wacton.Unicolour.Example.Diagrams.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/Example.Diagrams/bin/Debug/net8.0" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Example.Diagrams/Example.Diagrams.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="net8.0" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
20 changes: 20 additions & 0 deletions .run/Example.Gradients.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Gradients" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/Example.Gradients/bin/Debug/net8.0/Wacton.Unicolour.Example.Gradients.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/Example.Gradients/bin/Debug/net8.0" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Example.Gradients/Example.Gradients.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="net8.0" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
20 changes: 20 additions & 0 deletions .run/Example.Heatmaps.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Heatmaps" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/Example.Heatmaps/bin/Debug/net8.0/Wacton.Unicolour.Example.Heatmaps.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/Example.Heatmaps/bin/Debug/net8.0" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Example.Heatmaps/Example.Heatmaps.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="net8.0" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
17 changes: 17 additions & 0 deletions .run/Example.Web_ IIS Express.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Web: IIS Express" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Example.Web/Example.Web.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="IIS Express" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
17 changes: 17 additions & 0 deletions .run/Example.Web_ http.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Web: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Example.Web/Example.Web.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
17 changes: 17 additions & 0 deletions .run/Example.Web_ https.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Example.Web: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Example.Web/Example.Web.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
6 changes: 6 additions & 0 deletions .run/Publish Example.Web to folder.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Publish Example.Web to folder" type="DotNetFolderPublish" factoryName="Publish to folder">
<riderPublish configuration="Release" platform="Any CPU" self_contained="true" target_folder="$PROJECT_DIR$/Example.Web/bin/Release/net8.0/publish" target_framework="net8.0" uuid_high="1038597555020318423" uuid_low="-8592506992553309891" />
<method v="2" />
</configuration>
</component>
20 changes: 20 additions & 0 deletions .run/Unicolour.Readme.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Unicolour.Readme" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/Unicolour.Readme/bin/Debug/net8.0/Wacton.Unicolour.Readme.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/Unicolour.Readme/bin/Debug/net8.0" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Unicolour.Readme/Unicolour.Readme.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="net8.0" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[![GitLab](https://badgen.net/static/gitlab/source/ff1493?icon=gitlab)](https://gitlab.com/Wacton/Unicolour)
[![NuGet](https://badgen.net/nuget/v/Wacton.Unicolour?icon)](https://www.nuget.org/packages/Wacton.Unicolour/)
[![pipeline status](https://gitlab.com/Wacton/Unicolour/badges/main/pipeline.svg)](https://gitlab.com/Wacton/Unicolour/-/commits/main)
[![tests passed](https://badgen.net/static/tests/174,380/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![tests passed](https://badgen.net/static/tests/174,384/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![coverage report](https://gitlab.com/Wacton/Unicolour/badges/main/coverage.svg)](https://gitlab.com/Wacton/Unicolour/-/pipelines)

Unicolour is the most comprehensive .NET library for working with colour:
Expand Down
2 changes: 1 addition & 1 deletion Unicolour.Readme/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[![GitLab](https://badgen.net/static/gitlab/source/ff1493?icon=gitlab)](https://gitlab.com/Wacton/Unicolour)
[![NuGet](https://badgen.net/nuget/v/Wacton.Unicolour?icon)](https://www.nuget.org/packages/Wacton.Unicolour/)
[![pipeline status](https://gitlab.com/Wacton/Unicolour/badges/main/pipeline.svg)](https://gitlab.com/Wacton/Unicolour/-/commits/main)
[![tests passed](https://badgen.net/static/tests/174,380/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![tests passed](https://badgen.net/static/tests/174,384/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![coverage report](https://gitlab.com/Wacton/Unicolour/badges/main/coverage.svg)](https://gitlab.com/Wacton/Unicolour/-/pipelines)

Unicolour is the most comprehensive .NET library for working with colour:
Expand Down
15 changes: 11 additions & 4 deletions Unicolour.Tests/SmokeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -283,12 +283,19 @@ public void TemperatureWithLocusAndLuminance(
AssertNoError(expected, new Unicolour(Configuration.Default, cct, locus, luminance));
}

private static readonly Spd monochromaticSpd = new() { { 580, 1.0 } };
private static readonly Spd twoNmSpd = new() { { 578, 0.25 }, { 580, 1.0 }, { 582, 0.75 } };
private static readonly Spd fiveNmSpd = new() { { 575, 0.25 }, { 580, 1.0 }, { 585, 0.75 } };
private static readonly Spd noPowerSpd = new();
private static readonly List<Spd> SpdValues = [Spd.D65, monochromaticSpd, twoNmSpd, fiveNmSpd, noPowerSpd];

[Test]
public void SpectralPowerDistribution()
public void SpectralPowerDistribution(
[ValueSource(nameof(SpdValues))] Spd spd)
{
var expected = new Unicolour(Spd.D65);
AssertNoError(expected, new Unicolour(Spd.D65));
AssertNoError(expected, new Unicolour(Configuration.Default, Spd.D65));
var expected = new Unicolour(spd);
AssertNoError(expected, new Unicolour(spd));
AssertNoError(expected, new Unicolour(Configuration.Default, spd));
}

private static readonly List<double[]> IccValues = [[0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0], [0.5, 0.5, 0.5, 0.5]];
Expand Down
1 change: 1 addition & 0 deletions Unicolour.Tests/Utils/TestUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ void AccessProperties()
AccessProperty(() => unicolour.Yuv);
AccessProperty(() => unicolour.Yiq);
AccessProperty(() => unicolour.Ydbdr);
AccessProperty(unicolour.ToString);
}

void AccessProperty(Func<object> getProperty)
Expand Down
3 changes: 3 additions & 0 deletions Unicolour.sln.DotSettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=unicolour/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=wacton/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
12 changes: 6 additions & 6 deletions Unicolour/Unicolour.Constructors.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ public Unicolour(string hex, double alphaOverride) :
public Unicolour(Configuration config, string hex) :
this(config, ColourSpace.Rgb, Parse(hex))
{
source = $"{nameof(Hex)} {hex}";
source = new Lazy<string>(() => $"{nameof(Hex)} {hex}");
}

public Unicolour(Configuration config, string hex, double alphaOverride) :
this(config, ColourSpace.Rgb, Parse(hex) with { a = alphaOverride })
{
source = $"{nameof(Hex)} {hex}";
source = new Lazy<string>(() => $"{nameof(Hex)} {hex}");
}

/* construction from chromaticity */
Expand All @@ -67,7 +67,7 @@ public Unicolour(Chromaticity chromaticity, double luminance = 1.0) :
public Unicolour(Configuration config, Chromaticity chromaticity, double luminance = 1.0) :
this(config, ColourSpace.Xyy, chromaticity.X, chromaticity.Y, luminance)
{
source = $"{nameof(Chromaticity)} {chromaticity}";
source = new Lazy<string>(() => $"{nameof(Chromaticity)} {chromaticity}");
}

/* construction from temperature */
Expand All @@ -90,7 +90,7 @@ public Unicolour(Configuration config, Temperature temperature, double luminance
this(config, ColourSpace.Xyy, TemperatureToXyyTuple(temperature, config.Xyz.Observer, luminance))
{
this.temperature = new Lazy<Temperature>(() => temperature);
source = $"{nameof(Temperature)} {temperature}";
source = new Lazy<string>(() => $"{nameof(Temperature)} {temperature}");
}

private static (double x, double y, double upperY, double alpha) TemperatureToXyyTuple(Temperature temperature, Observer observer, double luminance)
Expand All @@ -108,7 +108,7 @@ public Unicolour(Spd spd) :
public Unicolour(Configuration config, Spd spd) :
this(config, ColourSpace.Xyz, SpdToXyzTuple(spd, config.Xyz.Observer))
{
source = $"{nameof(Spd)} {spd}";
source = new Lazy<string>(() => $"{nameof(Spd)} {spd}");
}

private static (double x, double y, double z, double alpha) SpdToXyzTuple(Spd spd, Observer observer)
Expand All @@ -127,7 +127,7 @@ public Unicolour(Configuration config, Channels channels, double alpha = 1.0) :
this(config, config.Icc.ConnectingSpace, IccToTuple(channels, config.Icc, config.Xyz), alpha)
{
icc = new Lazy<Channels>(() => channels);
source = $"{nameof(Icc)} {channels}";
source = new Lazy<string>(() => $"{nameof(Icc)} {channels}");
}

private static (double x, double y, double z) IccToTuple(Channels channels, IccConfiguration iccConfig, XyzConfiguration xyzConfig)
Expand Down
20 changes: 10 additions & 10 deletions Unicolour/Unicolour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,13 @@ public partial class Unicolour : IEquatable<Unicolour>
private readonly Lazy<Hct> hct;
private readonly Lazy<Channels> icc;
private readonly Lazy<Temperature> temperature;

internal readonly ColourRepresentation InitialRepresentation;
internal readonly ColourSpace InitialColourSpace;
private readonly string source;
private readonly Lazy<string> source;

public Alpha Alpha { get; }
public Configuration Config { get; }
internal readonly ColourSpace InitialColourSpace;
internal readonly ColourRepresentation InitialRepresentation;

public Rgb Rgb => rgb.Value;
public RgbLinear RgbLinear => rgbLinear.Value;
public Hsb Hsb => hsb.Value;
Expand Down Expand Up @@ -82,8 +84,6 @@ public partial class Unicolour : IEquatable<Unicolour>
public Cam16 Cam16 => cam16.Value;
public Hct Hct => hct.Value;
public Channels Icc => icc.Value;
public Alpha Alpha { get; }
public Configuration Config { get; }

public string Hex => isUnseen ? UnseenName : !IsInDisplayGamut ? "-" : Rgb.Byte255.ConstrainedHex;
public bool IsInDisplayGamut => Rgb.IsInGamut;
Expand All @@ -108,9 +108,9 @@ internal Unicolour(Configuration config, ColourHeritage heritage,

Config = config;
Alpha = new Alpha(alpha);
InitialRepresentation = CreateRepresentation(colourSpace, first, second, third, config, heritage);
InitialColourSpace = colourSpace;

InitialRepresentation = CreateRepresentation(colourSpace, first, second, third, config, heritage);

rgb = new Lazy<Rgb>(EvaluateRgb);
rgbLinear = new Lazy<RgbLinear>(EvaluateRgbLinear);
hsb = new Lazy<Hsb>(EvaluateHsb);
Expand Down Expand Up @@ -155,7 +155,7 @@ internal Unicolour(Configuration config, ColourHeritage heritage,
: Channels.UncalibratedFromRgb(Rgb));

temperature = new Lazy<Temperature>(() => Temperature.FromChromaticity(Chromaticity, Config.Xyz.Planckian));
source = $"{InitialColourSpace} {InitialRepresentation}";
source = new Lazy<string>(() => $"{InitialColourSpace} {InitialRepresentation}");
}

public double Contrast(Unicolour other) => Comparison.Contrast(this, other);
Expand Down Expand Up @@ -188,7 +188,7 @@ public Unicolour ConvertToConfiguration(Configuration newConfig)

public override string ToString()
{
var parts = new List<string> { $"from {source}", $"alpha {Alpha}" };
var parts = new List<string> { $"from {source.Value}", $"alpha {Alpha}" };
if (Description != ColourDescription.NotApplicable.ToString())
{
parts.Add(Description);
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[![GitLab](https://badgen.net/static/gitlab/source/ff1493?icon=gitlab)](https://gitlab.com/Wacton/Unicolour)
[![NuGet](https://badgen.net/nuget/v/Wacton.Unicolour?icon)](https://www.nuget.org/packages/Wacton.Unicolour/)
[![pipeline status](https://gitlab.com/Wacton/Unicolour/badges/main/pipeline.svg)](https://gitlab.com/Wacton/Unicolour/-/commits/main)
[![tests passed](https://badgen.net/static/tests/174,380/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![tests passed](https://badgen.net/static/tests/174,384/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![coverage report](https://gitlab.com/Wacton/Unicolour/badges/main/coverage.svg)](https://gitlab.com/Wacton/Unicolour/-/pipelines)

Unicolour is the most comprehensive .NET library for working with colour:
Expand Down
2 changes: 1 addition & 1 deletion docs/README_us.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[![GitLab](https://badgen.net/static/gitlab/source/ff1493?icon=gitlab)](https://gitlab.com/Wacton/Unicolour)
[![NuGet](https://badgen.net/nuget/v/Wacton.Unicolour?icon)](https://www.nuget.org/packages/Wacton.Unicolour/)
[![pipeline status](https://gitlab.com/Wacton/Unicolour/badges/main/pipeline.svg)](https://gitlab.com/Wacton/Unicolour/-/commits/main)
[![tests passed](https://badgen.net/static/tests/174,380/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![tests passed](https://badgen.net/static/tests/174,384/green/)](https://gitlab.com/Wacton/Unicolour/-/pipelines)
[![coverage report](https://gitlab.com/Wacton/Unicolour/badges/main/coverage.svg)](https://gitlab.com/Wacton/Unicolour/-/pipelines)

Unicolour is the most comprehensive .NET library for working with color:
Expand Down

0 comments on commit dc70ed5

Please sign in to comment.