Skip to content

Commit de82772

Browse files
shargonJim8yNeo Dev BotWi1l-B0t
authored
Master n3 to master (#1478)
* Update neo submodule to master-n3 (#1453) Co-authored-by: Neo Dev Bot <dev@neo.local> * Use stable framework package in templates (#1456) * Add: FindOptions.Backwards definition (#1458) * Add: IsContract for ContractManagement (#1454) (#1455) Co-authored-by: Will <201105916+Wi1l-B0t@users.noreply.github.com> * CI: run on master-n3 (#1459) * Update neo (#1463) * Upgrade devpack to Neo v3.9.0 (#1464) * Upgrade devpack to Neo v3.9.0 * Restore manifest version in test artifacts * Add: comment doc for Framework.Services (#1460) (#1467) * Fix: remove many compiler warnings (#1461) (#1469) * Reorder (#1472) * Fix CS0067 warning in artifacts (#1474) * Avoid CS0067 in artifacts * one more * Add: comments doc for ContractMethod CallFlags (#1479) * Add reference (#1476) * docs: Clarify Base58CheckDecode FAULT behavior in UInt160.Parse (#1483) Update documentation to warn that invalid Base58Check addresses will cause execution to FAULT (abort) rather than throw a catchable exception. Fixes #1443 * fix: HexStringInterpreter regex should only accept hex characters (#1484) Change regex from [a-zA-Z0-9_] to [a-fA-F0-9] to properly validate hexadecimal strings (0-9, a-f, A-F only). Fixes #1264 * docs: Add optimizer documentation (#1481) * docs: Add optimizer documentation Document the bytecode optimization strategies including: - Peephole optimization - Jump compression - Reachability analysis - Miscellaneous optimizations Also includes architecture overview and usage instructions. * docs: add OptimizationType enum options to optimizer documentation * fix(compiler): extend division overflow check and improve temp file security (#1485) * fix(compiler): extend division overflow check to IntPtr type - Add comprehensive documentation for CheckDivideOverflow method - Extend overflow check to include IntPtr (nint) type - Use BigInteger for consistent handling of min values - Add clear comments explaining which types need/don't need overflow checks Fixes HIGH-002 from security audit * test: add unit tests for division overflow fix Demonstrates the IntPtr (nint) division overflow issue and fix: - Before fix: nint.MinValue / -1 would silently overflow - After fix: properly throws in checked context Tests cover Int32, Int64, IntPtr, and BigInteger division scenarios. * fix: remove unsupported nint/nuint types from tests Neo compiler does not support nint/nuint (IntPtr/UIntPtr) types. Removed IntPtr handling from division overflow check and tests. * test: add testing artifacts for division overflow and shift contracts - Add Contract_DivisionOverflow.cs testing artifact - Update Contract_shift.cs with new shift methods All 938 tests pass locally. * chore: revert neo submodule to master-n3 version * fix: Support Event?.Invoke() conditional invocation pattern (#1482) Add support for invoking events using the null-conditional operator. When calling Event?.Invoke(...), the compiler now correctly recognizes this as an event invocation and emits the appropriate System.Runtime.Notify call. Fixes #1093 * Update examples for Neo v3.9 (#1465) * Update examples for v3.9 * chore: Remove example nef and manifest artifacts Remove compiled artifacts from examples as requested in PR review. These files should be generated during build, not committed. * refactor: replace neo submodule with NuGet package references (Neo 3.9.1) (#1489) * refactor: replace neo submodule with NuGet package references (Neo 3.9.1) - Remove neo submodule dependency - Update project references to use NuGet packages: - Neo 3.9.1 - Neo.Extensions 3.9.1 - Neo.IO 3.9.1 - Neo.Json 3.9.1 - Simplify CI workflow by removing submodule-related version extraction - Fix PublishPackage job that was failing due to empty VERSION_NEO variable * fix: workflow should support both master and master-n3 branches * fix: restore Release job in workflow * fix: remove neo submodule projects from solution file * fix: handle partial class compilation with correct SemanticModel (#1488) * fix: handle partial class compilation with correct SemanticModel - Add SemanticModelExtensions.GetModelForNode() helper method - Fix Expression.cs to check syntax tree before GetConstantValue - Fix InvocationExpression.cs to get correct model for GetSymbolInfo - Fix SourceConvert.cs to get correct model for GetTypeInfo This fixes NC5001 errors when compiling contracts with partial classes (e.g., Example.SmartContract.NFT) where syntax nodes may come from different syntax trees than the current semantic model. Closes #1363 * test: add unit tests for partial class cross-file compilation Tests the fix for issue #1363 where syntax nodes from different syntax trees caused NC5001 errors during compilation. New tests cover: - Cross-file method invocations in partial classes - Expression-bodied members using constants from other files - Complex expressions using both constants and methods across files * refactor: use GetModelForNode helper in TryConvertConstant Apply review suggestion to use the GetModelForNode extension method instead of inline syntax tree check. This allows constant evaluation to work across partial class files. --------- Co-authored-by: Jimmy <jimmy@r3e.network> Co-authored-by: Neo Dev Bot <dev@neo.local> Co-authored-by: Will <201105916+Wi1l-B0t@users.noreply.github.com>
1 parent f0519c2 commit de82772

242 files changed

Lines changed: 2667 additions & 451 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/main.yml

Lines changed: 7 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: .NET Core Test and Publish
22

33
on:
44
push:
5-
branches: [master]
5+
branches: [master, master-n3]
66
pull_request:
77
workflow_dispatch:
88

@@ -27,7 +27,6 @@ jobs:
2727
uses: actions/checkout@v5
2828
with:
2929
fetch-depth: 0
30-
submodules: recursive
3130
- name: Setup .NET Core
3231
uses: actions/setup-dotnet@v5
3332
with:
@@ -94,7 +93,7 @@ jobs:
9493
file: ${{ github.workspace }}/coverage/lcov.info
9594

9695
PublishPackage:
97-
if: github.ref == 'refs/heads/master'
96+
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/master-n3'
9897
needs: Test
9998
runs-on: ubuntu-latest
10099
timeout-minutes: 20
@@ -103,18 +102,13 @@ jobs:
103102
uses: actions/checkout@v5
104103
with:
105104
fetch-depth: 0
106-
submodules: recursive
107105
- name: Setup .NET Core
108106
uses: actions/setup-dotnet@v5
109107
with:
110108
dotnet-version: ${{ env.DOTNET_VERSION }}
111109

112110
- name: Set Version (dev-pack)
113111
run: git rev-list --count HEAD | xargs printf 'CI%05d' | xargs -I{} echo 'VERSION_SUFFIX={}' >> $GITHUB_ENV
114-
- name: Set Version (Neo)
115-
run: |
116-
git --git-dir=./neo/.git rev-list --count HEAD | xargs printf 'CI%05d' | xargs -I{} echo 'VERSION_SUFFIX_NEO={}' >> $GITHUB_ENV
117-
sed -n 's/.*<VersionPrefix>\(.*\)<\/VersionPrefix>.*/\1/p' ./neo/src/Directory.Build.props | xargs -I{} echo 'VERSION_NEO={}' >> $GITHUB_ENV
118112

119113
# Build and publish packages in dependency order
120114
- name: Pack Neo.SmartContract.Framework
@@ -138,27 +132,12 @@ jobs:
138132
--output ./out \
139133
--version-suffix ${{ env.VERSION_SUFFIX }}
140134
141-
- name: Prepare and Pack Neo.SmartContract.Testing
135+
- name: Pack Neo.SmartContract.Testing
142136
run: |
143-
# Backup project file
144-
cp ./src/Neo.SmartContract.Testing/Neo.SmartContract.Testing.csproj \
145-
./src/Neo.SmartContract.Testing/Neo.SmartContract.Testing.csproj.backup
146-
147-
# Replace Neo reference with package
148-
dotnet remove ./src/Neo.SmartContract.Testing/Neo.SmartContract.Testing.csproj reference '..\..\neo\src\Neo\Neo.csproj'
149-
dotnet add ./src/Neo.SmartContract.Testing/Neo.SmartContract.Testing.csproj package 'Neo' --version ${{ env.VERSION_NEO }}-${{ env.VERSION_SUFFIX_NEO }}
150-
151-
# Build and pack
152-
dotnet build ./src/Neo.SmartContract.Testing -f net10.0
153137
dotnet pack ./src/Neo.SmartContract.Testing \
154-
--no-build \
155138
--configuration Debug \
156139
--output ./out \
157140
--version-suffix ${{ env.VERSION_SUFFIX }}
158-
159-
# Restore project file
160-
mv ./src/Neo.SmartContract.Testing/Neo.SmartContract.Testing.csproj.backup \
161-
./src/Neo.SmartContract.Testing/Neo.SmartContract.Testing.csproj
162141
163142
- name: Pack Neo.Compiler.CSharp
164143
run: |
@@ -201,7 +180,6 @@ jobs:
201180
uses: actions/checkout@v5
202181
with:
203182
fetch-depth: 0
204-
submodules: recursive
205183
- name: Get version
206184
id: get_version
207185
run: |
@@ -220,54 +198,21 @@ jobs:
220198
- name: Build nccs compiler for multiple platforms
221199
if: steps.check_tag.outputs.statusCode == '404'
222200
run: |
223-
# Build for different platforms
224-
echo "Building nccs for Windows x64..."
225201
dotnet publish ./src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true /p:PublishReadyToRun=true -o ./nccs-win-x64
226-
227-
echo "Building nccs for Linux x64..."
228202
dotnet publish ./src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj -c Release -r linux-x64 --self-contained true /p:PublishSingleFile=true /p:PublishReadyToRun=true -o ./nccs-linux-x64
229-
230-
echo "Building nccs for macOS x64..."
231203
dotnet publish ./src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj -c Release -r osx-x64 --self-contained true /p:PublishSingleFile=true /p:PublishReadyToRun=true -o ./nccs-osx-x64
232-
233-
echo "Building nccs for macOS ARM64..."
234204
dotnet publish ./src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj -c Release -r osx-arm64 --self-contained true /p:PublishSingleFile=true /p:PublishReadyToRun=true -o ./nccs-osx-arm64
235-
236-
# Rename executables to have consistent naming
237-
# Windows: Neo.Compiler.CSharp.exe -> nccs.exe
238-
if [ -f "./nccs-win-x64/Neo.Compiler.CSharp.exe" ]; then
239-
mv ./nccs-win-x64/Neo.Compiler.CSharp.exe ./nccs-win-x64/nccs.exe
240-
fi
241-
# Linux: Neo.Compiler.CSharp -> nccs
242-
if [ -f "./nccs-linux-x64/Neo.Compiler.CSharp" ]; then
243-
mv ./nccs-linux-x64/Neo.Compiler.CSharp ./nccs-linux-x64/nccs
244-
fi
245-
# macOS x64: Neo.Compiler.CSharp -> nccs
246-
if [ -f "./nccs-osx-x64/Neo.Compiler.CSharp" ]; then
247-
mv ./nccs-osx-x64/Neo.Compiler.CSharp ./nccs-osx-x64/nccs
248-
fi
249-
# macOS ARM64: Neo.Compiler.CSharp -> nccs
250-
if [ -f "./nccs-osx-arm64/Neo.Compiler.CSharp" ]; then
251-
mv ./nccs-osx-arm64/Neo.Compiler.CSharp ./nccs-osx-arm64/nccs
252-
fi
253-
254-
# Create zip archives
255-
echo "Creating archives..."
205+
[ -f "./nccs-win-x64/Neo.Compiler.CSharp.exe" ] && mv ./nccs-win-x64/Neo.Compiler.CSharp.exe ./nccs-win-x64/nccs.exe
206+
[ -f "./nccs-linux-x64/Neo.Compiler.CSharp" ] && mv ./nccs-linux-x64/Neo.Compiler.CSharp ./nccs-linux-x64/nccs
207+
[ -f "./nccs-osx-x64/Neo.Compiler.CSharp" ] && mv ./nccs-osx-x64/Neo.Compiler.CSharp ./nccs-osx-x64/nccs
208+
[ -f "./nccs-osx-arm64/Neo.Compiler.CSharp" ] && mv ./nccs-osx-arm64/Neo.Compiler.CSharp ./nccs-osx-arm64/nccs
256209
cd nccs-win-x64 && zip -r ../nccs-win-x64.zip * && cd ..
257210
cd nccs-linux-x64 && tar -czf ../nccs-linux-x64.tar.gz * && cd ..
258211
cd nccs-osx-x64 && tar -czf ../nccs-osx-x64.tar.gz * && cd ..
259212
cd nccs-osx-arm64 && tar -czf ../nccs-osx-arm64.tar.gz * && cd ..
260-
261-
# Generate checksums
262-
echo "Generating checksums..."
263213
sha256sum nccs-win-x64.zip nccs-linux-x64.tar.gz nccs-osx-x64.tar.gz nccs-osx-arm64.tar.gz > checksums.txt
264-
265-
# Display checksums for verification
266-
echo "Checksums:"
267-
cat checksums.txt
268214
- name: Create release and upload binaries
269215
if: steps.check_tag.outputs.statusCode == '404'
270-
id: create_release
271216
uses: softprops/action-gh-release@v2.4.1
272217
env:
273218
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitmodules

Lines changed: 0 additions & 3 deletions
This file was deleted.

examples/Directory.Build.props

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
<PropertyGroup Condition="'$(IsTestProject)' != 'true'">
55
<Copyright>2024 The Neo SmartContract Examples Project</Copyright>
6-
<VersionPrefix>3.8.1</VersionPrefix>
7-
<TargetFramework>net9.0</TargetFramework>
6+
<VersionPrefix>3.9.0</VersionPrefix>
7+
<TargetFramework>net10.0</TargetFramework>
88
<Authors>The Neo SmartContract Examples Project</Authors>
99
<PackageIcon>neo.png</PackageIcon>
1010
<PackageProjectUrl>https://github.com/neo-project/neo-devpack-dotnet/examples</PackageProjectUrl>
@@ -34,18 +34,34 @@
3434
<EnableDefaultNoneItems>true</EnableDefaultNoneItems>
3535
<UsingMicrosoftNETSdk>true</UsingMicrosoftNETSdk>
3636

37-
<!--
37+
<NeoPackageVersion>3.9.0</NeoPackageVersion>
38+
39+
<!--
3840
Analyzer Configuration:
39-
Set UseLocalAnalyzer to 'false' when Neo.SmartContract.Analyzer 3.8.1+ is available on NuGet
41+
Set UseLocalAnalyzer to 'false' when Neo.SmartContract.Analyzer 3.9.0+ is available on NuGet
4042
Set UseLocalAnalyzer to 'true' to use the local project reference (current default)
4143
-->
4244
<UseLocalAnalyzer>true</UseLocalAnalyzer>
43-
<NeoAnalyzerVersion>3.8.1</NeoAnalyzerVersion>
45+
<NeoAnalyzerVersion>3.9.0</NeoAnalyzerVersion>
46+
47+
<!--
48+
Framework/Testing Configuration:
49+
Set UseLocalFramework/UseLocalTesting to 'false' when Neo.SmartContract.Framework/Testing 3.9.0+ are available on NuGet
50+
-->
51+
<UseLocalFramework>true</UseLocalFramework>
52+
<UseLocalTesting>true</UseLocalTesting>
4453
</PropertyGroup>
4554

4655
<ItemGroup Condition="'$(IsTestProject)' != 'true'">
47-
<PackageReference Include="Neo.SmartContract.Framework" Version="3.8.1"/>
48-
<PackageReference Include="Neo.SmartContract.Testing" Version="3.8.1"/>
56+
<ProjectReference Include="..\..\src\Neo.SmartContract.Framework\Neo.SmartContract.Framework.csproj"
57+
Condition="'$(UseLocalFramework)' == 'true'"/>
58+
<PackageReference Include="Neo.SmartContract.Framework" Version="$(NeoPackageVersion)"
59+
Condition="'$(UseLocalFramework)' != 'true'"/>
60+
61+
<ProjectReference Include="..\..\src\Neo.SmartContract.Testing\Neo.SmartContract.Testing.csproj"
62+
Condition="'$(UseLocalTesting)' == 'true'"/>
63+
<PackageReference Include="Neo.SmartContract.Testing" Version="$(NeoPackageVersion)"
64+
Condition="'$(UseLocalTesting)' != 'true'"/>
4965

5066
<!--
5167
Local Project Reference for Analyzer (Current - when UseLocalAnalyzer=true)
@@ -70,7 +86,8 @@
7086
</PackageReference>
7187
</ItemGroup>
7288

73-
<Target Name="ExecuteBeforeBuild" BeforeTargets="PreBuildEvent" Condition="'$(IsTestProject)' != 'true'">
89+
<Target Name="ExecuteBeforeBuild" BeforeTargets="PreBuildEvent"
90+
Condition="'$(IsTestProject)' != 'true' AND '$(MSBuildProjectName)' != 'TestContract' AND '$(DisableArtifactGeneration)' != 'true'">
7491
<PropertyGroup>
7592
<NccsProject>$(MSBuildThisFileDirectory)..\src\Neo.Compiler.CSharp\Neo.Compiler.CSharp.csproj</NccsProject>
7693
</PropertyGroup>

examples/Example.SmartContract.ContractCall.UnitTests/Example.SmartContract.ContractCall.UnitTests.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net9.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

@@ -10,13 +10,13 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="coverlet.collector" Version="6.0.2">
13+
<PackageReference Include="coverlet.collector" Version="6.0.4">
1414
<PrivateAssets>all</PrivateAssets>
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
</PackageReference>
1717
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1"/>
18-
<PackageReference Include="MSTest.TestAdapter" Version="3.8.0"/>
19-
<PackageReference Include="MSTest.TestFramework" Version="3.8.0"/>
18+
<PackageReference Include="MSTest.TestAdapter" Version="3.9.3"/>
19+
<PackageReference Include="MSTest.TestFramework" Version="3.9.3"/>
2020
</ItemGroup>
2121

2222
<ItemGroup>

examples/Example.SmartContract.ContractCall.UnitTests/TestingArtifacts/SampleContractCall.artifacts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract class SampleContractCall(Neo.SmartContract.Testing.SmartContract
1616
/// <summary>
1717
/// Optimization: "Basic"
1818
/// </summary>
19-
public static Neo.SmartContract.NefFile Nef => Convert.FromBase64String(@"TkVGM05lby5Db21waWxlci5DU2hhcnAgMy44LjErMTQ2YzczYzZjYmQ3YTMyMTRlZGVmZWRhZmMxM2FmYjFiM2QuLi4AAAAAAHVXAwN6AHuzqiYEIj5B2/6odHBBOVNuPHFoEcAVDAliYWxhbmNlT2ZpQWJ9W1JyamloE8AfDAtkdW1teU1ldGhvZFhBYn1bUkVAQdv+qHRAQTlTbjxAQWJ9W1JAVgEMFF6QEGiCvFczbXZ7FdXtLpwFPqgTYEDVrbYL").AsSerializable<Neo.SmartContract.NefFile>();
19+
public static Neo.SmartContract.NefFile Nef => Convert.FromBase64String(@"TkVGM05lby5Db21waWxlci5DU2hhcnAgMy45LjArNDIzNzFmNWY0ZTBiZTI4N2ExZmYyOGYzNThhYjI0NmY1YjQuLi4AAAAAAHVXAwN6AHuzqiYEIj5B2/6odHBBOVNuPHFoEcAVDAliYWxhbmNlT2ZpQWJ9W1JyamloE8AfDAtkdW1teU1ldGhvZFhBYn1bUkVAQdv+qHRAQTlTbjxAQWJ9W1JAVgEMFF6QEGiCvFczbXZ7FdXtLpwFPqgTYEB9MYTh").AsSerializable<Neo.SmartContract.NefFile>();
2020

2121
#endregion
2222

examples/Example.SmartContract.ContractCall.UnitTests/TestingArtifacts/SampleContractCall.manifest.json

Lines changed: 0 additions & 1 deletion
This file was deleted.
Binary file not shown.

examples/Example.SmartContract.Event.UnitTests/Example.SmartContract.Event.UnitTests.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net9.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

@@ -10,13 +10,13 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="coverlet.collector" Version="6.0.2">
13+
<PackageReference Include="coverlet.collector" Version="6.0.4">
1414
<PrivateAssets>all</PrivateAssets>
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
</PackageReference>
1717
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1"/>
18-
<PackageReference Include="MSTest.TestAdapter" Version="3.8.0"/>
19-
<PackageReference Include="MSTest.TestFramework" Version="3.8.0"/>
18+
<PackageReference Include="MSTest.TestAdapter" Version="3.9.3"/>
19+
<PackageReference Include="MSTest.TestFramework" Version="3.9.3"/>
2020
</ItemGroup>
2121

2222
<ItemGroup>

examples/Example.SmartContract.Event.UnitTests/TestingArtifacts/SampleEvent.artifacts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract class SampleEvent(Neo.SmartContract.Testing.SmartContractInitial
1616
/// <summary>
1717
/// Optimization: "Basic"
1818
/// </summary>
19-
public static Neo.SmartContract.NefFile Nef => Convert.FromBase64String(@"TkVGM05lby5Db21waWxlci5DU2hhcnAgMy44LjErODk2ZjU2ZGIzZmM4YjU5OGU3YmExYTM1ODE4OGRiYzNmZmYuLi4AAAAAAD5XAQAMAwECA9swcBoMAm9paBPADA5uZXdfZXZlbnRfbmFtZUGVAW9hADJoEsAMBmV2ZW50MkGVAW9hCSICQINBwiY=").AsSerializable<Neo.SmartContract.NefFile>();
19+
public static Neo.SmartContract.NefFile Nef => Convert.FromBase64String(@"TkVGM05lby5Db21waWxlci5DU2hhcnAgMy45LjArNDIzNzFmNWY0ZTBiZTI4N2ExZmYyOGYzNThhYjI0NmY1YjQuLi4AAAAAAD5XAQAMAwECA9swcBoMAm9paBPADA5uZXdfZXZlbnRfbmFtZUGVAW9hADJoEsAMBmV2ZW50MkGVAW9hCSICQKzCdjQ=").AsSerializable<Neo.SmartContract.NefFile>();
2020

2121
#endregion
2222

examples/Example.SmartContract.Event.UnitTests/TestingArtifacts/SampleEvent.manifest.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)