diff --git a/SabreTools.IO.Test/Compression/BZip2Tests.cs b/SabreTools.IO.Compression.Test/BZip2Tests.cs
similarity index 100%
rename from SabreTools.IO.Test/Compression/BZip2Tests.cs
rename to SabreTools.IO.Compression.Test/BZip2Tests.cs
diff --git a/SabreTools.IO.Test/Compression/BlastTests.cs b/SabreTools.IO.Compression.Test/BlastTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Compression/BlastTests.cs
rename to SabreTools.IO.Compression.Test/BlastTests.cs
diff --git a/SabreTools.IO.Test/Compression/MSZIPTests.cs b/SabreTools.IO.Compression.Test/MSZIPTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Compression/MSZIPTests.cs
rename to SabreTools.IO.Compression.Test/MSZIPTests.cs
diff --git a/SabreTools.IO.Test/Compression/QuantumTests.cs b/SabreTools.IO.Compression.Test/QuantumTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Compression/QuantumTests.cs
rename to SabreTools.IO.Compression.Test/QuantumTests.cs
diff --git a/SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj b/SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj
new file mode 100644
index 0000000..5d7054b
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj
@@ -0,0 +1,39 @@
+
+
+
+ net8.0;net9.0;net10.0
+ false
+ latest
+ enable
+ true
+ CS0618
+
+
+
+
+
+
+
+
+ Always
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt b/SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt
new file mode 100644
index 0000000..04277a8
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt
@@ -0,0 +1 @@
+Sample file for subdirectories
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/ascii.txt b/SabreTools.IO.Compression.Test/TestData/ascii.txt
new file mode 100644
index 0000000..690eb15
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/ascii.txt
@@ -0,0 +1 @@
+This doesn't match anything
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/file-to-compress.bin b/SabreTools.IO.Compression.Test/TestData/file-to-compress.bin
new file mode 100644
index 0000000..7724139
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/file-to-compress.bin
@@ -0,0 +1 @@
+This is just a file that has a known set of hashes to make sure that everything with hashing is still working as anticipated.
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.bz2 b/SabreTools.IO.Compression.Test/TestData/test-archive.bz2
new file mode 100644
index 0000000..6d498cc
Binary files /dev/null and b/SabreTools.IO.Compression.Test/TestData/test-archive.bz2 differ
diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.msz b/SabreTools.IO.Compression.Test/TestData/test-archive.msz
new file mode 100644
index 0000000..d8b0984
Binary files /dev/null and b/SabreTools.IO.Compression.Test/TestData/test-archive.msz differ
diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.pk b/SabreTools.IO.Compression.Test/TestData/test-archive.pk
new file mode 100644
index 0000000..be10b2b
Binary files /dev/null and b/SabreTools.IO.Compression.Test/TestData/test-archive.pk differ
diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.qtm b/SabreTools.IO.Compression.Test/TestData/test-archive.qtm
new file mode 100644
index 0000000..474d211
Binary files /dev/null and b/SabreTools.IO.Compression.Test/TestData/test-archive.qtm differ
diff --git a/SabreTools.IO.Compression.Test/TestData/utf16bebom.txt b/SabreTools.IO.Compression.Test/TestData/utf16bebom.txt
new file mode 100644
index 0000000..e2df5e2
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/utf16bebom.txt
@@ -0,0 +1 @@
+þÿ
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/utf16lebom.txt b/SabreTools.IO.Compression.Test/TestData/utf16lebom.txt
new file mode 100644
index 0000000..46b134b
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/utf16lebom.txt
@@ -0,0 +1 @@
+ÿþ
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/utf32bom.txt b/SabreTools.IO.Compression.Test/TestData/utf32bom.txt
new file mode 100644
index 0000000..2fa7e8a
Binary files /dev/null and b/SabreTools.IO.Compression.Test/TestData/utf32bom.txt differ
diff --git a/SabreTools.IO.Compression.Test/TestData/utf7bom.txt b/SabreTools.IO.Compression.Test/TestData/utf7bom.txt
new file mode 100644
index 0000000..cc1ade6
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/utf7bom.txt
@@ -0,0 +1 @@
++/v
\ No newline at end of file
diff --git a/SabreTools.IO.Compression.Test/TestData/utf8bom.txt b/SabreTools.IO.Compression.Test/TestData/utf8bom.txt
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/SabreTools.IO.Compression.Test/TestData/utf8bom.txt
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2.cs b/SabreTools.IO.Compression/BZip2/BZip2.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2.cs
rename to SabreTools.IO.Compression/BZip2/BZip2.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2Compressor.cs b/SabreTools.IO.Compression/BZip2/BZip2Compressor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2Compressor.cs
rename to SabreTools.IO.Compression/BZip2/BZip2Compressor.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2InputStream.cs b/SabreTools.IO.Compression/BZip2/BZip2InputStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2InputStream.cs
rename to SabreTools.IO.Compression/BZip2/BZip2InputStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2OutputStream.cs b/SabreTools.IO.Compression/BZip2/BZip2OutputStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/BZip2OutputStream.cs
rename to SabreTools.IO.Compression/BZip2/BZip2OutputStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/BitWriter.cs b/SabreTools.IO.Compression/BZip2/BitWriter.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/BitWriter.cs
rename to SabreTools.IO.Compression/BZip2/BitWriter.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/CRC32.cs b/SabreTools.IO.Compression/BZip2/CRC32.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/CRC32.cs
rename to SabreTools.IO.Compression/BZip2/CRC32.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/BZip2/Rand.cs b/SabreTools.IO.Compression/BZip2/Rand.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/BZip2/Rand.cs
rename to SabreTools.IO.Compression/BZip2/Rand.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Blast/Constants.cs b/SabreTools.IO.Compression/Blast/Constants.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Blast/Constants.cs
rename to SabreTools.IO.Compression/Blast/Constants.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Blast/Decompressor.cs b/SabreTools.IO.Compression/Blast/Decompressor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Blast/Decompressor.cs
rename to SabreTools.IO.Compression/Blast/Decompressor.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Blast/Huffman.cs b/SabreTools.IO.Compression/Blast/Huffman.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Blast/Huffman.cs
rename to SabreTools.IO.Compression/Blast/Huffman.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Blast/State.cs b/SabreTools.IO.Compression/Blast/State.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Blast/State.cs
rename to SabreTools.IO.Compression/Blast/State.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/Adler.cs b/SabreTools.IO.Compression/Deflate/Adler.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/Adler.cs
rename to SabreTools.IO.Compression/Deflate/Adler.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/BlockState.cs b/SabreTools.IO.Compression/Deflate/BlockState.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/BlockState.cs
rename to SabreTools.IO.Compression/Deflate/BlockState.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/CRC32.cs b/SabreTools.IO.Compression/Deflate/CRC32.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/CRC32.cs
rename to SabreTools.IO.Compression/Deflate/CRC32.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/CompressionLevel.cs b/SabreTools.IO.Compression/Deflate/CompressionLevel.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/CompressionLevel.cs
rename to SabreTools.IO.Compression/Deflate/CompressionLevel.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/CompressionMode.cs b/SabreTools.IO.Compression/Deflate/CompressionMode.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/CompressionMode.cs
rename to SabreTools.IO.Compression/Deflate/CompressionMode.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/CompressionStrategy.cs b/SabreTools.IO.Compression/Deflate/CompressionStrategy.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/CompressionStrategy.cs
rename to SabreTools.IO.Compression/Deflate/CompressionStrategy.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateFlavor.cs b/SabreTools.IO.Compression/Deflate/DeflateFlavor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateFlavor.cs
rename to SabreTools.IO.Compression/Deflate/DeflateFlavor.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateInfo.cs b/SabreTools.IO.Compression/Deflate/DeflateInfo.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateInfo.cs
rename to SabreTools.IO.Compression/Deflate/DeflateInfo.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateManager.cs b/SabreTools.IO.Compression/Deflate/DeflateManager.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateManager.cs
rename to SabreTools.IO.Compression/Deflate/DeflateManager.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateStream.cs b/SabreTools.IO.Compression/Deflate/DeflateStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/DeflateStream.cs
rename to SabreTools.IO.Compression/Deflate/DeflateStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/Enums.cs b/SabreTools.IO.Compression/Deflate/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/Enums.cs
rename to SabreTools.IO.Compression/Deflate/Enums.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/FlushType.cs b/SabreTools.IO.Compression/Deflate/FlushType.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/FlushType.cs
rename to SabreTools.IO.Compression/Deflate/FlushType.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/GZipStream.cs b/SabreTools.IO.Compression/Deflate/GZipStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/GZipStream.cs
rename to SabreTools.IO.Compression/Deflate/GZipStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InfTree.cs b/SabreTools.IO.Compression/Deflate/InfTree.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InfTree.cs
rename to SabreTools.IO.Compression/Deflate/InfTree.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateBlocks.cs b/SabreTools.IO.Compression/Deflate/InflateBlocks.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateBlocks.cs
rename to SabreTools.IO.Compression/Deflate/InflateBlocks.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateCodes.cs b/SabreTools.IO.Compression/Deflate/InflateCodes.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateCodes.cs
rename to SabreTools.IO.Compression/Deflate/InflateCodes.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateManager.cs b/SabreTools.IO.Compression/Deflate/InflateManager.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateManager.cs
rename to SabreTools.IO.Compression/Deflate/InflateManager.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateWrapper.cs b/SabreTools.IO.Compression/Deflate/InflateWrapper.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InflateWrapper.cs
rename to SabreTools.IO.Compression/Deflate/InflateWrapper.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InternalConstants.cs b/SabreTools.IO.Compression/Deflate/InternalConstants.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InternalConstants.cs
rename to SabreTools.IO.Compression/Deflate/InternalConstants.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/InternalInflateConstants.cs b/SabreTools.IO.Compression/Deflate/InternalInflateConstants.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/InternalInflateConstants.cs
rename to SabreTools.IO.Compression/Deflate/InternalInflateConstants.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/LICENSE.jzlib.txt b/SabreTools.IO.Compression/Deflate/LICENSE.jzlib.txt
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/LICENSE.jzlib.txt
rename to SabreTools.IO.Compression/Deflate/LICENSE.jzlib.txt
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/License.zlib.txt b/SabreTools.IO.Compression/Deflate/License.zlib.txt
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/License.zlib.txt
rename to SabreTools.IO.Compression/Deflate/License.zlib.txt
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/SharedUtils.cs b/SabreTools.IO.Compression/Deflate/SharedUtils.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/SharedUtils.cs
rename to SabreTools.IO.Compression/Deflate/SharedUtils.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/StaticTree.cs b/SabreTools.IO.Compression/Deflate/StaticTree.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/StaticTree.cs
rename to SabreTools.IO.Compression/Deflate/StaticTree.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/Tree.cs b/SabreTools.IO.Compression/Deflate/Tree.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/Tree.cs
rename to SabreTools.IO.Compression/Deflate/Tree.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/WorkItem.cs b/SabreTools.IO.Compression/Deflate/WorkItem.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/WorkItem.cs
rename to SabreTools.IO.Compression/Deflate/WorkItem.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibBaseStream.cs b/SabreTools.IO.Compression/Deflate/ZlibBaseStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibBaseStream.cs
rename to SabreTools.IO.Compression/Deflate/ZlibBaseStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibCodec.cs b/SabreTools.IO.Compression/Deflate/ZlibCodec.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibCodec.cs
rename to SabreTools.IO.Compression/Deflate/ZlibCodec.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibConstants.cs b/SabreTools.IO.Compression/Deflate/ZlibConstants.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibConstants.cs
rename to SabreTools.IO.Compression/Deflate/ZlibConstants.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibException.cs b/SabreTools.IO.Compression/Deflate/ZlibException.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibException.cs
rename to SabreTools.IO.Compression/Deflate/ZlibException.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibStream.cs b/SabreTools.IO.Compression/Deflate/ZlibStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibStream.cs
rename to SabreTools.IO.Compression/Deflate/ZlibStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibStreamFlavor.cs b/SabreTools.IO.Compression/Deflate/ZlibStreamFlavor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Deflate/ZlibStreamFlavor.cs
rename to SabreTools.IO.Compression/Deflate/ZlibStreamFlavor.cs
diff --git a/SabreTools.IO.Compression/ExtensionAttribute.cs b/SabreTools.IO.Compression/ExtensionAttribute.cs
new file mode 100644
index 0000000..478ed8b
--- /dev/null
+++ b/SabreTools.IO.Compression/ExtensionAttribute.cs
@@ -0,0 +1,9 @@
+#if NET20
+
+namespace System.Runtime.CompilerServices
+{
+ [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+ internal sealed class ExtensionAttribute : Attribute { }
+}
+
+#endif
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/AlignedOffsetBlockData.cs b/SabreTools.IO.Compression/LZX/AlignedOffsetBlockData.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/AlignedOffsetBlockData.cs
rename to SabreTools.IO.Compression/LZX/AlignedOffsetBlockData.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/Block.cs b/SabreTools.IO.Compression/LZX/Block.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/Block.cs
rename to SabreTools.IO.Compression/LZX/Block.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/BlockData.cs b/SabreTools.IO.Compression/LZX/BlockData.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/BlockData.cs
rename to SabreTools.IO.Compression/LZX/BlockData.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/BlockHeader.cs b/SabreTools.IO.Compression/LZX/BlockHeader.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/BlockHeader.cs
rename to SabreTools.IO.Compression/LZX/BlockHeader.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/Chunk.cs b/SabreTools.IO.Compression/LZX/Chunk.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/Chunk.cs
rename to SabreTools.IO.Compression/LZX/Chunk.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/ChunkHeader.cs b/SabreTools.IO.Compression/LZX/ChunkHeader.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/ChunkHeader.cs
rename to SabreTools.IO.Compression/LZX/ChunkHeader.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/Constants.cs b/SabreTools.IO.Compression/LZX/Constants.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/Constants.cs
rename to SabreTools.IO.Compression/LZX/Constants.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/Enums.cs b/SabreTools.IO.Compression/LZX/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/Enums.cs
rename to SabreTools.IO.Compression/LZX/Enums.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/UncompressedBlockData.cs b/SabreTools.IO.Compression/LZX/UncompressedBlockData.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/UncompressedBlockData.cs
rename to SabreTools.IO.Compression/LZX/UncompressedBlockData.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/LZX/VerbatimBlockData.cs b/SabreTools.IO.Compression/LZX/VerbatimBlockData.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/LZX/VerbatimBlockData.cs
rename to SabreTools.IO.Compression/LZX/VerbatimBlockData.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/MSZIP/BlockHeader.cs b/SabreTools.IO.Compression/MSZIP/BlockHeader.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/MSZIP/BlockHeader.cs
rename to SabreTools.IO.Compression/MSZIP/BlockHeader.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/MSZIP/Decompressor.cs b/SabreTools.IO.Compression/MSZIP/Decompressor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/MSZIP/Decompressor.cs
rename to SabreTools.IO.Compression/MSZIP/Decompressor.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Quantum/Constants.cs b/SabreTools.IO.Compression/Quantum/Constants.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Quantum/Constants.cs
rename to SabreTools.IO.Compression/Quantum/Constants.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Quantum/Decompressor.cs b/SabreTools.IO.Compression/Quantum/Decompressor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Quantum/Decompressor.cs
rename to SabreTools.IO.Compression/Quantum/Decompressor.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Quantum/Enums.cs b/SabreTools.IO.Compression/Quantum/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Quantum/Enums.cs
rename to SabreTools.IO.Compression/Quantum/Enums.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Quantum/Model.cs b/SabreTools.IO.Compression/Quantum/Model.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Quantum/Model.cs
rename to SabreTools.IO.Compression/Quantum/Model.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/Quantum/ModelSymbol.cs b/SabreTools.IO.Compression/Quantum/ModelSymbol.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/Quantum/ModelSymbol.cs
rename to SabreTools.IO.Compression/Quantum/ModelSymbol.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/README.MD b/SabreTools.IO.Compression/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/README.MD
rename to SabreTools.IO.Compression/README.MD
diff --git a/SabreTools.IO/SabreTools.IO.Compression/SZDD/Decompressor.cs b/SabreTools.IO.Compression/SZDD/Decompressor.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/SZDD/Decompressor.cs
rename to SabreTools.IO.Compression/SZDD/Decompressor.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/SZDD/Enums.cs b/SabreTools.IO.Compression/SZDD/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/SZDD/Enums.cs
rename to SabreTools.IO.Compression/SZDD/Enums.cs
diff --git a/SabreTools.IO.Compression/SabreTools.IO.Compression.csproj b/SabreTools.IO.Compression/SabreTools.IO.Compression.csproj
new file mode 100644
index 0000000..380b0f7
--- /dev/null
+++ b/SabreTools.IO.Compression/SabreTools.IO.Compression.csproj
@@ -0,0 +1,41 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs
rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs
rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs
rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs
rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/LICENSE b/SabreTools.IO.Compression/zlib/LICENSE
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/LICENSE
rename to SabreTools.IO.Compression/zlib/LICENSE
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/README.md b/SabreTools.IO.Compression/zlib/README.md
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/README.md
rename to SabreTools.IO.Compression/zlib/README.md
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs b/SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs
rename to SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibInflateStream.cs b/SabreTools.IO.Compression/zlib/ZlibInflateStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibInflateStream.cs
rename to SabreTools.IO.Compression/zlib/ZlibInflateStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/zlib.cs b/SabreTools.IO.Compression/zlib/zlib.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/zlib.cs
rename to SabreTools.IO.Compression/zlib/zlib.cs
diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/zlibConst.cs b/SabreTools.IO.Compression/zlib/zlibConst.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Compression/zlib/zlibConst.cs
rename to SabreTools.IO.Compression/zlib/zlibConst.cs
diff --git a/SabreTools.IO.Test/Extensions/BinaryReaderExtensionsTests.cs b/SabreTools.IO.Extensions.Test/BinaryReaderExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/BinaryReaderExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/BinaryReaderExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/BinaryWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/BinaryWriterExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/BinaryWriterExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/BinaryWriterExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/ByteArrayExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ByteArrayExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/ByteArrayExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/ByteArrayExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/ByteArrayReaderExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ByteArrayReaderExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/ByteArrayReaderExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/ByteArrayReaderExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/ByteArrayWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ByteArrayWriterExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/ByteArrayWriterExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/ByteArrayWriterExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/DateTimeExtensionsTests.cs b/SabreTools.IO.Extensions.Test/DateTimeExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/DateTimeExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/DateTimeExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/DictionaryExtensionsTests.cs b/SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/DictionaryExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/EnumerableExtensionsTests.cs b/SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/EnumerableExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/IOExtensionsTests.cs b/SabreTools.IO.Extensions.Test/IOExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/IOExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/IOExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/ParentablePathExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ParentablePathExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/ParentablePathExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/ParentablePathExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/ReadOnlyBitStreamExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ReadOnlyBitStreamExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/ReadOnlyBitStreamExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/ReadOnlyBitStreamExtensionsTests.cs
diff --git a/SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj b/SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj
new file mode 100644
index 0000000..30a948e
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj
@@ -0,0 +1,39 @@
+
+
+
+ net8.0;net9.0;net10.0
+ false
+ latest
+ enable
+ true
+ CS0618
+
+
+
+
+
+
+
+
+ Always
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO.Test/Extensions/StreamExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StreamExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/StreamExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/StreamExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/StreamReaderExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StreamReaderExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/StreamReaderExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/StreamReaderExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/StreamWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StreamWriterExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/StreamWriterExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/StreamWriterExtensionsTests.cs
diff --git a/SabreTools.IO.Test/Extensions/StringExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StringExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/StringExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/StringExtensionsTests.cs
diff --git a/SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt b/SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt
new file mode 100644
index 0000000..04277a8
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt
@@ -0,0 +1 @@
+Sample file for subdirectories
\ No newline at end of file
diff --git a/SabreTools.IO.Extensions.Test/TestData/ascii.txt b/SabreTools.IO.Extensions.Test/TestData/ascii.txt
new file mode 100644
index 0000000..690eb15
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/ascii.txt
@@ -0,0 +1 @@
+This doesn't match anything
\ No newline at end of file
diff --git a/SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin b/SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin
new file mode 100644
index 0000000..7724139
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin
@@ -0,0 +1 @@
+This is just a file that has a known set of hashes to make sure that everything with hashing is still working as anticipated.
\ No newline at end of file
diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.bz2 b/SabreTools.IO.Extensions.Test/TestData/test-archive.bz2
new file mode 100644
index 0000000..6d498cc
Binary files /dev/null and b/SabreTools.IO.Extensions.Test/TestData/test-archive.bz2 differ
diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.msz b/SabreTools.IO.Extensions.Test/TestData/test-archive.msz
new file mode 100644
index 0000000..d8b0984
Binary files /dev/null and b/SabreTools.IO.Extensions.Test/TestData/test-archive.msz differ
diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.pk b/SabreTools.IO.Extensions.Test/TestData/test-archive.pk
new file mode 100644
index 0000000..be10b2b
Binary files /dev/null and b/SabreTools.IO.Extensions.Test/TestData/test-archive.pk differ
diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.qtm b/SabreTools.IO.Extensions.Test/TestData/test-archive.qtm
new file mode 100644
index 0000000..474d211
Binary files /dev/null and b/SabreTools.IO.Extensions.Test/TestData/test-archive.qtm differ
diff --git a/SabreTools.IO.Extensions.Test/TestData/utf16bebom.txt b/SabreTools.IO.Extensions.Test/TestData/utf16bebom.txt
new file mode 100644
index 0000000..e2df5e2
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/utf16bebom.txt
@@ -0,0 +1 @@
+þÿ
\ No newline at end of file
diff --git a/SabreTools.IO.Extensions.Test/TestData/utf16lebom.txt b/SabreTools.IO.Extensions.Test/TestData/utf16lebom.txt
new file mode 100644
index 0000000..46b134b
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/utf16lebom.txt
@@ -0,0 +1 @@
+ÿþ
\ No newline at end of file
diff --git a/SabreTools.IO.Extensions.Test/TestData/utf32bom.txt b/SabreTools.IO.Extensions.Test/TestData/utf32bom.txt
new file mode 100644
index 0000000..2fa7e8a
Binary files /dev/null and b/SabreTools.IO.Extensions.Test/TestData/utf32bom.txt differ
diff --git a/SabreTools.IO.Extensions.Test/TestData/utf7bom.txt b/SabreTools.IO.Extensions.Test/TestData/utf7bom.txt
new file mode 100644
index 0000000..cc1ade6
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/utf7bom.txt
@@ -0,0 +1 @@
++/v
\ No newline at end of file
diff --git a/SabreTools.IO.Extensions.Test/TestData/utf8bom.txt b/SabreTools.IO.Extensions.Test/TestData/utf8bom.txt
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/SabreTools.IO.Extensions.Test/TestData/utf8bom.txt
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/SabreTools.IO.Test/Extensions/TestEnum.cs b/SabreTools.IO.Extensions.Test/TestEnum.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/TestEnum.cs
rename to SabreTools.IO.Extensions.Test/TestEnum.cs
diff --git a/SabreTools.IO.Test/Extensions/TestStructArrays.cs b/SabreTools.IO.Extensions.Test/TestStructArrays.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/TestStructArrays.cs
rename to SabreTools.IO.Extensions.Test/TestStructArrays.cs
diff --git a/SabreTools.IO.Test/Extensions/TestStructExplicit.cs b/SabreTools.IO.Extensions.Test/TestStructExplicit.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/TestStructExplicit.cs
rename to SabreTools.IO.Extensions.Test/TestStructExplicit.cs
diff --git a/SabreTools.IO.Test/Extensions/TestStructInheritance.cs b/SabreTools.IO.Extensions.Test/TestStructInheritance.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/TestStructInheritance.cs
rename to SabreTools.IO.Extensions.Test/TestStructInheritance.cs
diff --git a/SabreTools.IO.Test/Extensions/TestStructSequential.cs b/SabreTools.IO.Extensions.Test/TestStructSequential.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/TestStructSequential.cs
rename to SabreTools.IO.Extensions.Test/TestStructSequential.cs
diff --git a/SabreTools.IO.Test/Extensions/TestStructStrings.cs b/SabreTools.IO.Extensions.Test/TestStructStrings.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/TestStructStrings.cs
rename to SabreTools.IO.Extensions.Test/TestStructStrings.cs
diff --git a/SabreTools.IO.Test/Extensions/XmlTextWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/XmlTextWriterExtensionsTests.cs
similarity index 100%
rename from SabreTools.IO.Test/Extensions/XmlTextWriterExtensionsTests.cs
rename to SabreTools.IO.Extensions.Test/XmlTextWriterExtensionsTests.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/BinaryReaderExtensions.cs b/SabreTools.IO.Extensions/BinaryReaderExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/BinaryReaderExtensions.cs
rename to SabreTools.IO.Extensions/BinaryReaderExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/BinaryWriterExtensions.cs b/SabreTools.IO.Extensions/BinaryWriterExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/BinaryWriterExtensions.cs
rename to SabreTools.IO.Extensions/BinaryWriterExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/ByteArrayExtensions.cs b/SabreTools.IO.Extensions/ByteArrayExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/ByteArrayExtensions.cs
rename to SabreTools.IO.Extensions/ByteArrayExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/ByteArrayReaderExtensions.cs b/SabreTools.IO.Extensions/ByteArrayReaderExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/ByteArrayReaderExtensions.cs
rename to SabreTools.IO.Extensions/ByteArrayReaderExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/ByteArrayWriterExtensions.cs b/SabreTools.IO.Extensions/ByteArrayWriterExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/ByteArrayWriterExtensions.cs
rename to SabreTools.IO.Extensions/ByteArrayWriterExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/DateTimeExtensions.cs b/SabreTools.IO.Extensions/DateTimeExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/DateTimeExtensions.cs
rename to SabreTools.IO.Extensions/DateTimeExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/DictionaryExtensions.cs b/SabreTools.IO.Extensions/DictionaryExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/DictionaryExtensions.cs
rename to SabreTools.IO.Extensions/DictionaryExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/EnumerableExtensions.cs b/SabreTools.IO.Extensions/EnumerableExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/EnumerableExtensions.cs
rename to SabreTools.IO.Extensions/EnumerableExtensions.cs
diff --git a/SabreTools.IO.Extensions/ExtensionAttribute.cs b/SabreTools.IO.Extensions/ExtensionAttribute.cs
new file mode 100644
index 0000000..478ed8b
--- /dev/null
+++ b/SabreTools.IO.Extensions/ExtensionAttribute.cs
@@ -0,0 +1,9 @@
+#if NET20
+
+namespace System.Runtime.CompilerServices
+{
+ [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+ internal sealed class ExtensionAttribute : Attribute { }
+}
+
+#endif
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/IOExtensions.cs b/SabreTools.IO.Extensions/IOExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/IOExtensions.cs
rename to SabreTools.IO.Extensions/IOExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/MarshalHelpers.cs b/SabreTools.IO.Extensions/MarshalHelpers.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/MarshalHelpers.cs
rename to SabreTools.IO.Extensions/MarshalHelpers.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/NumericExtensions.cs b/SabreTools.IO.Extensions/NumericExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/NumericExtensions.cs
rename to SabreTools.IO.Extensions/NumericExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/ParentablePathExtensions.cs b/SabreTools.IO.Extensions/ParentablePathExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/ParentablePathExtensions.cs
rename to SabreTools.IO.Extensions/ParentablePathExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/README.MD b/SabreTools.IO.Extensions/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/README.MD
rename to SabreTools.IO.Extensions/README.MD
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/ReadOnlyBitStreamExtensions.cs b/SabreTools.IO.Extensions/ReadOnlyBitStreamExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/ReadOnlyBitStreamExtensions.cs
rename to SabreTools.IO.Extensions/ReadOnlyBitStreamExtensions.cs
diff --git a/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj b/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj
new file mode 100644
index 0000000..fcf6c97
--- /dev/null
+++ b/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj
@@ -0,0 +1,39 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StreamExtensions.cs b/SabreTools.IO.Extensions/StreamExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/StreamExtensions.cs
rename to SabreTools.IO.Extensions/StreamExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StreamReaderExtensions.cs b/SabreTools.IO.Extensions/StreamReaderExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/StreamReaderExtensions.cs
rename to SabreTools.IO.Extensions/StreamReaderExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StreamWriterExtensions.cs b/SabreTools.IO.Extensions/StreamWriterExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/StreamWriterExtensions.cs
rename to SabreTools.IO.Extensions/StreamWriterExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StringExtensions.cs b/SabreTools.IO.Extensions/StringExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/StringExtensions.cs
rename to SabreTools.IO.Extensions/StringExtensions.cs
diff --git a/SabreTools.IO/SabreTools.IO.Extensions/XmlTextWriterExtensions.cs b/SabreTools.IO.Extensions/XmlTextWriterExtensions.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO.Extensions/XmlTextWriterExtensions.cs
rename to SabreTools.IO.Extensions/XmlTextWriterExtensions.cs
diff --git a/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj b/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj
new file mode 100644
index 0000000..6e5a130
--- /dev/null
+++ b/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj
@@ -0,0 +1,62 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ SabreTools.IO
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO.Test/SabreTools.IO.Test.csproj b/SabreTools.IO.Test/SabreTools.IO.Test.csproj
index ed03935..5fedbca 100644
--- a/SabreTools.IO.Test/SabreTools.IO.Test.csproj
+++ b/SabreTools.IO.Test/SabreTools.IO.Test.csproj
@@ -34,6 +34,8 @@
+
+
\ No newline at end of file
diff --git a/SabreTools.IO.sln b/SabreTools.IO.sln
index 8705382..150e687 100644
--- a/SabreTools.IO.sln
+++ b/SabreTools.IO.sln
@@ -23,6 +23,34 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.SeparatedVa
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Utilities.Test", "SabreTools.Text.Utilities.Test\SabreTools.Text.Utilities.Test.csproj", "{71B85140-6468-4747-AF42-C1C0F04A4D80}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Meta", "SabreTools.IO.Meta\SabreTools.IO.Meta.csproj", "{5BCF7EB4-33AC-4139-8466-41E06FF86072}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Compression", "SabreTools.IO.Compression\SabreTools.IO.Compression.csproj", "{00D197D9-6F57-44FA-A399-FFEA61603B28}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Extensions", "SabreTools.IO.Extensions\SabreTools.IO.Extensions.csproj", "{ABC3D682-4A02-46FB-8EC3-27D0119D3042}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Logging", "SabreTools.Logging\SabreTools.Logging.csproj", "{9A192B06-8970-4763-AB78-4B1C9FA854E1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Matching", "SabreTools.Matching\SabreTools.Matching.csproj", "{97265DE9-5B64-459B-A768-2B8C6311FE11}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Numerics", "SabreTools.Numerics\SabreTools.Numerics.csproj", "{D00B8345-6472-4EF9-8953-CFCA8734DA6F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Security.Cryptography", "SabreTools.Security.Cryptography\SabreTools.Security.Cryptography.csproj", "{5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.ClrMamePro", "SabreTools.Text.ClrMamePro\SabreTools.Text.ClrMamePro.csproj", "{F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Compare", "SabreTools.Text.Compare\SabreTools.Text.Compare.csproj", "{168D97AB-4D17-4015-BCFC-6CC1FA24E747}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.INI", "SabreTools.Text.INI\SabreTools.Text.INI.csproj", "{6FB12A7F-4285-4D64-B972-A3F07E416448}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.SeparatedValue", "SabreTools.Text.SeparatedValue\SabreTools.Text.SeparatedValue.csproj", "{E1E0B039-2714-40EE-9BF2-0864D3D3535A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Utilities", "SabreTools.Text.Utilities\SabreTools.Text.Utilities.csproj", "{E8842271-ECA1-41BD-B360-E3C73505BAEC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Compression.Test", "SabreTools.IO.Compression.Test\SabreTools.IO.Compression.Test.csproj", "{F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Extensions.Test", "SabreTools.IO.Extensions.Test\SabreTools.IO.Extensions.Test.csproj", "{C829B479-3D3B-48EE-BDD7-5EFB40340166}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -153,6 +181,174 @@ Global
{71B85140-6468-4747-AF42-C1C0F04A4D80}.Release|x64.Build.0 = Release|Any CPU
{71B85140-6468-4747-AF42-C1C0F04A4D80}.Release|x86.ActiveCfg = Release|Any CPU
{71B85140-6468-4747-AF42-C1C0F04A4D80}.Release|x86.Build.0 = Release|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x64.Build.0 = Debug|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x86.Build.0 = Debug|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x64.ActiveCfg = Release|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x64.Build.0 = Release|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x86.ActiveCfg = Release|Any CPU
+ {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x86.Build.0 = Release|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x64.Build.0 = Debug|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x86.Build.0 = Debug|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|Any CPU.Build.0 = Release|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x64.ActiveCfg = Release|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x64.Build.0 = Release|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x86.ActiveCfg = Release|Any CPU
+ {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x86.Build.0 = Release|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x64.Build.0 = Debug|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x86.Build.0 = Debug|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x64.ActiveCfg = Release|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x64.Build.0 = Release|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x86.ActiveCfg = Release|Any CPU
+ {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x86.Build.0 = Release|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x64.Build.0 = Debug|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x86.Build.0 = Debug|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x64.ActiveCfg = Release|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x64.Build.0 = Release|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x86.ActiveCfg = Release|Any CPU
+ {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x86.Build.0 = Release|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x64.Build.0 = Debug|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x86.Build.0 = Debug|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|Any CPU.Build.0 = Release|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x64.ActiveCfg = Release|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x64.Build.0 = Release|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x86.ActiveCfg = Release|Any CPU
+ {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x86.Build.0 = Release|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x64.Build.0 = Debug|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x86.Build.0 = Debug|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x64.ActiveCfg = Release|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x64.Build.0 = Release|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x86.ActiveCfg = Release|Any CPU
+ {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x86.Build.0 = Release|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x64.Build.0 = Debug|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x86.Build.0 = Debug|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x64.ActiveCfg = Release|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x64.Build.0 = Release|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x86.ActiveCfg = Release|Any CPU
+ {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x86.Build.0 = Release|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x64.Build.0 = Debug|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x86.Build.0 = Debug|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x64.ActiveCfg = Release|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x64.Build.0 = Release|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x86.ActiveCfg = Release|Any CPU
+ {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x86.Build.0 = Release|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x64.Build.0 = Debug|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x86.Build.0 = Debug|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|Any CPU.Build.0 = Release|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x64.ActiveCfg = Release|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x64.Build.0 = Release|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x86.ActiveCfg = Release|Any CPU
+ {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x86.Build.0 = Release|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x64.Build.0 = Debug|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x86.Build.0 = Debug|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x64.ActiveCfg = Release|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x64.Build.0 = Release|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x86.ActiveCfg = Release|Any CPU
+ {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x86.Build.0 = Release|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x64.Build.0 = Debug|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x86.Build.0 = Debug|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x64.ActiveCfg = Release|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x64.Build.0 = Release|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x86.ActiveCfg = Release|Any CPU
+ {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x86.Build.0 = Release|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x64.Build.0 = Debug|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x86.Build.0 = Debug|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x64.ActiveCfg = Release|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x64.Build.0 = Release|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x86.ActiveCfg = Release|Any CPU
+ {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x86.Build.0 = Release|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x64.Build.0 = Debug|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x86.Build.0 = Debug|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x64.ActiveCfg = Release|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x64.Build.0 = Release|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x86.ActiveCfg = Release|Any CPU
+ {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x86.Build.0 = Release|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x64.Build.0 = Debug|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x86.Build.0 = Debug|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x64.ActiveCfg = Release|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x64.Build.0 = Release|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x86.ActiveCfg = Release|Any CPU
+ {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/SabreTools.IO/SabreTools.IO/BufferedStream.cs b/SabreTools.IO/BufferedStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/BufferedStream.cs
rename to SabreTools.IO/BufferedStream.cs
diff --git a/SabreTools.IO/SabreTools.IO/Enums.cs b/SabreTools.IO/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/Enums.cs
rename to SabreTools.IO/Enums.cs
diff --git a/SabreTools.IO/SabreTools.IO/OldDotNet.cs b/SabreTools.IO/OldDotNet.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/OldDotNet.cs
rename to SabreTools.IO/OldDotNet.cs
diff --git a/SabreTools.IO/SabreTools.IO/ParentablePath.cs b/SabreTools.IO/ParentablePath.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/ParentablePath.cs
rename to SabreTools.IO/ParentablePath.cs
diff --git a/SabreTools.IO/SabreTools.IO/PathTool.cs b/SabreTools.IO/PathTool.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/PathTool.cs
rename to SabreTools.IO/PathTool.cs
diff --git a/SabreTools.IO/SabreTools.IO/README.MD b/SabreTools.IO/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/README.MD
rename to SabreTools.IO/README.MD
diff --git a/SabreTools.IO/SabreTools.IO/ReadOnlyBitStream.cs b/SabreTools.IO/ReadOnlyBitStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/ReadOnlyBitStream.cs
rename to SabreTools.IO/ReadOnlyBitStream.cs
diff --git a/SabreTools.IO/SabreTools.IO/ReadOnlyCompositeStream.cs b/SabreTools.IO/ReadOnlyCompositeStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/ReadOnlyCompositeStream.cs
rename to SabreTools.IO/ReadOnlyCompositeStream.cs
diff --git a/SabreTools.IO/SabreTools.IO.csproj b/SabreTools.IO/SabreTools.IO.csproj
index a706fa9..2847735 100644
--- a/SabreTools.IO/SabreTools.IO.csproj
+++ b/SabreTools.IO/SabreTools.IO.csproj
@@ -14,6 +14,7 @@
1.9.1
+ SabreTools.IO.Common
Matt Nadareski
Common IO utilities by other SabreTools projects
Copyright (c) Matt Nadareski 2019-2025
@@ -26,19 +27,11 @@
-
+
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.IO/Transform.cs b/SabreTools.IO/Transform.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/Transform.cs
rename to SabreTools.IO/Transform.cs
diff --git a/SabreTools.IO/SabreTools.IO/ViewStream.cs b/SabreTools.IO/ViewStream.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.IO/ViewStream.cs
rename to SabreTools.IO/ViewStream.cs
diff --git a/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj b/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj
index 45347d9..9174315 100644
--- a/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj
+++ b/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Logging/Converters.cs b/SabreTools.Logging/Converters.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/Converters.cs
rename to SabreTools.Logging/Converters.cs
diff --git a/SabreTools.IO/SabreTools.Logging/Enums.cs b/SabreTools.Logging/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/Enums.cs
rename to SabreTools.Logging/Enums.cs
diff --git a/SabreTools.Logging/ExtensionAttribute.cs b/SabreTools.Logging/ExtensionAttribute.cs
new file mode 100644
index 0000000..478ed8b
--- /dev/null
+++ b/SabreTools.Logging/ExtensionAttribute.cs
@@ -0,0 +1,9 @@
+#if NET20
+
+namespace System.Runtime.CompilerServices
+{
+ [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+ internal sealed class ExtensionAttribute : Attribute { }
+}
+
+#endif
diff --git a/SabreTools.IO/SabreTools.Logging/InternalStopwatch.cs b/SabreTools.Logging/InternalStopwatch.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/InternalStopwatch.cs
rename to SabreTools.Logging/InternalStopwatch.cs
diff --git a/SabreTools.IO/SabreTools.Logging/LogEventArgs.cs b/SabreTools.Logging/LogEventArgs.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/LogEventArgs.cs
rename to SabreTools.Logging/LogEventArgs.cs
diff --git a/SabreTools.IO/SabreTools.Logging/Logger.cs b/SabreTools.Logging/Logger.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/Logger.cs
rename to SabreTools.Logging/Logger.cs
diff --git a/SabreTools.IO/SabreTools.Logging/LoggerImpl.cs b/SabreTools.Logging/LoggerImpl.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/LoggerImpl.cs
rename to SabreTools.Logging/LoggerImpl.cs
diff --git a/SabreTools.IO/SabreTools.Logging/README.MD b/SabreTools.Logging/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Logging/README.MD
rename to SabreTools.Logging/README.MD
diff --git a/SabreTools.Logging/SabreTools.Logging.csproj b/SabreTools.Logging/SabreTools.Logging.csproj
new file mode 100644
index 0000000..9a23c12
--- /dev/null
+++ b/SabreTools.Logging/SabreTools.Logging.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj b/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj
index 45347d9..c4ba91b 100644
--- a/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj
+++ b/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Matching/ContentMatch.cs b/SabreTools.Matching/ContentMatch.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/ContentMatch.cs
rename to SabreTools.Matching/ContentMatch.cs
diff --git a/SabreTools.IO/SabreTools.Matching/ContentMatchSet.cs b/SabreTools.Matching/ContentMatchSet.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/ContentMatchSet.cs
rename to SabreTools.Matching/ContentMatchSet.cs
diff --git a/SabreTools.IO/SabreTools.Matching/Delegates.cs b/SabreTools.Matching/Delegates.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/Delegates.cs
rename to SabreTools.Matching/Delegates.cs
diff --git a/SabreTools.IO/SabreTools.Matching/FilePathMatch.cs b/SabreTools.Matching/FilePathMatch.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/FilePathMatch.cs
rename to SabreTools.Matching/FilePathMatch.cs
diff --git a/SabreTools.IO/SabreTools.Matching/IMatch.cs b/SabreTools.Matching/IMatch.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/IMatch.cs
rename to SabreTools.Matching/IMatch.cs
diff --git a/SabreTools.IO/SabreTools.Matching/IMatchSet.cs b/SabreTools.Matching/IMatchSet.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/IMatchSet.cs
rename to SabreTools.Matching/IMatchSet.cs
diff --git a/SabreTools.IO/SabreTools.Matching/MatchUtil.cs b/SabreTools.Matching/MatchUtil.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/MatchUtil.cs
rename to SabreTools.Matching/MatchUtil.cs
diff --git a/SabreTools.IO/SabreTools.Matching/PathMatch.cs b/SabreTools.Matching/PathMatch.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/PathMatch.cs
rename to SabreTools.Matching/PathMatch.cs
diff --git a/SabreTools.IO/SabreTools.Matching/PathMatchSet.cs b/SabreTools.Matching/PathMatchSet.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/PathMatchSet.cs
rename to SabreTools.Matching/PathMatchSet.cs
diff --git a/SabreTools.IO/SabreTools.Matching/README.MD b/SabreTools.Matching/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Matching/README.MD
rename to SabreTools.Matching/README.MD
diff --git a/SabreTools.Matching/SabreTools.Matching.csproj b/SabreTools.Matching/SabreTools.Matching.csproj
new file mode 100644
index 0000000..9a23c12
--- /dev/null
+++ b/SabreTools.Matching/SabreTools.Matching.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj b/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj
index 45347d9..6ff2bab 100644
--- a/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj
+++ b/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Numerics/BothEndian.cs b/SabreTools.Numerics/BothEndian.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothEndian.cs
rename to SabreTools.Numerics/BothEndian.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt16.cs b/SabreTools.Numerics/BothInt16.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothInt16.cs
rename to SabreTools.Numerics/BothInt16.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt32.cs b/SabreTools.Numerics/BothInt32.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothInt32.cs
rename to SabreTools.Numerics/BothInt32.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt64.cs b/SabreTools.Numerics/BothInt64.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothInt64.cs
rename to SabreTools.Numerics/BothInt64.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt8.cs b/SabreTools.Numerics/BothInt8.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothInt8.cs
rename to SabreTools.Numerics/BothInt8.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt16.cs b/SabreTools.Numerics/BothUInt16.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothUInt16.cs
rename to SabreTools.Numerics/BothUInt16.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt32.cs b/SabreTools.Numerics/BothUInt32.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothUInt32.cs
rename to SabreTools.Numerics/BothUInt32.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt64.cs b/SabreTools.Numerics/BothUInt64.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothUInt64.cs
rename to SabreTools.Numerics/BothUInt64.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt8.cs b/SabreTools.Numerics/BothUInt8.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/BothUInt8.cs
rename to SabreTools.Numerics/BothUInt8.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/Int24.cs b/SabreTools.Numerics/Int24.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/Int24.cs
rename to SabreTools.Numerics/Int24.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/Int48.cs b/SabreTools.Numerics/Int48.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/Int48.cs
rename to SabreTools.Numerics/Int48.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/README.MD b/SabreTools.Numerics/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/README.MD
rename to SabreTools.Numerics/README.MD
diff --git a/SabreTools.Numerics/SabreTools.Numerics.csproj b/SabreTools.Numerics/SabreTools.Numerics.csproj
new file mode 100644
index 0000000..9a23c12
--- /dev/null
+++ b/SabreTools.Numerics/SabreTools.Numerics.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Numerics/UInt24.cs b/SabreTools.Numerics/UInt24.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/UInt24.cs
rename to SabreTools.Numerics/UInt24.cs
diff --git a/SabreTools.IO/SabreTools.Numerics/UInt48.cs b/SabreTools.Numerics/UInt48.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Numerics/UInt48.cs
rename to SabreTools.Numerics/UInt48.cs
diff --git a/SabreTools.IO/SabreTools.Security.Cryptography/AESCTR.cs b/SabreTools.Security.Cryptography/AESCTR.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Security.Cryptography/AESCTR.cs
rename to SabreTools.Security.Cryptography/AESCTR.cs
diff --git a/SabreTools.IO/SabreTools.Security.Cryptography/MoPaQDecrypter.cs b/SabreTools.Security.Cryptography/MoPaQDecrypter.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Security.Cryptography/MoPaQDecrypter.cs
rename to SabreTools.Security.Cryptography/MoPaQDecrypter.cs
diff --git a/SabreTools.IO/SabreTools.Security.Cryptography/README.MD b/SabreTools.Security.Cryptography/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Security.Cryptography/README.MD
rename to SabreTools.Security.Cryptography/README.MD
diff --git a/SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj b/SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj
new file mode 100644
index 0000000..b4a10f4
--- /dev/null
+++ b/SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj
@@ -0,0 +1,42 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj b/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj
index 45347d9..e2edc37 100644
--- a/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj
+++ b/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs b/SabreTools.Text.ClrMamePro/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs
rename to SabreTools.Text.ClrMamePro/Enums.cs
diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/README.MD b/SabreTools.Text.ClrMamePro/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.ClrMamePro/README.MD
rename to SabreTools.Text.ClrMamePro/README.MD
diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs b/SabreTools.Text.ClrMamePro/Reader.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs
rename to SabreTools.Text.ClrMamePro/Reader.cs
diff --git a/SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj b/SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj
new file mode 100644
index 0000000..9a23c12
--- /dev/null
+++ b/SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs b/SabreTools.Text.ClrMamePro/Writer.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs
rename to SabreTools.Text.ClrMamePro/Writer.cs
diff --git a/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj b/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj
index 45347d9..625d2ab 100644
--- a/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj
+++ b/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.Compare/NaturalComparer.cs b/SabreTools.Text.Compare/NaturalComparer.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Compare/NaturalComparer.cs
rename to SabreTools.Text.Compare/NaturalComparer.cs
diff --git a/SabreTools.IO/SabreTools.Text.Compare/NaturalComparerUtil.cs b/SabreTools.Text.Compare/NaturalComparerUtil.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Compare/NaturalComparerUtil.cs
rename to SabreTools.Text.Compare/NaturalComparerUtil.cs
diff --git a/SabreTools.IO/SabreTools.Text.Compare/NaturalReversedComparer.cs b/SabreTools.Text.Compare/NaturalReversedComparer.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Compare/NaturalReversedComparer.cs
rename to SabreTools.Text.Compare/NaturalReversedComparer.cs
diff --git a/SabreTools.IO/SabreTools.Text.Compare/README.MD b/SabreTools.Text.Compare/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Compare/README.MD
rename to SabreTools.Text.Compare/README.MD
diff --git a/SabreTools.Text.Compare/SabreTools.Text.Compare.csproj b/SabreTools.Text.Compare/SabreTools.Text.Compare.csproj
new file mode 100644
index 0000000..e889aa9
--- /dev/null
+++ b/SabreTools.Text.Compare/SabreTools.Text.Compare.csproj
@@ -0,0 +1,36 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj b/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj
index 45347d9..c785c51 100644
--- a/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj
+++ b/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.INI/Enums.cs b/SabreTools.Text.INI/Enums.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.INI/Enums.cs
rename to SabreTools.Text.INI/Enums.cs
diff --git a/SabreTools.IO/SabreTools.Text.INI/IniFile.cs b/SabreTools.Text.INI/IniFile.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.INI/IniFile.cs
rename to SabreTools.Text.INI/IniFile.cs
diff --git a/SabreTools.IO/SabreTools.Text.INI/README.MD b/SabreTools.Text.INI/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.INI/README.MD
rename to SabreTools.Text.INI/README.MD
diff --git a/SabreTools.IO/SabreTools.Text.INI/Reader.cs b/SabreTools.Text.INI/Reader.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.INI/Reader.cs
rename to SabreTools.Text.INI/Reader.cs
diff --git a/SabreTools.Text.INI/SabreTools.Text.INI.csproj b/SabreTools.Text.INI/SabreTools.Text.INI.csproj
new file mode 100644
index 0000000..9a23c12
--- /dev/null
+++ b/SabreTools.Text.INI/SabreTools.Text.INI.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.INI/Writer.cs b/SabreTools.Text.INI/Writer.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.INI/Writer.cs
rename to SabreTools.Text.INI/Writer.cs
diff --git a/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj b/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj
index 45347d9..0d9f3f6 100644
--- a/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj
+++ b/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.SeparatedValue/README.MD b/SabreTools.Text.SeparatedValue/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.SeparatedValue/README.MD
rename to SabreTools.Text.SeparatedValue/README.MD
diff --git a/SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs b/SabreTools.Text.SeparatedValue/Reader.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs
rename to SabreTools.Text.SeparatedValue/Reader.cs
diff --git a/SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj b/SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj
new file mode 100644
index 0000000..9a23c12
--- /dev/null
+++ b/SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs b/SabreTools.Text.SeparatedValue/Writer.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs
rename to SabreTools.Text.SeparatedValue/Writer.cs
diff --git a/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj b/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj
index 45347d9..1212344 100644
--- a/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj
+++ b/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj
@@ -23,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/SabreTools.Text.Utilities/ExtensionAttribute.cs b/SabreTools.Text.Utilities/ExtensionAttribute.cs
new file mode 100644
index 0000000..478ed8b
--- /dev/null
+++ b/SabreTools.Text.Utilities/ExtensionAttribute.cs
@@ -0,0 +1,9 @@
+#if NET20
+
+namespace System.Runtime.CompilerServices
+{
+ [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
+ internal sealed class ExtensionAttribute : Attribute { }
+}
+
+#endif
diff --git a/SabreTools.IO/SabreTools.Text.Utilities/NumberHelper.cs b/SabreTools.Text.Utilities/NumberHelper.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Utilities/NumberHelper.cs
rename to SabreTools.Text.Utilities/NumberHelper.cs
diff --git a/SabreTools.IO/SabreTools.Text.Utilities/README.MD b/SabreTools.Text.Utilities/README.MD
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Utilities/README.MD
rename to SabreTools.Text.Utilities/README.MD
diff --git a/SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj b/SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj
new file mode 100644
index 0000000..76297ed
--- /dev/null
+++ b/SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj
@@ -0,0 +1,43 @@
+
+
+
+
+ net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1
+ true
+ true
+ latest
+ CS0618
+ enable
+ true
+ snupkg
+ true
+ 1.9.1
+
+
+ Matt Nadareski
+ Common IO utilities by other SabreTools projects
+ Copyright (c) Matt Nadareski 2019-2025
+ https://github.com/SabreTools/
+ README.md
+ https://github.com/SabreTools/SabreTools.IO
+ git
+ io reading writing ini csv ssv tsv
+ MIT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SabreTools.IO/SabreTools.Text.Utilities/TextHelper.cs b/SabreTools.Text.Utilities/TextHelper.cs
similarity index 100%
rename from SabreTools.IO/SabreTools.Text.Utilities/TextHelper.cs
rename to SabreTools.Text.Utilities/TextHelper.cs
diff --git a/publish-nix.sh b/publish-nix.sh
index 62bc5d1..ba02507 100755
--- a/publish-nix.sh
+++ b/publish-nix.sh
@@ -32,5 +32,5 @@ then
dotnet restore
# Create Nuget Package
- dotnet pack SabreTools.IO/SabreTools.IO.csproj --output $BUILD_FOLDER
+ dotnet pack SabreTools.IO.Meta/SabreTools.IO.Meta.csproj --output $BUILD_FOLDER
fi
\ No newline at end of file
diff --git a/publish-win.ps1 b/publish-win.ps1
index 8d338b3..638fadd 100644
--- a/publish-win.ps1
+++ b/publish-win.ps1
@@ -22,5 +22,5 @@ if (!$NO_BUILD.IsPresent)
dotnet restore
# Create Nuget Package
- dotnet pack SabreTools.IO\SabreTools.IO.csproj --output $BUILD_FOLDER
+ dotnet pack SabreTools.IO.Meta\SabreTools.IO.Meta.csproj --output $BUILD_FOLDER
}