diff --git a/Command/Command/Cmd/CommandGiveall.cs b/Command/Command/Cmd/CommandGiveall.cs index 82128258..c448da32 100644 --- a/Command/Command/Cmd/CommandGiveall.cs +++ b/Command/Command/Cmd/CommandGiveall.cs @@ -147,6 +147,7 @@ public class CommandGiveall : ICommand await arg.SendMsg(I18NManager.Translate("Game.Command.Notice.PlayerNotFound")); return; } + arg.CharacterArgs.TryGetValue("x", out var amountStr); amountStr ??= "1"; if (!int.TryParse(amountStr, out var amount)) @@ -154,6 +155,7 @@ public class CommandGiveall : ICommand await arg.SendMsg(I18NManager.Translate("Game.Command.Notice.InvalidArguments")); return; } + var petList = GameData.ItemConfigData.Values; var items = new List(); foreach (var pet in petList) @@ -163,7 +165,7 @@ public class CommandGiveall : ICommand ItemId = pet.ID, Count = amount }); - await player.InventoryManager!.AddItems(items, true); + await player.InventoryManager!.AddItems(items); await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems", I18NManager.Translate("Word.Pet"), "1")); } diff --git a/Common/Configuration/ConfigContainer.cs b/Common/Configuration/ConfigContainer.cs index 48781623..a953894a 100644 --- a/Common/Configuration/ConfigContainer.cs +++ b/Common/Configuration/ConfigContainer.cs @@ -115,4 +115,4 @@ public class DownloadUrlConfig public class MuipServerConfig { public string AdminKey { get; set; } = "None"; -} +} \ No newline at end of file diff --git a/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs b/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs index bcc02f60..f4dc58b5 100644 --- a/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs +++ b/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs @@ -96,11 +96,13 @@ public class AdventureModifierConfig .ToList() ?? []; if (obj.ContainsKey(nameof(OnBeforeBattle))) - info.OnBeforeBattle = obj[nameof(OnBeforeBattle)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) + info.OnBeforeBattle = obj[nameof(OnBeforeBattle)] + ?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) .ToList() ?? []; if (obj.ContainsKey(nameof(OnAfterBattle))) - info.OnAfterBattle = obj[nameof(OnAfterBattle)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) + info.OnAfterBattle = obj[nameof(OnAfterBattle)] + ?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) .ToList() ?? []; if (obj.ContainsKey(nameof(OnStage))) @@ -112,11 +114,13 @@ public class AdventureModifierConfig .ToList() ?? []; if (obj.ContainsKey(nameof(OnForeGround))) - info.OnForeGround = obj[nameof(OnForeGround)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) + info.OnForeGround = obj[nameof(OnForeGround)] + ?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) .ToList() ?? []; if (obj.ContainsKey(nameof(OnBackGround))) - info.OnBackGround = obj[nameof(OnBackGround)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) + info.OnBackGround = obj[nameof(OnBackGround)] + ?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) .ToList() ?? []; // TODO: others diff --git a/Common/Data/Config/AdventureAbility/AdventureModifierLookupTableConfig.cs b/Common/Data/Config/AdventureAbility/AdventureModifierLookupTableConfig.cs index 695b1480..5b6cb3bc 100644 --- a/Common/Data/Config/AdventureAbility/AdventureModifierLookupTableConfig.cs +++ b/Common/Data/Config/AdventureAbility/AdventureModifierLookupTableConfig.cs @@ -1,7 +1,4 @@ -using EggLink.DanhengServer.Data.Config.Task; -using NetTaste; -using Newtonsoft.Json.Linq; -using System.Diagnostics; +using Newtonsoft.Json.Linq; namespace EggLink.DanhengServer.Data.Config.AdventureAbility; @@ -15,9 +12,7 @@ public class AdventureModifierLookupTableConfig if (!obj.ContainsKey(nameof(ModifierMap))) return info; foreach (var jObject in obj[nameof(ModifierMap)]!.ToObject>()!) - { info.ModifierMap.Add(jObject.Key, AdventureModifierConfig.LoadFromJObject(jObject.Value)); - } return info; } } \ No newline at end of file diff --git a/Common/Data/Custom/ChessRogueDiceSurfaceEffectConfig.cs b/Common/Data/Custom/ChessRogueDiceSurfaceEffectConfig.cs index 9e540c52..9f10131e 100644 --- a/Common/Data/Custom/ChessRogueDiceSurfaceEffectConfig.cs +++ b/Common/Data/Custom/ChessRogueDiceSurfaceEffectConfig.cs @@ -14,5 +14,6 @@ public class ChessRogueDiceSurfaceContentEffect { [JsonConverter(typeof(StringEnumConverter))] public ModifierEffectTypeEnum EffectType { get; set; } + public Dictionary Params { get; set; } = []; } \ No newline at end of file diff --git a/Common/Data/Excel/PetExcel.cs b/Common/Data/Excel/PetExcel.cs index 5b92b5cb..21aa2d62 100644 --- a/Common/Data/Excel/PetExcel.cs +++ b/Common/Data/Excel/PetExcel.cs @@ -6,10 +6,12 @@ public class PetExcel : ExcelResource public int PetID { get; set; } public int PetItemID { get; set; } public int SummonUnitID { get; set; } + public override int GetId() { return PetID; } + public override void Loaded() { GameData.PetData.Add(PetID, this); diff --git a/Common/Data/Excel/RogueMagicLayerRoomExcel.cs b/Common/Data/Excel/RogueMagicLayerRoomExcel.cs index 0e9e8c76..a469e1f8 100644 --- a/Common/Data/Excel/RogueMagicLayerRoomExcel.cs +++ b/Common/Data/Excel/RogueMagicLayerRoomExcel.cs @@ -14,8 +14,6 @@ public class RogueMagicLayerRoomExcel : ExcelResource public override void Loaded() { if (!GameData.RogueMagicLayerIdRoomCountDict.TryAdd(LayerID, 1)) - { GameData.RogueMagicLayerIdRoomCountDict[LayerID]++; - } } } \ No newline at end of file diff --git a/Common/Data/Excel/RogueMagicScepterExcel.cs b/Common/Data/Excel/RogueMagicScepterExcel.cs index dba6b4ac..0cba3ee4 100644 --- a/Common/Data/Excel/RogueMagicScepterExcel.cs +++ b/Common/Data/Excel/RogueMagicScepterExcel.cs @@ -18,12 +18,13 @@ public class RogueMagicScepterExcel : ExcelResource [JsonConverter(typeof(StringEnumConverter))] public RogueMagicStyleTypeEnum StyleType { get; set; } + //public FixPoint ScepterBasicPower { get; set; } public int StaffMazeBuffID { get; set; } [JsonConverter(typeof(StringEnumConverter))] public RogueMagicRangeTypeEnum LimitRangeType { get; set; } - + [JsonProperty(ItemConverterType = typeof(StringEnumConverter))] public List EffectTypeList { get; set; } = []; @@ -40,9 +41,7 @@ public class RogueMagicScepterExcel : ExcelResource public class LockMagicUnitInfo { - [JsonProperty("GHFHMJLCIEC")] - public int MagicUnitId { get; set; } + [JsonProperty("GHFHMJLCIEC")] public int MagicUnitId { get; set; } - [JsonProperty("LDEDAMNEIJO")] - public int MagicUnitLevel { get; set; } + [JsonProperty("LDEDAMNEIJO")] public int MagicUnitLevel { get; set; } } \ No newline at end of file diff --git a/Common/Data/Excel/RogueMagicUnitExcel.cs b/Common/Data/Excel/RogueMagicUnitExcel.cs index 5c56ed30..ca0f3a1d 100644 --- a/Common/Data/Excel/RogueMagicUnitExcel.cs +++ b/Common/Data/Excel/RogueMagicUnitExcel.cs @@ -19,6 +19,7 @@ public class RogueMagicUnitExcel : ExcelResource [JsonConverter(typeof(StringEnumConverter))] public RogueMagicStyleTypeEnum StyleType { get; set; } + //public TextID MagicUnitDesc { get; set; } //public TextID MagicUnitSimpleDesc { get; set; } public List ExtraEffectID { get; set; } = []; diff --git a/Common/Data/Excel/RogueTournFormulaExcel.cs b/Common/Data/Excel/RogueTournFormulaExcel.cs index 35960635..2b1e31d9 100644 --- a/Common/Data/Excel/RogueTournFormulaExcel.cs +++ b/Common/Data/Excel/RogueTournFormulaExcel.cs @@ -1,5 +1,4 @@ -using EggLink.DanhengServer.Data.Custom; -using EggLink.DanhengServer.Enums.TournRogue; +using EggLink.DanhengServer.Enums.TournRogue; using EggLink.DanhengServer.Proto; using Newtonsoft.Json; using Newtonsoft.Json.Converters; diff --git a/Common/Data/Excel/RogueTournWorkbenchExcel.cs b/Common/Data/Excel/RogueTournWorkbenchExcel.cs index 95a5eb39..1babd665 100644 --- a/Common/Data/Excel/RogueTournWorkbenchExcel.cs +++ b/Common/Data/Excel/RogueTournWorkbenchExcel.cs @@ -1,5 +1,4 @@ -using System; -using Newtonsoft.Json; +using Newtonsoft.Json; namespace EggLink.DanhengServer.Data.Excel; @@ -9,8 +8,7 @@ public class RogueTournWorkbenchExcel : ExcelResource public int WorkbenchID { get; set; } public List FuncList { get; set; } = []; - [JsonIgnore] - public List Funcs { get; set; } = []; + [JsonIgnore] public List Funcs { get; set; } = []; public override int GetId() { @@ -25,11 +23,7 @@ public class RogueTournWorkbenchExcel : ExcelResource public override void AfterAllDone() { foreach (var func in FuncList) - { if (GameData.RogueTournWorkbenchFuncData.TryGetValue(func, out var funcExcel)) - { Funcs.Add(funcExcel); - } - } } } \ No newline at end of file diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 95bfd0c6..890e55f9 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -222,6 +222,7 @@ public static class GameData public static Dictionary RogueTalentData { get; private set; } = []; public static Dictionary RogueTurntableData { get; private set; } = []; + public static Dictionary RogueWolfGunMiracleTargetData { get; private set; } = []; @@ -263,7 +264,10 @@ public static class GameData public static Dictionary RogueMagicAreaData { get; private set; } = []; public static Dictionary RogueMagicAdventureRoomData { get; private set; } = []; - public static Dictionary RogueMagicDifficultyCompData { get; private set; } = []; + + public static Dictionary RogueMagicDifficultyCompData { get; private set; } = + []; + public static Dictionary RogueMagicStoryData { get; private set; } = []; public static Dictionary RogueMagicScepterData { get; private set; } = []; public static Dictionary RogueMagicRoomData { get; private set; } = []; diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs index 8ac64a35..83eb7f4c 100644 --- a/Common/Data/ResourceManager.cs +++ b/Common/Data/ResourceManager.cs @@ -678,10 +678,10 @@ public class ResourceManager return; } + var files = directory.GetFiles(); foreach (var file in files) - { try { using var reader = file.OpenRead(); @@ -702,7 +702,6 @@ public class ResourceManager I18NManager.Translate("Server.ServerInfo.FailedToReadItem", file.Name, I18NManager.Translate("Word.Error")), ex); } - } //if (count < boardList.Count) // Logger.Warn(I18NManager.Translate("Server.ServerInfo.ConfigMissing", diff --git a/Common/Enums/Mission/MissionFinishTypeEnum.cs b/Common/Enums/Mission/MissionFinishTypeEnum.cs index afe6e657..7a10ebf8 100644 --- a/Common/Enums/Mission/MissionFinishTypeEnum.cs +++ b/Common/Enums/Mission/MissionFinishTypeEnum.cs @@ -2,7 +2,6 @@ public enum MissionFinishTypeEnum { - Unknown = 0, AutoFinish = 1, Talk = 2, diff --git a/Common/Enums/Rogue/RogueCellMarkTypeEnum.cs b/Common/Enums/Rogue/RogueCellMarkTypeEnum.cs index 029786dd..4c7674ec 100644 --- a/Common/Enums/Rogue/RogueCellMarkTypeEnum.cs +++ b/Common/Enums/Rogue/RogueCellMarkTypeEnum.cs @@ -2,7 +2,6 @@ public enum RogueCellMarkTypeEnum { - None = 0, Enhance = 1, Buff = 2, diff --git a/Common/Enums/RogueMagic/RogueMagicAreaGroupIDEnum.cs b/Common/Enums/RogueMagic/RogueMagicAreaGroupIDEnum.cs index 6b6cfe2b..6e748b02 100644 --- a/Common/Enums/RogueMagic/RogueMagicAreaGroupIDEnum.cs +++ b/Common/Enums/RogueMagic/RogueMagicAreaGroupIDEnum.cs @@ -2,7 +2,6 @@ public enum RogueMagicAreaGroupIDEnum { - None = 0, Guide = 1, Formal = 2, diff --git a/Common/Enums/RogueMagic/RogueMagicRangeTypeEnum.cs b/Common/Enums/RogueMagic/RogueMagicRangeTypeEnum.cs index c1bbdcc6..2962162a 100644 --- a/Common/Enums/RogueMagic/RogueMagicRangeTypeEnum.cs +++ b/Common/Enums/RogueMagic/RogueMagicRangeTypeEnum.cs @@ -6,5 +6,5 @@ public enum RogueMagicRangeTypeEnum Eject = 1, Concentrate = 2, AOE = 3, - Spread = 4, + Spread = 4 } \ No newline at end of file diff --git a/Common/Enums/RogueMagic/RogueMagicRoomTypeEnum.cs b/Common/Enums/RogueMagic/RogueMagicRoomTypeEnum.cs index 4b2e9a05..d35a63d2 100644 --- a/Common/Enums/RogueMagic/RogueMagicRoomTypeEnum.cs +++ b/Common/Enums/RogueMagic/RogueMagicRoomTypeEnum.cs @@ -2,7 +2,6 @@ public enum RogueMagicRoomTypeEnum { - Unknown = 0, Boss = 1, Battle = 2, diff --git a/Common/Enums/Scene/GameModeTypeEnum.cs b/Common/Enums/Scene/GameModeTypeEnum.cs index 00198818..f041ebe3 100644 --- a/Common/Enums/Scene/GameModeTypeEnum.cs +++ b/Common/Enums/Scene/GameModeTypeEnum.cs @@ -22,5 +22,5 @@ public enum GameModeTypeEnum TournRogue = 17, RelicRogue = 18, ArcadeRogue = 19, - MagicRogue = 20, + MagicRogue = 20 } \ No newline at end of file diff --git a/Common/Enums/TournRogue/RogueTournWorkbenchFuncTypeEnum.cs b/Common/Enums/TournRogue/RogueTournWorkbenchFuncTypeEnum.cs index 0a24cf50..ea9d3537 100644 --- a/Common/Enums/TournRogue/RogueTournWorkbenchFuncTypeEnum.cs +++ b/Common/Enums/TournRogue/RogueTournWorkbenchFuncTypeEnum.cs @@ -7,5 +7,5 @@ public enum RogueTournWorkbenchFuncTypeEnum BuffReforge = 2, FormulaReforge = 3, MiracleCompose = 4, - MiracleReforge = 5, + MiracleReforge = 5 } \ No newline at end of file diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index b23f7c5a..f8933db5 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -151,7 +151,10 @@ public class ServerInfoTextEN public string LoadingItem => "Loading {0}..."; public string RegisterItem => "Registered {0} {1}(s)."; public string FailedToLoadItem => "Failed to load {0}."; - public string NewClientSecretKey => "Client Secret Key does not exist and a new Client Secret Key is being generated."; + + public string NewClientSecretKey => + "Client Secret Key does not exist and a new Client Secret Key is being generated."; + public string FailedToInitializeItem => "Failed to initialize {0}."; public string FailedToReadItem => "Failed to read {0}, file {1}"; public string GeneratedItem => "Generated {0}."; diff --git a/Common/Util/Crypto.cs b/Common/Util/Crypto.cs index c911d43c..12f8002a 100644 --- a/Common/Util/Crypto.cs +++ b/Common/Util/Crypto.cs @@ -26,12 +26,12 @@ public class Crypto public static byte[] GenerateXorKey(ulong seed) { - byte[] key = new byte[4096]; - MT19937 random = new MT19937(seed); + var key = new byte[4096]; + var random = new MT19937(seed); - for (int i = 0; i < key.Length / 8; i++) + for (var i = 0; i < key.Length / 8; i++) { - ulong value = random.NextUInt64(); + var value = random.NextUInt64(); key[i * 8 + 0] = (byte)((value >> 56) & 0xFF); key[i * 8 + 1] = (byte)((value >> 48) & 0xFF); @@ -48,24 +48,22 @@ public class Crypto public static Ec2b? InitEc2b() { - string filePath = ConfigManager.Config.Path.ConfigPath + "/ClientSecretKey.ec2b"; + var filePath = ConfigManager.Config.Path.ConfigPath + "/ClientSecretKey.ec2b"; try { byte[] ec2bData; if (!File.Exists(filePath)) { - Ec2b newEc2b = Ec2b.GenerateEc2b(); + var newEc2b = Ec2b.GenerateEc2b(); ec2bData = newEc2b.GetBytes(); File.WriteAllBytes(filePath, ec2bData); Logger.Info(I18NManager.Translate("Server.ServerInfo.NewClientSecretKey")); return newEc2b; } - else - { - ec2bData = File.ReadAllBytes(filePath); - Ec2b ec2b = Ec2b.Read(ec2bData); - return ec2b; - } + + ec2bData = File.ReadAllBytes(filePath); + var ec2b = Ec2b.Read(ec2bData); + return ec2b; } catch (Exception ex) { diff --git a/Common/Util/Security/AES128.cs b/Common/Util/Security/AES128.cs index 31b607bc..254fbf23 100644 --- a/Common/Util/Security/AES128.cs +++ b/Common/Util/Security/AES128.cs @@ -1,226 +1,203 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace EggLink.DanhengServer.Util.Security; -namespace EggLink.DanhengServer.Util.Security +public class AES128 { - public class AES128 + private static void Xor(byte[] a, byte[] b, int n) { - private static void Xor(byte[] a, byte[] b, int n) + for (var i = 0; i < n; i++) a[i] ^= b[i]; + } + + private static void XorRoundKey(byte[] state, byte[] keys, int round) + { + Xor(state, keys.Skip(round * 16).Take(16).ToArray(), 16); + } + + private static void SubBytes(byte[] a, int n) + { + for (var i = 0; i < n; i++) a[i] = Magic.LookupSbox[a[i]]; + } + + private static void SubBytesInv(byte[] a, int n) + { + for (var i = 0; i < n; i++) a[i] = Magic.LookupSboxInv[a[i]]; + } + + private static void KeyScheduleCore(byte[] a, int i) + { + var temp = a[0]; + a[0] = a[1]; + a[1] = a[2]; + a[2] = a[3]; + a[3] = temp; + + SubBytes(a, 4); + + a[0] ^= Magic.LookupRcon[i]; + } + + public static void Aes128LoadSchedule(byte[] key, out byte[] schedule) + { + schedule = new byte[16 * 11]; + var bytes = 16; + var i = 1; + var t = new byte[4]; + + Array.Copy(key, schedule, 16); + + while (bytes < 176) { - for (int i = 0; i < n; i++) - { - a[i] ^= b[i]; - } - } + Array.Copy(schedule, bytes - 4, t, 0, 4); - private static void XorRoundKey(byte[] state, byte[] keys, int round) - { - Xor(state, keys.Skip(round * 16).Take(16).ToArray(), 16); - } + KeyScheduleCore(t, i); + i++; - private static void SubBytes(byte[] a, int n) - { - for (int i = 0; i < n; i++) - { - a[i] = Magic.LookupSbox[a[i]]; - } - } - private static void SubBytesInv(byte[] a, int n) - { - for (int i = 0; i < n; i++) - { - a[i] = Magic.LookupSboxInv[a[i]]; - } - } + for (var k = 0; k < 4; k++) t[k] ^= schedule[bytes - 16 + k]; - private static void KeyScheduleCore(byte[] a, int i) - { - byte temp = a[0]; - a[0] = a[1]; - a[1] = a[2]; - a[2] = a[3]; - a[3] = temp; + Array.Copy(t, 0, schedule, bytes, 4); + bytes += 4; - SubBytes(a, 4); - - a[0] ^= Magic.LookupRcon[i]; - } - - public static void Aes128LoadSchedule(byte[] key, out byte[] schedule) - { - schedule = new byte[16 * 11]; - int bytes = 16; - int i = 1; - byte[] t = new byte[4]; - - Array.Copy(key, schedule, 16); - - while (bytes < 176) + for (var j = 0; j < 3; j++) { Array.Copy(schedule, bytes - 4, t, 0, 4); - KeyScheduleCore(t, i); - i++; - - for (int k = 0; k < 4; k++) - { - t[k] ^= schedule[bytes - 16 + k]; - } + for (var k = 0; k < 4; k++) t[k] ^= schedule[bytes - 16 + k]; Array.Copy(t, 0, schedule, bytes, 4); bytes += 4; - - for (int j = 0; j < 3; j++) - { - Array.Copy(schedule, bytes - 4, t, 0, 4); - - for (int k = 0; k < 4; k++) - { - t[k] ^= schedule[bytes - 16 + k]; - } - - Array.Copy(t, 0, schedule, bytes, 4); - bytes += 4; - } } } - - private static void ShiftRows(byte[] state) - { - byte[] temp = new byte[16]; - Array.Copy(state, temp, 16); - - for (int i = 0; i < 16; i++) - { - state[i] = temp[Magic.ShiftRowsTable[i]]; - } - } - private static void ShiftRowsInv(byte[] state) - { - byte[] temp = new byte[16]; - Array.Copy(state, temp, 16); - - for (int i = 0; i < 16; i++) - { - state[i] = temp[Magic.ShiftRowsTableInv[i]]; - } - } - - private static void MixCol(byte[] state, int offset) - { - byte a0 = state[offset]; - byte a1 = state[offset + 1]; - byte a2 = state[offset + 2]; - byte a3 = state[offset + 3]; - - state[offset] = (byte)(Magic.LookupG2[a0] ^ Magic.LookupG3[a1] ^ a2 ^ a3); - state[offset + 1] = (byte)(Magic.LookupG2[a1] ^ Magic.LookupG3[a2] ^ a3 ^ a0); - state[offset + 2] = (byte)(Magic.LookupG2[a2] ^ Magic.LookupG3[a3] ^ a0 ^ a1); - state[offset + 3] = (byte)(Magic.LookupG2[a3] ^ Magic.LookupG3[a0] ^ a1 ^ a2); - } - - private static void MixCols(byte[] state) - { - MixCol(state, 0); - MixCol(state, 4); - MixCol(state, 8); - MixCol(state, 12); - } - - private static void MixColInv(byte[] state, int offset) - { - byte a0 = state[offset]; - byte a1 = state[offset + 1]; - byte a2 = state[offset + 2]; - byte a3 = state[offset + 3]; - - state[offset] = (byte)(Magic.LookupG14[a0] ^ Magic.LookupG9[a3] ^ Magic.LookupG13[a2] ^ Magic.LookupG11[a1]); - state[offset + 1] = (byte)(Magic.LookupG14[a1] ^ Magic.LookupG9[a0] ^ Magic.LookupG13[a3] ^ Magic.LookupG11[a2]); - state[offset + 2] = (byte)(Magic.LookupG14[a2] ^ Magic.LookupG9[a1] ^ Magic.LookupG13[a0] ^ Magic.LookupG11[a3]); - state[offset + 3] = (byte)(Magic.LookupG14[a3] ^ Magic.LookupG9[a2] ^ Magic.LookupG13[a1] ^ Magic.LookupG11[a0]); - } - - private static void MixColsInv(byte[] state) - { - MixColInv(state, 0); - MixColInv(state, 4); - MixColInv(state, 8); - MixColInv(state, 12); - } - - public static void Aes128Enc(byte[] plaintext, byte[] schedule, byte[] ciphertext) - { - Array.Copy(plaintext, ciphertext, 16); - XorRoundKey(ciphertext, schedule, 0); - - for (int i = 0; i < 9; i++) - { - SubBytes(ciphertext, 16); - ShiftRows(ciphertext); - MixCols(ciphertext); - XorRoundKey(ciphertext, schedule, i + 1); - } - - SubBytes(ciphertext, 16); - ShiftRows(ciphertext); - XorRoundKey(ciphertext, schedule, 10); - } - - public static void RevAes128Enc(byte[] plaintext, byte[] schedule, byte[] ciphertext) - { - Array.Copy(plaintext, ciphertext, 16); - XorRoundKey(ciphertext, schedule, 0); - - for (int i = 0; i < 9; i++) - { - SubBytesInv(ciphertext, 16); - ShiftRowsInv(ciphertext); - MixColsInv(ciphertext); - XorRoundKey(ciphertext, schedule, i + 1); - } - - SubBytesInv(ciphertext, 16); - ShiftRowsInv(ciphertext); - XorRoundKey(ciphertext, schedule, 10); - } - - public static void Aes128Dec(byte[] ciphertext, byte[] schedule, byte[] plaintext) - { - Array.Copy(ciphertext, plaintext, 16); - XorRoundKey(plaintext, schedule, 10); - ShiftRowsInv(plaintext); - SubBytesInv(plaintext, 16); - - for (int i = 0; i < 9; i++) - { - XorRoundKey(plaintext, schedule, 9 - i); - MixColsInv(plaintext); - ShiftRowsInv(plaintext); - SubBytesInv(plaintext, 16); - } - - XorRoundKey(plaintext, schedule, 0); - } - - public static void RevAes128Dec(byte[] ciphertext, byte[] schedule, byte[] plaintext) - { - Array.Copy(ciphertext, plaintext, 16); - XorRoundKey(plaintext, schedule, 10); - ShiftRows(plaintext); - SubBytes(plaintext, 16); - - for (int i = 0; i < 9; i++) - { - XorRoundKey(plaintext, schedule, 9 - i); - MixCols(plaintext); - ShiftRows(plaintext); - SubBytes(plaintext, 16); - } - - XorRoundKey(plaintext, schedule, 0); - } } -} + + private static void ShiftRows(byte[] state) + { + var temp = new byte[16]; + Array.Copy(state, temp, 16); + + for (var i = 0; i < 16; i++) state[i] = temp[Magic.ShiftRowsTable[i]]; + } + + private static void ShiftRowsInv(byte[] state) + { + var temp = new byte[16]; + Array.Copy(state, temp, 16); + + for (var i = 0; i < 16; i++) state[i] = temp[Magic.ShiftRowsTableInv[i]]; + } + + private static void MixCol(byte[] state, int offset) + { + var a0 = state[offset]; + var a1 = state[offset + 1]; + var a2 = state[offset + 2]; + var a3 = state[offset + 3]; + + state[offset] = (byte)(Magic.LookupG2[a0] ^ Magic.LookupG3[a1] ^ a2 ^ a3); + state[offset + 1] = (byte)(Magic.LookupG2[a1] ^ Magic.LookupG3[a2] ^ a3 ^ a0); + state[offset + 2] = (byte)(Magic.LookupG2[a2] ^ Magic.LookupG3[a3] ^ a0 ^ a1); + state[offset + 3] = (byte)(Magic.LookupG2[a3] ^ Magic.LookupG3[a0] ^ a1 ^ a2); + } + + private static void MixCols(byte[] state) + { + MixCol(state, 0); + MixCol(state, 4); + MixCol(state, 8); + MixCol(state, 12); + } + + private static void MixColInv(byte[] state, int offset) + { + var a0 = state[offset]; + var a1 = state[offset + 1]; + var a2 = state[offset + 2]; + var a3 = state[offset + 3]; + + state[offset] = (byte)(Magic.LookupG14[a0] ^ Magic.LookupG9[a3] ^ Magic.LookupG13[a2] ^ Magic.LookupG11[a1]); + state[offset + 1] = + (byte)(Magic.LookupG14[a1] ^ Magic.LookupG9[a0] ^ Magic.LookupG13[a3] ^ Magic.LookupG11[a2]); + state[offset + 2] = + (byte)(Magic.LookupG14[a2] ^ Magic.LookupG9[a1] ^ Magic.LookupG13[a0] ^ Magic.LookupG11[a3]); + state[offset + 3] = + (byte)(Magic.LookupG14[a3] ^ Magic.LookupG9[a2] ^ Magic.LookupG13[a1] ^ Magic.LookupG11[a0]); + } + + private static void MixColsInv(byte[] state) + { + MixColInv(state, 0); + MixColInv(state, 4); + MixColInv(state, 8); + MixColInv(state, 12); + } + + public static void Aes128Enc(byte[] plaintext, byte[] schedule, byte[] ciphertext) + { + Array.Copy(plaintext, ciphertext, 16); + XorRoundKey(ciphertext, schedule, 0); + + for (var i = 0; i < 9; i++) + { + SubBytes(ciphertext, 16); + ShiftRows(ciphertext); + MixCols(ciphertext); + XorRoundKey(ciphertext, schedule, i + 1); + } + + SubBytes(ciphertext, 16); + ShiftRows(ciphertext); + XorRoundKey(ciphertext, schedule, 10); + } + + public static void RevAes128Enc(byte[] plaintext, byte[] schedule, byte[] ciphertext) + { + Array.Copy(plaintext, ciphertext, 16); + XorRoundKey(ciphertext, schedule, 0); + + for (var i = 0; i < 9; i++) + { + SubBytesInv(ciphertext, 16); + ShiftRowsInv(ciphertext); + MixColsInv(ciphertext); + XorRoundKey(ciphertext, schedule, i + 1); + } + + SubBytesInv(ciphertext, 16); + ShiftRowsInv(ciphertext); + XorRoundKey(ciphertext, schedule, 10); + } + + public static void Aes128Dec(byte[] ciphertext, byte[] schedule, byte[] plaintext) + { + Array.Copy(ciphertext, plaintext, 16); + XorRoundKey(plaintext, schedule, 10); + ShiftRowsInv(plaintext); + SubBytesInv(plaintext, 16); + + for (var i = 0; i < 9; i++) + { + XorRoundKey(plaintext, schedule, 9 - i); + MixColsInv(plaintext); + ShiftRowsInv(plaintext); + SubBytesInv(plaintext, 16); + } + + XorRoundKey(plaintext, schedule, 0); + } + + public static void RevAes128Dec(byte[] ciphertext, byte[] schedule, byte[] plaintext) + { + Array.Copy(ciphertext, plaintext, 16); + XorRoundKey(plaintext, schedule, 10); + ShiftRows(plaintext); + SubBytes(plaintext, 16); + + for (var i = 0; i < 9; i++) + { + XorRoundKey(plaintext, schedule, 9 - i); + MixCols(plaintext); + ShiftRows(plaintext); + SubBytes(plaintext, 16); + } + + XorRoundKey(plaintext, schedule, 0); + } +} \ No newline at end of file diff --git a/Common/Util/Security/Ec2b.cs b/Common/Util/Security/Ec2b.cs index 4f97d955..e6c51f56 100644 --- a/Common/Util/Security/Ec2b.cs +++ b/Common/Util/Security/Ec2b.cs @@ -1,186 +1,153 @@ -using System; -using System.Buffers.Binary; -using System.IO; -using System.Security.Cryptography; -using System.Text; +using System.Buffers.Binary; -namespace EggLink.DanhengServer.Util.Security +namespace EggLink.DanhengServer.Util.Security; + +public class Ec2b { - public class Ec2b - { - private const int HEAD_MAGIC = 1647469381; // "Ec2b" - private const int KEY_SIZE = 16; - private const int DATA_SIZE = 2048; + private const int HEAD_MAGIC = 1647469381; // "Ec2b" + private const int KEY_SIZE = 16; + private const int DATA_SIZE = 2048; + private readonly byte[] Data; - private byte[] Key; - private byte[] Data; + private readonly byte[] Key; - private ulong Seed; - private byte[] XorKey; + private ulong Seed; + private byte[] XorKey; #pragma warning disable CS8618 // CS8618 - Non-nullable variable must contain a non-null value when exiting constructor. - private Ec2b(byte[] key, byte[] data) + private Ec2b(byte[] key, byte[] data) #pragma warning restore CS8618 // CS8618 - Non-nullable variable must contain a non-null value when exiting constructor. - { - Key = key; - Data = data; - byte[] scrambledKey = new byte[KEY_SIZE]; - Array.Copy(Key, scrambledKey, KEY_SIZE); - KeyScramble(scrambledKey); - GenerateDecryptionVector(scrambledKey, Data); - } - - public static Ec2b Read(byte[] input) - { - if (input == null || input.Length < 2076) - { - throw new Exception("Input data is too short."); - } - - int offset = 0; - - int magic = BinaryPrimitives.ReadInt32LittleEndian(input.AsSpan(offset, 4)); - if (magic != HEAD_MAGIC) - { - throw new Exception($"Magic mismatch, expected: {HEAD_MAGIC}, got: {magic}"); - } - offset += 4; - - int keySize = BinaryPrimitives.ReadInt32LittleEndian(input.AsSpan(offset, 4)); - offset += 4; - if (keySize != KEY_SIZE) - { - throw new Exception($"Invalid key size, expected: {KEY_SIZE}, got: {keySize}"); - } - - if (input.Length < offset + KEY_SIZE) - { - throw new Exception("Input data is too short for key."); - } - byte[] key = new byte[KEY_SIZE]; - Array.Copy(input, offset, key, 0, KEY_SIZE); - offset += KEY_SIZE; - - if (input.Length < offset + 4) - { - throw new Exception("Input data is too short for data size."); - } - int dataSize = BinaryPrimitives.ReadInt32LittleEndian(input.AsSpan(offset, 4)); - offset += 4; - if (dataSize != DATA_SIZE) - { - throw new Exception($"Invalid data size, expected: {DATA_SIZE}, got: {dataSize}"); - } - - if (input.Length < offset + DATA_SIZE) - { - throw new Exception("Input data is too short for data."); - } - byte[] data = new byte[DATA_SIZE]; - Array.Copy(input, offset, data, 0, DATA_SIZE); - - return new Ec2b(key, data); - } - - public static Ec2b GenerateEc2b() - { - byte[] key = new byte[KEY_SIZE]; - byte[] data = new byte[DATA_SIZE]; - - MT19937 random = new MT19937((ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds()); - - for (int i = 0; i < KEY_SIZE; i++) - key[i] = (byte)(random.NextUInt64() % 256); - - for (int i = 0; i < DATA_SIZE; i++) - data[i] = (byte)(random.NextUInt64() % 256); - - return new Ec2b(key, data); - } - - public byte[] GetBytes() - { - byte[] output = new byte[4 + 4 + KEY_SIZE + 4 + DATA_SIZE]; - int offset = 0; - - BinaryPrimitives.WriteInt32LittleEndian(output.AsSpan(offset, 4), HEAD_MAGIC); - offset += 4; - - BinaryPrimitives.WriteInt32LittleEndian(output.AsSpan(offset, 4), KEY_SIZE); - offset += 4; - - Array.Copy(Key, 0, output, offset, KEY_SIZE); - offset += KEY_SIZE; - - BinaryPrimitives.WriteInt32LittleEndian(output.AsSpan(offset, 4), DATA_SIZE); - offset += 4; - - Array.Copy(Data, 0, output, offset, DATA_SIZE); - - return output; - } - - public ulong GetSeed() - { - return Seed; - } - - public byte[] GetXorKey() - { - return XorKey; - } - - private void GenerateDecryptionVector(byte[] key, byte[] crypt) - { - List output = new List(4096); - - ulong val = 18446744073709551615; - for (int i = 0; i < crypt.Length; i += 8) - { - ulong chunk = BitConverter.ToUInt64(crypt, i); - val ^= chunk; - } - - ulong key_qword_0 = BitConverter.ToUInt64(key, 0); - ulong key_qword_1 = BitConverter.ToUInt64(key, 8); - - Seed = key_qword_1 ^ 0b1100111010101100001110110101101010000110011110000011011110101100 ^ val ^ key_qword_0; - - MT19937 mt = new MT19937(Seed); - for (int i = 0; i < 512; i++) - { - ulong next = mt.NextUInt64(); - byte[] bytes = BitConverter.GetBytes(next); - output.AddRange(bytes); - } - - XorKey = output.ToArray(); - } - - private static void KeyScramble(byte[] key) - { - byte[] roundKeys = new byte[176]; - for (int round = 0; round < 11; round++) - { - for (int i = 0; i < 16; i++) - { - for (int j = 0; j < 16; j++) - { - int idx = (round << 8) + (i * 16) + j; - roundKeys[round * 16 + i] ^= (byte)(Magic.aesXorTable[1, idx] ^ Magic.aesXorTable[0, idx]); - } - } - } - - byte[] chip = new byte[16]; - AES128.RevAes128Enc(key, roundKeys, chip); - - for (int i = 0; i < KEY_SIZE; i++) - { - chip[i] ^= Magic.keyXorTable[i]; - } - - Array.Copy(chip, key, KEY_SIZE); - } + { + Key = key; + Data = data; + var scrambledKey = new byte[KEY_SIZE]; + Array.Copy(Key, scrambledKey, KEY_SIZE); + KeyScramble(scrambledKey); + GenerateDecryptionVector(scrambledKey, Data); } -} + + public static Ec2b Read(byte[] input) + { + if (input == null || input.Length < 2076) throw new Exception("Input data is too short."); + + var offset = 0; + + var magic = BinaryPrimitives.ReadInt32LittleEndian(input.AsSpan(offset, 4)); + if (magic != HEAD_MAGIC) throw new Exception($"Magic mismatch, expected: {HEAD_MAGIC}, got: {magic}"); + offset += 4; + + var keySize = BinaryPrimitives.ReadInt32LittleEndian(input.AsSpan(offset, 4)); + offset += 4; + if (keySize != KEY_SIZE) throw new Exception($"Invalid key size, expected: {KEY_SIZE}, got: {keySize}"); + + if (input.Length < offset + KEY_SIZE) throw new Exception("Input data is too short for key."); + var key = new byte[KEY_SIZE]; + Array.Copy(input, offset, key, 0, KEY_SIZE); + offset += KEY_SIZE; + + if (input.Length < offset + 4) throw new Exception("Input data is too short for data size."); + var dataSize = BinaryPrimitives.ReadInt32LittleEndian(input.AsSpan(offset, 4)); + offset += 4; + if (dataSize != DATA_SIZE) throw new Exception($"Invalid data size, expected: {DATA_SIZE}, got: {dataSize}"); + + if (input.Length < offset + DATA_SIZE) throw new Exception("Input data is too short for data."); + var data = new byte[DATA_SIZE]; + Array.Copy(input, offset, data, 0, DATA_SIZE); + + return new Ec2b(key, data); + } + + public static Ec2b GenerateEc2b() + { + var key = new byte[KEY_SIZE]; + var data = new byte[DATA_SIZE]; + + var random = new MT19937((ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds()); + + for (var i = 0; i < KEY_SIZE; i++) + key[i] = (byte)(random.NextUInt64() % 256); + + for (var i = 0; i < DATA_SIZE; i++) + data[i] = (byte)(random.NextUInt64() % 256); + + return new Ec2b(key, data); + } + + public byte[] GetBytes() + { + var output = new byte[4 + 4 + KEY_SIZE + 4 + DATA_SIZE]; + var offset = 0; + + BinaryPrimitives.WriteInt32LittleEndian(output.AsSpan(offset, 4), HEAD_MAGIC); + offset += 4; + + BinaryPrimitives.WriteInt32LittleEndian(output.AsSpan(offset, 4), KEY_SIZE); + offset += 4; + + Array.Copy(Key, 0, output, offset, KEY_SIZE); + offset += KEY_SIZE; + + BinaryPrimitives.WriteInt32LittleEndian(output.AsSpan(offset, 4), DATA_SIZE); + offset += 4; + + Array.Copy(Data, 0, output, offset, DATA_SIZE); + + return output; + } + + public ulong GetSeed() + { + return Seed; + } + + public byte[] GetXorKey() + { + return XorKey; + } + + private void GenerateDecryptionVector(byte[] key, byte[] crypt) + { + var output = new List(4096); + + var val = 18446744073709551615; + for (var i = 0; i < crypt.Length; i += 8) + { + var chunk = BitConverter.ToUInt64(crypt, i); + val ^= chunk; + } + + var key_qword_0 = BitConverter.ToUInt64(key, 0); + var key_qword_1 = BitConverter.ToUInt64(key, 8); + + Seed = key_qword_1 ^ 0b1100111010101100001110110101101010000110011110000011011110101100 ^ val ^ key_qword_0; + + var mt = new MT19937(Seed); + for (var i = 0; i < 512; i++) + { + var next = mt.NextUInt64(); + var bytes = BitConverter.GetBytes(next); + output.AddRange(bytes); + } + + XorKey = output.ToArray(); + } + + private static void KeyScramble(byte[] key) + { + var roundKeys = new byte[176]; + for (var round = 0; round < 11; round++) + for (var i = 0; i < 16; i++) + for (var j = 0; j < 16; j++) + { + var idx = (round << 8) + i * 16 + j; + roundKeys[round * 16 + i] ^= (byte)(Magic.aesXorTable[1, idx] ^ Magic.aesXorTable[0, idx]); + } + + var chip = new byte[16]; + AES128.RevAes128Enc(key, roundKeys, chip); + + for (var i = 0; i < KEY_SIZE; i++) chip[i] ^= Magic.keyXorTable[i]; + + Array.Copy(chip, key, KEY_SIZE); + } +} \ No newline at end of file diff --git a/Common/Util/Security/MT19937.cs b/Common/Util/Security/MT19937.cs index 8291f7eb..a416b615 100644 --- a/Common/Util/Security/MT19937.cs +++ b/Common/Util/Security/MT19937.cs @@ -1,83 +1,73 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace EggLink.DanhengServer.Util.Security; -namespace EggLink.DanhengServer.Util.Security +public class MT19937 { - public class MT19937 + private const int N = 312; + private const int M = 156; + private const ulong MATRIX_A = 13043109905998158313UL; + private const ulong UPPER_MASK = 18446744071562067968UL; + private const ulong LOWER_MASK = 2147483647UL; + + private readonly ulong[] mt = new ulong[N]; + private int mti = N + 1; + + public MT19937() { - private const int N = 312; - private const int M = 156; - private const ulong MATRIX_A = 13043109905998158313UL; - private const ulong UPPER_MASK = 18446744071562067968UL; - private const ulong LOWER_MASK = 2147483647UL; - - private ulong[] mt = new ulong[N]; - private int mti = N + 1; - - public MT19937() - { - Seed(5489UL); // MT19937 default seed - } - - public MT19937(ulong seed) - { - Seed(seed); - } - - public void Seed(ulong seed) - { - mt[0] = seed; - for (mti = 1; mti < N; mti++) - { - mt[mti] = 6364136223846793005UL * (mt[mti - 1] ^ mt[mti - 1] >> 62) + (ulong)mti; - } - } - - public ulong NextUInt64() - { - ulong x; - ulong[] mag01 = { 0UL, MATRIX_A }; - - if (mti >= N) - { - int i; - - if (mti == N + 1) - { - Seed(5489UL); - } - - for (i = 0; i < N - M; i++) - { - x = mt[i] & UPPER_MASK | mt[i + 1] & LOWER_MASK; - mt[i] = mt[i + M] ^ x >> 1 ^ mag01[x & 1UL]; - } - for (; i < N - 1; i++) - { - x = mt[i] & UPPER_MASK | mt[i + 1] & LOWER_MASK; - mt[i] = mt[i + (M - N)] ^ x >> 1 ^ mag01[x & 1UL]; - } - x = mt[N - 1] & UPPER_MASK | mt[0] & LOWER_MASK; - mt[N - 1] = mt[M - 1] ^ x >> 1 ^ mag01[x & 1UL]; - - mti = 0; - } - - x = mt[mti++]; - x ^= x >> 29 & 0x5555555555555555UL; - x ^= x << 17 & 0x71D67FFFEDA60000UL; - x ^= x << 37 & 0xFFF7EEE000000000UL; - x ^= x >> 43; - - return x; - } - - public long NextInt63() - { - return (long)(NextUInt64() & 0x7FFFFFFFFFFFFFFFUL); - } + Seed(5489UL); // MT19937 default seed } -} + + public MT19937(ulong seed) + { + Seed(seed); + } + + public void Seed(ulong seed) + { + mt[0] = seed; + for (mti = 1; mti < N; mti++) + mt[mti] = 6364136223846793005UL * (mt[mti - 1] ^ (mt[mti - 1] >> 62)) + (ulong)mti; + } + + public ulong NextUInt64() + { + ulong x; + ulong[] mag01 = { 0UL, MATRIX_A }; + + if (mti >= N) + { + int i; + + if (mti == N + 1) Seed(5489UL); + + for (i = 0; i < N - M; i++) + { + x = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK); + mt[i] = mt[i + M] ^ (x >> 1) ^ mag01[x & 1UL]; + } + + for (; i < N - 1; i++) + { + x = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK); + mt[i] = mt[i + (M - N)] ^ (x >> 1) ^ mag01[x & 1UL]; + } + + x = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK); + mt[N - 1] = mt[M - 1] ^ (x >> 1) ^ mag01[x & 1UL]; + + mti = 0; + } + + x = mt[mti++]; + x ^= (x >> 29) & 0x5555555555555555UL; + x ^= (x << 17) & 0x71D67FFFEDA60000UL; + x ^= (x << 37) & 0xFFF7EEE000000000UL; + x ^= x >> 43; + + return x; + } + + public long NextInt63() + { + return (long)(NextUInt64() & 0x7FFFFFFFFFFFFFFFUL); + } +} \ No newline at end of file diff --git a/Common/Util/Security/Magic.cs b/Common/Util/Security/Magic.cs index 85685df3..a6450cda 100644 --- a/Common/Util/Security/Magic.cs +++ b/Common/Util/Security/Magic.cs @@ -1,541 +1,544 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace EggLink.DanhengServer.Util.Security; -namespace EggLink.DanhengServer.Util.Security +public class Magic { - public class Magic + public static readonly byte[] ShiftRowsTable = new byte[16] { - public static readonly byte[] ShiftRowsTable = new byte[16] - { - 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11 - }; - public static readonly byte[] ShiftRowsTableInv = new byte[16] - { - 0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3 - }; - public static readonly byte[] LookupRcon = new byte[16] - { - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a - }; - public static readonly byte[] LookupSbox = new byte[256] - { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 - }; - public static readonly byte[] LookupSboxInv = new byte[256] - { - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d - }; - public static readonly byte[] LookupG2 = new byte[256] - { - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, - 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, - 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, - 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, - 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, - 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, - 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, - 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, - 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, - 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, - 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, - 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, - 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, - 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, - 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, - 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5 - }; - public static readonly byte[] LookupG3 = new byte[256] - { - 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, - 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, - 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, - 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, - 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, - 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, - 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, - 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, - 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a, - 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba, - 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, - 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, - 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, - 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, - 0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, - 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a - }; - public static readonly byte[] LookupG9 = new byte[256] - { - 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, - 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, - 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, - 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, - 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, - 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, - 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, - 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, - 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, - 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, - 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, - 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, - 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, - 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, - 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, - 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46 - }; - public static readonly byte[] LookupG11 = new byte[256] - { - 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, - 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, - 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, - 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, - 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, - 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, - 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, - 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, - 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, - 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, - 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, - 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, - 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, - 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, - 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, - 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3 - }; - public static readonly byte[] LookupG13 = new byte[256] - { - 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, - 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, - 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, - 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, - 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, - 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, - 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, - 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, - 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, - 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, - 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, - 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, - 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, - 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, - 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, - 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97 - }; - public static readonly byte[] LookupG14 = new byte[256] - { - 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, - 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, - 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, - 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, - 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, - 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, - 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, - 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, - 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, - 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, - 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, - 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, - 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, - 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, - 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, - 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d - }; + 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11 + }; - public static readonly byte[] keyXorTable = new byte[16] - { - 162, 37, 37, 153, 183, 98, 244, 57, 40, 225, 183, 115, 145, 5, 37, 135 - }; + public static readonly byte[] ShiftRowsTableInv = new byte[16] + { + 0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3 + }; - public static readonly byte[,] aesXorTable = new byte[2, 2816] + public static readonly byte[] LookupRcon = new byte[16] + { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a + }; + + public static readonly byte[] LookupSbox = new byte[256] + { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + }; + + public static readonly byte[] LookupSboxInv = new byte[256] + { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d + }; + + public static readonly byte[] LookupG2 = new byte[256] + { + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, + 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, + 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, + 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, + 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, + 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, + 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, + 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, + 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5 + }; + + public static readonly byte[] LookupG3 = new byte[256] + { + 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, + 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, + 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, + 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, + 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, + 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, + 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, + 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, + 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a, + 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba, + 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, + 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, + 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, + 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, + 0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, + 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a + }; + + public static readonly byte[] LookupG9 = new byte[256] + { + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, + 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, + 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, + 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, + 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, + 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, + 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, + 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, + 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, + 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, + 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, + 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, + 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46 + }; + + public static readonly byte[] LookupG11 = new byte[256] + { + 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, + 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, + 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, + 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, + 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, + 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, + 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, + 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, + 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, + 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, + 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, + 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, + 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, + 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, + 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, + 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3 + }; + + public static readonly byte[] LookupG13 = new byte[256] + { + 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, + 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, + 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, + 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, + 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, + 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, + 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, + 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, + 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, + 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, + 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, + 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, + 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, + 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, + 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, + 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97 + }; + + public static readonly byte[] LookupG14 = new byte[256] + { + 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, + 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, + 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, + 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, + 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, + 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, + 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, + 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, + 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, + 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, + 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, + 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, + 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, + 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, + 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, + 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d + }; + + public static readonly byte[] keyXorTable = new byte[16] + { + 162, 37, 37, 153, 183, 98, 244, 57, 40, 225, 183, 115, 145, 5, 37, 135 + }; + + public static readonly byte[,] aesXorTable = new byte[2, 2816] + { { - { - 0xDE, 0xAD, 0xCA, 0xFE, 0xFA, 0xCE, 0xB0, 0x0C, 0xDE, 0xAD, 0xCA, 0xFE, 0xFA, 0xCE, 0xB0, 0x0C, - 0x3A, 0xE6, 0xDE, 0x9C, 0x81, 0xBA, 0x7C, 0xC6, 0x12, 0x1B, 0xAF, 0xD2, 0x8A, 0xBA, 0xF5, 0xE6, - 0x41, 0xDF, 0x71, 0xBA, 0x37, 0x11, 0x50, 0xF3, 0xF3, 0x62, 0x6E, 0x04, 0xF1, 0x14, 0xFC, 0xBD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x7B, 0x52, 0x7C, 0x19, 0x98, 0x35, 0x96, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, - 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, - 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, - 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, - }, - { - 0xC3, 0x20, 0x20, 0xB4, 0xAF, 0x0E, 0x82, 0x2E, 0xEF, 0x29, 0xFE, 0x75, 0x1D, 0xDB, 0x4B, 0x86, - 0x86, 0x23, 0x28, 0x72, 0xA3, 0xF4, 0x1B, 0x4F, 0x5F, 0x0E, 0x02, 0xB1, 0xAC, 0x0D, 0xE6, 0x4F, - 0x8B, 0x0B, 0x3F, 0xF3, 0x5F, 0xB5, 0x09, 0x7E, 0x3B, 0xE9, 0x93, 0x29, 0x55, 0xE1, 0xB4, 0x9B, - 0xCC, 0xCE, 0x37, 0xFC, 0xAB, 0x6B, 0xA4, 0x05, 0xE6, 0xC7, 0x45, 0x34, 0xC0, 0xFF, 0x7C, 0x24, - 0x89, 0x36, 0xBF, 0x17, 0xAB, 0x91, 0xCA, 0x49, 0xF2, 0x74, 0x80, 0xB6, 0x90, 0x60, 0xFF, 0xD2, - 0xA9, 0xE5, 0xC9, 0x64, 0xBC, 0x38, 0x40, 0x98, 0xB3, 0xBA, 0x8F, 0x8B, 0xBA, 0x9D, 0xF3, 0xCF, - 0x57, 0xBA, 0xAC, 0x18, 0xE7, 0xD3, 0x03, 0x01, 0x48, 0x29, 0x41, 0xF6, 0x2F, 0x89, 0xD4, 0x9F, - 0xD7, 0xD3, 0x05, 0x71, 0x63, 0x30, 0x4E, 0xBB, 0xF7, 0xB0, 0x99, 0xFF, 0x43, 0xDA, 0x87, 0xCA, - 0xA7, 0x48, 0x92, 0x9E, 0x76, 0xA6, 0xEE, 0x48, 0x1C, 0x96, 0x28, 0x8E, 0x54, 0x30, 0xD6, 0xA5, - 0xD3, 0x22, 0xA2, 0x30, 0xCB, 0x6A, 0x85, 0x26, 0x69, 0xE1, 0x7C, 0xEC, 0xDC, 0xD4, 0x89, 0x2A, - 0xB8, 0xAE, 0xDF, 0x12, 0x6E, 0x39, 0x8A, 0x9B, 0x48, 0x61, 0xF9, 0x4B, 0x34, 0xD0, 0xF1, 0x60, - 0x87, 0xBA, 0x88, 0x86, 0x68, 0x8C, 0xBE, 0xC1, 0x9C, 0xAE, 0x30, 0xBC, 0xE6, 0x62, 0xFF, 0xEB, - 0xBB, 0x88, 0x7C, 0xD2, 0xBB, 0x57, 0xB4, 0x02, 0x82, 0x06, 0x72, 0xD2, 0x94, 0x60, 0x86, 0x4A, - 0x29, 0xF0, 0xEA, 0xD3, 0x88, 0x92, 0xF1, 0x22, 0xD1, 0x5C, 0x88, 0x65, 0xE6, 0xFB, 0xEE, 0x28, - 0x79, 0x86, 0x68, 0x7D, 0xA6, 0x5A, 0xBF, 0xBD, 0x7D, 0x15, 0xEF, 0x05, 0xF6, 0xF9, 0xE0, 0x11, - 0xD6, 0x30, 0x94, 0xF2, 0x6C, 0x3D, 0x0A, 0xDB, 0xC5, 0x0E, 0xDC, 0xF2, 0xFD, 0x1F, 0x61, 0x91, - 0x5D, 0x80, 0x69, 0xA3, 0xDB, 0x35, 0x98, 0x4E, 0x4A, 0xC1, 0x49, 0x76, 0xAB, 0xC0, 0x67, 0x36, - 0x3F, 0xA4, 0xC6, 0xE8, 0xCA, 0x25, 0x44, 0x63, 0x23, 0xB5, 0xC8, 0xBB, 0x3A, 0xAC, 0xA1, 0x09, - 0xC3, 0x10, 0x57, 0xA5, 0x5B, 0x3B, 0x33, 0x21, 0xCD, 0x3C, 0x88, 0xAE, 0x1E, 0x8F, 0xC1, 0xD6, - 0xFB, 0x94, 0x61, 0x38, 0xAB, 0xF1, 0x9C, 0x06, 0xCB, 0x89, 0x58, 0x9A, 0xF4, 0xF4, 0x33, 0x80, - 0x66, 0x13, 0xC0, 0xFD, 0xE2, 0x16, 0xE0, 0x89, 0x65, 0xE2, 0xC1, 0xA6, 0xE3, 0x74, 0xD2, 0x5F, - 0xA0, 0x76, 0xAD, 0xF5, 0x6B, 0x4F, 0xE0, 0xF7, 0x52, 0xB0, 0xB1, 0x48, 0xDD, 0xEE, 0xB6, 0x01, - 0x9A, 0x90, 0x91, 0x18, 0xEC, 0xCB, 0xCB, 0xAD, 0x04, 0xB6, 0x73, 0xCF, 0x7F, 0xF3, 0xAC, 0xBE, - 0xEC, 0x91, 0x44, 0x56, 0x81, 0xB8, 0x74, 0xAE, 0x28, 0x5D, 0xC7, 0x5C, 0xAB, 0x8B, 0x56, 0x21, - 0x32, 0x91, 0xB9, 0x9E, 0x70, 0xF6, 0x9B, 0xAC, 0x50, 0x0B, 0x2E, 0x4B, 0x8B, 0xA2, 0xA5, 0x24, - 0x5B, 0x91, 0xDF, 0x24, 0xA7, 0xB0, 0x79, 0xA7, 0x16, 0x54, 0x44, 0x2E, 0xBC, 0x48, 0xCD, 0x87, - 0xBA, 0xAF, 0xD4, 0xB9, 0x1C, 0x0F, 0xAA, 0xFA, 0x3A, 0x3F, 0x3A, 0x3D, 0x68, 0x5A, 0xAE, 0xAC, - 0xBA, 0xBE, 0xA3, 0x92, 0x6E, 0x38, 0x8E, 0x33, 0x3E, 0x0A, 0xCC, 0xF6, 0xE3, 0x26, 0x57, 0xEC, - 0x8E, 0x63, 0x31, 0x27, 0xBA, 0x20, 0x4E, 0x7F, 0x34, 0xE5, 0x19, 0xFE, 0x7F, 0xA6, 0x97, 0x90, - 0xD6, 0x29, 0x1C, 0x3F, 0x8C, 0x3F, 0x81, 0x62, 0x3D, 0xF5, 0x00, 0xD4, 0xC5, 0xE2, 0xE1, 0x42, - 0x42, 0x8C, 0x65, 0x8F, 0x5A, 0x66, 0x59, 0xE1, 0xDD, 0xEC, 0xDC, 0x1B, 0x4E, 0x63, 0x82, 0xFF, - 0x02, 0x9D, 0x53, 0xDE, 0xBD, 0xB4, 0x80, 0xCF, 0x2B, 0xB7, 0xDE, 0x69, 0x5D, 0x1B, 0xCA, 0xFB, - 0xB3, 0xF9, 0xBE, 0xD0, 0xF5, 0x79, 0x86, 0x2F, 0x0E, 0xB6, 0xA9, 0x87, 0xF4, 0x68, 0xC1, 0xBF, - 0x4F, 0xB8, 0xA6, 0x2D, 0x03, 0xA9, 0x72, 0x04, 0xCA, 0x37, 0x6D, 0x1B, 0x90, 0xDD, 0xBC, 0x52, - 0xAE, 0xF3, 0xFF, 0x08, 0xDD, 0x4B, 0x46, 0xD0, 0xCD, 0xB1, 0x8A, 0x35, 0x9A, 0x02, 0x64, 0x64, - 0x2F, 0x57, 0xA5, 0x7B, 0x9A, 0x0D, 0x2B, 0x55, 0x11, 0x3C, 0xC0, 0x35, 0x74, 0x69, 0xD9, 0x7B, - 0x43, 0x1D, 0xAC, 0xB2, 0xC2, 0x8A, 0xBE, 0x22, 0x45, 0x46, 0x76, 0xA9, 0x8A, 0x49, 0xB2, 0x5F, - 0xC0, 0xB8, 0xBC, 0xCD, 0x27, 0xF8, 0x14, 0xB2, 0xA9, 0x6D, 0x5A, 0x1F, 0xA4, 0x43, 0x1E, 0x0F, - 0xDB, 0xA4, 0x9E, 0x2B, 0xCA, 0xFC, 0x98, 0x7F, 0xF1, 0x18, 0x87, 0x5B, 0x11, 0x2D, 0xC5, 0xE4, - 0x91, 0x20, 0xA9, 0x6A, 0x2D, 0xAC, 0xA8, 0xFA, 0x94, 0x57, 0x7F, 0x30, 0x73, 0x08, 0xE8, 0x49, - 0xF0, 0xC8, 0x63, 0xDA, 0x83, 0x87, 0x2A, 0xC3, 0x31, 0x1A, 0xFC, 0xB7, 0x57, 0xB2, 0x40, 0x46, - 0x09, 0x6D, 0x84, 0xB4, 0x66, 0xF1, 0x13, 0x16, 0x3A, 0x3A, 0xFB, 0xC6, 0x6E, 0xB0, 0x71, 0xB8, - 0x23, 0x74, 0x22, 0x89, 0xFC, 0xBE, 0x34, 0xB3, 0x17, 0xB6, 0xC9, 0x68, 0x53, 0x64, 0x47, 0xAF, - 0xCA, 0x1D, 0x5F, 0xB4, 0x74, 0xA3, 0x77, 0xB5, 0xFB, 0x77, 0xD9, 0x69, 0x2B, 0x3A, 0xAA, 0xAE, - 0xE4, 0x03, 0x81, 0x6B, 0x3A, 0x35, 0x9C, 0x45, 0x50, 0x9C, 0x76, 0xCE, 0xE3, 0x7F, 0x64, 0x4B, - 0x9F, 0x83, 0x7B, 0x72, 0xBC, 0x02, 0x1E, 0x94, 0x99, 0xC1, 0x1C, 0x45, 0x19, 0x1D, 0x56, 0x74, - 0x73, 0xE7, 0xFC, 0x58, 0x72, 0x2D, 0xE3, 0x50, 0xA4, 0x21, 0xBE, 0x81, 0xDF, 0x80, 0xDA, 0x40, - 0xDB, 0x79, 0x67, 0x0E, 0x94, 0xA3, 0x05, 0xDD, 0xF7, 0x14, 0x28, 0xD6, 0xC4, 0x2B, 0xF3, 0xCF, - 0x36, 0x08, 0x84, 0xF3, 0xC8, 0x8C, 0xAD, 0xCE, 0x7F, 0x7C, 0x0F, 0xC6, 0xFE, 0x05, 0x54, 0x4B, - 0x17, 0xA1, 0x83, 0x65, 0x97, 0x29, 0x01, 0x70, 0xC1, 0x16, 0xAE, 0x69, 0xA4, 0x90, 0xB9, 0xBE, - 0x17, 0x05, 0x50, 0xF1, 0x65, 0x07, 0x23, 0x76, 0x64, 0x84, 0x2D, 0x40, 0x34, 0xFD, 0xDF, 0x62, - 0x7E, 0x4C, 0x85, 0xD2, 0x6D, 0x17, 0xE1, 0x41, 0x12, 0xC6, 0x3E, 0xD6, 0x14, 0xB8, 0x5F, 0x8F, - 0x39, 0x65, 0xC2, 0x62, 0x21, 0x06, 0x5C, 0xC9, 0xB8, 0x99, 0xA5, 0x00, 0xE3, 0x9C, 0x73, 0xAB, - 0xB9, 0x76, 0x12, 0xD2, 0xFA, 0x7F, 0x7D, 0x64, 0x63, 0x9E, 0x26, 0xAA, 0x89, 0x85, 0x3A, 0xC9, - 0x94, 0x04, 0x97, 0xEC, 0xFD, 0xC5, 0xA3, 0xB1, 0x7D, 0xD6, 0x07, 0x9C, 0x47, 0x30, 0x9C, 0x64, - 0x97, 0x0E, 0xC6, 0xFC, 0x0B, 0xFF, 0xA7, 0xF9, 0x46, 0x5B, 0x2B, 0xDB, 0x9E, 0x1C, 0x85, 0x3A, - 0x75, 0xD6, 0xEB, 0x9B, 0x15, 0x36, 0xD7, 0x1A, 0x3D, 0xFC, 0x0B, 0x75, 0x08, 0x5E, 0x32, 0x23, - 0xE0, 0xA5, 0xAD, 0x0F, 0x45, 0xB3, 0x78, 0x20, 0x22, 0x24, 0x64, 0x0C, 0xCF, 0xD6, 0x3C, 0xA4, - 0x48, 0xC7, 0xB3, 0x6E, 0x02, 0xE2, 0x0A, 0xAB, 0x92, 0xFC, 0x40, 0x7D, 0xF5, 0x02, 0x61, 0x56, - 0xAB, 0xC5, 0x68, 0x38, 0xE0, 0x01, 0xF1, 0x94, 0x73, 0xC6, 0xFE, 0xC2, 0x34, 0x67, 0x8E, 0xB1, - 0x73, 0x72, 0xD4, 0x3B, 0xFD, 0x1F, 0xE2, 0xA8, 0xED, 0x20, 0x14, 0x0A, 0x60, 0x6D, 0xD1, 0x85, - 0x14, 0x05, 0x54, 0x96, 0xC6, 0x3D, 0xB5, 0x1B, 0x37, 0x56, 0x24, 0xF7, 0x7C, 0x0F, 0x55, 0xC6, - 0xAA, 0x7E, 0x33, 0x2D, 0xE1, 0x97, 0x74, 0xA8, 0xDC, 0xC5, 0xA1, 0xEC, 0x8C, 0xEF, 0x28, 0x3B, - 0x49, 0x8B, 0x00, 0xED, 0x8B, 0xD9, 0xE9, 0x65, 0xD5, 0x05, 0x7B, 0x6D, 0x20, 0xCA, 0x8F, 0x93, - 0xB4, 0xCA, 0x36, 0x34, 0x8E, 0x16, 0x46, 0xCE, 0x02, 0x23, 0x43, 0x22, 0xF6, 0xBD, 0x10, 0xCC, - 0xD0, 0xA3, 0xB0, 0x42, 0xA5, 0xAF, 0x59, 0x72, 0x97, 0x0B, 0xAE, 0x80, 0x8D, 0x19, 0xD0, 0x1D, - 0x7D, 0x30, 0x4E, 0x5B, 0x46, 0xC0, 0xC2, 0x5C, 0x40, 0xFC, 0xF3, 0xEF, 0x05, 0x84, 0xE8, 0x0C, - 0x80, 0xD7, 0x37, 0xA1, 0x6F, 0xC1, 0x8C, 0xE0, 0xBA, 0xA1, 0x88, 0x7B, 0xE7, 0x20, 0xBF, 0x18, - 0x02, 0x40, 0x9F, 0x6F, 0x23, 0x11, 0x78, 0x07, 0xD0, 0x92, 0x87, 0x2D, 0xB5, 0xE0, 0xE9, 0xE9, - 0xAA, 0x32, 0x88, 0x57, 0xF8, 0x9B, 0x01, 0x93, 0x2D, 0x07, 0x77, 0x68, 0x86, 0xAD, 0x06, 0xDE, - 0x57, 0xA9, 0xA4, 0x96, 0x33, 0x42, 0xF8, 0xFB, 0x23, 0x1F, 0x99, 0xB6, 0x62, 0x93, 0x6B, 0x12, - 0xBE, 0x72, 0x9F, 0x96, 0x1A, 0xDA, 0x05, 0x60, 0xF1, 0xD5, 0x40, 0x9F, 0x75, 0xF3, 0x1D, 0xBE, - 0xD7, 0x87, 0x5D, 0x3A, 0x55, 0xF0, 0x9B, 0xBF, 0xE8, 0xB9, 0x72, 0xC2, 0xDD, 0x4D, 0x27, 0xF6, - 0xA9, 0x37, 0x96, 0x7E, 0x6E, 0x6E, 0x64, 0x37, 0x4E, 0x2E, 0x3F, 0xFD, 0x3C, 0xF4, 0xA6, 0xF5, - 0x22, 0xA8, 0x43, 0xF4, 0x13, 0x21, 0xB5, 0x4E, 0xA8, 0x6D, 0x50, 0x0A, 0xB3, 0xFE, 0x9F, 0x5C, - 0xE7, 0x1A, 0xCF, 0x36, 0x42, 0x30, 0x1C, 0x88, 0x7F, 0x29, 0xE9, 0xCD, 0x96, 0xF2, 0x6A, 0x52, - 0xB2, 0x25, 0x87, 0x63, 0xDC, 0xFC, 0x72, 0xE4, 0xF8, 0x5E, 0xB1, 0x97, 0xB4, 0x1E, 0x08, 0x90, - 0x68, 0x10, 0x73, 0x7F, 0x94, 0x61, 0x48, 0x49, 0x36, 0x9B, 0x7D, 0xBD, 0xDF, 0xCD, 0xB1, 0xA3, - 0x7D, 0xFB, 0xDD, 0x97, 0x8A, 0x0D, 0xFC, 0x9A, 0xB8, 0xA9, 0x33, 0xB5, 0x4E, 0x50, 0x3D, 0x60, - 0x90, 0xEB, 0xAB, 0xB8, 0xCB, 0x6E, 0x32, 0xE4, 0x6B, 0xB0, 0x3F, 0x57, 0xB8, 0xA4, 0x6A, 0x7C, - 0x00, 0x66, 0x39, 0xB1, 0x22, 0xE2, 0x04, 0x26, 0xA1, 0x5A, 0x17, 0xAA, 0x80, 0xB6, 0xC0, 0xF6, - 0xCF, 0x7A, 0xF8, 0x60, 0xE9, 0x52, 0xB8, 0x0E, 0x08, 0xC0, 0xD5, 0x1F, 0xAB, 0x61, 0x62, 0x1A, - 0x83, 0xD1, 0x92, 0xE1, 0x4D, 0x6D, 0xDF, 0x27, 0x0E, 0xFF, 0xF9, 0xA3, 0x36, 0xFF, 0x73, 0xEF, - 0x1D, 0xAB, 0xAC, 0xBF, 0xA7, 0xB3, 0x29, 0xD2, 0xB2, 0x37, 0xAB, 0x08, 0x7D, 0xB6, 0x7E, 0x0D, - 0x25, 0xAA, 0x49, 0x29, 0x9F, 0x61, 0x52, 0x44, 0x19, 0x1C, 0x51, 0x95, 0x74, 0xB9, 0x3D, 0xDD, - 0x95, 0x2C, 0x4F, 0x30, 0x56, 0xC9, 0xEF, 0x3D, 0x87, 0x90, 0x1E, 0xF8, 0x69, 0xFF, 0x37, 0x06, - 0x27, 0xDB, 0x72, 0x82, 0x2C, 0xDE, 0xB8, 0x39, 0x0B, 0x78, 0xB1, 0x1F, 0x37, 0x54, 0xBF, 0x21, - 0x32, 0x87, 0xB4, 0xD9, 0x49, 0x2D, 0x29, 0x19, 0x43, 0x01, 0xD4, 0xC0, 0xA3, 0xFF, 0x09, 0x6F, - 0x69, 0xC8, 0x5D, 0x35, 0x1D, 0x10, 0x09, 0x91, 0xB6, 0x12, 0xEC, 0x04, 0xA6, 0x61, 0xEF, 0x73, - 0xC7, 0x4C, 0x04, 0x8E, 0x3E, 0xAE, 0xD7, 0xC2, 0x84, 0x48, 0xAB, 0x99, 0x96, 0x75, 0xD8, 0xAD, - 0xA7, 0x5B, 0xDE, 0x72, 0x44, 0x96, 0xC5, 0xB3, 0xEB, 0x8E, 0xED, 0xD6, 0x69, 0x81, 0xE6, 0x07, - 0x3A, 0x15, 0x0D, 0x66, 0x5F, 0x36, 0xA9, 0xAB, 0x53, 0x82, 0x47, 0x98, 0x27, 0xF2, 0x16, 0x95, - 0x05, 0x0B, 0xAE, 0xF1, 0x04, 0x92, 0x80, 0x20, 0xA4, 0x9B, 0x43, 0x66, 0x70, 0x7F, 0x45, 0x0B, - 0x4B, 0x85, 0x95, 0x10, 0x09, 0xC8, 0xD9, 0xF9, 0x5D, 0x40, 0x6D, 0x07, 0x69, 0x18, 0xF3, 0xD6, - 0x98, 0x61, 0x25, 0x8E, 0xA1, 0xE2, 0x24, 0xBD, 0xF0, 0xFA, 0x89, 0xD8, 0x68, 0xB2, 0x03, 0x81, - 0x63, 0xF9, 0x42, 0xD4, 0x1A, 0xD9, 0x4D, 0xCD, 0x30, 0x36, 0x2D, 0xB1, 0x63, 0xFC, 0xA3, 0x2B, - 0xA7, 0x07, 0x50, 0xBC, 0x67, 0xAB, 0x7D, 0x33, 0x1D, 0xEC, 0x62, 0xFE, 0xD2, 0x65, 0xAA, 0xBA, - 0x37, 0xC9, 0x7F, 0x67, 0x26, 0x9D, 0x8A, 0x8B, 0x63, 0x0B, 0xE0, 0x30, 0x65, 0x07, 0x8C, 0xF3, - 0xD1, 0xCF, 0x0D, 0xB4, 0x1E, 0xF3, 0x29, 0xBE, 0x43, 0x1F, 0x34, 0x1E, 0x52, 0x02, 0xA7, 0x8D, - 0x30, 0x2E, 0x3E, 0x39, 0x00, 0xB6, 0x7B, 0x5C, 0x29, 0x39, 0xC0, 0x0D, 0xAB, 0xA0, 0x6D, 0x77, - 0x3C, 0xB2, 0x18, 0x42, 0x57, 0x63, 0xDA, 0x9E, 0xF5, 0xE0, 0x42, 0x43, 0xF6, 0x50, 0xFD, 0x71, - 0x9B, 0x30, 0xE0, 0x92, 0x8B, 0xD1, 0xE1, 0xC4, 0x96, 0xC9, 0xF5, 0x14, 0xB6, 0xF7, 0xA5, 0x10, - 0x77, 0xF4, 0xF9, 0xAC, 0xDC, 0x45, 0xE1, 0x3C, 0xD6, 0x0B, 0xA5, 0xE2, 0x58, 0x01, 0x19, 0x39, - 0x14, 0x68, 0x96, 0xC0, 0xCE, 0xA9, 0xDE, 0x84, 0x22, 0x59, 0x87, 0x70, 0xFD, 0x8A, 0x71, 0x64, - 0x79, 0x16, 0x37, 0x80, 0x83, 0xFD, 0x9C, 0x73, 0xE6, 0x9C, 0x8B, 0xCD, 0xC0, 0x69, 0x66, 0x90, - 0x45, 0x0A, 0xC9, 0x81, 0x4A, 0xDA, 0x26, 0xDA, 0xA1, 0x70, 0x03, 0x6C, 0x36, 0x9D, 0xAD, 0xD7, - 0xE2, 0x1F, 0x27, 0xBE, 0xBB, 0xEC, 0x63, 0xD9, 0xC2, 0x2A, 0x56, 0x4D, 0x63, 0xCD, 0x92, 0xEE, - 0xAF, 0xCA, 0xD0, 0x11, 0x35, 0x2F, 0x1D, 0xF1, 0x96, 0xD1, 0xAA, 0xDC, 0xF6, 0x14, 0x3F, 0xA0, - 0xEE, 0x90, 0x83, 0x9F, 0x42, 0x40, 0xE6, 0x2C, 0x10, 0x23, 0x00, 0x23, 0x18, 0x8C, 0xA1, 0x26, - 0x4B, 0x22, 0xE1, 0x36, 0x07, 0x55, 0xCB, 0xC3, 0xD2, 0xDD, 0x12, 0x58, 0x19, 0x75, 0x03, 0xC6, - 0xD8, 0x2E, 0xCE, 0x87, 0x1C, 0xC3, 0x15, 0x44, 0x2A, 0x30, 0x00, 0x52, 0x39, 0x31, 0x13, 0xF4, - 0x25, 0x75, 0x74, 0x15, 0x6C, 0xC5, 0xC1, 0xD2, 0x33, 0x75, 0xC2, 0x41, 0x22, 0x28, 0x95, 0xDF, - 0x97, 0x6C, 0x31, 0xF8, 0x35, 0xA6, 0x54, 0x29, 0x5C, 0xF4, 0x20, 0x97, 0x69, 0xE5, 0x46, 0xFF, - 0x34, 0x24, 0x73, 0x12, 0xB8, 0x61, 0x25, 0x46, 0xB3, 0x8F, 0xBA, 0x3C, 0xFA, 0x06, 0xFF, 0x3F, - 0x66, 0x9D, 0x22, 0x55, 0x46, 0x2F, 0xFF, 0x44, 0xDB, 0x25, 0x29, 0xE0, 0x16, 0x6E, 0xEC, 0x87, - 0x97, 0x92, 0x37, 0x23, 0x0E, 0x52, 0x4E, 0xBB, 0x10, 0xBB, 0x1C, 0x73, 0x75, 0xD1, 0x31, 0xC3, - 0xAD, 0xFE, 0xB8, 0x12, 0x50, 0xA0, 0x69, 0x91, 0x36, 0xEA, 0x5F, 0x0D, 0xEC, 0x1A, 0x23, 0x4A, - 0x7D, 0x94, 0x84, 0xC8, 0x4A, 0x58, 0x6A, 0xA1, 0xA3, 0x75, 0xCA, 0x85, 0xE7, 0x96, 0x91, 0x07, - 0x05, 0x3A, 0x57, 0x61, 0x6A, 0x6F, 0xF1, 0xEF, 0xF7, 0xB3, 0xB1, 0x09, 0xB8, 0x91, 0xA8, 0xF9, - 0x57, 0xB8, 0x63, 0x95, 0xFF, 0xB4, 0x1C, 0x96, 0xE7, 0xE5, 0xEC, 0x06, 0x3A, 0x11, 0xE6, 0x81, - 0xAB, 0x23, 0xE4, 0x5E, 0x5A, 0xB6, 0x6B, 0x69, 0x62, 0x6F, 0x9D, 0xC4, 0x08, 0x6F, 0xA6, 0xBE, - 0x4D, 0x09, 0x12, 0x77, 0xCA, 0xDD, 0xB5, 0x2D, 0x66, 0xCB, 0x4F, 0x4F, 0x11, 0xF2, 0x3A, 0x1A, - 0x97, 0x1F, 0xFE, 0x50, 0x2F, 0x19, 0x32, 0x05, 0x45, 0xA0, 0x50, 0x60, 0x58, 0x40, 0x40, 0x3D, - 0xF6, 0xC3, 0x6F, 0x07, 0xC8, 0x26, 0x26, 0x0E, 0x42, 0x22, 0x96, 0x6D, 0xFE, 0x95, 0x53, 0x70, - 0xDC, 0x92, 0x12, 0x63, 0xFD, 0xA3, 0x7D, 0x6E, 0x44, 0xCD, 0x11, 0x2C, 0x51, 0x6F, 0xBC, 0x50, - 0xFC, 0x1C, 0xC8, 0x3A, 0x28, 0xF5, 0x39, 0xF8, 0x8C, 0x60, 0x5D, 0xA5, 0x4A, 0xFA, 0xAB, 0x04, - 0x7F, 0x34, 0x91, 0x53, 0xE7, 0x6C, 0x56, 0xC6, 0x14, 0xE4, 0xCC, 0xE4, 0xBB, 0x6E, 0x47, 0x7A, - 0x46, 0x6B, 0xE2, 0x88, 0xA0, 0xBD, 0xBD, 0xCC, 0x51, 0xF3, 0x37, 0x4B, 0xB3, 0xA0, 0x19, 0x92, - 0x48, 0x35, 0xBB, 0xBC, 0x79, 0x78, 0xFF, 0x49, 0xC1, 0x2B, 0x93, 0xDF, 0x75, 0xA7, 0xFB, 0x94, - 0x89, 0xAF, 0x50, 0x5E, 0x2D, 0xE1, 0x78, 0x60, 0x0C, 0xDF, 0xF8, 0x7C, 0xFD, 0xCD, 0x2D, 0xE2, - 0xFF, 0xD3, 0xA3, 0x4A, 0x48, 0x0D, 0x40, 0x8F, 0x03, 0x4F, 0x2C, 0xBD, 0xFA, 0x2E, 0x16, 0xC3, - 0xD4, 0xFD, 0x0B, 0xB3, 0xBD, 0x4F, 0x30, 0xAD, 0xD0, 0xAE, 0xCA, 0x77, 0x9D, 0xDD, 0x3D, 0xA3, - 0x66, 0xD0, 0xC1, 0x6D, 0xCC, 0x3B, 0x56, 0x81, 0x5D, 0x80, 0x07, 0xD8, 0x84, 0x46, 0x71, 0x40, - 0x57, 0xB3, 0x44, 0x85, 0x63, 0x4E, 0x17, 0x2C, 0xB0, 0x21, 0x98, 0x43, 0x42, 0x04, 0x18, 0x84, - 0xFA, 0xB1, 0xD7, 0xC5, 0x5C, 0xCA, 0x25, 0x8B, 0x1A, 0x7A, 0x50, 0x60, 0x68, 0x4A, 0x30, 0xEA, - 0xE6, 0xDE, 0x19, 0xBB, 0x9F, 0x47, 0xEF, 0xDB, 0xC5, 0x81, 0x72, 0xF0, 0x8D, 0xBA, 0x74, 0x3A, - 0xD1, 0xD5, 0xC6, 0xD1, 0xE0, 0xAE, 0x28, 0x2A, 0x65, 0xE5, 0x0B, 0x09, 0xFA, 0xEA, 0x5B, 0xA6, - 0xDB, 0x38, 0xD8, 0x67, 0xC0, 0xBE, 0xA1, 0x12, 0x1C, 0x03, 0xB1, 0x81, 0xB8, 0x95, 0xDD, 0x78, - 0xF8, 0x16, 0x6E, 0xAB, 0xBB, 0xAA, 0x33, 0x54, 0x0E, 0x39, 0x83, 0x24, 0x17, 0xB3, 0x0B, 0x3C, - 0xA1, 0x62, 0x21, 0xB2, 0xA0, 0xF8, 0x49, 0xAB, 0x8B, 0x80, 0xC6, 0x3D, 0xF1, 0x2E, 0x18, 0x44, - 0x74, 0x5F, 0x98, 0x92, 0x33, 0xFB, 0xB2, 0x52, 0x6B, 0x97, 0xE9, 0x48, 0x12, 0x91, 0x32, 0x50, - 0x21, 0x75, 0x74, 0x69, 0x88, 0x54, 0xC6, 0xF3, 0xC9, 0x37, 0x3C, 0xB3, 0x89, 0xAB, 0x33, 0x1F, - 0x79, 0x57, 0xF7, 0xE4, 0xB5, 0x87, 0x0C, 0xA4, 0x99, 0x48, 0x89, 0x63, 0x5F, 0x72, 0xA1, 0xBC, - 0xFF, 0xFE, 0xF8, 0xB3, 0xF1, 0x00, 0xE4, 0xD4, 0x01, 0x9B, 0xB7, 0x2E, 0x4F, 0xA0, 0x90, 0xE4, - 0x9B, 0x6A, 0xA8, 0xBA, 0xE1, 0xD3, 0xD5, 0xBC, 0xEB, 0xC5, 0xB2, 0x89, 0xB4, 0xE9, 0x4D, 0x3F, - 0x4C, 0xFA, 0x8C, 0xCB, 0xCD, 0x22, 0x08, 0xB8, 0xC7, 0xB3, 0xA3, 0xED, 0x6B, 0xAC, 0xF3, 0x2D, - 0x98, 0x70, 0x41, 0x47, 0x85, 0xE8, 0x6E, 0x31, 0x0A, 0xC2, 0x3E, 0x51, 0x39, 0x55, 0xF8, 0x4A, - 0xE9, 0x48, 0x64, 0x01, 0xDB, 0x8D, 0xE3, 0xAF, 0xA4, 0xB9, 0xD8, 0x19, 0xCA, 0x86, 0xCA, 0xA1, - 0x6C, 0x1C, 0x12, 0x3D, 0xA1, 0x02, 0x23, 0x1D, 0x29, 0x5D, 0x94, 0x04, 0xC6, 0x51, 0x01, 0x40, - 0x0B, 0xB3, 0x69, 0x25, 0x45, 0xEF, 0x43, 0x81, 0x4F, 0x97, 0x57, 0x0D, 0xA1, 0xA5, 0xC9, 0x9D, - 0xE6, 0x56, 0xB9, 0x38, 0x93, 0xA1, 0x78, 0xC5, 0xBF, 0x75, 0xFE, 0x81, 0x6A, 0x35, 0x64, 0x89, - 0x64, 0x43, 0x75, 0xFD, 0x29, 0x63, 0xD1, 0x15, 0xAB, 0x43, 0x60, 0x65, 0xDC, 0x98, 0xD5, 0xC7, - 0x6E, 0xF9, 0xB2, 0x38, 0xFB, 0x6E, 0xB0, 0x34, 0x9C, 0xA3, 0x73, 0x61, 0xF5, 0x51, 0xFF, 0x1F, - 0xCE, 0xB0, 0x08, 0x83, 0x29, 0xB3, 0x82, 0x07, 0xFA, 0xC4, 0xE5, 0x21, 0xD3, 0xA0, 0xD4, 0xC0, - 0xF8, 0x1A, 0x65, 0x9B, 0x35, 0x7A, 0xE3, 0x32, 0xA5, 0x4D, 0x77, 0x1F, 0x23, 0x19, 0xCC, 0xE1, - 0xB3, 0x50, 0x0D, 0xE8, 0x2F, 0x8B, 0x18, 0x89, 0x61, 0xCB, 0x22, 0xBA, 0xE0, 0x4A, 0xA2, 0x7F, - 0xA5, 0x1B, 0x45, 0x59, 0x33, 0xC4, 0x73, 0xDF, 0x42, 0xC6, 0x00, 0x11, 0x37, 0xF2, 0x3C, 0x1B, - 0xF4, 0x26, 0xD1, 0x6D, 0x93, 0xC1, 0x94, 0xD2, 0x60, 0xE5, 0xF3, 0x91, 0x66, 0x92, 0x3C, 0x65, - 0x27, 0xC1, 0x83, 0x13, 0x76, 0x5A, 0x88, 0xEC, 0xB2, 0x59, 0x95, 0x18, 0x81, 0x2E, 0x94, 0x96, - 0x53, 0x17, 0xB6, 0xFD, 0x8C, 0xCC, 0xBE, 0x8D, 0x36, 0xB3, 0xC8, 0xF2, 0xB2, 0xBE, 0x0F, 0x12, - 0x99, 0xFF, 0xFA, 0xF9, 0x18, 0xAB, 0x30, 0xFA, 0xB1, 0x5B, 0xF2, 0xEE, 0xCA, 0x6E, 0xA1, 0xD9, - 0xCE, 0xCC, 0x60, 0xA0, 0x4D, 0xFD, 0x7C, 0xAD, 0x4D, 0x50, 0xB6, 0x88, 0x0D, 0x88, 0x3B, 0x28, - 0x7F, 0xA1, 0x28, 0x41, 0x0A, 0x43, 0xAD, 0xCC, 0x08, 0x14, 0xF3, 0xF2, 0x43, 0xE7, 0xCF, 0x6A, - 0x5C, 0x11, 0xD0, 0x6D, 0x99, 0xC8, 0x4F, 0xB1, 0x14, 0x06, 0xBC, 0x68, 0x6D, 0xBE, 0xCD, 0xD7, - 0x58, 0xA2, 0x17, 0xF5, 0x9E, 0xFD, 0xDA, 0xFA, 0xBF, 0x73, 0x57, 0x4A, 0xF8, 0xF3, 0xA9, 0x94, - 0xB3, 0x01, 0xE9, 0xA3, 0xDA, 0xEA, 0xC1, 0x40, 0x33, 0xAA, 0x3F, 0xE6, 0x0D, 0x6A, 0xE2, 0xF3, - 0x74, 0xE8, 0x1B, 0x3C, 0x2B, 0x25, 0x44, 0x8E, 0x1C, 0x36, 0xBE, 0xA9, 0x27, 0x6E, 0x6A, 0x48, - 0x8E, 0x2F, 0x2C, 0x9D, 0x71, 0x66, 0x23, 0x7C, 0x7A, 0x74, 0x93, 0x46, 0x2D, 0xCA, 0x6B, 0xC6, - 0x33, 0xDA, 0x1E, 0x1E, 0x44, 0x07, 0xFD, 0x89, 0x5D, 0x30, 0x02, 0x4C, 0xB1, 0x73, 0xC0, 0x91, - 0xEB, 0xA5, 0x61, 0x89, 0xA4, 0x04, 0xFD, 0xD5, 0x5F, 0x54, 0x59, 0x81, 0xC3, 0x2A, 0x13, 0x89, - 0xDA, 0x68, 0xB6, 0x3A, 0x9C, 0x70, 0x6F, 0x48, 0xB4, 0x3C, 0xF8, 0x9B, 0xF8, 0xF2, 0x59, 0xBF, - 0xF4, 0x8D, 0x06, 0x58, 0xEA, 0xA2, 0xA6, 0xB4, 0x70, 0x08, 0x80, 0x2B, 0x50, 0x13, 0x36, 0x79, - 0x17, 0x0B, 0x94, 0x0E, 0x4D, 0xF5, 0xC8, 0x14, 0xB9, 0x02, 0x7D, 0xEE, 0x6B, 0xBD, 0x10, 0xB4, - 0x85, 0x74, 0xA1, 0xB9, 0x84, 0x67, 0xC6, 0x2C, 0xDB, 0xDA, 0x55, 0x54, 0x16, 0xDA, 0x02, 0xB6, - 0xDA, 0x2A, 0x9B, 0x51, 0xD6, 0xDC, 0x87, 0x80, 0xC1, 0xB8, 0x6F, 0x0C, 0xEF, 0x4B, 0xD1, 0x1A, - 0x9F, 0x36, 0x2E, 0x9C, 0x7E, 0x5F, 0x17, 0xE2, 0xC1, 0x82, 0x0C, 0x42, 0x0D, 0x15, 0x18, 0xCA, - } - }; - } -} + 0xDE, 0xAD, 0xCA, 0xFE, 0xFA, 0xCE, 0xB0, 0x0C, 0xDE, 0xAD, 0xCA, 0xFE, 0xFA, 0xCE, 0xB0, 0x0C, + 0x3A, 0xE6, 0xDE, 0x9C, 0x81, 0xBA, 0x7C, 0xC6, 0x12, 0x1B, 0xAF, 0xD2, 0x8A, 0xBA, 0xF5, 0xE6, + 0x41, 0xDF, 0x71, 0xBA, 0x37, 0x11, 0x50, 0xF3, 0xF3, 0x62, 0x6E, 0x04, 0xF1, 0x14, 0xFC, 0xBD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x7B, 0x52, 0x7C, 0x19, 0x98, 0x35, 0x96, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56 + }, + { + 0xC3, 0x20, 0x20, 0xB4, 0xAF, 0x0E, 0x82, 0x2E, 0xEF, 0x29, 0xFE, 0x75, 0x1D, 0xDB, 0x4B, 0x86, + 0x86, 0x23, 0x28, 0x72, 0xA3, 0xF4, 0x1B, 0x4F, 0x5F, 0x0E, 0x02, 0xB1, 0xAC, 0x0D, 0xE6, 0x4F, + 0x8B, 0x0B, 0x3F, 0xF3, 0x5F, 0xB5, 0x09, 0x7E, 0x3B, 0xE9, 0x93, 0x29, 0x55, 0xE1, 0xB4, 0x9B, + 0xCC, 0xCE, 0x37, 0xFC, 0xAB, 0x6B, 0xA4, 0x05, 0xE6, 0xC7, 0x45, 0x34, 0xC0, 0xFF, 0x7C, 0x24, + 0x89, 0x36, 0xBF, 0x17, 0xAB, 0x91, 0xCA, 0x49, 0xF2, 0x74, 0x80, 0xB6, 0x90, 0x60, 0xFF, 0xD2, + 0xA9, 0xE5, 0xC9, 0x64, 0xBC, 0x38, 0x40, 0x98, 0xB3, 0xBA, 0x8F, 0x8B, 0xBA, 0x9D, 0xF3, 0xCF, + 0x57, 0xBA, 0xAC, 0x18, 0xE7, 0xD3, 0x03, 0x01, 0x48, 0x29, 0x41, 0xF6, 0x2F, 0x89, 0xD4, 0x9F, + 0xD7, 0xD3, 0x05, 0x71, 0x63, 0x30, 0x4E, 0xBB, 0xF7, 0xB0, 0x99, 0xFF, 0x43, 0xDA, 0x87, 0xCA, + 0xA7, 0x48, 0x92, 0x9E, 0x76, 0xA6, 0xEE, 0x48, 0x1C, 0x96, 0x28, 0x8E, 0x54, 0x30, 0xD6, 0xA5, + 0xD3, 0x22, 0xA2, 0x30, 0xCB, 0x6A, 0x85, 0x26, 0x69, 0xE1, 0x7C, 0xEC, 0xDC, 0xD4, 0x89, 0x2A, + 0xB8, 0xAE, 0xDF, 0x12, 0x6E, 0x39, 0x8A, 0x9B, 0x48, 0x61, 0xF9, 0x4B, 0x34, 0xD0, 0xF1, 0x60, + 0x87, 0xBA, 0x88, 0x86, 0x68, 0x8C, 0xBE, 0xC1, 0x9C, 0xAE, 0x30, 0xBC, 0xE6, 0x62, 0xFF, 0xEB, + 0xBB, 0x88, 0x7C, 0xD2, 0xBB, 0x57, 0xB4, 0x02, 0x82, 0x06, 0x72, 0xD2, 0x94, 0x60, 0x86, 0x4A, + 0x29, 0xF0, 0xEA, 0xD3, 0x88, 0x92, 0xF1, 0x22, 0xD1, 0x5C, 0x88, 0x65, 0xE6, 0xFB, 0xEE, 0x28, + 0x79, 0x86, 0x68, 0x7D, 0xA6, 0x5A, 0xBF, 0xBD, 0x7D, 0x15, 0xEF, 0x05, 0xF6, 0xF9, 0xE0, 0x11, + 0xD6, 0x30, 0x94, 0xF2, 0x6C, 0x3D, 0x0A, 0xDB, 0xC5, 0x0E, 0xDC, 0xF2, 0xFD, 0x1F, 0x61, 0x91, + 0x5D, 0x80, 0x69, 0xA3, 0xDB, 0x35, 0x98, 0x4E, 0x4A, 0xC1, 0x49, 0x76, 0xAB, 0xC0, 0x67, 0x36, + 0x3F, 0xA4, 0xC6, 0xE8, 0xCA, 0x25, 0x44, 0x63, 0x23, 0xB5, 0xC8, 0xBB, 0x3A, 0xAC, 0xA1, 0x09, + 0xC3, 0x10, 0x57, 0xA5, 0x5B, 0x3B, 0x33, 0x21, 0xCD, 0x3C, 0x88, 0xAE, 0x1E, 0x8F, 0xC1, 0xD6, + 0xFB, 0x94, 0x61, 0x38, 0xAB, 0xF1, 0x9C, 0x06, 0xCB, 0x89, 0x58, 0x9A, 0xF4, 0xF4, 0x33, 0x80, + 0x66, 0x13, 0xC0, 0xFD, 0xE2, 0x16, 0xE0, 0x89, 0x65, 0xE2, 0xC1, 0xA6, 0xE3, 0x74, 0xD2, 0x5F, + 0xA0, 0x76, 0xAD, 0xF5, 0x6B, 0x4F, 0xE0, 0xF7, 0x52, 0xB0, 0xB1, 0x48, 0xDD, 0xEE, 0xB6, 0x01, + 0x9A, 0x90, 0x91, 0x18, 0xEC, 0xCB, 0xCB, 0xAD, 0x04, 0xB6, 0x73, 0xCF, 0x7F, 0xF3, 0xAC, 0xBE, + 0xEC, 0x91, 0x44, 0x56, 0x81, 0xB8, 0x74, 0xAE, 0x28, 0x5D, 0xC7, 0x5C, 0xAB, 0x8B, 0x56, 0x21, + 0x32, 0x91, 0xB9, 0x9E, 0x70, 0xF6, 0x9B, 0xAC, 0x50, 0x0B, 0x2E, 0x4B, 0x8B, 0xA2, 0xA5, 0x24, + 0x5B, 0x91, 0xDF, 0x24, 0xA7, 0xB0, 0x79, 0xA7, 0x16, 0x54, 0x44, 0x2E, 0xBC, 0x48, 0xCD, 0x87, + 0xBA, 0xAF, 0xD4, 0xB9, 0x1C, 0x0F, 0xAA, 0xFA, 0x3A, 0x3F, 0x3A, 0x3D, 0x68, 0x5A, 0xAE, 0xAC, + 0xBA, 0xBE, 0xA3, 0x92, 0x6E, 0x38, 0x8E, 0x33, 0x3E, 0x0A, 0xCC, 0xF6, 0xE3, 0x26, 0x57, 0xEC, + 0x8E, 0x63, 0x31, 0x27, 0xBA, 0x20, 0x4E, 0x7F, 0x34, 0xE5, 0x19, 0xFE, 0x7F, 0xA6, 0x97, 0x90, + 0xD6, 0x29, 0x1C, 0x3F, 0x8C, 0x3F, 0x81, 0x62, 0x3D, 0xF5, 0x00, 0xD4, 0xC5, 0xE2, 0xE1, 0x42, + 0x42, 0x8C, 0x65, 0x8F, 0x5A, 0x66, 0x59, 0xE1, 0xDD, 0xEC, 0xDC, 0x1B, 0x4E, 0x63, 0x82, 0xFF, + 0x02, 0x9D, 0x53, 0xDE, 0xBD, 0xB4, 0x80, 0xCF, 0x2B, 0xB7, 0xDE, 0x69, 0x5D, 0x1B, 0xCA, 0xFB, + 0xB3, 0xF9, 0xBE, 0xD0, 0xF5, 0x79, 0x86, 0x2F, 0x0E, 0xB6, 0xA9, 0x87, 0xF4, 0x68, 0xC1, 0xBF, + 0x4F, 0xB8, 0xA6, 0x2D, 0x03, 0xA9, 0x72, 0x04, 0xCA, 0x37, 0x6D, 0x1B, 0x90, 0xDD, 0xBC, 0x52, + 0xAE, 0xF3, 0xFF, 0x08, 0xDD, 0x4B, 0x46, 0xD0, 0xCD, 0xB1, 0x8A, 0x35, 0x9A, 0x02, 0x64, 0x64, + 0x2F, 0x57, 0xA5, 0x7B, 0x9A, 0x0D, 0x2B, 0x55, 0x11, 0x3C, 0xC0, 0x35, 0x74, 0x69, 0xD9, 0x7B, + 0x43, 0x1D, 0xAC, 0xB2, 0xC2, 0x8A, 0xBE, 0x22, 0x45, 0x46, 0x76, 0xA9, 0x8A, 0x49, 0xB2, 0x5F, + 0xC0, 0xB8, 0xBC, 0xCD, 0x27, 0xF8, 0x14, 0xB2, 0xA9, 0x6D, 0x5A, 0x1F, 0xA4, 0x43, 0x1E, 0x0F, + 0xDB, 0xA4, 0x9E, 0x2B, 0xCA, 0xFC, 0x98, 0x7F, 0xF1, 0x18, 0x87, 0x5B, 0x11, 0x2D, 0xC5, 0xE4, + 0x91, 0x20, 0xA9, 0x6A, 0x2D, 0xAC, 0xA8, 0xFA, 0x94, 0x57, 0x7F, 0x30, 0x73, 0x08, 0xE8, 0x49, + 0xF0, 0xC8, 0x63, 0xDA, 0x83, 0x87, 0x2A, 0xC3, 0x31, 0x1A, 0xFC, 0xB7, 0x57, 0xB2, 0x40, 0x46, + 0x09, 0x6D, 0x84, 0xB4, 0x66, 0xF1, 0x13, 0x16, 0x3A, 0x3A, 0xFB, 0xC6, 0x6E, 0xB0, 0x71, 0xB8, + 0x23, 0x74, 0x22, 0x89, 0xFC, 0xBE, 0x34, 0xB3, 0x17, 0xB6, 0xC9, 0x68, 0x53, 0x64, 0x47, 0xAF, + 0xCA, 0x1D, 0x5F, 0xB4, 0x74, 0xA3, 0x77, 0xB5, 0xFB, 0x77, 0xD9, 0x69, 0x2B, 0x3A, 0xAA, 0xAE, + 0xE4, 0x03, 0x81, 0x6B, 0x3A, 0x35, 0x9C, 0x45, 0x50, 0x9C, 0x76, 0xCE, 0xE3, 0x7F, 0x64, 0x4B, + 0x9F, 0x83, 0x7B, 0x72, 0xBC, 0x02, 0x1E, 0x94, 0x99, 0xC1, 0x1C, 0x45, 0x19, 0x1D, 0x56, 0x74, + 0x73, 0xE7, 0xFC, 0x58, 0x72, 0x2D, 0xE3, 0x50, 0xA4, 0x21, 0xBE, 0x81, 0xDF, 0x80, 0xDA, 0x40, + 0xDB, 0x79, 0x67, 0x0E, 0x94, 0xA3, 0x05, 0xDD, 0xF7, 0x14, 0x28, 0xD6, 0xC4, 0x2B, 0xF3, 0xCF, + 0x36, 0x08, 0x84, 0xF3, 0xC8, 0x8C, 0xAD, 0xCE, 0x7F, 0x7C, 0x0F, 0xC6, 0xFE, 0x05, 0x54, 0x4B, + 0x17, 0xA1, 0x83, 0x65, 0x97, 0x29, 0x01, 0x70, 0xC1, 0x16, 0xAE, 0x69, 0xA4, 0x90, 0xB9, 0xBE, + 0x17, 0x05, 0x50, 0xF1, 0x65, 0x07, 0x23, 0x76, 0x64, 0x84, 0x2D, 0x40, 0x34, 0xFD, 0xDF, 0x62, + 0x7E, 0x4C, 0x85, 0xD2, 0x6D, 0x17, 0xE1, 0x41, 0x12, 0xC6, 0x3E, 0xD6, 0x14, 0xB8, 0x5F, 0x8F, + 0x39, 0x65, 0xC2, 0x62, 0x21, 0x06, 0x5C, 0xC9, 0xB8, 0x99, 0xA5, 0x00, 0xE3, 0x9C, 0x73, 0xAB, + 0xB9, 0x76, 0x12, 0xD2, 0xFA, 0x7F, 0x7D, 0x64, 0x63, 0x9E, 0x26, 0xAA, 0x89, 0x85, 0x3A, 0xC9, + 0x94, 0x04, 0x97, 0xEC, 0xFD, 0xC5, 0xA3, 0xB1, 0x7D, 0xD6, 0x07, 0x9C, 0x47, 0x30, 0x9C, 0x64, + 0x97, 0x0E, 0xC6, 0xFC, 0x0B, 0xFF, 0xA7, 0xF9, 0x46, 0x5B, 0x2B, 0xDB, 0x9E, 0x1C, 0x85, 0x3A, + 0x75, 0xD6, 0xEB, 0x9B, 0x15, 0x36, 0xD7, 0x1A, 0x3D, 0xFC, 0x0B, 0x75, 0x08, 0x5E, 0x32, 0x23, + 0xE0, 0xA5, 0xAD, 0x0F, 0x45, 0xB3, 0x78, 0x20, 0x22, 0x24, 0x64, 0x0C, 0xCF, 0xD6, 0x3C, 0xA4, + 0x48, 0xC7, 0xB3, 0x6E, 0x02, 0xE2, 0x0A, 0xAB, 0x92, 0xFC, 0x40, 0x7D, 0xF5, 0x02, 0x61, 0x56, + 0xAB, 0xC5, 0x68, 0x38, 0xE0, 0x01, 0xF1, 0x94, 0x73, 0xC6, 0xFE, 0xC2, 0x34, 0x67, 0x8E, 0xB1, + 0x73, 0x72, 0xD4, 0x3B, 0xFD, 0x1F, 0xE2, 0xA8, 0xED, 0x20, 0x14, 0x0A, 0x60, 0x6D, 0xD1, 0x85, + 0x14, 0x05, 0x54, 0x96, 0xC6, 0x3D, 0xB5, 0x1B, 0x37, 0x56, 0x24, 0xF7, 0x7C, 0x0F, 0x55, 0xC6, + 0xAA, 0x7E, 0x33, 0x2D, 0xE1, 0x97, 0x74, 0xA8, 0xDC, 0xC5, 0xA1, 0xEC, 0x8C, 0xEF, 0x28, 0x3B, + 0x49, 0x8B, 0x00, 0xED, 0x8B, 0xD9, 0xE9, 0x65, 0xD5, 0x05, 0x7B, 0x6D, 0x20, 0xCA, 0x8F, 0x93, + 0xB4, 0xCA, 0x36, 0x34, 0x8E, 0x16, 0x46, 0xCE, 0x02, 0x23, 0x43, 0x22, 0xF6, 0xBD, 0x10, 0xCC, + 0xD0, 0xA3, 0xB0, 0x42, 0xA5, 0xAF, 0x59, 0x72, 0x97, 0x0B, 0xAE, 0x80, 0x8D, 0x19, 0xD0, 0x1D, + 0x7D, 0x30, 0x4E, 0x5B, 0x46, 0xC0, 0xC2, 0x5C, 0x40, 0xFC, 0xF3, 0xEF, 0x05, 0x84, 0xE8, 0x0C, + 0x80, 0xD7, 0x37, 0xA1, 0x6F, 0xC1, 0x8C, 0xE0, 0xBA, 0xA1, 0x88, 0x7B, 0xE7, 0x20, 0xBF, 0x18, + 0x02, 0x40, 0x9F, 0x6F, 0x23, 0x11, 0x78, 0x07, 0xD0, 0x92, 0x87, 0x2D, 0xB5, 0xE0, 0xE9, 0xE9, + 0xAA, 0x32, 0x88, 0x57, 0xF8, 0x9B, 0x01, 0x93, 0x2D, 0x07, 0x77, 0x68, 0x86, 0xAD, 0x06, 0xDE, + 0x57, 0xA9, 0xA4, 0x96, 0x33, 0x42, 0xF8, 0xFB, 0x23, 0x1F, 0x99, 0xB6, 0x62, 0x93, 0x6B, 0x12, + 0xBE, 0x72, 0x9F, 0x96, 0x1A, 0xDA, 0x05, 0x60, 0xF1, 0xD5, 0x40, 0x9F, 0x75, 0xF3, 0x1D, 0xBE, + 0xD7, 0x87, 0x5D, 0x3A, 0x55, 0xF0, 0x9B, 0xBF, 0xE8, 0xB9, 0x72, 0xC2, 0xDD, 0x4D, 0x27, 0xF6, + 0xA9, 0x37, 0x96, 0x7E, 0x6E, 0x6E, 0x64, 0x37, 0x4E, 0x2E, 0x3F, 0xFD, 0x3C, 0xF4, 0xA6, 0xF5, + 0x22, 0xA8, 0x43, 0xF4, 0x13, 0x21, 0xB5, 0x4E, 0xA8, 0x6D, 0x50, 0x0A, 0xB3, 0xFE, 0x9F, 0x5C, + 0xE7, 0x1A, 0xCF, 0x36, 0x42, 0x30, 0x1C, 0x88, 0x7F, 0x29, 0xE9, 0xCD, 0x96, 0xF2, 0x6A, 0x52, + 0xB2, 0x25, 0x87, 0x63, 0xDC, 0xFC, 0x72, 0xE4, 0xF8, 0x5E, 0xB1, 0x97, 0xB4, 0x1E, 0x08, 0x90, + 0x68, 0x10, 0x73, 0x7F, 0x94, 0x61, 0x48, 0x49, 0x36, 0x9B, 0x7D, 0xBD, 0xDF, 0xCD, 0xB1, 0xA3, + 0x7D, 0xFB, 0xDD, 0x97, 0x8A, 0x0D, 0xFC, 0x9A, 0xB8, 0xA9, 0x33, 0xB5, 0x4E, 0x50, 0x3D, 0x60, + 0x90, 0xEB, 0xAB, 0xB8, 0xCB, 0x6E, 0x32, 0xE4, 0x6B, 0xB0, 0x3F, 0x57, 0xB8, 0xA4, 0x6A, 0x7C, + 0x00, 0x66, 0x39, 0xB1, 0x22, 0xE2, 0x04, 0x26, 0xA1, 0x5A, 0x17, 0xAA, 0x80, 0xB6, 0xC0, 0xF6, + 0xCF, 0x7A, 0xF8, 0x60, 0xE9, 0x52, 0xB8, 0x0E, 0x08, 0xC0, 0xD5, 0x1F, 0xAB, 0x61, 0x62, 0x1A, + 0x83, 0xD1, 0x92, 0xE1, 0x4D, 0x6D, 0xDF, 0x27, 0x0E, 0xFF, 0xF9, 0xA3, 0x36, 0xFF, 0x73, 0xEF, + 0x1D, 0xAB, 0xAC, 0xBF, 0xA7, 0xB3, 0x29, 0xD2, 0xB2, 0x37, 0xAB, 0x08, 0x7D, 0xB6, 0x7E, 0x0D, + 0x25, 0xAA, 0x49, 0x29, 0x9F, 0x61, 0x52, 0x44, 0x19, 0x1C, 0x51, 0x95, 0x74, 0xB9, 0x3D, 0xDD, + 0x95, 0x2C, 0x4F, 0x30, 0x56, 0xC9, 0xEF, 0x3D, 0x87, 0x90, 0x1E, 0xF8, 0x69, 0xFF, 0x37, 0x06, + 0x27, 0xDB, 0x72, 0x82, 0x2C, 0xDE, 0xB8, 0x39, 0x0B, 0x78, 0xB1, 0x1F, 0x37, 0x54, 0xBF, 0x21, + 0x32, 0x87, 0xB4, 0xD9, 0x49, 0x2D, 0x29, 0x19, 0x43, 0x01, 0xD4, 0xC0, 0xA3, 0xFF, 0x09, 0x6F, + 0x69, 0xC8, 0x5D, 0x35, 0x1D, 0x10, 0x09, 0x91, 0xB6, 0x12, 0xEC, 0x04, 0xA6, 0x61, 0xEF, 0x73, + 0xC7, 0x4C, 0x04, 0x8E, 0x3E, 0xAE, 0xD7, 0xC2, 0x84, 0x48, 0xAB, 0x99, 0x96, 0x75, 0xD8, 0xAD, + 0xA7, 0x5B, 0xDE, 0x72, 0x44, 0x96, 0xC5, 0xB3, 0xEB, 0x8E, 0xED, 0xD6, 0x69, 0x81, 0xE6, 0x07, + 0x3A, 0x15, 0x0D, 0x66, 0x5F, 0x36, 0xA9, 0xAB, 0x53, 0x82, 0x47, 0x98, 0x27, 0xF2, 0x16, 0x95, + 0x05, 0x0B, 0xAE, 0xF1, 0x04, 0x92, 0x80, 0x20, 0xA4, 0x9B, 0x43, 0x66, 0x70, 0x7F, 0x45, 0x0B, + 0x4B, 0x85, 0x95, 0x10, 0x09, 0xC8, 0xD9, 0xF9, 0x5D, 0x40, 0x6D, 0x07, 0x69, 0x18, 0xF3, 0xD6, + 0x98, 0x61, 0x25, 0x8E, 0xA1, 0xE2, 0x24, 0xBD, 0xF0, 0xFA, 0x89, 0xD8, 0x68, 0xB2, 0x03, 0x81, + 0x63, 0xF9, 0x42, 0xD4, 0x1A, 0xD9, 0x4D, 0xCD, 0x30, 0x36, 0x2D, 0xB1, 0x63, 0xFC, 0xA3, 0x2B, + 0xA7, 0x07, 0x50, 0xBC, 0x67, 0xAB, 0x7D, 0x33, 0x1D, 0xEC, 0x62, 0xFE, 0xD2, 0x65, 0xAA, 0xBA, + 0x37, 0xC9, 0x7F, 0x67, 0x26, 0x9D, 0x8A, 0x8B, 0x63, 0x0B, 0xE0, 0x30, 0x65, 0x07, 0x8C, 0xF3, + 0xD1, 0xCF, 0x0D, 0xB4, 0x1E, 0xF3, 0x29, 0xBE, 0x43, 0x1F, 0x34, 0x1E, 0x52, 0x02, 0xA7, 0x8D, + 0x30, 0x2E, 0x3E, 0x39, 0x00, 0xB6, 0x7B, 0x5C, 0x29, 0x39, 0xC0, 0x0D, 0xAB, 0xA0, 0x6D, 0x77, + 0x3C, 0xB2, 0x18, 0x42, 0x57, 0x63, 0xDA, 0x9E, 0xF5, 0xE0, 0x42, 0x43, 0xF6, 0x50, 0xFD, 0x71, + 0x9B, 0x30, 0xE0, 0x92, 0x8B, 0xD1, 0xE1, 0xC4, 0x96, 0xC9, 0xF5, 0x14, 0xB6, 0xF7, 0xA5, 0x10, + 0x77, 0xF4, 0xF9, 0xAC, 0xDC, 0x45, 0xE1, 0x3C, 0xD6, 0x0B, 0xA5, 0xE2, 0x58, 0x01, 0x19, 0x39, + 0x14, 0x68, 0x96, 0xC0, 0xCE, 0xA9, 0xDE, 0x84, 0x22, 0x59, 0x87, 0x70, 0xFD, 0x8A, 0x71, 0x64, + 0x79, 0x16, 0x37, 0x80, 0x83, 0xFD, 0x9C, 0x73, 0xE6, 0x9C, 0x8B, 0xCD, 0xC0, 0x69, 0x66, 0x90, + 0x45, 0x0A, 0xC9, 0x81, 0x4A, 0xDA, 0x26, 0xDA, 0xA1, 0x70, 0x03, 0x6C, 0x36, 0x9D, 0xAD, 0xD7, + 0xE2, 0x1F, 0x27, 0xBE, 0xBB, 0xEC, 0x63, 0xD9, 0xC2, 0x2A, 0x56, 0x4D, 0x63, 0xCD, 0x92, 0xEE, + 0xAF, 0xCA, 0xD0, 0x11, 0x35, 0x2F, 0x1D, 0xF1, 0x96, 0xD1, 0xAA, 0xDC, 0xF6, 0x14, 0x3F, 0xA0, + 0xEE, 0x90, 0x83, 0x9F, 0x42, 0x40, 0xE6, 0x2C, 0x10, 0x23, 0x00, 0x23, 0x18, 0x8C, 0xA1, 0x26, + 0x4B, 0x22, 0xE1, 0x36, 0x07, 0x55, 0xCB, 0xC3, 0xD2, 0xDD, 0x12, 0x58, 0x19, 0x75, 0x03, 0xC6, + 0xD8, 0x2E, 0xCE, 0x87, 0x1C, 0xC3, 0x15, 0x44, 0x2A, 0x30, 0x00, 0x52, 0x39, 0x31, 0x13, 0xF4, + 0x25, 0x75, 0x74, 0x15, 0x6C, 0xC5, 0xC1, 0xD2, 0x33, 0x75, 0xC2, 0x41, 0x22, 0x28, 0x95, 0xDF, + 0x97, 0x6C, 0x31, 0xF8, 0x35, 0xA6, 0x54, 0x29, 0x5C, 0xF4, 0x20, 0x97, 0x69, 0xE5, 0x46, 0xFF, + 0x34, 0x24, 0x73, 0x12, 0xB8, 0x61, 0x25, 0x46, 0xB3, 0x8F, 0xBA, 0x3C, 0xFA, 0x06, 0xFF, 0x3F, + 0x66, 0x9D, 0x22, 0x55, 0x46, 0x2F, 0xFF, 0x44, 0xDB, 0x25, 0x29, 0xE0, 0x16, 0x6E, 0xEC, 0x87, + 0x97, 0x92, 0x37, 0x23, 0x0E, 0x52, 0x4E, 0xBB, 0x10, 0xBB, 0x1C, 0x73, 0x75, 0xD1, 0x31, 0xC3, + 0xAD, 0xFE, 0xB8, 0x12, 0x50, 0xA0, 0x69, 0x91, 0x36, 0xEA, 0x5F, 0x0D, 0xEC, 0x1A, 0x23, 0x4A, + 0x7D, 0x94, 0x84, 0xC8, 0x4A, 0x58, 0x6A, 0xA1, 0xA3, 0x75, 0xCA, 0x85, 0xE7, 0x96, 0x91, 0x07, + 0x05, 0x3A, 0x57, 0x61, 0x6A, 0x6F, 0xF1, 0xEF, 0xF7, 0xB3, 0xB1, 0x09, 0xB8, 0x91, 0xA8, 0xF9, + 0x57, 0xB8, 0x63, 0x95, 0xFF, 0xB4, 0x1C, 0x96, 0xE7, 0xE5, 0xEC, 0x06, 0x3A, 0x11, 0xE6, 0x81, + 0xAB, 0x23, 0xE4, 0x5E, 0x5A, 0xB6, 0x6B, 0x69, 0x62, 0x6F, 0x9D, 0xC4, 0x08, 0x6F, 0xA6, 0xBE, + 0x4D, 0x09, 0x12, 0x77, 0xCA, 0xDD, 0xB5, 0x2D, 0x66, 0xCB, 0x4F, 0x4F, 0x11, 0xF2, 0x3A, 0x1A, + 0x97, 0x1F, 0xFE, 0x50, 0x2F, 0x19, 0x32, 0x05, 0x45, 0xA0, 0x50, 0x60, 0x58, 0x40, 0x40, 0x3D, + 0xF6, 0xC3, 0x6F, 0x07, 0xC8, 0x26, 0x26, 0x0E, 0x42, 0x22, 0x96, 0x6D, 0xFE, 0x95, 0x53, 0x70, + 0xDC, 0x92, 0x12, 0x63, 0xFD, 0xA3, 0x7D, 0x6E, 0x44, 0xCD, 0x11, 0x2C, 0x51, 0x6F, 0xBC, 0x50, + 0xFC, 0x1C, 0xC8, 0x3A, 0x28, 0xF5, 0x39, 0xF8, 0x8C, 0x60, 0x5D, 0xA5, 0x4A, 0xFA, 0xAB, 0x04, + 0x7F, 0x34, 0x91, 0x53, 0xE7, 0x6C, 0x56, 0xC6, 0x14, 0xE4, 0xCC, 0xE4, 0xBB, 0x6E, 0x47, 0x7A, + 0x46, 0x6B, 0xE2, 0x88, 0xA0, 0xBD, 0xBD, 0xCC, 0x51, 0xF3, 0x37, 0x4B, 0xB3, 0xA0, 0x19, 0x92, + 0x48, 0x35, 0xBB, 0xBC, 0x79, 0x78, 0xFF, 0x49, 0xC1, 0x2B, 0x93, 0xDF, 0x75, 0xA7, 0xFB, 0x94, + 0x89, 0xAF, 0x50, 0x5E, 0x2D, 0xE1, 0x78, 0x60, 0x0C, 0xDF, 0xF8, 0x7C, 0xFD, 0xCD, 0x2D, 0xE2, + 0xFF, 0xD3, 0xA3, 0x4A, 0x48, 0x0D, 0x40, 0x8F, 0x03, 0x4F, 0x2C, 0xBD, 0xFA, 0x2E, 0x16, 0xC3, + 0xD4, 0xFD, 0x0B, 0xB3, 0xBD, 0x4F, 0x30, 0xAD, 0xD0, 0xAE, 0xCA, 0x77, 0x9D, 0xDD, 0x3D, 0xA3, + 0x66, 0xD0, 0xC1, 0x6D, 0xCC, 0x3B, 0x56, 0x81, 0x5D, 0x80, 0x07, 0xD8, 0x84, 0x46, 0x71, 0x40, + 0x57, 0xB3, 0x44, 0x85, 0x63, 0x4E, 0x17, 0x2C, 0xB0, 0x21, 0x98, 0x43, 0x42, 0x04, 0x18, 0x84, + 0xFA, 0xB1, 0xD7, 0xC5, 0x5C, 0xCA, 0x25, 0x8B, 0x1A, 0x7A, 0x50, 0x60, 0x68, 0x4A, 0x30, 0xEA, + 0xE6, 0xDE, 0x19, 0xBB, 0x9F, 0x47, 0xEF, 0xDB, 0xC5, 0x81, 0x72, 0xF0, 0x8D, 0xBA, 0x74, 0x3A, + 0xD1, 0xD5, 0xC6, 0xD1, 0xE0, 0xAE, 0x28, 0x2A, 0x65, 0xE5, 0x0B, 0x09, 0xFA, 0xEA, 0x5B, 0xA6, + 0xDB, 0x38, 0xD8, 0x67, 0xC0, 0xBE, 0xA1, 0x12, 0x1C, 0x03, 0xB1, 0x81, 0xB8, 0x95, 0xDD, 0x78, + 0xF8, 0x16, 0x6E, 0xAB, 0xBB, 0xAA, 0x33, 0x54, 0x0E, 0x39, 0x83, 0x24, 0x17, 0xB3, 0x0B, 0x3C, + 0xA1, 0x62, 0x21, 0xB2, 0xA0, 0xF8, 0x49, 0xAB, 0x8B, 0x80, 0xC6, 0x3D, 0xF1, 0x2E, 0x18, 0x44, + 0x74, 0x5F, 0x98, 0x92, 0x33, 0xFB, 0xB2, 0x52, 0x6B, 0x97, 0xE9, 0x48, 0x12, 0x91, 0x32, 0x50, + 0x21, 0x75, 0x74, 0x69, 0x88, 0x54, 0xC6, 0xF3, 0xC9, 0x37, 0x3C, 0xB3, 0x89, 0xAB, 0x33, 0x1F, + 0x79, 0x57, 0xF7, 0xE4, 0xB5, 0x87, 0x0C, 0xA4, 0x99, 0x48, 0x89, 0x63, 0x5F, 0x72, 0xA1, 0xBC, + 0xFF, 0xFE, 0xF8, 0xB3, 0xF1, 0x00, 0xE4, 0xD4, 0x01, 0x9B, 0xB7, 0x2E, 0x4F, 0xA0, 0x90, 0xE4, + 0x9B, 0x6A, 0xA8, 0xBA, 0xE1, 0xD3, 0xD5, 0xBC, 0xEB, 0xC5, 0xB2, 0x89, 0xB4, 0xE9, 0x4D, 0x3F, + 0x4C, 0xFA, 0x8C, 0xCB, 0xCD, 0x22, 0x08, 0xB8, 0xC7, 0xB3, 0xA3, 0xED, 0x6B, 0xAC, 0xF3, 0x2D, + 0x98, 0x70, 0x41, 0x47, 0x85, 0xE8, 0x6E, 0x31, 0x0A, 0xC2, 0x3E, 0x51, 0x39, 0x55, 0xF8, 0x4A, + 0xE9, 0x48, 0x64, 0x01, 0xDB, 0x8D, 0xE3, 0xAF, 0xA4, 0xB9, 0xD8, 0x19, 0xCA, 0x86, 0xCA, 0xA1, + 0x6C, 0x1C, 0x12, 0x3D, 0xA1, 0x02, 0x23, 0x1D, 0x29, 0x5D, 0x94, 0x04, 0xC6, 0x51, 0x01, 0x40, + 0x0B, 0xB3, 0x69, 0x25, 0x45, 0xEF, 0x43, 0x81, 0x4F, 0x97, 0x57, 0x0D, 0xA1, 0xA5, 0xC9, 0x9D, + 0xE6, 0x56, 0xB9, 0x38, 0x93, 0xA1, 0x78, 0xC5, 0xBF, 0x75, 0xFE, 0x81, 0x6A, 0x35, 0x64, 0x89, + 0x64, 0x43, 0x75, 0xFD, 0x29, 0x63, 0xD1, 0x15, 0xAB, 0x43, 0x60, 0x65, 0xDC, 0x98, 0xD5, 0xC7, + 0x6E, 0xF9, 0xB2, 0x38, 0xFB, 0x6E, 0xB0, 0x34, 0x9C, 0xA3, 0x73, 0x61, 0xF5, 0x51, 0xFF, 0x1F, + 0xCE, 0xB0, 0x08, 0x83, 0x29, 0xB3, 0x82, 0x07, 0xFA, 0xC4, 0xE5, 0x21, 0xD3, 0xA0, 0xD4, 0xC0, + 0xF8, 0x1A, 0x65, 0x9B, 0x35, 0x7A, 0xE3, 0x32, 0xA5, 0x4D, 0x77, 0x1F, 0x23, 0x19, 0xCC, 0xE1, + 0xB3, 0x50, 0x0D, 0xE8, 0x2F, 0x8B, 0x18, 0x89, 0x61, 0xCB, 0x22, 0xBA, 0xE0, 0x4A, 0xA2, 0x7F, + 0xA5, 0x1B, 0x45, 0x59, 0x33, 0xC4, 0x73, 0xDF, 0x42, 0xC6, 0x00, 0x11, 0x37, 0xF2, 0x3C, 0x1B, + 0xF4, 0x26, 0xD1, 0x6D, 0x93, 0xC1, 0x94, 0xD2, 0x60, 0xE5, 0xF3, 0x91, 0x66, 0x92, 0x3C, 0x65, + 0x27, 0xC1, 0x83, 0x13, 0x76, 0x5A, 0x88, 0xEC, 0xB2, 0x59, 0x95, 0x18, 0x81, 0x2E, 0x94, 0x96, + 0x53, 0x17, 0xB6, 0xFD, 0x8C, 0xCC, 0xBE, 0x8D, 0x36, 0xB3, 0xC8, 0xF2, 0xB2, 0xBE, 0x0F, 0x12, + 0x99, 0xFF, 0xFA, 0xF9, 0x18, 0xAB, 0x30, 0xFA, 0xB1, 0x5B, 0xF2, 0xEE, 0xCA, 0x6E, 0xA1, 0xD9, + 0xCE, 0xCC, 0x60, 0xA0, 0x4D, 0xFD, 0x7C, 0xAD, 0x4D, 0x50, 0xB6, 0x88, 0x0D, 0x88, 0x3B, 0x28, + 0x7F, 0xA1, 0x28, 0x41, 0x0A, 0x43, 0xAD, 0xCC, 0x08, 0x14, 0xF3, 0xF2, 0x43, 0xE7, 0xCF, 0x6A, + 0x5C, 0x11, 0xD0, 0x6D, 0x99, 0xC8, 0x4F, 0xB1, 0x14, 0x06, 0xBC, 0x68, 0x6D, 0xBE, 0xCD, 0xD7, + 0x58, 0xA2, 0x17, 0xF5, 0x9E, 0xFD, 0xDA, 0xFA, 0xBF, 0x73, 0x57, 0x4A, 0xF8, 0xF3, 0xA9, 0x94, + 0xB3, 0x01, 0xE9, 0xA3, 0xDA, 0xEA, 0xC1, 0x40, 0x33, 0xAA, 0x3F, 0xE6, 0x0D, 0x6A, 0xE2, 0xF3, + 0x74, 0xE8, 0x1B, 0x3C, 0x2B, 0x25, 0x44, 0x8E, 0x1C, 0x36, 0xBE, 0xA9, 0x27, 0x6E, 0x6A, 0x48, + 0x8E, 0x2F, 0x2C, 0x9D, 0x71, 0x66, 0x23, 0x7C, 0x7A, 0x74, 0x93, 0x46, 0x2D, 0xCA, 0x6B, 0xC6, + 0x33, 0xDA, 0x1E, 0x1E, 0x44, 0x07, 0xFD, 0x89, 0x5D, 0x30, 0x02, 0x4C, 0xB1, 0x73, 0xC0, 0x91, + 0xEB, 0xA5, 0x61, 0x89, 0xA4, 0x04, 0xFD, 0xD5, 0x5F, 0x54, 0x59, 0x81, 0xC3, 0x2A, 0x13, 0x89, + 0xDA, 0x68, 0xB6, 0x3A, 0x9C, 0x70, 0x6F, 0x48, 0xB4, 0x3C, 0xF8, 0x9B, 0xF8, 0xF2, 0x59, 0xBF, + 0xF4, 0x8D, 0x06, 0x58, 0xEA, 0xA2, 0xA6, 0xB4, 0x70, 0x08, 0x80, 0x2B, 0x50, 0x13, 0x36, 0x79, + 0x17, 0x0B, 0x94, 0x0E, 0x4D, 0xF5, 0xC8, 0x14, 0xB9, 0x02, 0x7D, 0xEE, 0x6B, 0xBD, 0x10, 0xB4, + 0x85, 0x74, 0xA1, 0xB9, 0x84, 0x67, 0xC6, 0x2C, 0xDB, 0xDA, 0x55, 0x54, 0x16, 0xDA, 0x02, 0xB6, + 0xDA, 0x2A, 0x9B, 0x51, 0xD6, 0xDC, 0x87, 0x80, 0xC1, 0xB8, 0x6F, 0x0C, 0xEF, 0x4B, 0xD1, 0x1A, + 0x9F, 0x36, 0x2E, 0x9C, 0x7E, 0x5F, 0x17, 0xE2, 0xC1, 0x82, 0x0C, 0x42, 0x0D, 0x15, 0x18, 0xCA + } + }; +} \ No newline at end of file diff --git a/DanhengKcpSharp/DanhengConnection.cs b/DanhengKcpSharp/DanhengConnection.cs index 4652c739..42b948a6 100644 --- a/DanhengKcpSharp/DanhengConnection.cs +++ b/DanhengKcpSharp/DanhengConnection.cs @@ -30,9 +30,6 @@ public class DanhengConnection public bool IsOnline = true; public StreamWriter? Writer; - public byte[]? XorKey { get; set; } - public ulong ClientSecretKeySeed { get; set; } - public DanhengConnection(KcpConversation conversation, IPEndPoint remote) { Conversation = conversation; @@ -44,9 +41,13 @@ public class DanhengConnection XorKey = Crypto.ClientSecretKey.GetXorKey(); #pragma warning restore CS8602 // CS8602 - Dereference of a possibly null reference. } + Start(); } + public byte[]? XorKey { get; set; } + public ulong ClientSecretKeySeed { get; set; } + public long? ConversationId => Conversation.ConversationId; public SessionStateEnum State { get; set; } = SessionStateEnum.INACTIVE; diff --git a/GameServer/Game/Battle/BattleManager.cs b/GameServer/Game/Battle/BattleManager.cs index d39f029f..5db612dc 100644 --- a/GameServer/Game/Battle/BattleManager.cs +++ b/GameServer/Game/Battle/BattleManager.cs @@ -97,7 +97,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) { // Skill is not supposed to trigger a battle List hitMonsterInstances = []; - hitMonsterInstances.AddRange(targetList.Select(entityMonster => new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.NoBattle))); + hitMonsterInstances.AddRange(targetList.Select(entityMonster => + new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.NoBattle))); skill.OnHitTarget(Player.SceneInstance!.AvatarInfo[(int)req.AttackedByEntityId], targetList); await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, hitMonsterInstances)); @@ -115,7 +116,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) if (!triggerBattle) { List hitMonsterInstances = []; - hitMonsterInstances.AddRange(targetList.Select(entityMonster => new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSimulateBattle))); + hitMonsterInstances.AddRange(targetList.Select(entityMonster => + new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSimulateBattle))); await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, hitMonsterInstances)); return; @@ -125,22 +127,21 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) if (inst is RogueMagicInstance { CurLevel.CurRoom.AdventureInstance: not null } magic) { List hitMonsterInstances = []; - hitMonsterInstances.AddRange(targetList.Select(entityMonster => new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSkipBattle))); + hitMonsterInstances.AddRange(targetList.Select(entityMonster => + new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSkipBattle))); await magic.HitMonsterInAdventure(targetList); - foreach (var entityMonster in targetList) - { - await entityMonster.Kill(); - } + foreach (var entityMonster in targetList) await entityMonster.Kill(); await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, hitMonsterInstances)); return; } - BattleInstance battleInstance = new(Player, Player.LineupManager!.GetCurLineup()!, targetList.Where(x => x.IsAlive).ToList()) - { - WorldLevel = Player.Data.WorldLevel - }; + BattleInstance battleInstance = + new(Player, Player.LineupManager!.GetCurLineup()!, targetList.Where(x => x.IsAlive).ToList()) + { + WorldLevel = Player.Data.WorldLevel + }; avatarList.AddRange(Player.LineupManager!.GetCurLineup()!.BaseAvatars! .Select(item => @@ -182,10 +183,13 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) // Send battle start packet List hitMonsterInstance = []; - hitMonsterInstance.AddRange(targetList.Where(x => x.IsAlive).Select(entityMonster => new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.TriggerBattle))); - hitMonsterInstance.AddRange(targetList.Where(x => !x.IsAlive).Select(entityMonster => new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSkipBattle))); + hitMonsterInstance.AddRange(targetList.Where(x => x.IsAlive).Select(entityMonster => + new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.TriggerBattle))); + hitMonsterInstance.AddRange(targetList.Where(x => !x.IsAlive).Select(entityMonster => + new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSkipBattle))); - await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, battleInstance, hitMonsterInstance)); + await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, battleInstance, + hitMonsterInstance)); Player.SceneInstance?.ClearSummonUnit(); } else diff --git a/GameServer/Game/Battle/Skill/Action/MazeRemoveSummonUnit.cs b/GameServer/Game/Battle/Skill/Action/MazeRemoveSummonUnit.cs index 279d117b..193c5816 100644 --- a/GameServer/Game/Battle/Skill/Action/MazeRemoveSummonUnit.cs +++ b/GameServer/Game/Battle/Skill/Action/MazeRemoveSummonUnit.cs @@ -1,13 +1,13 @@ using EggLink.DanhengServer.GameServer.Game.Player; -using EggLink.DanhengServer.GameServer.Game.Scene.Entity; using EggLink.DanhengServer.GameServer.Game.Scene; +using EggLink.DanhengServer.GameServer.Game.Scene.Entity; namespace EggLink.DanhengServer.GameServer.Game.Battle.Skill.Action; -public class MazeRemoveSummonUnit(int unitId): IMazeSkillAction +public class MazeRemoveSummonUnit(int unitId) : IMazeSkillAction { public int SummonUnitId = unitId; - + public async ValueTask OnAttack(AvatarSceneInfo avatar, List entities) { await System.Threading.Tasks.Task.CompletedTask; @@ -16,10 +16,8 @@ public class MazeRemoveSummonUnit(int unitId): IMazeSkillAction public async ValueTask OnCast(AvatarSceneInfo avatar, PlayerInstance player) { if (player.SceneInstance!.SummonUnit?.SummonUnitId == SummonUnitId) - { // remove await player.SceneInstance!.ClearSummonUnit(); - } } public async ValueTask OnHitTarget(AvatarSceneInfo avatar, List entities) diff --git a/GameServer/Game/Battle/Skill/MazeSkill.cs b/GameServer/Game/Battle/Skill/MazeSkill.cs index 053103c0..bd0f6e2e 100644 --- a/GameServer/Game/Battle/Skill/MazeSkill.cs +++ b/GameServer/Game/Battle/Skill/MazeSkill.cs @@ -23,7 +23,8 @@ public class MazeSkill foreach (var task in taskInfos) AddAction(task); if (GameData.SummonUnitDataData.TryGetValue((excel?.AvatarID ?? 0) * 10 + 1, out var summonUnit) && isSkill && - !summonUnit.IsClient && req.MazeAbilityStr == "") Actions.Add(new MazeSummonUnit(summonUnit, req.TargetMotion)); + !summonUnit.IsClient && + req.MazeAbilityStr == "") Actions.Add(new MazeSummonUnit(summonUnit, req.TargetMotion)); } public List Actions { get; } = []; diff --git a/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs b/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs index 115e339e..8edd9e58 100644 --- a/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs +++ b/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs @@ -132,7 +132,7 @@ public class ChessRogueCellInstance var curCell = Instance.CurCell; if (curCell == null) return true; - return curCell.PosX >= PosX; // only check the left side of the board + return curCell.PosX >= PosX; // only check the left side of the board } public int GetEntryId() diff --git a/GameServer/Game/ChessRogue/ChessRogueInstance.cs b/GameServer/Game/ChessRogue/ChessRogueInstance.cs index 51b7696a..9dc4710e 100644 --- a/GameServer/Game/ChessRogue/ChessRogueInstance.cs +++ b/GameServer/Game/ChessRogue/ChessRogueInstance.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Data; +using System.Reflection; +using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Config.AdventureAbility; using EggLink.DanhengServer.Data.Custom; using EggLink.DanhengServer.Data.Excel; @@ -7,8 +8,6 @@ using EggLink.DanhengServer.GameServer.Game.Battle; using EggLink.DanhengServer.GameServer.Game.ChessRogue.Cell; using EggLink.DanhengServer.GameServer.Game.ChessRogue.Dice; using EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect; -using EggLink.DanhengServer.GameServer.Game.Mission.FinishAction; -using EggLink.DanhengServer.GameServer.Game.Mission.FinishType; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Game.Rogue; using EggLink.DanhengServer.GameServer.Game.Rogue.Buff; @@ -17,7 +16,6 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; -using System.Reflection; namespace EggLink.DanhengServer.GameServer.Game.ChessRogue; @@ -209,6 +207,31 @@ public class ChessRogueInstance : BaseRogueInstance } } + #region Modifier + + public async ValueTask ApplyModifier(int selectCellId) + { + if (DiceInstance.Modifier == null) return; + + var modifier = DiceInstance.Modifier; + if (selectCellId == 0) + { + modifier.IsConfirmed = true; + await Player.SendPacket(new PacketRogueModifierStageStartNotify(modifier.SourceType)); + // gain money + await GainMoney(10, 2); + + await Player.SendPacket(new PacketChessRogueUpdateDiceInfoScNotify(DiceInstance)); + return; + } + + await modifier.SelectModifierCell(this, selectCellId); + + await Player.SendPacket(new PacketChessRogueUpdateDiceInfoScNotify(DiceInstance)); + } + + #endregion + #region Buff Management public override void HandleMazeBuffModifier(AdventureModifierConfig config, MazeBuff buff) @@ -224,7 +247,7 @@ public class ChessRogueInstance : BaseRogueInstance "ItemNum" => CurMoney, "RogueMiracleNum" => RogueMiracles.Count, "RogueBuffNumWithType" => RogueBuffs.Count, - "RogueModifierCount" => DiceInstance.Modifier == null ? 0: 1, + "RogueModifierCount" => DiceInstance.Modifier == null ? 0 : 1, "RogueLayer" => Layers.IndexOf(CurLayer) + 1, _ => 0 }; @@ -476,30 +499,6 @@ public class ChessRogueInstance : BaseRogueInstance #endregion - #region Modifier - - public async ValueTask ApplyModifier(int selectCellId) - { - if (DiceInstance.Modifier == null) return; - - var modifier = DiceInstance.Modifier; - if (selectCellId == 0) - { - modifier.IsConfirmed = true; - await Player.SendPacket(new PacketRogueModifierStageStartNotify(modifier.SourceType)); - // gain money - await GainMoney(10, 2); - - await Player.SendPacket(new PacketChessRogueUpdateDiceInfoScNotify(DiceInstance)); - return; - } - await modifier.SelectModifierCell(this, selectCellId); - - await Player.SendPacket(new PacketChessRogueUpdateDiceInfoScNotify(DiceInstance)); - } - - #endregion - #region Action Management public async ValueTask CostActionPoint(int cost) @@ -727,7 +726,7 @@ public class ChessRogueInstance : BaseRogueInstance canSelected.AddRange(CanMoveCellIdList.Select(i => (uint)i)); - CanMoveCellIdList.Clear(); // clear + CanMoveCellIdList.Clear(); // clear var proto = new ChessRogueLevelInfo { diff --git a/GameServer/Game/ChessRogue/Modifier/ChessRogueDiceModifierInstance.cs b/GameServer/Game/ChessRogue/Modifier/ChessRogueDiceModifierInstance.cs index 42cc2a80..297b02aa 100644 --- a/GameServer/Game/ChessRogue/Modifier/ChessRogueDiceModifierInstance.cs +++ b/GameServer/Game/ChessRogue/Modifier/ChessRogueDiceModifierInstance.cs @@ -13,6 +13,26 @@ public class ChessRogueDiceModifierInstance(int modifierId, ChessRogueDiceSurfac public int SelectedCell { get; set; } public bool IsConfirmed { get; set; } + public RogueModifier ToProto() + { + return new RogueModifier + { + MainModifierEffect = (ulong)ModifierId, + ModifierSourceType = SourceType, + ModifierContent = new RogueModifierContent + { + ContentModifierEffectId = (uint)EffectConfig.EffectType, + ModifierContentType = RogueModifierContentType.RogueModifierContentDefinite + }, + ModifierInfo = new ChessRogueModifierInfo + { + GNDJCFDJHEJ = { SelectableCells.Select(x => (uint)x) }, + SelectCellId = (uint)SelectedCell, + Confirm = IsConfirmed + } + }; + } + #region Effect public async ValueTask SelectCell(ChessRogueInstance instance, int selectCellId) @@ -33,7 +53,7 @@ public class ChessRogueDiceModifierInstance(int modifierId, ChessRogueDiceSurfac instance.ModifierEffectHandlers.TryGetValue(effect, out var handler); - if (handler != null) + if (handler != null) await handler.SelectModifierCell(this, instance, selectCellId); else IsConfirmed = true; @@ -76,24 +96,4 @@ public class ChessRogueDiceModifierInstance(int modifierId, ChessRogueDiceSurfac } #endregion - - public RogueModifier ToProto() - { - return new RogueModifier - { - MainModifierEffect = (ulong)ModifierId, - ModifierSourceType = SourceType, - ModifierContent = new RogueModifierContent - { - ContentModifierEffectId = (uint)EffectConfig.EffectType, - ModifierContentType = RogueModifierContentType.RogueModifierContentDefinite - }, - ModifierInfo = new ChessRogueModifierInfo - { - GNDJCFDJHEJ = { SelectableCells.Select(x => (uint)x) }, - SelectCellId = (uint)SelectedCell, - Confirm = IsConfirmed - } - }; - } } \ No newline at end of file diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectAddMazeBuff.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectAddMazeBuff.cs index 7cae0bbd..a7eb628c 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectAddMazeBuff.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectAddMazeBuff.cs @@ -1,5 +1,4 @@ using EggLink.DanhengServer.Data; -using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Enums.Rogue; using EggLink.DanhengServer.GameServer.Game.Battle; @@ -8,19 +7,22 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.AddMazeBuff)] public class ModifierEffectAddMazeBuff : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { modifierInstance.IsConfirmed = true; await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; @@ -42,10 +44,8 @@ public class ModifierEffectAddMazeBuff : ModifierEffectHandler { var modifier = GameData.AdventureModifierData.GetValueOrDefault(buffExcel.ModifierName); if (modifier != null) - { // handle modifier instance.HandleMazeBuffModifier(modifier, buff); - } } battle.Buffs.Add(buff); diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectChangeSelectCellType.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectChangeSelectCellType.cs index 85835e37..da384d39 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectChangeSelectCellType.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectChangeSelectCellType.cs @@ -10,19 +10,23 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.ChangeSelectCellType)] public class ModifierEffectChangeSelectCellType : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); foreach (var type in types) { - var cells = chessRogueInstance.RogueCells.Where(x => x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); + var cells = chessRogueInstance.RogueCells.Where(x => + x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key)); } + await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { var cell = chessRogueInstance.RogueCells[selectCellId]; @@ -30,17 +34,21 @@ public class ModifierEffectChangeSelectCellType : ModifierEffectHandler modifierInstance.SelectedCell = selectCellId; modifierInstance.IsConfirmed = true; - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("TargetType", "3").Split(";"); var targetType = types.Select(x => (RogueDLCBlockTypeEnum)int.Parse(x)).ToList().RandomElement(); cell.BlockType = targetType; - await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(cell, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); + await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(cell, + chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, + ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReRandomCellTypeGetMoney.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReRandomCellTypeGetMoney.cs index 923e7c1e..be012298 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReRandomCellTypeGetMoney.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReRandomCellTypeGetMoney.cs @@ -10,7 +10,8 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.ReRandomCellTypeGetMoney)] public class ModifierEffectReRandomCellTypeGetMoney : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); @@ -40,10 +41,7 @@ public class ModifierEffectReRandomCellTypeGetMoney : ModifierEffectHandler var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("TargetType", "3").Split(";"); var targetType = types.Select(x => (RogueDLCBlockTypeEnum)int.Parse(x)).ToList(); - foreach (var cell in refreshCell) - { - cell.BlockType = targetType.RandomElement(); - } + foreach (var cell in refreshCell) cell.BlockType = targetType.RandomElement(); // get money var money = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "0")); @@ -54,7 +52,8 @@ public class ModifierEffectReRandomCellTypeGetMoney : ModifierEffectHandler ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToRandom.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToRandom.cs index 4c59cfb8..9263ed45 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToRandom.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToRandom.cs @@ -5,36 +5,40 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; -using System.Collections.Generic; namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects; [ModifierEffect(ModifierEffectTypeEnum.ReplicateCurCellToRandom)] public class ModifierEffectReplicateCurCellToRandom : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); - List targetCells = []; // list of cells can be changed - var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); // get the target types - var count = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "1")); // get the count of cells to change + List targetCells = []; // list of cells can be changed + var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3") + .Split(";"); // get the target types + var count = int.Parse( + modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "1")); // get the count of cells to change var curCell = chessRogueInstance.CurCell; foreach (var type in types) { - var cells = chessRogueInstance.RogueCells.Where(x => // get all cells with the target type + var cells = chessRogueInstance.RogueCells.Where(x => // get all cells with the target type x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); - targetCells.AddRange(cells.Select(x => x.Value)); // add the cells to the list + targetCells.AddRange(cells.Select(x => x.Value)); // add the cells to the list } List updated = []; for (var i = 0; i < count; i++) { - if (targetCells.Count == 0) // if there are no more cells to change, quit the loop + if (targetCells.Count == 0) // if there are no more cells to change, quit the loop break; - var targetCell = targetCells.RandomElement(); // get a random cell from the list - targetCell.BlockType = curCell?.BlockType ?? RogueDLCBlockTypeEnum.Empty; // set the cell type to the current cell type + var targetCell = targetCells.RandomElement(); // get a random cell from the list + targetCell.BlockType = + curCell?.BlockType ?? RogueDLCBlockTypeEnum.Empty; // set the cell type to the current cell type targetCells.Remove(targetCell); updated.Add(targetCell); } @@ -46,13 +50,15 @@ public class ModifierEffectReplicateCurCellToRandom : ModifierEffectHandler modifierInstance.IsConfirmed = true; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToSelectCell.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToSelectCell.cs index d666b721..f8f990de 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToSelectCell.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateCurCellToSelectCell.cs @@ -9,22 +9,27 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.ReplicateCurCellToSelectCell)] public class ModifierEffectReplicateCurCellToSelectCell : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); foreach (var type in types) { - var cells = chessRogueInstance.RogueCells.Where(x => x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); + var cells = chessRogueInstance.RogueCells.Where(x => + x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key)); } + await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); modifierInstance.SelectedCell = selectCellId; modifierInstance.IsConfirmed = true; @@ -34,10 +39,13 @@ public class ModifierEffectReplicateCurCellToSelectCell : ModifierEffectHandler targetCell.BlockType = curCell?.BlockType ?? RogueDLCBlockTypeEnum.Empty; // Send packet to update the cell - await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(targetCell, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); + await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(targetCell, + chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, + ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToAround.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToAround.cs index 71c2c947..eb90450b 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToAround.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToAround.cs @@ -2,17 +2,17 @@ using EggLink.DanhengServer.GameServer.Game.Battle; using EggLink.DanhengServer.GameServer.Game.ChessRogue.Cell; using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue; -using System.Collections.Generic; -using EggLink.DanhengServer.Util; -using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier; +using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Util; namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects; [ModifierEffect(ModifierEffectTypeEnum.ReplicateSelectCellToAround)] public class ModifierEffectReplicateSelectCellToAround : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); @@ -26,10 +26,12 @@ public class ModifierEffectReplicateSelectCellToAround : ModifierEffectHandler await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); modifierInstance.SelectedCell = selectCellId; modifierInstance.IsConfirmed = true; @@ -45,6 +47,7 @@ public class ModifierEffectReplicateSelectCellToAround : ModifierEffectHandler targetCells.AddRange(cells.Select(x => x.Value)); } + targetCells.Remove(targetCell); List updated = []; @@ -59,10 +62,13 @@ public class ModifierEffectReplicateSelectCellToAround : ModifierEffectHandler } // Send packet to update the cell - await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); + await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, + chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, + ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToRandom.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToRandom.cs index 1b8fcbc1..b7540748 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToRandom.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectReplicateSelectCellToRandom.cs @@ -11,7 +11,8 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.ReplicateSelectCellToRandom)] public class ModifierEffectReplicateSelectCellToRandom : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); @@ -25,10 +26,12 @@ public class ModifierEffectReplicateSelectCellToRandom : ModifierEffectHandler await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); modifierInstance.SelectedCell = selectCellId; modifierInstance.IsConfirmed = true; @@ -39,10 +42,12 @@ public class ModifierEffectReplicateSelectCellToRandom : ModifierEffectHandler foreach (var type in types) { var cells = chessRogueInstance.RogueCells.Where(x => - x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); // get all cells with the target type + x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && + !x.Value.IsCollapsed()); // get all cells with the target type targetCells.AddRange(cells.Select(x => x.Value)); } + targetCells.Remove(targetCell); List updated = []; @@ -57,10 +62,13 @@ public class ModifierEffectReplicateSelectCellToRandom : ModifierEffectHandler } // Send packet to update the cell - await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); + await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, + chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, + ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetBlockTypeToAround.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetBlockTypeToAround.cs index ac4c7b89..d5cd2561 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetBlockTypeToAround.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetBlockTypeToAround.cs @@ -5,15 +5,14 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; -using System.Collections.Generic; -using System.Xml.Linq; namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects; [ModifierEffect(ModifierEffectTypeEnum.SetBlockTypeToAround)] public class ModifierEffectSetBlockTypeToAround : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); @@ -27,10 +26,12 @@ public class ModifierEffectSetBlockTypeToAround : ModifierEffectHandler await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); modifierInstance.SelectedCell = selectCellId; modifierInstance.IsConfirmed = true; @@ -46,6 +47,7 @@ public class ModifierEffectSetBlockTypeToAround : ModifierEffectHandler targetCells.AddRange(cells.Select(x => x.Value)); } + targetCells.Remove(targetCell); List updated = []; @@ -60,10 +62,13 @@ public class ModifierEffectSetBlockTypeToAround : ModifierEffectHandler } // Send packet to update the cell - await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); + await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, + chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, + ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetCellTypeAndTakeReward.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetCellTypeAndTakeReward.cs index 2b48a894..05993b4a 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetCellTypeAndTakeReward.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetCellTypeAndTakeReward.cs @@ -10,23 +10,27 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.SetCellTypeAndTakeReward)] public class ModifierEffectSetCellTypeAndTakeReward : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); foreach (var type in types) { - var cells = chessRogueInstance.RogueCells.Where(x => x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); + var cells = chessRogueInstance.RogueCells.Where(x => + x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key)); } await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); modifierInstance.SelectedCell = selectCellId; modifierInstance.IsConfirmed = true; @@ -52,6 +56,7 @@ public class ModifierEffectSetCellTypeAndTakeReward : ModifierEffectHandler await chessRogueInstance.RollBuff(1, 100004); await chessRogueInstance.GainMoney(Random.Shared.Next(40, 60), 2); } + break; case "Event": var eventCount = cell.MarkType switch @@ -83,7 +88,8 @@ public class ModifierEffectSetCellTypeAndTakeReward : ModifierEffectHandler ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetColCanMove.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetColCanMove.cs index ed7ea8b6..ab12314d 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetColCanMove.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSetColCanMove.cs @@ -6,39 +6,39 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.SetColCanMove)] public class ModifierEffectSetColCanMove : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var curCol = chessRogueInstance.CurCell?.PosX ?? 0; var col = modifierInstance.EffectConfig.Params.GetValueOrDefault("Col", "0").Split(";"); foreach (var c in col) - { if (c.StartsWith("~")) // ~1 means cur + 1 { var offset = int.Parse(c[1..]); - foreach (var cell in chessRogueInstance.RogueCells.Values.Where(cell => cell.PosX == curCol + offset && !cell.IsCollapsed())) - { + foreach (var cell in chessRogueInstance.RogueCells.Values.Where(cell => + cell.PosX == curCol + offset && !cell.IsCollapsed())) chessRogueInstance.CanMoveCellIdList.Add(cell.CellId); - } } else { - foreach (var cell in chessRogueInstance.RogueCells.Values.Where(cell => cell.PosX == int.Parse(c) && !cell.IsCollapsed())) - { + foreach (var cell in chessRogueInstance.RogueCells.Values.Where(cell => + cell.PosX == int.Parse(c) && !cell.IsCollapsed())) chessRogueInstance.CanMoveCellIdList.Add(cell.CellId); - } } - } + await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSwapCellToCurAround.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSwapCellToCurAround.cs index 843fd37b..53a116c9 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSwapCellToCurAround.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectSwapCellToCurAround.cs @@ -11,7 +11,8 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.SwapCellToCurAround)] public class ModifierEffectSwapCellToCurAround : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); @@ -56,7 +57,8 @@ public class ModifierEffectSwapCellToCurAround : ModifierEffectHandler ChessRogueCellUpdateReason.Modifier)); } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTrunAroundToEmptyGetBuff.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTrunAroundToEmptyGetBuff.cs index 77e45877..2dfa3424 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTrunAroundToEmptyGetBuff.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTrunAroundToEmptyGetBuff.cs @@ -7,24 +7,29 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects; -[ModifierEffect(ModifierEffectTypeEnum.TrunAroundToEmptyGetBuff)] // I don't know why it's called TrunAround instead of TurnAround, maybe miHoYo r sleeping lol +[ModifierEffect(ModifierEffectTypeEnum + .TrunAroundToEmptyGetBuff)] // I don't know why it's called TrunAround instead of TurnAround, maybe miHoYo r sleeping lol public class ModifierEffectTrunAroundToEmptyGetBuff : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { await ValueTask.CompletedTask; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); var targetCell = chessRogueInstance.RogueCells[selectCellId]; modifierInstance.IsConfirmed = true; @@ -52,10 +57,7 @@ public class ModifierEffectTrunAroundToEmptyGetBuff : ModifierEffectHandler chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); - if (count > 0) - { - await chessRogueInstance.RollBuff(count, 100004); - } + if (count > 0) await chessRogueInstance.RollBuff(count, 100004); } public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle, diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTurnRandomCellBlockType.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTurnRandomCellBlockType.cs index 9fecfd59..b6b5c220 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTurnRandomCellBlockType.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/Effects/ModifierEffectTurnRandomCellBlockType.cs @@ -11,13 +11,16 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe [ModifierEffect(ModifierEffectTypeEnum.TurnRandomCellBlockType)] public class ModifierEffectTurnRandomCellBlockType : ModifierEffectHandler { - public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance) + public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance) { - await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); + await chessRogueInstance.Player.SendPacket( + new PacketRogueModifierStageStartNotify(modifierInstance.SourceType)); List targetCells = []; var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); - var targetTypes = modifierInstance.EffectConfig.Params.GetValueOrDefault("TargetType", "3").Split(";").Select(x => (RogueDLCBlockTypeEnum)int.Parse(x)).ToList(); + var targetTypes = modifierInstance.EffectConfig.Params.GetValueOrDefault("TargetType", "3").Split(";") + .Select(x => (RogueDLCBlockTypeEnum)int.Parse(x)).ToList(); var count = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "1")); foreach (var type in types) { @@ -41,17 +44,19 @@ public class ModifierEffectTurnRandomCellBlockType : ModifierEffectHandler await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier)); - + modifierInstance.IsConfirmed = true; } - public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; } - public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, + public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId) { await ValueTask.CompletedTask; diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectAttribute.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectAttribute.cs index 1843b9e6..6ff85ae1 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectAttribute.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectAttribute.cs @@ -1,10 +1,9 @@ using EggLink.DanhengServer.Enums.Rogue; -namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect +namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect; + +[AttributeUsage(AttributeTargets.Class)] +public class ModifierEffectAttribute(ModifierEffectTypeEnum effectType) : Attribute { - [AttributeUsage(AttributeTargets.Class)] - public class ModifierEffectAttribute(ModifierEffectTypeEnum effectType) : Attribute - { - public ModifierEffectTypeEnum EffectType { get; } = effectType; - } -} + public ModifierEffectTypeEnum EffectType { get; } = effectType; +} \ No newline at end of file diff --git a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectHandler.cs b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectHandler.cs index 2116295d..14690eec 100644 --- a/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectHandler.cs +++ b/GameServer/Game/ChessRogue/Modifier/ModifierEffect/ModifierEffectHandler.cs @@ -1,14 +1,20 @@ using EggLink.DanhengServer.GameServer.Game.Battle; -namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect +namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect; + +public abstract class ModifierEffectHandler { - public abstract class ModifierEffectHandler - { - public abstract ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance); - public abstract ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, int selectCellId); - public abstract ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, int selectCellId); - public abstract void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle, - ChessRogueInstance instance); - public abstract ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle); - } -} + public abstract ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance); + + public abstract ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId); + + public abstract ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, + ChessRogueInstance chessRogueInstance, int selectCellId); + + public abstract void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle, + ChessRogueInstance instance); + + public abstract ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle); +} \ No newline at end of file diff --git a/GameServer/Game/Rogue/BaseRogueInstance.cs b/GameServer/Game/Rogue/BaseRogueInstance.cs index c8e2e935..8fac13e5 100644 --- a/GameServer/Game/Rogue/BaseRogueInstance.cs +++ b/GameServer/Game/Rogue/BaseRogueInstance.cs @@ -15,7 +15,6 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; -using System; using LineupInfo = EggLink.DanhengServer.Database.Lineup.LineupInfo; namespace EggLink.DanhengServer.GameServer.Game.Rogue; @@ -112,7 +111,7 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum bool updateMenu = true, bool notify = true) { var buff = RogueBuffs.Find(x => x.BuffExcel.MazeBuffID == buffId); - if (buff == null) return null; // buff not found + if (buff == null) return null; // buff not found RogueBuffs.Remove(buff); var result = buff.ToRemoveResultProto(source); @@ -227,7 +226,8 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum await UpdateMenu(); - await Player.SendPacket(new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, reforgeBuff:true)); + await Player.SendPacket( + new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, reforgeBuff: true)); } public virtual async ValueTask HandleRerollBuff(int location) @@ -238,7 +238,8 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum { await action.RogueBuffSelectMenu.RerollBuff(); // reroll await Player.SendPacket( - new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, menu: action.RogueBuffSelectMenu)); + new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, + menu: action.RogueBuffSelectMenu)); } } @@ -397,7 +398,8 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum RogueActions.Remove(action.QueuePosition); await UpdateMenu(); - await Player.SendPacket(new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, selectBonus: true)); + await Player.SendPacket( + new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, selectBonus: true)); } public virtual async ValueTask UpdateMenu(int position = 0) diff --git a/GameServer/Game/Rogue/RogueActionInstance.cs b/GameServer/Game/Rogue/RogueActionInstance.cs index 3ee1aae3..450ce03d 100644 --- a/GameServer/Game/Rogue/RogueActionInstance.cs +++ b/GameServer/Game/Rogue/RogueActionInstance.cs @@ -33,7 +33,8 @@ public class RogueActionInstance if (RogueBuffSelectMenu != null && !IsReforge) action.BuffSelectInfo = RogueBuffSelectMenu.ToProto(); - if (RogueBuffSelectMenu != null && IsReforge) action.BuffReforgeSelectInfo = RogueBuffSelectMenu.ToReforgeProto(); + if (RogueBuffSelectMenu != null && IsReforge) + action.BuffReforgeSelectInfo = RogueBuffSelectMenu.ToReforgeProto(); if (RogueMiracleSelectMenu != null) action.MiracleSelectInfo = RogueMiracleSelectMenu.ToProto(); diff --git a/GameServer/Game/RogueMagic/Adventure/RogueMagicAdventureInstance.cs b/GameServer/Game/RogueMagic/Adventure/RogueMagicAdventureInstance.cs index 16af3b91..fb674a03 100644 --- a/GameServer/Game/RogueMagic/Adventure/RogueMagicAdventureInstance.cs +++ b/GameServer/Game/RogueMagic/Adventure/RogueMagicAdventureInstance.cs @@ -10,7 +10,10 @@ namespace EggLink.DanhengServer.GameServer.Game.RogueMagic.Adventure; public class RogueMagicAdventureInstance(RogueMagicAdventureRoomExcel excel) { public RogueMagicAdventureRoomExcel Excel { get; set; } = excel; - public int RemainMonsterNum { get; set; } = excel.AdventureType == RogueAdventureGameplayTypeEnum.RogueCaptureMonster ? 16 : 0; + + public int RemainMonsterNum { get; set; } = + excel.AdventureType == RogueAdventureGameplayTypeEnum.RogueCaptureMonster ? 16 : 0; + public int CaughtMonsterNum { get; set; } public RogueAdventureRoomStatus Status { get; set; } = RogueAdventureRoomStatus.None; public int Score { get; set; } = 0; @@ -67,7 +70,6 @@ public class RogueMagicAdventureInstance(RogueMagicAdventureRoomExcel excel) }; if (WolfGunTargets.Count > 0) - { proto.QueryInfo = new RogueAdventureRoomGameplayWolfGunInfo { GameInfo = new RogueAdventureRoomGameplayWolfGunGameInfo @@ -76,7 +78,6 @@ public class RogueMagicAdventureInstance(RogueMagicAdventureRoomExcel excel) BattleTargetList = { WolfGunTargets.Select(x => x.ToProto()) } } }; - } return proto; } diff --git a/GameServer/Game/RogueMagic/MagicUnit/RogueMagicUnitSelectMenu.cs b/GameServer/Game/RogueMagic/MagicUnit/RogueMagicUnitSelectMenu.cs index 853a2694..c6666e77 100644 --- a/GameServer/Game/RogueMagic/MagicUnit/RogueMagicUnitSelectMenu.cs +++ b/GameServer/Game/RogueMagic/MagicUnit/RogueMagicUnitSelectMenu.cs @@ -18,16 +18,12 @@ public class RogueMagicUnitSelectMenu(BaseRogueInstance rogue) : BaseRogueSelect public override void Roll() { - if (MagicUnits.Count > 0) return; // already init + if (MagicUnits.Count > 0) return; // already init // Remove existing magic units if (rogue is RogueMagicInstance magic) - { foreach (var excel in MagicUnitPool.Clone()) - { if (magic.RogueMagicUnits.Any(x => x.Value.Excel.MagicUnitID == excel.MagicUnitID)) MagicUnitPool.Remove(excel); - } - } var list = new RandomList(); foreach (var unitExcel in MagicUnitPool) @@ -87,11 +83,14 @@ public class RogueMagicUnitSelectMenu(BaseRogueInstance rogue) : BaseRogueSelect { return new RogueMagicUnitSelectInfo { - SelectMagicUnits = { MagicUnits.Select(x => new RogueMagicGameUnit + SelectMagicUnits = { - MagicUnitId = (uint)x.MagicUnitID, - Level = (uint)x.MagicUnitLevel - }) }, + MagicUnits.Select(x => new RogueMagicGameUnit + { + MagicUnitId = (uint)x.MagicUnitID, + Level = (uint)x.MagicUnitLevel + }) + }, SelectHintId = 260002, ABHPIGOGACI = 1, OMPAAKLLLFD = 1 diff --git a/GameServer/Game/RogueMagic/RogueMagicInstance.cs b/GameServer/Game/RogueMagic/RogueMagicInstance.cs index 522b4d56..d87572b5 100644 --- a/GameServer/Game/RogueMagic/RogueMagicInstance.cs +++ b/GameServer/Game/RogueMagic/RogueMagicInstance.cs @@ -23,7 +23,8 @@ public class RogueMagicInstance : BaseRogueInstance { #region Initializer - public RogueMagicInstance(PlayerInstance player, int areaId, List difficultyIds, int styleType) : base(player, RogueSubModeEnum.MagicRogue, 0) + public RogueMagicInstance(PlayerInstance player, int areaId, List difficultyIds, int styleType) : base(player, + RogueSubModeEnum.MagicRogue, 0) { // generate levels AreaExcel = GameData.RogueMagicAreaData.GetValueOrDefault(areaId) ?? @@ -32,7 +33,8 @@ public class RogueMagicInstance : BaseRogueInstance foreach (var index in Enumerable.Range(1, AreaExcel.LayerIDList.Count)) { var layerId = AreaExcel.LayerIDList[index - 1]; - var levelInstance = new RogueMagicLevelInstance(index, layerId, GameData.RogueMagicLayerIdRoomCountDict.GetValueOrDefault(layerId)); + var levelInstance = new RogueMagicLevelInstance(index, layerId, + GameData.RogueMagicLayerIdRoomCountDict.GetValueOrDefault(layerId)); Levels.Add(levelInstance.LayerId, levelInstance); } @@ -48,7 +50,7 @@ public class RogueMagicInstance : BaseRogueInstance DifficultyCompExcels.Add(excel); } - foreach (var id in AreaExcel.DifficultyIDList) // need to find a better way to get difficulty excels + foreach (var id in AreaExcel.DifficultyIDList) // need to find a better way to get difficulty excels { GameData.RogueTournDifficultyData.TryGetValue(1000 + id, out var excel); if (excel != null) @@ -63,12 +65,46 @@ public class RogueMagicInstance : BaseRogueInstance #endregion + #region Adventure + + public async ValueTask HandleStopWolfGunAdventure(List targetIndex, RogueMagicAdventureInstance instance) + { + if (instance.WolfGunTargets.Count == 0) return; + + var result = (from index in targetIndex + where index >= 0 && index < instance.WolfGunTargets.Count + select instance.WolfGunTargets[index]).ToList(); + + foreach (var target in result) + if (target.IsMoney) + { + // money + await GainMoney(target.TargetId, 2); + } + else if (target.IsMiracle) + { + // miracle + await AddMiracle(target.TargetId); + } + else if (target.IsRuanmei) + { + // ruanmei + var unitExcels = GameData.RogueMagicUnitData.Values + .Where(x => x.MagicUnitLevel == 1 && x.MagicUnitType != RogueMagicMountTypeEnum.Active).ToList(); + var toAddExcel = Enumerable.Range(0, 10).Select(unused => unitExcels.RandomElement()).ToList(); + + await AddMagicUnits(toAddExcel, RogueCommonActionResultSourceType.None); + } + } + + #endregion + #region Properties public RogueMagicAreaExcel AreaExcel { get; set; } public List DifficultyCompExcels { get; set; } = []; public Dictionary Levels { get; set; } = []; - public List DifficultyExcels { get; set; } = []; // for battle + public List DifficultyExcels { get; set; } = []; // for battle public int CurLayerId { get; set; } public RogueMagicLevelInstance? CurLevel => Levels.GetValueOrDefault(CurLayerId); @@ -101,10 +137,8 @@ public class RogueMagicInstance : BaseRogueInstance { var curIndex = CurLevel?.LevelIndex ?? 0; if (curIndex == 3) - { // last layer return; - } CurLayerId = AreaExcel.LayerIDList[curIndex]; await EnterRoom(1, type); @@ -145,22 +179,24 @@ public class RogueMagicInstance : BaseRogueInstance await Player.EnterMissionScene(entrance, group, anchor, false); // sync - await Player.SendPacket(new PacketRogueMagicLevelInfoUpdateScNotify(this, [CurLevel], [next?.RoomIndex ?? 0, - (next?.RoomIndex ?? 0) - 1])); + await Player.SendPacket(new PacketRogueMagicLevelInfoUpdateScNotify(this, [CurLevel], [ + next?.RoomIndex ?? 0, + (next?.RoomIndex ?? 0) - 1 + ])); } public async ValueTask QuitRogue() -{ - Player.LineupManager?.SetExtraLineup(ExtraLineupType.LineupNone, []); + { + Player.LineupManager?.SetExtraLineup(ExtraLineupType.LineupNone, []); - var currentLineup = Player.LineupManager!.GetCurLineup()!; + var currentLineup = Player.LineupManager!.GetCurLineup()!; - await Player.SendPacket(new PacketSyncLineupNotify(currentLineup)); + await Player.SendPacket(new PacketSyncLineupNotify(currentLineup)); - await Player.EnterMissionScene(801120102, 0, 0, false); + await Player.EnterMissionScene(801120102, 0, 0, false); - Player.RogueMagicManager!.RogueMagicInstance = null; -} + Player.RogueMagicManager!.RogueMagicInstance = null; + } #endregion @@ -168,7 +204,8 @@ public class RogueMagicInstance : BaseRogueInstance public async ValueTask RollScepter(int amount, int level) { - var scepterExcels = GameData.RogueMagicScepterData.Values.Where(x => !RogueScepters.ContainsKey(x.ScepterID) && x.ScepterLevel == level).ToList(); + var scepterExcels = GameData.RogueMagicScepterData.Values + .Where(x => !RogueScepters.ContainsKey(x.ScepterID) && x.ScepterLevel == level).ToList(); for (var i = 0; i < amount; i++) { @@ -199,7 +236,8 @@ public class RogueMagicInstance : BaseRogueInstance new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, selectScepter: true)); } - public async ValueTask AddScepter(RogueMagicScepterExcel excel, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select) + public async ValueTask AddScepter(RogueMagicScepterExcel excel, + RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select) { var scepter = new RogueScepterInstance(excel); RogueScepters.Add(excel.ScepterID, scepter); @@ -218,7 +256,8 @@ public class RogueMagicInstance : BaseRogueInstance // add scepter.AddUnit(slot, unit); - await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, scepter.ToDressInfo(RogueCommonActionResultSourceType.None))); + await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, + scepter.ToDressInfo(RogueCommonActionResultSourceType.None))); } #endregion @@ -227,7 +266,9 @@ public class RogueMagicInstance : BaseRogueInstance public async ValueTask RollMagicUnit(int amount, int level, List categories) { - var unitExcels = GameData.RogueMagicUnitData.Values.Where(x => x.MagicUnitLevel == level && categories.Contains(x.MagicUnitCategory) && x.MagicUnitType != RogueMagicMountTypeEnum.Active).ToList(); + var unitExcels = GameData.RogueMagicUnitData.Values.Where(x => + x.MagicUnitLevel == level && categories.Contains(x.MagicUnitCategory) && + x.MagicUnitType != RogueMagicMountTypeEnum.Active).ToList(); for (var i = 0; i < amount; i++) { @@ -247,7 +288,8 @@ public class RogueMagicInstance : BaseRogueInstance var action = RogueActions.First().Value; if (action.RogueMagicUnitSelectMenu != null) { - var unitExcel = action.RogueMagicUnitSelectMenu.MagicUnits.Find(x => x.MagicUnitID == selectMagicUnit.MagicUnitId); + var unitExcel = + action.RogueMagicUnitSelectMenu.MagicUnits.Find(x => x.MagicUnitID == selectMagicUnit.MagicUnitId); if (unitExcel != null) await AddMagicUnit(unitExcel); RogueActions.Remove(action.QueuePosition); } @@ -260,7 +302,8 @@ public class RogueMagicInstance : BaseRogueInstance public async ValueTask AddMagicUnit(RogueMagicUnitExcel excel, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select, - RogueCommonActionResultDisplayType display = RogueCommonActionResultDisplayType.None, bool sync = true, bool compose = true) + RogueCommonActionResultDisplayType display = RogueCommonActionResultDisplayType.None, bool sync = true, + bool compose = true) { var unit = new RogueMagicUnitInstance(excel) { @@ -283,10 +326,7 @@ public class RogueMagicInstance : BaseRogueInstance RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select, RogueCommonActionResultDisplayType display = RogueCommonActionResultDisplayType.None, bool sync = true) { - if (!RogueMagicUnits.Remove(uniqueId, out var unit)) - { - return null; - } + if (!RogueMagicUnits.Remove(uniqueId, out var unit)) return null; var res = unit.ToRemoveInfo(source); if (sync) @@ -308,56 +348,59 @@ public class RogueMagicInstance : BaseRogueInstance } foreach (var unitLevelDict in unitMap) + foreach (var unitLevelMap in unitLevelDict.Value) { - foreach (var unitLevelMap in unitLevelDict.Value) + if (unitLevelMap.Key == 3) continue; // max level + if (unitLevelMap.Value.Count < 3) continue; // cannot compose + + // remove + List removeInstances = []; + var addCount = unitLevelMap.Value.Count / 3; + + removeInstances.AddRange(Enumerable.Range(0, addCount * 3).Select(i => unitLevelMap.Value[i])); + + List resList = []; + foreach (var rogueMagicUnitInstance in removeInstances) { - if (unitLevelMap.Key == 3) continue; // max level - if (unitLevelMap.Value.Count < 3) continue; // cannot compose + var res = await RemoveMagicUnit(rogueMagicUnitInstance.UniqueId, + RogueCommonActionResultSourceType.MagicUnitCompose, + sync: false); - // remove - List removeInstances = []; - var addCount = unitLevelMap.Value.Count / 3; - - removeInstances.AddRange(Enumerable.Range(0, addCount * 3).Select(i => unitLevelMap.Value[i])); - - List resList = []; - foreach (var rogueMagicUnitInstance in removeInstances) - { - var res = await RemoveMagicUnit(rogueMagicUnitInstance.UniqueId, RogueCommonActionResultSourceType.MagicUnitCompose, - sync: false); - - if (res != null) resList.Add(res); - } - - // get the dressed scepter - List scepterResList = []; - scepterResList.AddRange(from rogueMagicUnitInstance in removeInstances from scepter in RogueScepters where scepter.Value.DressedUnits.Any(x => x.Value.Remove(rogueMagicUnitInstance)) select scepter.Value.ToDressInfo(RogueCommonActionResultSourceType.MagicUnitCompose)); - - // send packet - await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, scepterResList)); - await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, resList)); - - // add new - var excels = GameData.RogueMagicUnitData.Values.Where(x => - x.MagicUnitID == unitLevelDict.Key && x.MagicUnitLevel == unitLevelMap.Key + 1).ToList(); - - if (excels.Count <= 0) continue; - for (var i = 0; i < addCount; i++) - await AddMagicUnit(excels.RandomElement(), RogueCommonActionResultSourceType.MagicUnitCompose, compose:false); - - // select another - await RollMagicUnit(addCount, unitLevelMap.Key, [excels.RandomElement().MagicUnitCategory]); + if (res != null) resList.Add(res); } + + // get the dressed scepter + List scepterResList = []; + scepterResList.AddRange(from rogueMagicUnitInstance in removeInstances + from scepter in RogueScepters + where scepter.Value.DressedUnits.Any(x => x.Value.Remove(rogueMagicUnitInstance)) + select scepter.Value.ToDressInfo(RogueCommonActionResultSourceType.MagicUnitCompose)); + + // send packet + await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, scepterResList)); + await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, resList)); + + // add new + var excels = GameData.RogueMagicUnitData.Values.Where(x => + x.MagicUnitID == unitLevelDict.Key && x.MagicUnitLevel == unitLevelMap.Key + 1).ToList(); + + if (excels.Count <= 0) continue; + for (var i = 0; i < addCount; i++) + await AddMagicUnit(excels.RandomElement(), RogueCommonActionResultSourceType.MagicUnitCompose, + compose: false); + + // select another + await RollMagicUnit(addCount, unitLevelMap.Key, [excels.RandomElement().MagicUnitCategory]); } } - public async ValueTask AddMagicUnits(List excels, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select, RogueCommonActionResultDisplayType display = RogueCommonActionResultDisplayType.Multi) + public async ValueTask AddMagicUnits(List excels, + RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select, + RogueCommonActionResultDisplayType display = RogueCommonActionResultDisplayType.Multi) { List results = []; foreach (var excel in excels) - { results.Add(await AddMagicUnit(excel, source, RogueCommonActionResultDisplayType.None, false)); - } await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, results, display)); } @@ -368,7 +411,8 @@ public class RogueMagicInstance : BaseRogueInstance public override async ValueTask AddBuff(int buffId, int level = 1, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Dialogue, - RogueCommonActionResultDisplayType displayType = RogueCommonActionResultDisplayType.Single, bool updateMenu = true, + RogueCommonActionResultDisplayType displayType = RogueCommonActionResultDisplayType.Single, + bool updateMenu = true, bool notify = true) { // this mode does not support buff @@ -384,42 +428,6 @@ public class RogueMagicInstance : BaseRogueInstance #endregion - #region Adventure - - public async ValueTask HandleStopWolfGunAdventure(List targetIndex, RogueMagicAdventureInstance instance) - { - if (instance.WolfGunTargets.Count == 0) return; - - var result = (from index in targetIndex - where index >= 0 && index < instance.WolfGunTargets.Count - select instance.WolfGunTargets[index]).ToList(); - - foreach (var target in result) - { - if (target.IsMoney) - { - // money - await GainMoney(target.TargetId, 2); - } - else if (target.IsMiracle) - { - // miracle - await AddMiracle(target.TargetId); - } - else if (target.IsRuanmei) - { - // ruanmei - var unitExcels = GameData.RogueMagicUnitData.Values - .Where(x => x.MagicUnitLevel == 1 && x.MagicUnitType != RogueMagicMountTypeEnum.Active).ToList(); - var toAddExcel = Enumerable.Range(0, 10).Select(unused => unitExcels.RandomElement()).ToList(); - - await AddMagicUnits(toAddExcel, RogueCommonActionResultSourceType.None); - } - } - } - - #endregion - #region Handlers public override void OnBattleStart(BattleInstance battle) @@ -431,6 +439,7 @@ public class RogueMagicInstance : BaseRogueInstance if (excel.LevelList.Count > 0) battle.CustomLevel = excel.LevelList.RandomElement(); } + battle.MagicInfo = new BattleRogueMagicInfo { ModifierContent = new BattleRogueMagicModifierInfo @@ -468,10 +477,8 @@ public class RogueMagicInstance : BaseRogueInstance public override async ValueTask OnBattleEnd(BattleInstance battle, PVEBattleResultCsReq req) { if (battle.BattleEndStatus != BattleEndStatus.BattleEndWin) - { // quit return; - } // extra round calc var usedCnt = req.Stt.RoundCnt; @@ -640,4 +647,4 @@ public class RogueMagicInstance : BaseRogueInstance } #endregion -} +} \ No newline at end of file diff --git a/GameServer/Game/RogueMagic/RogueMagicManager.cs b/GameServer/Game/RogueMagic/RogueMagicManager.cs index 6da3d0cd..2b2bef71 100644 --- a/GameServer/Game/RogueMagic/RogueMagicManager.cs +++ b/GameServer/Game/RogueMagic/RogueMagicManager.cs @@ -1,6 +1,5 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Enums.RogueMagic; -using EggLink.DanhengServer.Enums.TournRogue; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; using EggLink.DanhengServer.Proto; @@ -49,9 +48,7 @@ public class RogueMagicManager(PlayerInstance player) : BasePlayerManager(player var proto = new RogueMagicGetInfo { StoryInfo = ToStoryInfo(), - RogueMagicTalentInfo = ToTalentInfo(), - RogueMagicUnitInfoList = { }, - RogueMagicScepterInfoList = { } + RogueMagicTalentInfo = ToTalentInfo() }; proto.RogueTournAreaInfo.AddRange(ToAreaInfoList()); @@ -76,11 +73,14 @@ public class RogueMagicManager(PlayerInstance player) : BasePlayerManager(player { TalentInfoList = new RogueTalentInfoList { - TalentInfo = { GameData.RogueMagicTalentData.Keys.Select(x => new RogueTalentInfo + TalentInfo = { - TalentId = (uint)x, - Status = RogueTalentStatus.Enable - }) } + GameData.RogueMagicTalentData.Keys.Select(x => new RogueTalentInfo + { + TalentId = (uint)x, + Status = RogueTalentStatus.Enable + }) + } } }; @@ -97,7 +97,7 @@ public class RogueMagicManager(PlayerInstance player) : BasePlayerManager(player public List ToDifficultyInfoList() { return (from difficulty in GameData.RogueMagicDifficultyCompData.Values - select new RogueMagicDifficultyInfo + select new RogueMagicDifficultyInfo { DifficultyId = (uint)difficulty.DifficultyCompID, IsUnlocked = true }).ToList(); } diff --git a/GameServer/Game/RogueMagic/Scene/RogueMagicEntityLoader.cs b/GameServer/Game/RogueMagic/Scene/RogueMagicEntityLoader.cs index f6c34af9..00dacd5a 100644 --- a/GameServer/Game/RogueMagic/Scene/RogueMagicEntityLoader.cs +++ b/GameServer/Game/RogueMagic/Scene/RogueMagicEntityLoader.cs @@ -8,7 +8,6 @@ using EggLink.DanhengServer.GameServer.Game.Rogue.Scene.Entity; using EggLink.DanhengServer.GameServer.Game.RogueTourn.Scene; using EggLink.DanhengServer.GameServer.Game.Scene; using EggLink.DanhengServer.GameServer.Game.Scene.Entity; -using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; namespace EggLink.DanhengServer.GameServer.Game.RogueMagic.Scene; @@ -17,9 +16,9 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) { public List ExistTypes = []; public int FinalRoomBossGroup = 500401; + public int LayerNormalBossGroup1 = 400711; public int LayerNormalBossGroup2 = 500301; - public int LayerNormalBossGroup1 = 400711; public PlayerInstance Player = player; public List RogueDoorPropIds = [1033, 1034, 1035, 1036, 1037, 1000, 1053, 1054, 1055, 1056, 1057]; @@ -105,10 +104,7 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) if (config == null) return null; - if (config.RoomType == RogueMagicRoomTypeEnum.Adventure) - { - return await base.LoadMonster(info, group, sendPacket); - } + if (config.RoomType == RogueMagicRoomTypeEnum.Adventure) return await base.LoadMonster(info, group, sendPacket); List allowedRank = []; @@ -132,10 +128,7 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) { var dict = GameData.RogueMonsterGroupData[FinalRoomBossGroup].RogueMonsterListAndWeight; var random = new RandomList(); - foreach (var i in dict) - { - random.Add(int.Parse(i.Key), i.Value); - } + foreach (var i in dict) random.Add(int.Parse(i.Key), i.Value); rogueMonster = GameData.RogueMonsterData[random.GetRandom()]; } @@ -143,10 +136,7 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) { var dict = GameData.RogueMonsterGroupData[LayerNormalBossGroup2].RogueMonsterListAndWeight; var random = new RandomList(); - foreach (var i in dict) - { - random.Add(int.Parse(i.Key), i.Value); - } + foreach (var i in dict) random.Add(int.Parse(i.Key), i.Value); rogueMonster = GameData.RogueMonsterData[random.GetRandom()]; } @@ -154,10 +144,7 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) { var dict = GameData.RogueMonsterGroupData[LayerNormalBossGroup1].RogueMonsterListAndWeight; var random = new RandomList(); - foreach (var i in dict) - { - random.Add(int.Parse(i.Key), i.Value); - } + foreach (var i in dict) random.Add(int.Parse(i.Key), i.Value); rogueMonster = GameData.RogueMonsterData[random.GetRandom()]; } @@ -199,19 +186,21 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) GameData.MazePropData.TryGetValue(info.PropID, out var propExcel); if (propExcel == null) return null; - if (info.PropID == 1049) return null; // gamble machine + if (info.PropID == 1049) return null; // gamble machine var prop = new RogueProp(Scene, propExcel, group, info); if (RogueDoorPropIds.Contains(prop.PropInfo.PropID)) { - if (magic.CurLevel?.LayerId == magic.Levels.Last().Key && magic.CurLevel?.Rooms.Last().RoomIndex == room.RoomIndex) // last room + if (magic.CurLevel?.LayerId == magic.Levels.Last().Key && + magic.CurLevel?.Rooms.Last().RoomIndex == room.RoomIndex) // last room { // exit - if (prop.InstId != 300002) return null; // not center door + if (prop.InstId != 300002) return null; // not center door prop.CustomPropID = 1053; } else + { do // find next room { RandomList roomTypes = new(); @@ -222,12 +211,13 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) if (room.LevelInstance.Rooms.Last().RoomIndex - 1 == room.RoomIndex) // boss only { - if (prop.InstId != 300002) return null; // not center door + if (prop.InstId != 300002) return null; // not center door nextRoom = RogueMagicRoomTypeEnum.Boss; } - else if (room.LevelInstance.Rooms.Last().RoomIndex - 2 == room.RoomIndex && room.LevelInstance.LevelIndex == 3) // respite only + else if (room.LevelInstance.Rooms.Last().RoomIndex - 2 == room.RoomIndex && + room.LevelInstance.LevelIndex == 3) // respite only { - if (prop.InstId != 300002) return null; // not center door + if (prop.InstId != 300002) return null; // not center door nextRoom = RogueMagicRoomTypeEnum.Reforge; } else @@ -255,6 +245,7 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) break; } while (true); + } await prop.SetState(PropStateEnum.Open); } @@ -266,12 +257,8 @@ public class RogueMagicEntityLoader(SceneInstance scene, PlayerInstance player) }; var workbenchExcel = GameData.RogueTournWorkbenchData.GetValueOrDefault(p.WorkbenchId); if (workbenchExcel != null) - { foreach (var funcExcel in workbenchExcel.Funcs) - { p.WorkbenchFuncs.Add(new RogueWorkbenchFunc(funcExcel)); - } - } prop = p; await prop.SetState(info.State); diff --git a/GameServer/Game/RogueMagic/Scene/RogueMagicRoomInstance.cs b/GameServer/Game/RogueMagic/Scene/RogueMagicRoomInstance.cs index f355f44e..d16e9051 100644 --- a/GameServer/Game/RogueMagic/Scene/RogueMagicRoomInstance.cs +++ b/GameServer/Game/RogueMagic/Scene/RogueMagicRoomInstance.cs @@ -1,7 +1,6 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Custom; using EggLink.DanhengServer.Enums.RogueMagic; -using EggLink.DanhengServer.Enums.TournRogue; using EggLink.DanhengServer.GameServer.Game.RogueMagic.Adventure; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; @@ -32,7 +31,8 @@ public class RogueMagicRoomInstance(int roomIndex, RogueMagicLevelInstance level public void Init(RogueMagicRoomTypeEnum type) { - if (Status == RogueMagicRoomStatus.Processing || Status == RogueMagicRoomStatus.Finish) return; // already initialized + if (Status == RogueMagicRoomStatus.Processing || Status == RogueMagicRoomStatus.Finish) + return; // already initialized RoomType = type; Status = RogueMagicRoomStatus.Processing; @@ -68,7 +68,7 @@ public class RogueMagicRoomInstance(int roomIndex, RogueMagicLevelInstance level groupList.AddRange(Config.DefaultLoadGroup); //if (RoomIndex == 1) // first room - groupList.AddRange(Config.SubMonsterGroup); + groupList.AddRange(Config.SubMonsterGroup); return groupList; } diff --git a/GameServer/Game/RogueMagic/Scepter/RogueScepterInstance.cs b/GameServer/Game/RogueMagic/Scepter/RogueScepterInstance.cs index 0b002f3d..96241756 100644 --- a/GameServer/Game/RogueMagic/Scepter/RogueScepterInstance.cs +++ b/GameServer/Game/RogueMagic/Scepter/RogueScepterInstance.cs @@ -29,31 +29,22 @@ public class RogueScepterInstance(RogueMagicScepterExcel excel) }; foreach (var dressedUnit in DressedUnits) - { - foreach (var unit in dressedUnit.Value) + foreach (var unit in dressedUnit.Value) + proto.ScepterDressInfo.Add(new RogueMagicScepterDressInfo { - proto.ScepterDressInfo.Add(new RogueMagicScepterDressInfo - { - Slot = (uint)dressedUnit.Key, - DressMagicUnitUniqueId = (uint)unit.UniqueId, - Type = (uint)unit.Excel.MagicUnitType - }); - } - } + Slot = (uint)dressedUnit.Key, + DressMagicUnitUniqueId = (uint)unit.UniqueId, + Type = (uint)unit.Excel.MagicUnitType + }); - foreach (var trench in Excel.TrenchCount) - { - proto.TrenchCount.Add((uint)trench.Key, (uint)trench.Value); - } + foreach (var trench in Excel.TrenchCount) proto.TrenchCount.Add((uint)trench.Key, (uint)trench.Value); foreach (var unitInfo in Excel.LockMagicUnit) - { proto.LockedMagicUnitList.Add(new RogueMagicGameUnit { MagicUnitId = (uint)unitInfo.MagicUnitId, Level = (uint)unitInfo.MagicUnitLevel }); - } return proto; } @@ -90,32 +81,23 @@ public class RogueScepterInstance(RogueMagicScepterExcel excel) Level = (uint)Excel.ScepterLevel }; - foreach (var trench in Excel.TrenchCount) - { - proto.TrenchCount.Add((uint)trench.Key, (uint)trench.Value); - } + foreach (var trench in Excel.TrenchCount) proto.TrenchCount.Add((uint)trench.Key, (uint)trench.Value); foreach (var unitInfo in Excel.LockMagicUnit) - { proto.RogueMagicUnitInfoList.Add(new BattleRogueMagicUnit { MagicUnitId = (uint)unitInfo.MagicUnitId, Level = (uint)unitInfo.MagicUnitLevel }); - } foreach (var unitInfo in DressedUnits) - { - foreach (var unit in unitInfo.Value) + foreach (var unit in unitInfo.Value) + proto.RogueMagicUnitInfoList.Add(new BattleRogueMagicUnit { - proto.RogueMagicUnitInfoList.Add(new BattleRogueMagicUnit - { - MagicUnitId = (uint)unit.Excel.MagicUnitID, - Level = (uint)unit.Excel.MagicUnitLevel, - DiceSlotId = (uint)unitInfo.Key - }); - } - } + MagicUnitId = (uint)unit.Excel.MagicUnitID, + Level = (uint)unit.Excel.MagicUnitLevel, + DiceSlotId = (uint)unitInfo.Key + }); return proto; } diff --git a/GameServer/Game/RogueMagic/Scepter/RogueScepterSelectMenu.cs b/GameServer/Game/RogueMagic/Scepter/RogueScepterSelectMenu.cs index 2871a3df..12dc6ae5 100644 --- a/GameServer/Game/RogueMagic/Scepter/RogueScepterSelectMenu.cs +++ b/GameServer/Game/RogueMagic/Scepter/RogueScepterSelectMenu.cs @@ -2,7 +2,6 @@ using EggLink.DanhengServer.GameServer.Game.Rogue; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; -using System; namespace EggLink.DanhengServer.GameServer.Game.RogueMagic.Scepter; @@ -19,16 +18,12 @@ public class RogueScepterSelectMenu(BaseRogueInstance rogue) : BaseRogueSelectMe public override void Roll() { - if (Scepters.Count > 0) return; // already init + if (Scepters.Count > 0) return; // already init // Remove existing scepters if (rogue is RogueMagicInstance magic) - { foreach (var excel in ScepterPool.Clone()) - { if (magic.RogueScepters.Any(x => x.Value.Excel.ScepterID == excel.ScepterID)) ScepterPool.Remove(excel); - } - } var list = new RandomList(); foreach (var magicScepterExcel in ScepterPool) @@ -88,11 +83,14 @@ public class RogueScepterSelectMenu(BaseRogueInstance rogue) : BaseRogueSelectMe { return new RogueMagicScepterSelectInfo { - SelectScepters = { Scepters.Select(x => new RogueMagicScepter + SelectScepters = { - ScepterId = (uint)x.ScepterID, - Level = (uint)x.ScepterLevel - }) } + Scepters.Select(x => new RogueMagicScepter + { + ScepterId = (uint)x.ScepterID, + Level = (uint)x.ScepterLevel + }) + } }; } } \ No newline at end of file diff --git a/GameServer/Game/RogueTourn/RogueTournInstance.cs b/GameServer/Game/RogueTourn/RogueTournInstance.cs index 83947e37..d120fd50 100644 --- a/GameServer/Game/RogueTourn/RogueTournInstance.cs +++ b/GameServer/Game/RogueTourn/RogueTournInstance.cs @@ -9,7 +9,7 @@ using EggLink.DanhengServer.GameServer.Game.Rogue.Buff; using EggLink.DanhengServer.GameServer.Game.Rogue.Event; using EggLink.DanhengServer.GameServer.Game.RogueTourn.Formula; using EggLink.DanhengServer.GameServer.Game.RogueTourn.Scene; -using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueTourn; using EggLink.DanhengServer.Proto; @@ -120,7 +120,6 @@ public class RogueTournInstance : BaseRogueInstance await Player.SendPacket(new PacketRogueTournLevelInfoUpdateScNotify(this, [CurLevel])); } - public async ValueTask QuitRogue() { @@ -129,13 +128,12 @@ public class RogueTournInstance : BaseRogueInstance var currentLineup = Player.LineupManager!.GetCurLineup()!; await Player.SendPacket(new PacketSyncLineupNotify(currentLineup)); - + await Player.EnterMissionScene(1034102, 0, 0, false); - + Player.RogueTournManager!.RogueTournInstance = null; } - #endregion #region Buff & Formula @@ -147,7 +145,8 @@ public class RogueTournInstance : BaseRogueInstance public async ValueTask RollFormula(int amount, List categories) { - var formulaList = GameData.RogueTournFormulaData.Values.Where(x => !RogueFormulas.Contains(x) && categories.Contains(x.FormulaCategory)).ToList(); + var formulaList = GameData.RogueTournFormulaData.Values + .Where(x => !RogueFormulas.Contains(x) && categories.Contains(x.FormulaCategory)).ToList(); for (var i = 0; i < amount; i++) { @@ -222,7 +221,6 @@ public class RogueTournInstance : BaseRogueInstance { // expand formula foreach (var formula in RogueFormulas) - { if (formula.IsExpanded(RogueBuffs.Select(x => x.BuffId).ToList()) && !ExpandedFormulaIdList.Contains(formula.FormulaID)) { @@ -240,15 +238,12 @@ public class RogueTournInstance : BaseRogueInstance formula.ToContractResultProto(RogueCommonActionResultSourceType.Buff, RogueBuffs.Select(x => x.BuffId).ToList()), RogueCommonActionResultDisplayType.Single)); } - } // buff type Dictionary buffTypeDict = []; foreach (var type in RogueBuffs.Select(buff => buff.BuffExcel.RogueBuffType) .Where(type => !buffTypeDict.TryAdd((uint)type, 1))) - { buffTypeDict[(uint)type]++; - } await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, new RogueCommonActionResult { @@ -298,7 +293,7 @@ public class RogueTournInstance : BaseRogueInstance bool updateMenu = true, bool notify = true) { var formula = RogueFormulas.Find(x => x.FormulaID == formulaId); - if (formula == null) return null; // buff not found + if (formula == null) return null; // buff not found RogueFormulas.Remove(formula); var result = formula.ToRemoveResultProto(source, RogueBuffs.Select(x => x.BuffId).ToList()); @@ -393,7 +388,7 @@ public class RogueTournInstance : BaseRogueInstance var buff = RogueBuffs.Find(x => x.BuffId == buffId); if (buff == null) return Retcode.RetRogueSelectBuffNotExist; - if (buff.BuffLevel == 2) return Retcode.RetRogueSelectBuffCertainMismatch; // already enhanced + if (buff.BuffLevel == 2) return Retcode.RetRogueSelectBuffCertainMismatch; // already enhanced var cost = (int)buff.BuffExcel.RogueBuffCategory; if (func.CurNum < cost) return Retcode.RetRogueCoinNotEnough; @@ -417,14 +412,15 @@ public class RogueTournInstance : BaseRogueInstance if (func.CurFreeNum > 0) func.CurFreeNum--; func.CurCost += 30; - await RemoveBuff(buff.BuffId, RogueCommonActionResultSourceType.Reforge, RogueCommonActionResultDisplayType.None); + await RemoveBuff(buff.BuffId, RogueCommonActionResultSourceType.Reforge, + RogueCommonActionResultDisplayType.None); await RollBuff(1, buff.BuffExcel.RogueBuffCategory switch { RogueBuffCategoryEnum.Common => 2000001, RogueBuffCategoryEnum.Rare => 2000002, RogueBuffCategoryEnum.Legendary => 2000003, _ => 2000001 - }, isReforge:true); + }, isReforge: true); return Retcode.RetSucc; } diff --git a/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs b/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs index 87a208b5..a9e12242 100644 --- a/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs +++ b/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs @@ -158,7 +158,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) GameData.MazePropData.TryGetValue(info.PropID, out var propExcel); if (propExcel == null) return null; - if (info.PropID == 1049) return null; // gamble machine + if (info.PropID == 1049) return null; // gamble machine var prop = new RogueProp(Scene, propExcel, group, info); @@ -178,12 +178,13 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) if (room.LevelInstance.Rooms.Last().RoomIndex - 1 == room.RoomIndex) // boss only { - if (prop.InstId != 300002) return null; // not center door + if (prop.InstId != 300002) return null; // not center door nextRoom = RogueTournRoomTypeEnum.Boss; } - else if (room.LevelInstance.Rooms.Last().RoomIndex - 2 == room.RoomIndex && room.LevelInstance.LevelIndex == 3) // respite only + else if (room.LevelInstance.Rooms.Last().RoomIndex - 2 == room.RoomIndex && + room.LevelInstance.LevelIndex == 3) // respite only { - if (prop.InstId != 300002) return null; // not center door + if (prop.InstId != 300002) return null; // not center door nextRoom = RogueTournRoomTypeEnum.Respite; } else @@ -223,12 +224,8 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) }; var workbenchExcel = GameData.RogueTournWorkbenchData.GetValueOrDefault(p.WorkbenchId); if (workbenchExcel != null) - { foreach (var funcExcel in workbenchExcel.Funcs) - { p.WorkbenchFuncs.Add(new RogueWorkbenchFunc(funcExcel)); - } - } prop = p; await prop.SetState(info.State); diff --git a/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs b/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs index 6cc8c19d..c58a5364 100644 --- a/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs +++ b/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs @@ -28,7 +28,8 @@ public class RogueTournRoomInstance(int roomIndex, RogueTournLevelInstance level public void Init(RogueTournRoomTypeEnum type) { - if (Status == RogueTournRoomStatus.Processing || Status == RogueTournRoomStatus.Finish) return; // already initialized + if (Status == RogueTournRoomStatus.Processing || Status == RogueTournRoomStatus.Finish) + return; // already initialized RoomType = type; Status = RogueTournRoomStatus.Processing; @@ -56,7 +57,7 @@ public class RogueTournRoomInstance(int roomIndex, RogueTournLevelInstance level groupList.AddRange(Config.DefaultLoadGroup); //if (RoomIndex == 1) // first room - groupList.AddRange(Config.SubMonsterGroup); + groupList.AddRange(Config.SubMonsterGroup); return groupList; } diff --git a/GameServer/Game/RogueTourn/Scene/RogueWorkbenchProp.cs b/GameServer/Game/RogueTourn/Scene/RogueWorkbenchProp.cs index 62ff44e3..f844ebdd 100644 --- a/GameServer/Game/RogueTourn/Scene/RogueWorkbenchProp.cs +++ b/GameServer/Game/RogueTourn/Scene/RogueWorkbenchProp.cs @@ -40,13 +40,15 @@ public class RogueWorkbenchFunc(RogueTournWorkbenchFuncExcel excel) { public int FuncId { get; set; } = excel.FuncID; public RogueTournWorkbenchFuncExcel Excel { get; set; } = excel; + public int CurNum { get; set; } = excel.FuncType switch { - RogueTournWorkbenchFuncTypeEnum.BuffReforge => -1, // infinite + RogueTournWorkbenchFuncTypeEnum.BuffReforge => -1, // infinite RogueTournWorkbenchFuncTypeEnum.FormulaReforge => 5, RogueTournWorkbenchFuncTypeEnum.BuffEnhance => 5, _ => 0 }; + public int MaxNum { get; set; } = 5; public int CurCost { get; set; } = excel.FuncType switch @@ -85,9 +87,9 @@ public class RogueWorkbenchFunc(RogueTournWorkbenchFuncExcel excel) MaxNum = (uint)MaxNum, BuffEnhanceCostMap = { - {1, 1}, - {2, 2}, - {3, 3} + { 1, 1 }, + { 2, 2 }, + { 3, 3 } } }; break; @@ -96,14 +98,17 @@ public class RogueWorkbenchFunc(RogueTournWorkbenchFuncExcel excel) { CostData = new ItemCostData { - ItemList = { new ItemCost + ItemList = { - PileItem = new PileItem + new ItemCost { - ItemId = 31, - ItemNum = (uint)CurCost + PileItem = new PileItem + { + ItemId = 31, + ItemNum = (uint)CurCost + } } - } } + } }, CanFreeReforge = CurFreeNum > 0, FreeReforgeNum = (uint)CurFreeNum, @@ -116,14 +121,17 @@ public class RogueWorkbenchFunc(RogueTournWorkbenchFuncExcel excel) { CostData = new ItemCostData { - ItemList = { new ItemCost + ItemList = { - PileItem = new PileItem + new ItemCost { - ItemId = 31, - ItemNum = (uint)CurCost + PileItem = new PileItem + { + ItemId = 31, + ItemNum = (uint)CurCost + } } - } } + } }, CanFreeReforge = CurFreeNum > 0, FreeReforgeNum = (uint)CurFreeNum, diff --git a/GameServer/Game/Scene/Entity/EntityMonster.cs b/GameServer/Game/Scene/Entity/EntityMonster.cs index aa2bb3bf..149135f3 100644 --- a/GameServer/Game/Scene/Entity/EntityMonster.cs +++ b/GameServer/Game/Scene/Entity/EntityMonster.cs @@ -32,11 +32,11 @@ public class EntityMonster( public int EventID { get; set; } = info.EventID; public int CustomStageID { get; set; } = 0; - public int EntityID { get; set; } = 0; - public int GroupID { get; set; } = GroupID; public int RogueMonsterId { get; set; } = 0; public int CustomLevel { get; set; } = 0; + public int EntityID { get; set; } = 0; + public int GroupID { get; set; } = GroupID; public async ValueTask AddBuff(SceneBuff buff) { diff --git a/GameServer/Server/Connection.cs b/GameServer/Server/Connection.cs index 8f01a158..ecd24d18 100644 --- a/GameServer/Server/Connection.cs +++ b/GameServer/Server/Connection.cs @@ -195,6 +195,7 @@ public class Connection(KcpConversation conversation, IPEndPoint remote) : Danhe packet.SetData(rsp); await SendPacket(packet); } + return; } diff --git a/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmFinishLevelCsReq.cs b/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmFinishLevelCsReq.cs index 2daa3f60..258b7015 100644 --- a/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmFinishLevelCsReq.cs +++ b/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmFinishLevelCsReq.cs @@ -8,7 +8,7 @@ public class HandlerMusicRhythmFinishLevelCsReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - int curLevel = connection.Player!.Data.CurMusicLevel; + var curLevel = connection.Player!.Data.CurMusicLevel; await connection.SendPacket(new PacketMusicRhythmFinishLevelScRsp((uint)curLevel)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmStartLevelCsReq.cs b/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmStartLevelCsReq.cs index 4dd0fcd6..0e5974c3 100644 --- a/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmStartLevelCsReq.cs +++ b/GameServer/Server/Packet/Recv/Music/HandlerMusicRhythmStartLevelCsReq.cs @@ -10,7 +10,7 @@ public class HandlerMusicRhythmStartLevelCsReq : Handler public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { var req = MusicRhythmStartLevelCsReq.Parser.ParseFrom(data); - uint curLevel = req.LevelId; + var curLevel = req.LevelId; connection.Player!.Data.CurMusicLevel = (int)curLevel; diff --git a/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs b/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs index 1025bffe..41b9d4a4 100644 --- a/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs +++ b/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs @@ -5,16 +5,15 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Pet; [Opcode(CmdIds.SummonPetCsReq)] -public class HandlerSummonPetCsReq : Handler +public class HandlerSummonPetCsReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { var req = SummonPetCsReq.Parser.ParseFrom(data); - int curPetId = connection.Player!.Data.Pet; - if (curPetId != req.SummonedPetId && curPetId != 0) { + var curPetId = connection.Player!.Data.Pet; + if (curPetId != req.SummonedPetId && curPetId != 0) await connection.SendPacket(new PacketCurPetChangedScNotify(req.SummonedPetId)); - } connection.Player!.Data.Pet = (int)req.SummonedPetId; diff --git a/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs b/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs index 39cc817c..d670759f 100644 --- a/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs +++ b/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs @@ -13,7 +13,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Player; [Opcode(CmdIds.PlayerGetTokenCsReq)] public class HandlerPlayerGetTokenCsReq : Handler { - Logger logger = new Logger("GameServer"); + private readonly Logger logger = new("GameServer"); + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { var req = PlayerGetTokenCsReq.Parser.ParseFrom(data); @@ -51,7 +52,7 @@ public class HandlerPlayerGetTokenCsReq : Handler if (ConfigManager.Config.GameServer.UsePacketEncryption) { connection.XorKey = Crypto.GenerateXorKey(connection.ClientSecretKeySeed); - logger.Info($"{connection.RemoteEndPoint.ToString()} key exchange successful"); + logger.Info($"{connection.RemoteEndPoint} key exchange successful"); } } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/RogueCommon/HandlerHandleRogueCommonPendingActionCsReq.cs b/GameServer/Server/Packet/Recv/RogueCommon/HandlerHandleRogueCommonPendingActionCsReq.cs index 2909e4b9..38a65189 100644 --- a/GameServer/Server/Packet/Recv/RogueCommon/HandlerHandleRogueCommonPendingActionCsReq.cs +++ b/GameServer/Server/Packet/Recv/RogueCommon/HandlerHandleRogueCommonPendingActionCsReq.cs @@ -15,18 +15,23 @@ public class HandlerHandleRogueCommonPendingActionCsReq : Handler var rogue = connection.Player!.RogueManager?.GetRogueInstance(); if (rogue == null) return; - if (req.BuffSelectResult != null) await rogue.HandleBuffSelect((int)req.BuffSelectResult.BuffSelectId, (int)req.QueueLocation); + if (req.BuffSelectResult != null) + await rogue.HandleBuffSelect((int)req.BuffSelectResult.BuffSelectId, (int)req.QueueLocation); - if (req.BuffReforgeSelectResult != null) await rogue.HandleBuffReforgeSelect((int)req.BuffReforgeSelectResult.BuffSelectId, (int)req.QueueLocation); + if (req.BuffReforgeSelectResult != null) + await rogue.HandleBuffReforgeSelect((int)req.BuffReforgeSelectResult.BuffSelectId, (int)req.QueueLocation); if (req.BuffRerollSelectResult != null) await rogue.HandleRerollBuff((int)req.QueueLocation); - if (req.BonusSelectResult != null) await rogue.HandleBonusSelect((int)req.BonusSelectResult.BonusId, (int)req.QueueLocation); + if (req.BonusSelectResult != null) + await rogue.HandleBonusSelect((int)req.BonusSelectResult.BonusId, (int)req.QueueLocation); - if (req.MiracleSelectResult != null) await rogue.HandleMiracleSelect(req.MiracleSelectResult.MiracleSelectId, (int)req.QueueLocation); + if (req.MiracleSelectResult != null) + await rogue.HandleMiracleSelect(req.MiracleSelectResult.MiracleSelectId, (int)req.QueueLocation); if (req.RogueTournFormulaResult != null && rogue is RogueTournInstance tournInstance) - await tournInstance.HandleFormulaSelect((int)req.RogueTournFormulaResult.TournFormulaId, (int)req.QueueLocation); + await tournInstance.HandleFormulaSelect((int)req.RogueTournFormulaResult.TournFormulaId, + (int)req.QueueLocation); if (req.MagicUnitSelectResult != null && rogue is RogueMagicInstance magic) await magic.HandleMagicUnitSelect(req.MagicUnitSelectResult.SelectMagicUnit, (int)req.QueueLocation); diff --git a/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchGetInfoCsReq.cs b/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchGetInfoCsReq.cs index 7b284a0c..d841357c 100644 --- a/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchGetInfoCsReq.cs +++ b/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchGetInfoCsReq.cs @@ -21,6 +21,7 @@ public class HandlerRogueWorkbenchGetInfoCsReq : Handler await connection.SendPacket(new PacketRogueWorkbenchGetInfoScRsp(Retcode.RetSceneEntityNotExist, null)); return; } + await connection.SendPacket(new PacketRogueWorkbenchGetInfoScRsp(Retcode.RetSucc, prop)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchHandleFuncCsReq.cs b/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchHandleFuncCsReq.cs index cf4f3b2f..08f4c96d 100644 --- a/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchHandleFuncCsReq.cs +++ b/GameServer/Server/Packet/Recv/RogueCommon/HandlerRogueWorkbenchHandleFuncCsReq.cs @@ -18,26 +18,30 @@ public class HandlerRogueWorkbenchHandleFuncCsReq : Handler player.SceneInstance?.Entities.TryGetValue((int)req.PropEntityId, out entity); if (entity is not RogueWorkbenchProp prop) { - await connection.SendPacket(new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetSceneEntityNotExist, req.WorkbenchFuncId, null)); + await connection.SendPacket(new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetSceneEntityNotExist, + req.WorkbenchFuncId, null)); return; } var func = prop.WorkbenchFuncs.Find(x => x.FuncId == req.WorkbenchFuncId); if (func == null) { - await connection.SendPacket(new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetFail, req.WorkbenchFuncId, null)); + await connection.SendPacket( + new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetFail, req.WorkbenchFuncId, null)); return; } var instance = player.RogueTournManager?.RogueTournInstance; if (instance == null) { - await connection.SendPacket(new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetTournRogueStatusMismatch, req.WorkbenchFuncId, null)); + await connection.SendPacket(new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetTournRogueStatusMismatch, + req.WorkbenchFuncId, null)); return; } await instance.HandleFunc(func, req.WorkbenchContent); - await connection.SendPacket(new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetSucc, req.WorkbenchFuncId, func)); + await connection.SendPacket( + new PacketRogueWorkbenchHandleFuncScRsp(Retcode.RetSucc, req.WorkbenchFuncId, func)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs index 27aefa60..c2d4a40a 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs @@ -10,9 +10,9 @@ public class HandlerEnterSceneCsReq : Handler public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { var req = EnterSceneCsReq.Parser.ParseFrom(data); - var overMapTp = await connection.Player!.EnterScene((int)req.EntryId, (int)req.TeleportId, true, - (int)req.GameStoryLineId, req.IsCloseMap); + var overMapTp = await connection.Player!.EnterScene((int)req.EntryId, (int)req.TeleportId, true, + (int)req.GameStoryLineId, req.IsCloseMap); - await connection.SendPacket(new PacketEnterSceneScRsp(overMapTp, req.IsCloseMap, (int)req.GameStoryLineId)); + await connection.SendPacket(new PacketEnterSceneScRsp(overMapTp, req.IsCloseMap, (int)req.GameStoryLineId)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmDataScRsp.cs b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmDataScRsp.cs index 1d22e6cd..a08dc078 100644 --- a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmDataScRsp.cs +++ b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmDataScRsp.cs @@ -14,38 +14,25 @@ public class PacketMusicRhythmDataScRsp : BasePacket }; foreach (var level in GameData.MusicRhythmLevelData.Values) - { proto.MusicLevel.Add(new MusicRhythmLevel { LevelId = (uint)level.GetId(), IsFullCombo = true, UnlockLevel = 3 }); - } foreach (var group in GameData.MusicRhythmGroupData.Values) - { proto.MusicGroup.Add(new MusicRhythmGroup { MusicGroupId = (uint)group.GetId(), MusicGroupPhase = (uint)group.Phase }); - } - foreach (var song in GameData.MusicRhythmSongData.Values) - { - proto.UnlockSongList.Add((uint)song.GetId()); - } + foreach (var song in GameData.MusicRhythmSongData.Values) proto.UnlockSongList.Add((uint)song.GetId()); - foreach (var track in GameData.MusicRhythmTrackData.Values) - { - proto.UnlockTrackList.Add((uint)track.GetId()); - } + foreach (var track in GameData.MusicRhythmTrackData.Values) proto.UnlockTrackList.Add((uint)track.GetId()); - foreach (var phase in GameData.MusicRhythmPhaseData.Values) - { - proto.UnlockPhaseList.Add((uint)phase.GetId()); - } + foreach (var phase in GameData.MusicRhythmPhaseData.Values) proto.UnlockPhaseList.Add((uint)phase.GetId()); SetData(proto); } diff --git a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmFinishLevelScRsp.cs b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmFinishLevelScRsp.cs index de454d16..ed34d84d 100644 --- a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmFinishLevelScRsp.cs +++ b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmFinishLevelScRsp.cs @@ -9,7 +9,7 @@ public class PacketMusicRhythmFinishLevelScRsp : BasePacket { var proto = new MusicRhythmFinishLevelScRsp { - LevelId = curLevel, + LevelId = curLevel }; SetData(proto); diff --git a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmStartLevelScRsp.cs b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmStartLevelScRsp.cs index 70d7dc2b..4346e227 100644 --- a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmStartLevelScRsp.cs +++ b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmStartLevelScRsp.cs @@ -9,7 +9,7 @@ public class PacketMusicRhythmStartLevelScRsp : BasePacket { var proto = new MusicRhythmStartLevelScRsp { - LevelId = levelId, + LevelId = levelId }; SetData(proto); diff --git a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongNotify.cs b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongNotify.cs index 6e7826cc..4cb74ab6 100644 --- a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongNotify.cs +++ b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongNotify.cs @@ -10,10 +10,7 @@ public class PacketMusicRhythmUnlockSongNotify : BasePacket { var proto = new MusicRhythmUnlockSongNotify(); - foreach (var song in GameData.MusicRhythmSongData.Values) - { - proto.MusicUnlockList.Add((uint)song.GetId()); - } + foreach (var song in GameData.MusicRhythmSongData.Values) proto.MusicUnlockList.Add((uint)song.GetId()); SetData(proto); } diff --git a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongSfxScNotify.cs b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongSfxScNotify.cs index 036951b2..cbfa83f2 100644 --- a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongSfxScNotify.cs +++ b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockSongSfxScNotify.cs @@ -10,10 +10,7 @@ public class PacketMusicRhythmUnlockSongSfxScNotify : BasePacket { var proto = new MusicRhythmUnlockSongSfxScNotify(); - foreach (var sfx in GameData.MusicRhythmSoundEffectData.Values) - { - proto.MusicUnlockList.Add((uint)sfx.GetId()); - } + foreach (var sfx in GameData.MusicRhythmSoundEffectData.Values) proto.MusicUnlockList.Add((uint)sfx.GetId()); SetData(proto); } diff --git a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockTrackScNotify.cs b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockTrackScNotify.cs index 6785fbf4..f15cc117 100644 --- a/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockTrackScNotify.cs +++ b/GameServer/Server/Packet/Send/Music/PacketMusicRhythmUnlockTrackScNotify.cs @@ -10,10 +10,7 @@ public class PacketMusicRhythmUnlockTrackScNotify : BasePacket { var proto = new MusicRhythmUnlockTrackScNotify(); - foreach (var sfx in GameData.MusicRhythmTrackData.Values) - { - proto.TrackUnlockList.Add((uint)sfx.GetId()); - } + foreach (var sfx in GameData.MusicRhythmTrackData.Values) proto.TrackUnlockList.Add((uint)sfx.GetId()); SetData(proto); } diff --git a/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs b/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs index dc118f09..d90fa0db 100644 --- a/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs +++ b/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs @@ -7,10 +7,9 @@ public class PacketCurPetChangedScNotify : BasePacket { public PacketCurPetChangedScNotify(uint newPetId) : base(CmdIds.CurPetChangedScNotify) { - var proto = new CurPetChangedScNotify { - CurPetId = newPetId, + CurPetId = newPetId }; SetData(proto); diff --git a/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs b/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs index ae8663fd..6dae5350 100644 --- a/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs +++ b/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs @@ -9,17 +9,12 @@ public class PacketGetPetDataScRsp : BasePacket { public PacketGetPetDataScRsp(PlayerInstance player) : base(CmdIds.GetPetDataScRsp) { - var proto = new GetPetDataScRsp { - CurPetId = (uint)player.Data.Pet, + CurPetId = (uint)player.Data.Pet }; - foreach (var pet in GameData.PetData.Values) - { - - proto.PetIdList.Add((uint)pet.PetID); - } + foreach (var pet in GameData.PetData.Values) proto.PetIdList.Add((uint)pet.PetID); SetData(proto); } diff --git a/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs b/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs index 82b9aea2..33deae26 100644 --- a/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs +++ b/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs @@ -7,7 +7,6 @@ public class PacketRecallPetScRsp : BasePacket { public PacketRecallPetScRsp(uint newPetId) : base(CmdIds.RecallPetScRsp) { - var proto = new RecallPetScRsp { CurPetId = newPetId, diff --git a/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs b/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs index 921d00b4..a39e4dd3 100644 --- a/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs +++ b/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs @@ -7,7 +7,6 @@ public class PacketSummonPetScRsp : BasePacket { public PacketSummonPetScRsp(int curPetId, uint newPetId) : base(CmdIds.SummonPetScRsp) { - var proto = new SummonPetScRsp { CurPetId = (uint)curPetId, diff --git a/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs b/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs index 2f7dc381..6120f8c9 100644 --- a/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs +++ b/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs @@ -17,10 +17,10 @@ public class PacketPlayerGetTokenScRsp : BasePacket if (ConfigManager.Config.GameServer.UsePacketEncryption) { - MT19937 tempRandom = new MT19937((ulong)DateTimeOffset.Now.ToUnixTimeSeconds()); + var tempRandom = new MT19937((ulong)DateTimeOffset.Now.ToUnixTimeSeconds()); rsp.SecretKeySeed = connection.ClientSecretKeySeed = tempRandom.NextUInt64(); } - + SetData(rsp); } diff --git a/GameServer/Server/Packet/Send/RogueCommon/PacketGetRogueAdventureRoomInfoScRsp.cs b/GameServer/Server/Packet/Send/RogueCommon/PacketGetRogueAdventureRoomInfoScRsp.cs index 30391722..a9cda9ce 100644 --- a/GameServer/Server/Packet/Send/RogueCommon/PacketGetRogueAdventureRoomInfoScRsp.cs +++ b/GameServer/Server/Packet/Send/RogueCommon/PacketGetRogueAdventureRoomInfoScRsp.cs @@ -6,7 +6,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; public class PacketGetRogueAdventureRoomInfoScRsp : BasePacket { - public PacketGetRogueAdventureRoomInfoScRsp(RogueMagicAdventureInstance instance) : base(CmdIds.GetRogueAdventureRoomInfoScRsp) + public PacketGetRogueAdventureRoomInfoScRsp(RogueMagicAdventureInstance instance) : base( + CmdIds.GetRogueAdventureRoomInfoScRsp) { var proto = new GetRogueAdventureRoomInfoScRsp { diff --git a/GameServer/Server/Packet/Send/RogueCommon/PacketPrepareRogueAdventureRoomScRsp.cs b/GameServer/Server/Packet/Send/RogueCommon/PacketPrepareRogueAdventureRoomScRsp.cs index 734bf373..6237d0b7 100644 --- a/GameServer/Server/Packet/Send/RogueCommon/PacketPrepareRogueAdventureRoomScRsp.cs +++ b/GameServer/Server/Packet/Send/RogueCommon/PacketPrepareRogueAdventureRoomScRsp.cs @@ -6,7 +6,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; public class PacketPrepareRogueAdventureRoomScRsp : BasePacket { - public PacketPrepareRogueAdventureRoomScRsp(RogueMagicAdventureInstance instance) : base(CmdIds.PrepareRogueAdventureRoomScRsp) + public PacketPrepareRogueAdventureRoomScRsp(RogueMagicAdventureInstance instance) : base( + CmdIds.PrepareRogueAdventureRoomScRsp) { var proto = new PrepareRogueAdventureRoomScRsp { diff --git a/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchGetInfoScRsp.cs b/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchGetInfoScRsp.cs index b0efd978..c4394f6b 100644 --- a/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchGetInfoScRsp.cs +++ b/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchGetInfoScRsp.cs @@ -6,7 +6,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; public class PacketRogueWorkbenchGetInfoScRsp : BasePacket { - public PacketRogueWorkbenchGetInfoScRsp(Retcode ret, RogueWorkbenchProp? prop) : base(CmdIds.RogueWorkbenchGetInfoScRsp) + public PacketRogueWorkbenchGetInfoScRsp(Retcode ret, RogueWorkbenchProp? prop) : base( + CmdIds.RogueWorkbenchGetInfoScRsp) { var proto = new RogueWorkbenchGetInfoScRsp { @@ -14,12 +15,8 @@ public class PacketRogueWorkbenchGetInfoScRsp : BasePacket }; if (prop != null) - { foreach (var rogueWorkbenchFunc in prop.WorkbenchFuncs) - { proto.FuncInfoMap.Add((uint)rogueWorkbenchFunc.FuncId, rogueWorkbenchFunc.ToProto()); - } - } SetData(proto); } diff --git a/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchHandleFuncScRsp.cs b/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchHandleFuncScRsp.cs index 7a6e3c5d..0f4268d6 100644 --- a/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchHandleFuncScRsp.cs +++ b/GameServer/Server/Packet/Send/RogueCommon/PacketRogueWorkbenchHandleFuncScRsp.cs @@ -6,7 +6,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; public class PacketRogueWorkbenchHandleFuncScRsp : BasePacket { - public PacketRogueWorkbenchHandleFuncScRsp(Retcode retcode, uint funcId, RogueWorkbenchFunc? func) : base(CmdIds.RogueWorkbenchHandleFuncScRsp) + public PacketRogueWorkbenchHandleFuncScRsp(Retcode retcode, uint funcId, RogueWorkbenchFunc? func) : base( + CmdIds.RogueWorkbenchHandleFuncScRsp) { var proto = new RogueWorkbenchHandleFuncScRsp { @@ -14,10 +15,7 @@ public class PacketRogueWorkbenchHandleFuncScRsp : BasePacket WorkbenchFuncId = funcId }; - if (func != null) - { - proto.TargetFuncInfo = func.ToProto(); - } + if (func != null) proto.TargetFuncInfo = func.ToProto(); SetData(proto); } diff --git a/GameServer/Server/Packet/Send/RogueMagic/PacketRogueMagicLevelInfoUpdateScNotify.cs b/GameServer/Server/Packet/Send/RogueMagic/PacketRogueMagicLevelInfoUpdateScNotify.cs index d3c897bc..4000e22e 100644 --- a/GameServer/Server/Packet/Send/RogueMagic/PacketRogueMagicLevelInfoUpdateScNotify.cs +++ b/GameServer/Server/Packet/Send/RogueMagic/PacketRogueMagicLevelInfoUpdateScNotify.cs @@ -7,7 +7,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueMagic; public class PacketRogueMagicLevelInfoUpdateScNotify : BasePacket { - public PacketRogueMagicLevelInfoUpdateScNotify(RogueMagicInstance instance, List levels, List? updateRoomIndexList = null) : base(CmdIds.RogueMagicLevelInfoUpdateScNotify) + public PacketRogueMagicLevelInfoUpdateScNotify(RogueMagicInstance instance, List levels, + List? updateRoomIndexList = null) : base(CmdIds.RogueMagicLevelInfoUpdateScNotify) { var proto = new RogueMagicLevelInfoUpdateScNotify { diff --git a/GameServer/Server/Packet/Send/RogueModifier/PacketRogueModifierStageStartNotify.cs b/GameServer/Server/Packet/Send/RogueModifier/PacketRogueModifierStageStartNotify.cs index 37388ea5..b8e20357 100644 --- a/GameServer/Server/Packet/Send/RogueModifier/PacketRogueModifierStageStartNotify.cs +++ b/GameServer/Server/Packet/Send/RogueModifier/PacketRogueModifierStageStartNotify.cs @@ -5,7 +5,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier; public class PacketRogueModifierStageStartNotify : BasePacket { - public PacketRogueModifierStageStartNotify(RogueModifierSourceType source) : base(CmdIds.RogueModifierStageStartNotify) + public PacketRogueModifierStageStartNotify(RogueModifierSourceType source) : base( + CmdIds.RogueModifierStageStartNotify) { var proto = new RogueModifierStageStartNotify { diff --git a/GameServer/Server/Packet/Send/Scene/PacketEnterSceneScRsp.cs b/GameServer/Server/Packet/Send/Scene/PacketEnterSceneScRsp.cs index dd4af825..5bd0e132 100644 --- a/GameServer/Server/Packet/Send/Scene/PacketEnterSceneScRsp.cs +++ b/GameServer/Server/Packet/Send/Scene/PacketEnterSceneScRsp.cs @@ -17,6 +17,7 @@ public class PacketEnterSceneScRsp : BasePacket SetData(proto); } + public PacketEnterSceneScRsp(Retcode retcode) : base( CmdIds.EnterSceneScRsp) { diff --git a/GameServer/Server/Packet/Send/Scene/PacketSceneCastSkillScRsp.cs b/GameServer/Server/Packet/Send/Scene/PacketSceneCastSkillScRsp.cs index 409d9067..46b8b6f4 100644 --- a/GameServer/Server/Packet/Send/Scene/PacketSceneCastSkillScRsp.cs +++ b/GameServer/Server/Packet/Send/Scene/PacketSceneCastSkillScRsp.cs @@ -6,22 +6,21 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; public class PacketSceneCastSkillScRsp : BasePacket { - public PacketSceneCastSkillScRsp(uint castEntityId, List hitMonsters) : base(CmdIds.SceneCastSkillScRsp) + public PacketSceneCastSkillScRsp(uint castEntityId, List hitMonsters) : base( + CmdIds.SceneCastSkillScRsp) { var proto = new SceneCastSkillScRsp { CastEntityId = castEntityId }; - foreach (var hitMonster in hitMonsters) - { - proto.MonsterBattleInfo.Add(hitMonster.ToProto()); - } + foreach (var hitMonster in hitMonsters) proto.MonsterBattleInfo.Add(hitMonster.ToProto()); SetData(proto); } - public PacketSceneCastSkillScRsp(uint castEntityId, BattleInstance battle, List hitMonsters) : base(CmdIds.SceneCastSkillScRsp) + public PacketSceneCastSkillScRsp(uint castEntityId, BattleInstance battle, List hitMonsters) : + base(CmdIds.SceneCastSkillScRsp) { var proto = new SceneCastSkillScRsp { @@ -29,10 +28,7 @@ public class PacketSceneCastSkillScRsp : BasePacket BattleInfo = battle.ToProto() }; - foreach (var hitMonster in hitMonsters) - { - proto.MonsterBattleInfo.Add(hitMonster.ToProto()); - } + foreach (var hitMonster in hitMonsters) proto.MonsterBattleInfo.Add(hitMonster.ToProto()); SetData(proto); } diff --git a/Program/Program/EntryPoint.cs b/Program/Program/EntryPoint.cs index 2f37473a..c82a7510 100644 --- a/Program/Program/EntryPoint.cs +++ b/Program/Program/EntryPoint.cs @@ -113,10 +113,7 @@ public class EntryPoint if (ConfigManager.Config.GameServer.UsePacketEncryption) { Crypto.ClientSecretKey = Crypto.InitEc2b(); - if (Crypto.ClientSecretKey == null) - { - ConfigManager.Config.GameServer.UsePacketEncryption = false; - } + if (Crypto.ClientSecretKey == null) ConfigManager.Config.GameServer.UsePacketEncryption = false; } Logger.Warn(I18NManager.Translate("Server.ServerInfo.WaitForAllDone"));