diff --git a/RR3CommunityServer/Assets/.gitignore b/RR3CommunityServer/Assets/.gitignore new file mode 100644 index 0000000..78f00c4 --- /dev/null +++ b/RR3CommunityServer/Assets/.gitignore @@ -0,0 +1,8 @@ +# Ignore actual asset files (they're copyrighted and large) +*.pak +*.unity3d +*.bundle + +# But keep the directory structure +!.gitignore +!README.md diff --git a/RR3CommunityServer/Assets/README.md b/RR3CommunityServer/Assets/README.md new file mode 100644 index 0000000..7928f08 --- /dev/null +++ b/RR3CommunityServer/Assets/README.md @@ -0,0 +1,273 @@ +# ๐ŸŽจ RR3 Community Server - Assets Directory + +This directory stores game assets that will be served to RR3 clients. + +## ๐Ÿ“ Directory Structure + +``` +Assets/ +โ”œโ”€โ”€ cars/ # Car models, physics data +โ”œโ”€โ”€ tracks/ # Track models, AI data +โ”œโ”€โ”€ textures/ # UI and visual textures +โ””โ”€โ”€ audio/ # Sounds and music +``` + +## ๐Ÿ” How to Get Assets + +### โš ๏ธ Legal Disclaimer + +**Assets are copyrighted by Electronic Arts**. This system is designed for: +- โœ… Game preservation after server shutdown +- โœ… Personal use with legally purchased games +- โœ… Private servers for owned content + +**DO NOT:** +- โŒ Distribute EA's assets publicly +- โŒ Use for piracy +- โŒ Share without proper rights + +### Method 1: Extract from Your Installation + +If you own Real Racing 3 and it's installed on your device: + +```bash +# Connect Android device +adb shell + +# Navigate to game data +cd /data/data/com.ea.games.r3_row/files/ + +# List downloaded assets +ls -la + +# Pull to your PC (requires root or backup permission) +exit +adb pull /data/data/com.ea.games.r3_row/files/ ./rr3-assets-backup/ + +# Copy .pak files to Assets directory +cp ./rr3-assets-backup/*.pak ./Assets/cars/ +``` + +### Method 2: Monitor Downloads + +Use network monitoring to see what the official game downloads: + +```bash +# Install Charles Proxy or Fiddler +# Configure Android to use proxy +# Launch RR3 and let it download content +# Save downloaded files from proxy cache +``` + +### Method 3: From APK (Some assets are bundled) + +```bash +# Decompile APK +apktool d realracing3.apk -o rr3-decompiled + +# Look for bundled assets +cd rr3-decompiled/assets/ +ls -la *.pak + +# Copy to server +cp *.pak /path/to/RR3CommunityServer/Assets/ +``` + +## ๐Ÿ“ฆ Asset File Naming + +Assets should be named consistently: + +### Cars +``` +nissan_silvia_s15.pak +ford_focus_rs.pak +porsche_911_gt3_rs.pak +ferrari_488_gtb.pak +mclaren_p1_gtr.pak +``` + +### Tracks +``` +silverstone_national.pak +brands_hatch_gp.pak +dubai_autodrome.pak +laguna_seca.pak +spa_francorchamps.pak +``` + +### Textures +``` +ui_textures.pak +car_textures_pack1.pak +environment_textures.pak +``` + +### Audio +``` +engine_sounds_pack1.pak +ambient_sounds.pak +music_track1.pak +``` + +## ๐Ÿ”Œ API Endpoints + +Once assets are in place, they're accessible via: + +``` +GET /synergy/content/manifest + - List all available assets + +GET /synergy/content/download/{type}/{id} + - Download specific asset + Example: /synergy/content/download/cars/nissan_silvia_s15 + +GET /synergy/content/info/{type}/{id} + - Get asset metadata + +GET /synergy/content/list/{type} + - List all assets of a type + +GET /synergy/content/health + - Check content service status +``` + +## ๐Ÿงช Testing + +### 1. Add a test asset + +Create a dummy .pak file for testing: + +```bash +# Create test file +echo "Test asset content" > Assets/cars/test_car.pak +``` + +### 2. Check if it appears + +```bash +curl http://localhost:5001/synergy/content/manifest +``` + +Should show: +```json +{ + "version": "1.0.0", + "assetCount": 1, + "assets": [ + { + "id": "test_car", + "type": "cars", + "size": 19, + "url": "/synergy/content/download/cars/test_car" + } + ] +} +``` + +### 3. Download it + +```bash +curl http://localhost:5001/synergy/content/download/cars/test_car -o test.pak +``` + +### 4. Check in game + +Connect your modded APK to the community server and start the game. It should request assets from: +``` +http://your-server:5001/synergy/content/download/cars/... +``` + +Monitor with: +```bash +adb logcat | grep -E "(Content|Download|Asset)" +``` + +## ๐Ÿ“Š Asset Sizes + +Typical RR3 asset sizes: + +- **Car Model**: 10-20 MB +- **Track**: 50-100 MB +- **Texture Pack**: 5-10 MB +- **Audio Pack**: 1-5 MB +- **Full Game Assets**: 2-4 GB total + +Plan storage accordingly! + +## ๐Ÿ” Security + +Assets are served as-is without authentication (for game preservation). + +If you want to add authentication: + +1. Edit `ContentController.cs` +2. Add `[Authorize]` attribute to endpoints +3. Require API key or session token + +## ๐Ÿš€ Performance + +For better performance: + +1. **Use a CDN** - Cloudflare, AWS CloudFront +2. **Enable caching** - Add Cache-Control headers +3. **Compress files** - Use gzip for .pak files +4. **Use HTTPS** - For secure delivery + +## ๐Ÿ“ Asset Metadata (Optional) + +You can add `.json` files alongside `.pak` files: + +`nissan_silvia_s15.json`: +```json +{ + "id": "nissan_silvia_s15", + "name": "Nissan Silvia Spec-R", + "type": "car", + "class": "C", + "version": "1.0.0", + "dependencies": [ + "car_textures", + "engine_sounds" + ] +} +``` + +## ๐Ÿ’ก Tips + +1. **Start small** - Add one car, test it +2. **Verify checksums** - Ensure files aren't corrupted +3. **Organize by version** - Keep track of asset versions +4. **Document sources** - Know where each asset came from +5. **Backup everything** - Assets are precious! + +## ๐Ÿ†˜ Troubleshooting + +### Assets not showing in manifest +- Check file permissions +- Ensure .pak extension +- Verify directory structure + +### Download fails +- Check file exists +- Verify server is running +- Look at server logs + +### Game crashes after download +- Asset might be corrupted +- Wrong asset version +- Incompatible format + +## ๐Ÿ“š Resources + +- Real Racing 3 Wiki: Game content information +- Unity Asset Bundle Extractor: Tool for Unity games +- QuickBMS: Extract game archives +- Wireshark: Network traffic analysis + +--- + +**This folder enables full offline gameplay!** ๐ŸŽฎ + +With all assets present, RR3 can run completely independently from EA's servers. + +**Remember**: Only use assets you legally own. This is for preservation, not piracy! ๐Ÿ diff --git a/RR3CommunityServer/Controllers/ContentController.cs b/RR3CommunityServer/Controllers/ContentController.cs new file mode 100644 index 0000000..9ee5cc9 --- /dev/null +++ b/RR3CommunityServer/Controllers/ContentController.cs @@ -0,0 +1,237 @@ +using Microsoft.AspNetCore.Mvc; +using System.Security.Cryptography; + +namespace RR3CommunityServer.Controllers; + +[ApiController] +[Route("synergy/content")] +public class ContentController : ControllerBase +{ + private readonly IWebHostEnvironment _env; + private readonly string _assetsPath; + + public ContentController(IWebHostEnvironment env) + { + _env = env; + _assetsPath = Path.Combine(_env.ContentRootPath, "Assets"); + + // Create assets directory structure if not exists + Directory.CreateDirectory(Path.Combine(_assetsPath, "cars")); + Directory.CreateDirectory(Path.Combine(_assetsPath, "tracks")); + Directory.CreateDirectory(Path.Combine(_assetsPath, "textures")); + Directory.CreateDirectory(Path.Combine(_assetsPath, "audio")); + } + + /// + /// Get asset manifest - list of all available content + /// + [HttpGet("manifest")] + public IActionResult GetManifest() + { + var assets = GetAssetList(); + + return Ok(new + { + version = "1.0.0", + assetCount = assets.Count, + totalSize = assets.Sum(a => ((dynamic)a).size), + assets = assets + }); + } + + /// + /// Download specific asset file + /// + [HttpGet("download/{assetType}/{assetId}")] + public IActionResult DownloadAsset(string assetType, string assetId) + { + var assetPath = Path.Combine(_assetsPath, assetType, $"{assetId}.pak"); + + if (!System.IO.File.Exists(assetPath)) + { + return NotFound(new { error = $"Asset not found: {assetType}/{assetId}" }); + } + + var fileBytes = System.IO.File.ReadAllBytes(assetPath); + var fileName = $"{assetId}.pak"; + + return File(fileBytes, "application/octet-stream", fileName); + } + + /// + /// Get asset metadata and info + /// + [HttpGet("info/{assetType}/{assetId}")] + public IActionResult GetAssetInfo(string assetType, string assetId) + { + var assetPath = Path.Combine(_assetsPath, assetType, $"{assetId}.pak"); + + if (!System.IO.File.Exists(assetPath)) + { + return NotFound(new { error = $"Asset not found: {assetType}/{assetId}" }); + } + + var fileInfo = new FileInfo(assetPath); + + return Ok(new + { + assetId = assetId, + assetType = assetType, + size = fileInfo.Length, + sizeFormatted = FormatBytes(fileInfo.Length), + checksum = CalculateMD5(assetPath), + version = "1.0.0", + downloadUrl = $"/synergy/content/download/{assetType}/{assetId}", + lastModified = fileInfo.LastWriteTimeUtc + }); + } + + /// + /// Check if specific asset exists + /// + [HttpHead("download/{assetType}/{assetId}")] + public IActionResult CheckAssetExists(string assetType, string assetId) + { + var assetPath = Path.Combine(_assetsPath, assetType, $"{assetId}.pak"); + + if (System.IO.File.Exists(assetPath)) + { + var fileInfo = new FileInfo(assetPath); + Response.Headers["Content-Length"] = fileInfo.Length.ToString(); + Response.Headers["X-Asset-Checksum"] = CalculateMD5(assetPath); + return Ok(); + } + + return NotFound(); + } + + /// + /// Get assets by type + /// + [HttpGet("list/{assetType}")] + public IActionResult GetAssetsByType(string assetType) + { + var typePath = Path.Combine(_assetsPath, assetType); + + if (!Directory.Exists(typePath)) + { + return Ok(new { assetType = assetType, assets = new List() }); + } + + var assets = new List(); + + foreach (var file in Directory.GetFiles(typePath, "*.pak")) + { + var assetId = Path.GetFileNameWithoutExtension(file); + var fileInfo = new FileInfo(file); + + assets.Add(new + { + id = assetId, + type = assetType, + size = fileInfo.Length, + sizeFormatted = FormatBytes(fileInfo.Length), + url = $"/synergy/content/download/{assetType}/{assetId}", + checksum = CalculateMD5(file) + }); + } + + return Ok(new + { + assetType = assetType, + count = assets.Count, + totalSize = assets.Sum(a => ((dynamic)a).size), + assets = assets + }); + } + + /// + /// Health check for content service + /// + [HttpGet("health")] + public IActionResult HealthCheck() + { + var assetTypes = new[] { "cars", "tracks", "textures", "audio" }; + var stats = new Dictionary(); + + foreach (var type in assetTypes) + { + var typePath = Path.Combine(_assetsPath, type); + if (Directory.Exists(typePath)) + { + var files = Directory.GetFiles(typePath, "*.pak"); + var totalSize = files.Sum(f => new FileInfo(f).Length); + + stats[type] = new + { + count = files.Length, + size = totalSize, + sizeFormatted = FormatBytes(totalSize) + }; + } + else + { + stats[type] = new { count = 0, size = 0, sizeFormatted = "0 B" }; + } + } + + return Ok(new + { + status = "healthy", + assetsPath = _assetsPath, + assetTypes = stats + }); + } + + private List GetAssetList() + { + var assets = new List(); + + if (Directory.Exists(_assetsPath)) + { + foreach (var typeDir in Directory.GetDirectories(_assetsPath)) + { + var assetType = Path.GetFileName(typeDir); + + foreach (var file in Directory.GetFiles(typeDir, "*.pak")) + { + var assetId = Path.GetFileNameWithoutExtension(file); + var fileInfo = new FileInfo(file); + + assets.Add(new + { + id = assetId, + type = assetType, + size = fileInfo.Length, + sizeFormatted = FormatBytes(fileInfo.Length), + url = $"/synergy/content/download/{assetType}/{assetId}", + checksum = CalculateMD5(file) + }); + } + } + } + + return assets; + } + + private string CalculateMD5(string filePath) + { + using var md5 = MD5.Create(); + using var stream = System.IO.File.OpenRead(filePath); + var hash = md5.ComputeHash(stream); + return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + } + + private string FormatBytes(long bytes) + { + string[] sizes = { "B", "KB", "MB", "GB", "TB" }; + double len = bytes; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) + { + order++; + len = len / 1024; + } + return $"{len:0.##} {sizes[order]}"; + } +} diff --git a/RR3CommunityServer/Controllers/DirectorController.cs b/RR3CommunityServer/Controllers/DirectorController.cs index d166235..a801008 100644 --- a/RR3CommunityServer/Controllers/DirectorController.cs +++ b/RR3CommunityServer/Controllers/DirectorController.cs @@ -37,6 +37,7 @@ public class DirectorController : ControllerBase { "synergy.tracking", baseUrl }, { "synergy.rewards", baseUrl }, { "synergy.progression", baseUrl }, + { "synergy.content", baseUrl }, // Asset downloads { "synergy.s2s", baseUrl }, { "nexus.portal", baseUrl }, { "ens.url", baseUrl } diff --git a/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.dll b/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.dll index 74a53ca..b445b6d 100644 Binary files a/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.dll and b/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.dll differ diff --git a/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.exe b/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.exe index 3d14274..85c9e30 100644 Binary files a/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.exe and b/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.exe differ diff --git a/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.pdb b/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.pdb index bc219da..dfe0b75 100644 Binary files a/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.pdb and b/RR3CommunityServer/bin/Debug/net8.0/RR3CommunityServer.pdb differ diff --git a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfo.cs b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfo.cs index 0b16682..9d6cde5 100644 --- a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfo.cs +++ b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("RR3CommunityServer")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+fbe421847e7dfad2014a3887a980b21816b089c2")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+934fa5152419080c5b5141b2593477e484c01afe")] [assembly: System.Reflection.AssemblyProductAttribute("RR3CommunityServer")] [assembly: System.Reflection.AssemblyTitleAttribute("RR3CommunityServer")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfoInputs.cache b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfoInputs.cache index d3a44df..125b193 100644 --- a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfoInputs.cache +++ b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.AssemblyInfoInputs.cache @@ -1 +1 @@ -b7ccb392933ea056c5b401e3050c023e4497dda64d38cb3a82972974a423f294 +f4d6eeec5b393772c26779c58f4e77800d065ad7b123a1216eccd195e2af820c diff --git a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.csproj.CoreCompileInputs.cache b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.csproj.CoreCompileInputs.cache index be2b6f4..0e6bfa4 100644 --- a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.csproj.CoreCompileInputs.cache +++ b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -aa1c6883da2c6f9cad1195dd020f1819f588859efd855d9f098047f16cd51eb1 +6117c07d8c4cfa88581ba7fdf8679b0a47488ddca8a8c87acb69fd578c4799f9 diff --git a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.dll b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.dll index 74a53ca..b445b6d 100644 Binary files a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.dll and b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.dll differ diff --git a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.pdb b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.pdb index bc219da..dfe0b75 100644 Binary files a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.pdb and b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.pdb differ diff --git a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.sourcelink.json b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.sourcelink.json index f46ab32..ab2d888 100644 --- a/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.sourcelink.json +++ b/RR3CommunityServer/obj/Debug/net8.0/RR3CommunityServer.sourcelink.json @@ -1 +1 @@ -{"documents":{"E:\\rr3\\RR3CommunityServer\\*":"https://raw.githubusercontent.com/ssfdre38/rr3-server/fbe421847e7dfad2014a3887a980b21816b089c2/*"}} \ No newline at end of file +{"documents":{"E:\\rr3\\RR3CommunityServer\\*":"https://raw.githubusercontent.com/ssfdre38/rr3-server/934fa5152419080c5b5141b2593477e484c01afe/*"}} \ No newline at end of file diff --git a/RR3CommunityServer/obj/Debug/net8.0/apphost.exe b/RR3CommunityServer/obj/Debug/net8.0/apphost.exe index 3d14274..85c9e30 100644 Binary files a/RR3CommunityServer/obj/Debug/net8.0/apphost.exe and b/RR3CommunityServer/obj/Debug/net8.0/apphost.exe differ diff --git a/RR3CommunityServer/obj/Debug/net8.0/ref/RR3CommunityServer.dll b/RR3CommunityServer/obj/Debug/net8.0/ref/RR3CommunityServer.dll index deee5a9..a9634f5 100644 Binary files a/RR3CommunityServer/obj/Debug/net8.0/ref/RR3CommunityServer.dll and b/RR3CommunityServer/obj/Debug/net8.0/ref/RR3CommunityServer.dll differ diff --git a/RR3CommunityServer/obj/Debug/net8.0/refint/RR3CommunityServer.dll b/RR3CommunityServer/obj/Debug/net8.0/refint/RR3CommunityServer.dll index deee5a9..a9634f5 100644 Binary files a/RR3CommunityServer/obj/Debug/net8.0/refint/RR3CommunityServer.dll and b/RR3CommunityServer/obj/Debug/net8.0/refint/RR3CommunityServer.dll differ diff --git a/RR3CommunityServer/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json b/RR3CommunityServer/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json index cdb846c..a555659 100644 --- a/RR3CommunityServer/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json +++ b/RR3CommunityServer/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"FVgSwAD+RSUSlX55EychRC3hFo+vn7vEvO4TyMJprcM=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["7Gcs8uTS1W2TjgmuuoBwaL/zy\u002B2wcKht3msEI7xtxEM=","XWz/ezyQ/zz6q7gqbUREA6BRKDpL7J8X2Ypj\u002B1WdnYY=","A3Op/M2RFQpYBjcrogPFz1XIhJgm4S0j42sTu7EvHxI=","hnhSRoeFpk3C6XWICUlX/lNip6TfbZWFYZv4weSCyrw=","EoVh8vBcGohUnEMEoZuTXrpZ9uBDHT19VmDHc/D\u002Bm0I=","IdEjAFCVk3xZYjiEMESONot/jkvTj/gnwS5nnpGaIMc=","JVRe\u002Be2d47FunIfxVYRpqRFtljZ8gqrK3xMRy6TCd\u002BQ=","DQG0T8n9f5ohwv9akihU55D4/3WR7\u002BlDnvkdsAHHSgc=","VxDQNRQXYUU41o9SG4HrkKWR59FJIv8lmnwBolB/wE0=","0qcd51IQrNKYL9233q2L9h8dLzPcor56mdtkcOdQWoI=","0Slg2/xnc5E9nXprYyph/57wQou\u002BhGSGgKchbo4aNOg=","iwhciMceDYGWEDInLGhYMdHcWG826ConXi020\u002B5rawY=","uyvh3stjGDbFG\u002BpgTWJOhuOKd8owqZkvI8psvOWqsso=","H7pIhmEAeQaK0FIAJMM4lqts08H04IDYcy0aNxHdKHM=","\u002BlXcvLfSHF8FbrWk2UQSf\u002BodPwZSm4MA4RTIFOtI\u002BaY=","/s1pOdMacXOJO2AeBKr2KfMWu1ai23zb2OZjCcapnp8=","k15Z/9EL/0Vd5ORRglbigwCRBc4UN8gwcnYMsJGX7G0="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"FVgSwAD+RSUSlX55EychRC3hFo+vn7vEvO4TyMJprcM=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["7Gcs8uTS1W2TjgmuuoBwaL/zy\u002B2wcKht3msEI7xtxEM=","XWz/ezyQ/zz6q7gqbUREA6BRKDpL7J8X2Ypj\u002B1WdnYY=","A3Op/M2RFQpYBjcrogPFz1XIhJgm4S0j42sTu7EvHxI=","hnhSRoeFpk3C6XWICUlX/lNip6TfbZWFYZv4weSCyrw=","EoVh8vBcGohUnEMEoZuTXrpZ9uBDHT19VmDHc/D\u002Bm0I=","IdEjAFCVk3xZYjiEMESONot/jkvTj/gnwS5nnpGaIMc=","JVRe\u002Be2d47FunIfxVYRpqRFtljZ8gqrK3xMRy6TCd\u002BQ=","DQG0T8n9f5ohwv9akihU55D4/3WR7\u002BlDnvkdsAHHSgc=","VxDQNRQXYUU41o9SG4HrkKWR59FJIv8lmnwBolB/wE0=","0qcd51IQrNKYL9233q2L9h8dLzPcor56mdtkcOdQWoI=","0Slg2/xnc5E9nXprYyph/57wQou\u002BhGSGgKchbo4aNOg=","s3aoiNP1MQgQRB\u002BVPitzH59upgaCzF\u002Bmb31uVs8G/eI=","T4Q5Djrj0xyEnesxWEjQ7iaKDb7sMWyGcOs\u002BFUrfZu8=","iwhciMceDYGWEDInLGhYMdHcWG826ConXi020\u002B5rawY=","uyvh3stjGDbFG\u002BpgTWJOhuOKd8owqZkvI8psvOWqsso=","H7pIhmEAeQaK0FIAJMM4lqts08H04IDYcy0aNxHdKHM=","\u002BlXcvLfSHF8FbrWk2UQSf\u002BodPwZSm4MA4RTIFOtI\u002BaY=","/s1pOdMacXOJO2AeBKr2KfMWu1ai23zb2OZjCcapnp8=","dUP4TEpQnExDOxsXDL4jtIAp3tRLK4pYZTMa4TqPSfw="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/RR3CommunityServer/obj/Debug/net8.0/rjsmrazor.dswa.cache.json b/RR3CommunityServer/obj/Debug/net8.0/rjsmrazor.dswa.cache.json index 794e0f2..fea1f74 100644 --- a/RR3CommunityServer/obj/Debug/net8.0/rjsmrazor.dswa.cache.json +++ b/RR3CommunityServer/obj/Debug/net8.0/rjsmrazor.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"77IoXRXzqsXjiL49gpciOThHZJG/7UPKC1BPuiFQdlk=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["7Gcs8uTS1W2TjgmuuoBwaL/zy\u002B2wcKht3msEI7xtxEM=","XWz/ezyQ/zz6q7gqbUREA6BRKDpL7J8X2Ypj\u002B1WdnYY=","A3Op/M2RFQpYBjcrogPFz1XIhJgm4S0j42sTu7EvHxI=","hnhSRoeFpk3C6XWICUlX/lNip6TfbZWFYZv4weSCyrw=","EoVh8vBcGohUnEMEoZuTXrpZ9uBDHT19VmDHc/D\u002Bm0I=","IdEjAFCVk3xZYjiEMESONot/jkvTj/gnwS5nnpGaIMc=","JVRe\u002Be2d47FunIfxVYRpqRFtljZ8gqrK3xMRy6TCd\u002BQ=","DQG0T8n9f5ohwv9akihU55D4/3WR7\u002BlDnvkdsAHHSgc=","VxDQNRQXYUU41o9SG4HrkKWR59FJIv8lmnwBolB/wE0=","0qcd51IQrNKYL9233q2L9h8dLzPcor56mdtkcOdQWoI=","0Slg2/xnc5E9nXprYyph/57wQou\u002BhGSGgKchbo4aNOg=","iwhciMceDYGWEDInLGhYMdHcWG826ConXi020\u002B5rawY=","uyvh3stjGDbFG\u002BpgTWJOhuOKd8owqZkvI8psvOWqsso=","H7pIhmEAeQaK0FIAJMM4lqts08H04IDYcy0aNxHdKHM=","\u002BlXcvLfSHF8FbrWk2UQSf\u002BodPwZSm4MA4RTIFOtI\u002BaY=","/s1pOdMacXOJO2AeBKr2KfMWu1ai23zb2OZjCcapnp8=","k15Z/9EL/0Vd5ORRglbigwCRBc4UN8gwcnYMsJGX7G0="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"77IoXRXzqsXjiL49gpciOThHZJG/7UPKC1BPuiFQdlk=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["7Gcs8uTS1W2TjgmuuoBwaL/zy\u002B2wcKht3msEI7xtxEM=","XWz/ezyQ/zz6q7gqbUREA6BRKDpL7J8X2Ypj\u002B1WdnYY=","A3Op/M2RFQpYBjcrogPFz1XIhJgm4S0j42sTu7EvHxI=","hnhSRoeFpk3C6XWICUlX/lNip6TfbZWFYZv4weSCyrw=","EoVh8vBcGohUnEMEoZuTXrpZ9uBDHT19VmDHc/D\u002Bm0I=","IdEjAFCVk3xZYjiEMESONot/jkvTj/gnwS5nnpGaIMc=","JVRe\u002Be2d47FunIfxVYRpqRFtljZ8gqrK3xMRy6TCd\u002BQ=","DQG0T8n9f5ohwv9akihU55D4/3WR7\u002BlDnvkdsAHHSgc=","VxDQNRQXYUU41o9SG4HrkKWR59FJIv8lmnwBolB/wE0=","0qcd51IQrNKYL9233q2L9h8dLzPcor56mdtkcOdQWoI=","0Slg2/xnc5E9nXprYyph/57wQou\u002BhGSGgKchbo4aNOg=","s3aoiNP1MQgQRB\u002BVPitzH59upgaCzF\u002Bmb31uVs8G/eI=","T4Q5Djrj0xyEnesxWEjQ7iaKDb7sMWyGcOs\u002BFUrfZu8=","iwhciMceDYGWEDInLGhYMdHcWG826ConXi020\u002B5rawY=","uyvh3stjGDbFG\u002BpgTWJOhuOKd8owqZkvI8psvOWqsso=","H7pIhmEAeQaK0FIAJMM4lqts08H04IDYcy0aNxHdKHM=","\u002BlXcvLfSHF8FbrWk2UQSf\u002BodPwZSm4MA4RTIFOtI\u002BaY=","/s1pOdMacXOJO2AeBKr2KfMWu1ai23zb2OZjCcapnp8=","dUP4TEpQnExDOxsXDL4jtIAp3tRLK4pYZTMa4TqPSfw="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file