Skip to content

Commit

Permalink
Merged PR 655: Create V3.2.14
Browse files Browse the repository at this point in the history
* Internal: Updated NuGet packages
* BugFix: Backup and replace invalid database file
* BugFix: Correct sdf export of atom properties
* BugFix: Handle V3.3 structure in library

Related work items: #1102
  • Loading branch information
MikeWilliams-UK committed Dec 20, 2023
1 parent 92fe94d commit e324255
Show file tree
Hide file tree
Showing 72 changed files with 503 additions and 331 deletions.
56 changes: 30 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,54 +24,58 @@ Azure Devops Build must be set to use VS2022 build agent
| Package | Version | Licence | Reference Count |
|--|--|--|--|
|Azure.Core.Amqp|1.3.0|MIT|2|
|Azure.Core|1.34.0|MIT|2|
|Azure.Messaging.ServiceBus|7.16.1|MIT|2|
|DocumentFormat.OpenXml|2.20.0|MIT|2|
|Azure.Core|1.36.0|MIT|2|
|Azure.Messaging.ServiceBus|7.17.1|MIT|2|
|DocumentFormat.OpenXml.Framework|3.0.0||2|
|DocumentFormat.OpenXml|3.0.0|MIT|2|
|DotNetProjects.WpfToolkit.Input|6.1.94|MS-PL|1|
|EntityFramework|6.4.4|Apache-2.0|2|
|Jacobslusser.ScintillaNET|3.6.3|MIT|1|
|Microsoft.Azure.Amqp|2.6.3|MIT|2|
|Microsoft.Bcl.AsyncInterfaces|7.0.0|MIT|2|
|Microsoft.Azure.Amqp|2.6.4|MIT|2|
|Microsoft.Bcl.AsyncInterfaces|8.0.0|MIT|2|
|Microsoft.NETCore.Platforms|7.0.4|MIT|2|
|Microsoft.Xaml.Behaviors.Wpf|1.1.39|MIT|1|
|Microsoft.TestPlatform.ObjectModel|17.8.0||1|
|Microsoft.Xaml.Behaviors.Wpf|1.1.77|MIT|1|
|Microsoft_VisualStudio_QualityTools_UnitTestFramework.STW|12.0.21005.1|Microsoft|1|
|Newtonsoft.Json|13.0.3|MIT|15|
|NuGet.Frameworks|6.8.0||1|
|Ookii.Dialogs.WinForms|4.0.0|Public Domain|1|
|Stub.System.Data.SQLite.Core.NetFramework|1.0.118.0|Public Domain|2|
|System.Buffers|4.5.1|MIT|3|
|System.Collections.Immutable|7.0.0|MIT|1|
|System.Buffers|4.5.1|MIT|4|
|System.Collections.Immutable|8.0.0|MIT|2|
|System.Data.SQLite.Core|1.0.118.0|Public Domain|2|
|System.Data.SQLite.EF6|1.0.118.0|Public Domain|2|
|System.Data.SQLite.Linq|1.0.118.0|Public Domain|2|
|System.Data.SQLite|1.0.118.0|Public Domain|2|
|System.Diagnostics.DiagnosticSource|7.0.2|Public Domain|2|
|System.Diagnostics.DiagnosticSource|8.0.0|Public Domain|2|
|System.IO.FileSystem.Primitives|4.3.0|MS-.NET-Library|2|
|System.IO.Packaging|7.0.0|MIT|2|
|System.Memory.Data|7.0.0|MIT|2|
|System.Memory|4.5.5|MIT|3|
|System.IO.Packaging|8.0.0|MIT|2|
|System.Memory.Data|8.0.0|MIT|2|
|System.Memory|4.5.5|MIT|4|
|System.Net.Http|4.3.4|MS-.NET-Library|9|
|System.Numerics.Vectors|4.5.0|MIT|3|
|System.Resources.Extensions|7.0.0|MIT|1|
|System.Runtime.CompilerServices.Unsafe|6.0.0|MIT|3|
|System.Numerics.Vectors|4.5.0|MIT|4|
|System.Reflection.Metadata|8.0.0||1|
|System.Resources.Extensions|8.0.0|MIT|1|
|System.Runtime.CompilerServices.Unsafe|6.0.0|MIT|4|
|System.Runtime.InteropServices.RuntimeInformation|4.3.0|MS-.NET-Library|2|
|System.Security.Cryptography.Algorithms|4.3.1|MS-.NET-Library|9|
|System.Security.Cryptography.Encoding|4.3.0|MS-.NET-Library|9|
|System.Security.Cryptography.Primitives|4.3.0|MS-.NET-Library|9|
|System.Security.Cryptography.X509Certificates|4.3.2|MS-.NET-Library|9|
|System.Text.Encodings.Web|7.0.0|MIT|2|
|System.Text.Json|7.0.3|MIT|2|
|System.Text.Encodings.Web|8.0.0|MIT|2|
|System.Text.Json|8.0.0|MIT|2|
|System.Threading.Tasks.Extensions|4.5.4|MIT|2|
|System.ValueTuple|4.5.0|MIT|5|
|System.ValueTuple|4.5.0|MIT|6|
|Unofficial.Ionic.Zip|1.9.1.8|Unknown ?|3|
|xunit.abstractions|2.0.3|Apache-2.0|1|
|xunit.analyzers|1.2.0|Apache-2.0|1|
|xunit.assert|2.5.0|Apache-2.0|1|
|xunit.core|2.5.0|Apache-2.0|1|
|xunit.extensibility.core|2.5.0|Apache-2.0|1|
|xunit.extensibility.execution|2.5.0|Apache-2.0|1|
|xunit.runner.console|2.5.0|Apache-2.0|1|
|xunit.runner.visualstudio|2.5.0|Apache-2.0|1|
|xunit|2.5.0|Apache-2.0|1|
|xunit.analyzers|1.7.0|Apache-2.0|1|
|xunit.assert|2.6.3|Apache-2.0|1|
|xunit.core|2.6.3|Apache-2.0|1|
|xunit.extensibility.core|2.6.3|Apache-2.0|1|
|xunit.extensibility.execution|2.6.3|Apache-2.0|1|
|xunit.runner.console|2.6.3|Apache-2.0|1|
|xunit.runner.visualstudio|2.5.5|Apache-2.0|1|
|xunit|2.6.3|Apache-2.0|1|

## Acknowledgements
1. [CEVOpen](https://github.com/petermr/CEVOpen) - This data represents about 2100 unique chemical names of volatile plant chemicals (essential oils) from the EssoilDB 1.0 database (compiled from the scientific literature over about 10 years in Dr Yadav's laboratory). They are made available for re-use by anyone for any purpose (CC0). We would appreciate acknowledgement of EssoilDB and the following people who extracted and cleaned the data during 2019. (Gitanjali Yadav, Ambarish Kumar, Peter Murray-Rust).
Expand Down
3 changes: 2 additions & 1 deletion src/Chem4Word.V3-2.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,13 @@
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INT_ALIGN_SWITCH_SECTIONS/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/USE_INDENT_FROM_VS/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/FileHeader/FileHeaderText/@EntryValue">---------------------------------------------------------------------------&#xD;
Copyright (c) $CURRENT_YEAR$, The .NET Foundation.&#xD;
Copyright (c) ${CurrentDate.Year}, The .NET Foundation.&#xD;
This software is released under the Apache License, Version 2.0.&#xD;
The license and further copyright text can be found in the file LICENSE.md&#xD;
at the root directory of the distribution.&#xD;
---------------------------------------------------------------------------&#xD;
</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECodeCleanup_002EFileHeader_002EFileHeaderSettingsMigrate/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
Expand Down
45 changes: 24 additions & 21 deletions src/Chem4Word.V3/Chem4Word.V3.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,20 @@
-->
<ItemGroup>
<Reference Include="Accessibility" />
<Reference Include="Azure.Core, Version=1.34.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8, processorArchitecture=MSIL">
<HintPath>..\packages\Azure.Core.1.34.0\lib\net461\Azure.Core.dll</HintPath>
<Reference Include="Azure.Core, Version=1.36.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8, processorArchitecture=MSIL">
<HintPath>..\packages\Azure.Core.1.36.0\lib\net461\Azure.Core.dll</HintPath>
</Reference>
<Reference Include="Azure.Core.Amqp, Version=1.3.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8, processorArchitecture=MSIL">
<HintPath>..\packages\Azure.Core.Amqp.1.3.0\lib\netstandard2.0\Azure.Core.Amqp.dll</HintPath>
</Reference>
<Reference Include="Azure.Messaging.ServiceBus, Version=7.16.1.0, Culture=neutral, PublicKeyToken=92742159e12e44c8, processorArchitecture=MSIL">
<HintPath>..\packages\Azure.Messaging.ServiceBus.7.16.1\lib\netstandard2.0\Azure.Messaging.ServiceBus.dll</HintPath>
<Reference Include="Azure.Messaging.ServiceBus, Version=7.17.1.0, Culture=neutral, PublicKeyToken=92742159e12e44c8, processorArchitecture=MSIL">
<HintPath>..\packages\Azure.Messaging.ServiceBus.7.17.1\lib\netstandard2.0\Azure.Messaging.ServiceBus.dll</HintPath>
</Reference>
<Reference Include="DocumentFormat.OpenXml, Version=2.20.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
<HintPath>..\packages\DocumentFormat.OpenXml.2.20.0\lib\net46\DocumentFormat.OpenXml.dll</HintPath>
<Reference Include="DocumentFormat.OpenXml, Version=3.0.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
<HintPath>..\packages\DocumentFormat.OpenXml.3.0.0\lib\net40\DocumentFormat.OpenXml.dll</HintPath>
</Reference>
<Reference Include="DocumentFormat.OpenXml.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
<HintPath>..\packages\DocumentFormat.OpenXml.Framework.3.0.0\lib\net46\DocumentFormat.OpenXml.Framework.dll</HintPath>
</Reference>
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
Expand All @@ -179,10 +182,10 @@
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Azure.Amqp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.Amqp.2.6.3\lib\net45\Microsoft.Azure.Amqp.dll</HintPath>
<HintPath>..\packages\Microsoft.Azure.Amqp.2.6.4\lib\net45\Microsoft.Azure.Amqp.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
<EmbedInteropTypes>True</EmbedInteropTypes>
Expand Down Expand Up @@ -228,23 +231,23 @@
<HintPath>..\packages\System.Data.SQLite.Linq.1.0.118.0\lib\net46\System.Data.SQLite.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Design" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=7.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.7.0.2\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
<Reference Include="System.Diagnostics.DiagnosticSource, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.8.0.0\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.IdentityModel" />
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.IO.Packaging, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Packaging.7.0.0\lib\net462\System.IO.Packaging.dll</HintPath>
<Reference Include="System.IO.Packaging, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Packaging.8.0.0\lib\net462\System.IO.Packaging.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Memory.Data, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.Data.7.0.0\lib\net462\System.Memory.Data.dll</HintPath>
<Reference Include="System.Memory.Data, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.Data.8.0.0\lib\net462\System.Memory.Data.dll</HintPath>
</Reference>
<Reference Include="System.Net" />
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
Expand All @@ -257,8 +260,8 @@
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Resources.Extensions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Resources.Extensions.7.0.0\lib\net462\System.Resources.Extensions.dll</HintPath>
<Reference Include="System.Resources.Extensions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Resources.Extensions.8.0.0\lib\net462\System.Resources.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Runtime" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
Expand Down Expand Up @@ -290,11 +293,11 @@
<Private>True</Private>
</Reference>
<Reference Include="System.ServiceModel" />
<Reference Include="System.Text.Encodings.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encodings.Web.7.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
<Reference Include="System.Text.Encodings.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
</Reference>
<Reference Include="System.Text.Json, Version=7.0.0.3, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Json.7.0.3\lib\net462\System.Text.Json.dll</HintPath>
<Reference Include="System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Json.8.0.0\lib\net462\System.Text.Json.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
Expand Down
31 changes: 20 additions & 11 deletions src/Chem4Word.V3/Chem4WordV3.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,11 @@ public partial class Chem4WordV3
private string _lastContentControlAdded = "";

private bool _chemistrySelected;
private int _rightClickEvents;
private bool _markAsChemistryHandled;

public bool OptionsReloadRequired = false;
private int _rightClickEvents;

private ConfigWatcher _configWatcher;

public bool LibraryState;
Expand Down Expand Up @@ -212,7 +213,7 @@ private void C4WAddIn_Startup(object sender, EventArgs e)
var cmd = Environment.CommandLine.ToLower();
if (Ribbon != null && !cmd.Contains("-embedding"))
{
var message = $"{module} started at {SafeDate.ToLongDate(DateTime.Now)}";
var message = $"{module} started at {SafeDate.ToLongDate(DateTime.UtcNow)}";
Debug.WriteLine(message);
StartUpTimings.Add(message);

Expand Down Expand Up @@ -292,7 +293,7 @@ private void SlowOperations()

try
{
var message = $"{module} started at {SafeDate.ToLongDate(DateTime.Now)}";
var message = $"{module} started at {SafeDate.ToLongDate(DateTime.UtcNow)}";

Debug.WriteLine(message);
StartUpTimings.Add(message);
Expand Down Expand Up @@ -425,6 +426,11 @@ public void LoadNamesFromLibrary()
var module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod()?.Name}()";
try
{
if (LibraryOptions == null)
{
LoadOptions();
}

if (LibraryOptions != null)
{
var lib = new Libraries.Database.Library(Telemetry, LibraryOptions);
Expand Down Expand Up @@ -622,8 +628,8 @@ private void PerformShutDownActions()
}
}

GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
finally
{
Expand Down Expand Up @@ -675,7 +681,7 @@ private void LoadPlugIns(bool mustBeSigned)
{
var module = $"{MethodBase.GetCurrentMethod().Name}()";
// http://www.codeproject.com/Articles/453778/Loading-Assemblies-from-Anywhere-into-a-New-AppDom
var message = $"{module} started at {SafeDate.ToLongDate(DateTime.Now)}";
var message = $"{module} started at {SafeDate.ToLongDate(DateTime.UtcNow)}";
StartUpTimings.Add(message);
Debug.WriteLine(message);

Expand Down Expand Up @@ -1380,7 +1386,6 @@ private void OnCommandBarButtonClick(CommandBarButton ctrl, ref bool cancelDefau

_rightClickEvents++;

ClearChemistryContextMenus();
if (!_markAsChemistryHandled)
{
var targetWord = JsonConvert.DeserializeObject<TargetWord>(ctrl.Tag);
Expand Down Expand Up @@ -1431,9 +1436,9 @@ private void OnCommandBarButtonClick(CommandBarButton ctrl, ref bool cancelDefau

#endregion Find Id of name

// Test phrases (ensure benzene is in your library)
// Test phrases (ensure benzene and cyclopropane are in your library)
// This is benzene, this is not.
// This is benzene. This is not.
// This is cyclopropane. This is not.

Word.ContentControl contentControl = null;
var wordSettings = new WordSettings(Application);
Expand All @@ -1449,7 +1454,7 @@ private void OnCommandBarButtonClick(CommandBarButton ctrl, ref bool cancelDefau
Application.Selection.SetRange(insertionPoint, insertionPoint);

var tag = $"{tagPrefix}:{model.CustomXmlPartGuid}";
contentControl = ChemistryHelper.Insert1DChemistry(doc, targetWord.ChemicalName, true, tag);
contentControl = ChemistryHelper.Insert1DChemistry(doc, targetWord.ChemicalName, false, tag);

Telemetry.Write(module, "Information", $"Inserted 1D version of {targetWord.ChemicalName} from library");
}
Expand All @@ -1472,6 +1477,7 @@ private void OnCommandBarButtonClick(CommandBarButton ctrl, ref bool cancelDefau
}
}

ClearChemistryContextMenus();
_markAsChemistryHandled = true;
}
}
Expand Down Expand Up @@ -1612,8 +1618,6 @@ private void AddChemistryMenuPopup(List<TargetWord> selectedWords)

try
{
ClearChemistryContextMenus();

if (Application.Documents.Count > 0)
{
var vstoObject = WordExtensions.DocumentExtensions.GetVstoObject(Application.ActiveDocument, Globals.Factory);
Expand Down Expand Up @@ -1691,6 +1695,11 @@ private void ClearChemistryContextMenus()
{
RegistryHelper.StoreException(module, exception);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}

#endregion Right Click
Expand Down
Loading

0 comments on commit e324255

Please sign in to comment.