Decompiled source of OutwardArchipelago v0.1.0

plugins/Archipelago.MultiClient.Net.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Numerics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Archipelago.MultiClient.Net.Colors;
using Archipelago.MultiClient.Net.ConcurrentCollection;
using Archipelago.MultiClient.Net.Converters;
using Archipelago.MultiClient.Net.DataPackage;
using Archipelago.MultiClient.Net.Enums;
using Archipelago.MultiClient.Net.Exceptions;
using Archipelago.MultiClient.Net.Extensions;
using Archipelago.MultiClient.Net.Helpers;
using Archipelago.MultiClient.Net.MessageLog.Messages;
using Archipelago.MultiClient.Net.MessageLog.Parts;
using Archipelago.MultiClient.Net.Models;
using Archipelago.MultiClient.Net.Packets;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: ComVisible(false)]
[assembly: Guid("35a803ad-85ed-42e9-b1e3-c6b72096f0c1")]
[assembly: InternalsVisibleTo("Archipelago.MultiClient.Net.Tests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
[assembly: AssemblyCompany("Jarno Westhof, Hussein Farran, Zach Parks")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyDescription("A client library for use with .NET based prog-langs for interfacing with Archipelago hosts.")]
[assembly: AssemblyFileVersion("6.7.0.0")]
[assembly: AssemblyInformationalVersion("6.7.0+c807746b6f1774cf1afe12af819acb078b55a333")]
[assembly: AssemblyProduct("Archipelago.MultiClient.Net")]
[assembly: AssemblyTitle("Archipelago.MultiClient.Net")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArchipelagoMW/Archipelago.MultiClient.Net")]
[assembly: AssemblyVersion("6.7.0.0")]
internal interface IConcurrentHashSet<T>
{
	bool TryAdd(T item);

	bool Contains(T item);

	void UnionWith(T[] otherSet);

	T[] ToArray();

	ReadOnlyCollection<T> AsToReadOnlyCollection();

	ReadOnlyCollection<T> AsToReadOnlyCollectionExcept(IConcurrentHashSet<T> otherSet);
}
public class AttemptingStringEnumConverter : StringEnumConverter
{
	public AttemptingStringEnumConverter()
	{
	}

	public AttemptingStringEnumConverter(Type namingStrategyType)
		: base(namingStrategyType)
	{
	}

	public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
	{
		try
		{
			return ((StringEnumConverter)this).ReadJson(reader, objectType, existingValue, serializer);
		}
		catch (JsonSerializationException)
		{
			return objectType.IsValueType ? Activator.CreateInstance(objectType) : null;
		}
	}
}
namespace Archipelago.MultiClient.Net
{
	[Serializable]
	public abstract class ArchipelagoPacketBase
	{
		[JsonIgnore]
		internal JObject jobject;

		[JsonProperty("cmd")]
		[JsonConverter(typeof(StringEnumConverter))]
		public abstract ArchipelagoPacketType PacketType { get; }

		public JObject ToJObject()
		{
			return jobject;
		}
	}
	public interface IArchipelagoSession : IArchipelagoSessionActions
	{
		IArchipelagoSocketHelper Socket { get; }

		IReceivedItemsHelper Items { get; }

		ILocationCheckHelper Locations { get; }

		IPlayerHelper Players { get; }

		IDataStorageHelper DataStorage { get; }

		IConnectionInfoProvider ConnectionInfo { get; }

		IRoomStateHelper RoomState { get; }

		IMessageLogHelper MessageLog { get; }

		IHintsHelper Hints { get; }

		Task<RoomInfoPacket> ConnectAsync();

		Task<LoginResult> LoginAsync(string game, string name, ItemsHandlingFlags itemsHandlingFlags, Version version = null, string[] tags = null, string uuid = null, string password = null, bool requestSlotData = true);

		LoginResult TryConnectAndLogin(string game, string name, ItemsHandlingFlags itemsHandlingFlags, Version version = null, string[] tags = null, string uuid = null, string password = null, bool requestSlotData = true);
	}
	public class ArchipelagoSession : IArchipelagoSession, IArchipelagoSessionActions
	{
		private const int ArchipelagoConnectionTimeoutInSeconds = 4;

		private ConnectionInfoHelper connectionInfo;

		private TaskCompletionSource<LoginResult> loginResultTask = new TaskCompletionSource<LoginResult>();

		private TaskCompletionSource<RoomInfoPacket> roomInfoPacketTask = new TaskCompletionSource<RoomInfoPacket>();

		public IArchipelagoSocketHelper Socket { get; }

		public IReceivedItemsHelper Items { get; }

		public ILocationCheckHelper Locations { get; }

		public IPlayerHelper Players { get; }

		public IDataStorageHelper DataStorage { get; }

		public IConnectionInfoProvider ConnectionInfo => connectionInfo;

		public IRoomStateHelper RoomState { get; }

		public IMessageLogHelper MessageLog { get; }

		public IHintsHelper Hints { get; }

		internal ArchipelagoSession(IArchipelagoSocketHelper socket, IReceivedItemsHelper items, ILocationCheckHelper locations, IPlayerHelper players, IRoomStateHelper roomState, ConnectionInfoHelper connectionInfoHelper, IDataStorageHelper dataStorage, IMessageLogHelper messageLog, IHintsHelper createHints)
		{
			Socket = socket;
			Items = items;
			Locations = locations;
			Players = players;
			RoomState = roomState;
			connectionInfo = connectionInfoHelper;
			DataStorage = dataStorage;
			MessageLog = messageLog;
			Hints = createHints;
			socket.PacketReceived += Socket_PacketReceived;
		}

		private void Socket_PacketReceived(ArchipelagoPacketBase packet)
		{
			if (!(packet is ConnectedPacket) && !(packet is ConnectionRefusedPacket))
			{
				if (packet is RoomInfoPacket result)
				{
					roomInfoPacketTask.TrySetResult(result);
				}
			}
			else
			{
				loginResultTask.TrySetResult(LoginResult.FromPacket(packet));
			}
		}

		public Task<RoomInfoPacket> ConnectAsync()
		{
			roomInfoPacketTask = new TaskCompletionSource<RoomInfoPacket>();
			Task.Factory.StartNew(delegate
			{
				try
				{
					Task task = Socket.ConnectAsync();
					task.Wait(TimeSpan.FromSeconds(4.0));
					if (!task.IsCompleted)
					{
						roomInfoPacketTask.TrySetCanceled();
					}
				}
				catch (AggregateException)
				{
					roomInfoPacketTask.TrySetCanceled();
				}
			});
			return roomInfoPacketTask.Task;
		}

		public Task<LoginResult> LoginAsync(string game, string name, ItemsHandlingFlags itemsHandlingFlags, Version version = null, string[] tags = null, string uuid = null, string password = null, bool requestSlotData = true)
		{
			loginResultTask = new TaskCompletionSource<LoginResult>();
			if (!roomInfoPacketTask.Task.IsCompleted)
			{
				loginResultTask.TrySetResult(new LoginFailure("You are not connected, run ConnectAsync() first"));
				return loginResultTask.Task;
			}
			connectionInfo.SetConnectionParameters(game, tags, itemsHandlingFlags, uuid);
			try
			{
				Socket.SendPacket(BuildConnectPacket(name, password, version, requestSlotData));
			}
			catch (ArchipelagoSocketClosedException)
			{
				loginResultTask.TrySetResult(new LoginFailure("You are not connected, run ConnectAsync() first"));
				return loginResultTask.Task;
			}
			SetResultAfterTimeout(loginResultTask, 4, new LoginFailure("Connection timed out."));
			return loginResultTask.Task;
		}

		private static void SetResultAfterTimeout<T>(TaskCompletionSource<T> task, int timeoutInSeconds, T result)
		{
			new CancellationTokenSource(TimeSpan.FromSeconds(timeoutInSeconds)).Token.Register(delegate
			{
				task.TrySetResult(result);
			});
		}

		public LoginResult TryConnectAndLogin(string game, string name, ItemsHandlingFlags itemsHandlingFlags, Version version = null, string[] tags = null, string uuid = null, string password = null, bool requestSlotData = true)
		{
			Task<RoomInfoPacket> task = ConnectAsync();
			try
			{
				task.Wait(TimeSpan.FromSeconds(4.0));
			}
			catch (AggregateException ex)
			{
				if (ex.GetBaseException() is OperationCanceledException)
				{
					return new LoginFailure("Connection timed out.");
				}
				return new LoginFailure(ex.GetBaseException().Message);
			}
			if (!task.IsCompleted)
			{
				return new LoginFailure("Connection timed out.");
			}
			return LoginAsync(game, name, itemsHandlingFlags, version, tags, uuid, password, requestSlotData).Result;
		}

		private ConnectPacket BuildConnectPacket(string name, string password, Version version, bool requestSlotData)
		{
			return new ConnectPacket
			{
				Game = ConnectionInfo.Game,
				Name = name,
				Password = password,
				Tags = ConnectionInfo.Tags,
				Uuid = ConnectionInfo.Uuid,
				Version = ((version != null) ? new NetworkVersion(version) : new NetworkVersion(0, 6, 0)),
				ItemsHandling = ConnectionInfo.ItemsHandlingFlags,
				RequestSlotData = requestSlotData
			};
		}

		public void Say(string message)
		{
			Socket.SendPacket(new SayPacket
			{
				Text = message
			});
		}

		public void SetClientState(ArchipelagoClientState state)
		{
			Socket.SendPacket(new StatusUpdatePacket
			{
				Status = state
			});
		}

		public void SetGoalAchieved()
		{
			SetClientState(ArchipelagoClientState.ClientGoal);
		}
	}
	public interface IArchipelagoSessionActions
	{
		void Say(string message);

		void SetClientState(ArchipelagoClientState state);

		void SetGoalAchieved();
	}
	public static class ArchipelagoSessionFactory
	{
		public static ArchipelagoSession CreateSession(Uri uri)
		{
			ArchipelagoSocketHelper socket = new ArchipelagoSocketHelper(uri);
			DataPackageCache cache = new DataPackageCache(socket);
			ConnectionInfoHelper connectionInfoHelper = new ConnectionInfoHelper(socket);
			PlayerHelper playerHelper = new PlayerHelper(socket, connectionInfoHelper);
			ItemInfoResolver itemInfoResolver = new ItemInfoResolver(cache, connectionInfoHelper);
			LocationCheckHelper locationCheckHelper = new LocationCheckHelper(socket, itemInfoResolver, connectionInfoHelper, playerHelper);
			ReceivedItemsHelper items = new ReceivedItemsHelper(socket, locationCheckHelper, itemInfoResolver, connectionInfoHelper, playerHelper);
			RoomStateHelper roomStateHelper = new RoomStateHelper(socket, locationCheckHelper);
			DataStorageHelper dataStorageHelper = new DataStorageHelper(socket, connectionInfoHelper);
			MessageLogHelper messageLog = new MessageLogHelper(socket, itemInfoResolver, playerHelper, connectionInfoHelper);
			HintsHelper createHints = new HintsHelper(socket, playerHelper, locationCheckHelper, roomStateHelper, dataStorageHelper);
			return new ArchipelagoSession(socket, items, locationCheckHelper, playerHelper, roomStateHelper, connectionInfoHelper, dataStorageHelper, messageLog, createHints);
		}

		public static ArchipelagoSession CreateSession(string hostname, int port = 38281)
		{
			return CreateSession(ParseUri(hostname, port));
		}

		internal static Uri ParseUri(string hostname, int port)
		{
			string text = hostname;
			if (!text.StartsWith("ws://") && !text.StartsWith("wss://"))
			{
				text = "unspecified://" + text;
			}
			if (!text.Substring(text.IndexOf("://", StringComparison.Ordinal) + 3).Contains(":"))
			{
				text += $":{port}";
			}
			if (text.EndsWith(":"))
			{
				text += port;
			}
			return new Uri(text);
		}
	}
	public abstract class LoginResult
	{
		public abstract bool Successful { get; }

		public static LoginResult FromPacket(ArchipelagoPacketBase packet)
		{
			if (!(packet is ConnectedPacket connectedPacket))
			{
				if (packet is ConnectionRefusedPacket connectionRefusedPacket)
				{
					return new LoginFailure(connectionRefusedPacket);
				}
				throw new ArgumentOutOfRangeException("packet", "packet is not a connection result packet");
			}
			return new LoginSuccessful(connectedPacket);
		}
	}
	public class LoginSuccessful : LoginResult
	{
		public override bool Successful => true;

		public int Team { get; }

		public int Slot { get; }

		public Dictionary<string, object> SlotData { get; }

		public LoginSuccessful(ConnectedPacket connectedPacket)
		{
			Team = connectedPacket.Team;
			Slot = connectedPacket.Slot;
			SlotData = connectedPacket.SlotData;
		}
	}
	public class LoginFailure : LoginResult
	{
		public override bool Successful => false;

		public ConnectionRefusedError[] ErrorCodes { get; }

		public string[] Errors { get; }

		public LoginFailure(ConnectionRefusedPacket connectionRefusedPacket)
		{
			if (connectionRefusedPacket.Errors != null)
			{
				ErrorCodes = connectionRefusedPacket.Errors.ToArray();
				Errors = ErrorCodes.Select(GetErrorMessage).ToArray();
			}
			else
			{
				ErrorCodes = new ConnectionRefusedError[0];
				Errors = new string[0];
			}
		}

		public LoginFailure(string message)
		{
			ErrorCodes = new ConnectionRefusedError[0];
			Errors = new string[1] { message };
		}

		private static string GetErrorMessage(ConnectionRefusedError errorCode)
		{
			return errorCode switch
			{
				ConnectionRefusedError.InvalidSlot => "The slot name did not match any slot on the server.", 
				ConnectionRefusedError.InvalidGame => "The slot is set to a different game on the server.", 
				ConnectionRefusedError.SlotAlreadyTaken => "The slot already has a connection with a different uuid established.", 
				ConnectionRefusedError.IncompatibleVersion => "The client and server version mismatch.", 
				ConnectionRefusedError.InvalidPassword => "The password is invalid.", 
				ConnectionRefusedError.InvalidItemsHandling => "The item handling flags provided are invalid.", 
				_ => $"Unknown error: {errorCode}.", 
			};
		}
	}
	internal class TwoWayLookup<TA, TB> : IEnumerable<KeyValuePair<TB, TA>>, IEnumerable
	{
		private readonly Dictionary<TA, TB> aToB = new Dictionary<TA, TB>();

		private readonly Dictionary<TB, TA> bToA = new Dictionary<TB, TA>();

		public TA this[TB b] => bToA[b];

		public TB this[TA a] => aToB[a];

		public void Add(TA a, TB b)
		{
			aToB[a] = b;
			bToA[b] = a;
		}

		public void Add(TB b, TA a)
		{
			Add(a, b);
		}

		public bool TryGetValue(TA a, out TB b)
		{
			return aToB.TryGetValue(a, out b);
		}

		public bool TryGetValue(TB b, out TA a)
		{
			return bToA.TryGetValue(b, out a);
		}

		public IEnumerator<KeyValuePair<TB, TA>> GetEnumerator()
		{
			return bToA.GetEnumerator();
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return GetEnumerator();
		}
	}
}
namespace Archipelago.MultiClient.Net.Packets
{
	public class BouncedPacket : BouncePacket
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Bounced;
	}
	public class BouncePacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Bounce;

		[JsonProperty("games")]
		public List<string> Games { get; set; } = new List<string>();


		[JsonProperty("slots")]
		public List<int> Slots { get; set; } = new List<int>();


		[JsonProperty("tags")]
		public List<string> Tags { get; set; } = new List<string>();


		[JsonProperty("data")]
		public Dictionary<string, JToken> Data { get; set; }
	}
	public class ConnectedPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Connected;

		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }

		[JsonProperty("players")]
		public NetworkPlayer[] Players { get; set; }

		[JsonProperty("missing_locations")]
		public long[] MissingChecks { get; set; }

		[JsonProperty("checked_locations")]
		public long[] LocationsChecked { get; set; }

		[JsonProperty("slot_data")]
		public Dictionary<string, object> SlotData { get; set; }

		[JsonProperty("slot_info")]
		public Dictionary<int, NetworkSlot> SlotInfo { get; set; }

		[JsonProperty("hint_points")]
		public int? HintPoints { get; set; }
	}
	public class ConnectionRefusedPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.ConnectionRefused;

		[JsonProperty("errors", ItemConverterType = typeof(AttemptingStringEnumConverter))]
		public ConnectionRefusedError[] Errors { get; set; }
	}
	public class ConnectPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Connect;

		[JsonProperty("password")]
		public string Password { get; set; }

		[JsonProperty("game")]
		public string Game { get; set; }

		[JsonProperty("name")]
		public string Name { get; set; }

		[JsonProperty("uuid")]
		public string Uuid { get; set; }

		[JsonProperty("version")]
		public NetworkVersion Version { get; set; }

		[JsonProperty("tags")]
		public string[] Tags { get; set; }

		[JsonProperty("items_handling")]
		public ItemsHandlingFlags ItemsHandling { get; set; }

		[JsonProperty("slot_data")]
		public bool RequestSlotData { get; set; }
	}
	public class ConnectUpdatePacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.ConnectUpdate;

		[JsonProperty("tags")]
		public string[] Tags { get; set; }

		[JsonProperty("items_handling")]
		public ItemsHandlingFlags? ItemsHandling { get; set; }
	}
	public class CreateHintsPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.CreateHints;

		[JsonProperty("locations")]
		public long[] Locations { get; set; }

		[JsonProperty("player")]
		public int Player { get; set; }

		[JsonProperty("status")]
		public HintStatus Status { get; set; }
	}
	public class DataPackagePacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.DataPackage;

		[JsonProperty("data")]
		public Archipelago.MultiClient.Net.Models.DataPackage DataPackage { get; set; }
	}
	public class GetDataPackagePacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.GetDataPackage;

		[JsonProperty("games")]
		public string[] Games { get; set; }
	}
	public class GetPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Get;

		[JsonProperty("keys")]
		public string[] Keys { get; set; }
	}
	public class InvalidPacketPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.InvalidPacket;

		[JsonProperty("type")]
		public InvalidPacketErrorType ErrorType { get; set; }

		[JsonProperty("text")]
		public string ErrorText { get; set; }

		[JsonProperty("original_cmd")]
		public ArchipelagoPacketType OriginalCmd { get; set; }
	}
	public class LocationChecksPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.LocationChecks;

		[JsonProperty("locations")]
		public long[] Locations { get; set; }
	}
	public class LocationInfoPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.LocationInfo;

		[JsonProperty("locations")]
		public NetworkItem[] Locations { get; set; }
	}
	public class LocationScoutsPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.LocationScouts;

		[JsonProperty("locations")]
		public long[] Locations { get; set; }

		[JsonProperty("create_as_hint")]
		public int CreateAsHint { get; set; }
	}
	public class PrintJsonPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.PrintJSON;

		[JsonProperty("data")]
		public JsonMessagePart[] Data { get; set; }

		[JsonProperty("type")]
		[JsonConverter(typeof(AttemptingStringEnumConverter))]
		public JsonMessageType? MessageType { get; set; }
	}
	public class ItemPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("receiving")]
		public int ReceivingPlayer { get; set; }

		[JsonProperty("item")]
		public NetworkItem Item { get; set; }
	}
	public class ItemCheatPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("receiving")]
		public int ReceivingPlayer { get; set; }

		[JsonProperty("item")]
		public NetworkItem Item { get; set; }

		[JsonProperty("team")]
		public int Team { get; set; }
	}
	public class HintPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("receiving")]
		public int ReceivingPlayer { get; set; }

		[JsonProperty("item")]
		public NetworkItem Item { get; set; }

		[JsonProperty("found")]
		public bool? Found { get; set; }
	}
	public class JoinPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }

		[JsonProperty("tags")]
		public string[] Tags { get; set; }
	}
	public class LeavePrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }
	}
	public class ChatPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }

		[JsonProperty("message")]
		public string Message { get; set; }
	}
	public class ServerChatPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("message")]
		public string Message { get; set; }
	}
	public class TutorialPrintJsonPacket : PrintJsonPacket
	{
	}
	public class TagsChangedPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }

		[JsonProperty("tags")]
		public string[] Tags { get; set; }
	}
	public class CommandResultPrintJsonPacket : PrintJsonPacket
	{
	}
	public class AdminCommandResultPrintJsonPacket : PrintJsonPacket
	{
	}
	public class GoalPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }
	}
	public class ReleasePrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }
	}
	public class CollectPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }
	}
	public class CountdownPrintJsonPacket : PrintJsonPacket
	{
		[JsonProperty("countdown")]
		public int RemainingSeconds { get; set; }
	}
	public class ReceivedItemsPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.ReceivedItems;

		[JsonProperty("index")]
		public int Index { get; set; }

		[JsonProperty("items")]
		public NetworkItem[] Items { get; set; }
	}
	public class RetrievedPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Retrieved;

		[JsonProperty("keys")]
		public Dictionary<string, JToken> Data { get; set; }
	}
	public class RoomInfoPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.RoomInfo;

		[JsonProperty("version")]
		public NetworkVersion Version { get; set; }

		[JsonProperty("generator_version")]
		public NetworkVersion GeneratorVersion { get; set; }

		[JsonProperty("tags")]
		public string[] Tags { get; set; }

		[JsonProperty("password")]
		public bool Password { get; set; }

		[JsonProperty("permissions")]
		public Dictionary<string, Permissions> Permissions { get; set; }

		[JsonProperty("hint_cost")]
		public int HintCostPercentage { get; set; }

		[JsonProperty("location_check_points")]
		public int LocationCheckPoints { get; set; }

		[JsonProperty("players")]
		public NetworkPlayer[] Players { get; set; }

		[JsonProperty("games")]
		public string[] Games { get; set; }

		[JsonProperty("datapackage_checksums")]
		public Dictionary<string, string> DataPackageChecksums { get; set; }

		[JsonProperty("seed_name")]
		public string SeedName { get; set; }

		[JsonProperty("time")]
		public double Timestamp { get; set; }
	}
	public class RoomUpdatePacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.RoomUpdate;

		[JsonProperty("tags")]
		public string[] Tags { get; set; }

		[JsonProperty("password")]
		public bool? Password { get; set; }

		[JsonProperty("permissions")]
		public Dictionary<string, Permissions> Permissions { get; set; } = new Dictionary<string, Permissions>();


		[JsonProperty("hint_cost")]
		public int? HintCostPercentage { get; set; }

		[JsonProperty("location_check_points")]
		public int? LocationCheckPoints { get; set; }

		[JsonProperty("players")]
		public NetworkPlayer[] Players { get; set; }

		[JsonProperty("hint_points")]
		public int? HintPoints { get; set; }

		[JsonProperty("checked_locations")]
		public long[] CheckedLocations { get; set; }
	}
	public class SayPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Say;

		[JsonProperty("text")]
		public string Text { get; set; }
	}
	public class SetNotifyPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.SetNotify;

		[JsonProperty("keys")]
		public string[] Keys { get; set; }
	}
	public class SetPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Set;

		[JsonProperty("key")]
		public string Key { get; set; }

		[JsonProperty("default")]
		public JToken DefaultValue { get; set; }

		[JsonProperty("operations")]
		public OperationSpecification[] Operations { get; set; }

		[JsonProperty("want_reply")]
		public bool WantReply { get; set; }

		[JsonExtensionData]
		public Dictionary<string, JToken> AdditionalArguments { get; set; }

		[OnDeserialized]
		internal void OnDeserializedMethod(StreamingContext context)
		{
			AdditionalArguments?.Remove("cmd");
		}
	}
	public class SetReplyPacket : SetPacket
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.SetReply;

		[JsonProperty("value")]
		public JToken Value { get; set; }

		[JsonProperty("original_value")]
		public JToken OriginalValue { get; set; }
	}
	public class StatusUpdatePacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.StatusUpdate;

		[JsonProperty("status")]
		public ArchipelagoClientState Status { get; set; }
	}
	public class SyncPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Sync;
	}
	internal class UnknownPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.Unknown;
	}
	public class UpdateHintPacket : ArchipelagoPacketBase
	{
		public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.UpdateHint;

		[JsonProperty("player")]
		public int Player { get; set; }

		[JsonProperty("location")]
		public long Location { get; set; }

		[JsonProperty("status")]
		public HintStatus Status { get; set; }
	}
}
namespace Archipelago.MultiClient.Net.Models
{
	public struct Color : IEquatable<Color>
	{
		public static Color Red = new Color(byte.MaxValue, 0, 0);

		public static Color Green = new Color(0, 128, 0);

		public static Color Yellow = new Color(byte.MaxValue, byte.MaxValue, 0);

		public static Color Blue = new Color(0, 0, byte.MaxValue);

		public static Color Magenta = new Color(byte.MaxValue, 0, byte.MaxValue);

		public static Color Cyan = new Color(0, byte.MaxValue, byte.MaxValue);

		public static Color Black = new Color(0, 0, 0);

		public static Color White = new Color(byte.MaxValue, byte.MaxValue, byte.MaxValue);

		public static Color SlateBlue = new Color(106, 90, 205);

		public static Color Salmon = new Color(250, 128, 114);

		public static Color Plum = new Color(221, 160, 221);

		public byte R { get; set; }

		public byte G { get; set; }

		public byte B { get; set; }

		public Color(byte r, byte g, byte b)
		{
			R = r;
			G = g;
			B = b;
		}

		public override bool Equals(object obj)
		{
			if (obj is Color color && R == color.R && G == color.G)
			{
				return B == color.B;
			}
			return false;
		}

		public bool Equals(Color other)
		{
			if (R == other.R && G == other.G)
			{
				return B == other.B;
			}
			return false;
		}

		public override int GetHashCode()
		{
			return ((-1520100960 * -1521134295 + R.GetHashCode()) * -1521134295 + G.GetHashCode()) * -1521134295 + B.GetHashCode();
		}

		public static bool operator ==(Color left, Color right)
		{
			return left.Equals(right);
		}

		public static bool operator !=(Color left, Color right)
		{
			return !(left == right);
		}
	}
	public class DataPackage
	{
		[JsonProperty("games")]
		public Dictionary<string, GameData> Games { get; set; } = new Dictionary<string, GameData>();

	}
	public class DataStorageElement
	{
		internal DataStorageElementContext Context;

		internal List<OperationSpecification> Operations = new List<OperationSpecification>(0);

		internal DataStorageHelper.DataStorageUpdatedHandler Callbacks;

		internal Dictionary<string, JToken> AdditionalArguments = new Dictionary<string, JToken>(0);

		private JToken cachedValue;

		public event DataStorageHelper.DataStorageUpdatedHandler OnValueChanged
		{
			add
			{
				Context.AddHandler(Context.Key, value);
			}
			remove
			{
				Context.RemoveHandler(Context.Key, value);
			}
		}

		internal DataStorageElement(DataStorageElementContext context)
		{
			Context = context;
		}

		internal DataStorageElement(OperationType operationType, JToken value)
		{
			Operations = new List<OperationSpecification>(1)
			{
				new OperationSpecification
				{
					OperationType = operationType,
					Value = value
				}
			};
		}

		internal DataStorageElement(DataStorageElement source, OperationType operationType, JToken value)
			: this(source.Context)
		{
			Operations = source.Operations.ToList();
			Callbacks = source.Callbacks;
			AdditionalArguments = source.AdditionalArguments;
			Operations.Add(new OperationSpecification
			{
				OperationType = operationType,
				Value = value
			});
		}

		internal DataStorageElement(DataStorageElement source, Callback callback)
			: this(source.Context)
		{
			Operations = source.Operations.ToList();
			Callbacks = source.Callbacks;
			AdditionalArguments = source.AdditionalArguments;
			Callbacks = (DataStorageHelper.DataStorageUpdatedHandler)Delegate.Combine(Callbacks, callback.Method);
		}

		internal DataStorageElement(DataStorageElement source, AdditionalArgument additionalArgument)
			: this(source.Context)
		{
			Operations = source.Operations.ToList();
			Callbacks = source.Callbacks;
			AdditionalArguments = source.AdditionalArguments;
			AdditionalArguments[additionalArgument.Key] = additionalArgument.Value;
		}

		public static DataStorageElement operator ++(DataStorageElement a)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(1));
		}

		public static DataStorageElement operator --(DataStorageElement a)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(-1));
		}

		public static DataStorageElement operator +(DataStorageElement a, int b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator +(DataStorageElement a, long b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator +(DataStorageElement a, float b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator +(DataStorageElement a, double b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator +(DataStorageElement a, decimal b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator +(DataStorageElement a, string b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator +(DataStorageElement a, JToken b)
		{
			return new DataStorageElement(a, OperationType.Add, b);
		}

		public static DataStorageElement operator +(DataStorageElement a, IEnumerable b)
		{
			return new DataStorageElement(a, OperationType.Add, (JToken)(object)JArray.FromObject((object)b));
		}

		public static DataStorageElement operator +(DataStorageElement a, OperationSpecification s)
		{
			return new DataStorageElement(a, s.OperationType, s.Value);
		}

		public static DataStorageElement operator +(DataStorageElement a, Callback c)
		{
			return new DataStorageElement(a, c);
		}

		public static DataStorageElement operator +(DataStorageElement a, AdditionalArgument arg)
		{
			return new DataStorageElement(a, arg);
		}

		public static DataStorageElement operator *(DataStorageElement a, int b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator *(DataStorageElement a, long b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator *(DataStorageElement a, float b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator *(DataStorageElement a, double b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator *(DataStorageElement a, decimal b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator %(DataStorageElement a, int b)
		{
			return new DataStorageElement(a, OperationType.Mod, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator %(DataStorageElement a, long b)
		{
			return new DataStorageElement(a, OperationType.Mod, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator %(DataStorageElement a, float b)
		{
			return new DataStorageElement(a, OperationType.Mod, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator %(DataStorageElement a, double b)
		{
			return new DataStorageElement(a, OperationType.Mod, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator %(DataStorageElement a, decimal b)
		{
			return new DataStorageElement(a, OperationType.Mod, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator ^(DataStorageElement a, int b)
		{
			return new DataStorageElement(a, OperationType.Pow, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator ^(DataStorageElement a, long b)
		{
			return new DataStorageElement(a, OperationType.Pow, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator ^(DataStorageElement a, float b)
		{
			return new DataStorageElement(a, OperationType.Pow, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator ^(DataStorageElement a, double b)
		{
			return new DataStorageElement(a, OperationType.Pow, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator ^(DataStorageElement a, decimal b)
		{
			return new DataStorageElement(a, OperationType.Pow, JToken.op_Implicit(b));
		}

		public static DataStorageElement operator -(DataStorageElement a, int b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.FromObject((object)(-b)));
		}

		public static DataStorageElement operator -(DataStorageElement a, long b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.FromObject((object)(-b)));
		}

		public static DataStorageElement operator -(DataStorageElement a, float b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.FromObject((object)(0f - b)));
		}

		public static DataStorageElement operator -(DataStorageElement a, double b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.FromObject((object)(0.0 - b)));
		}

		public static DataStorageElement operator -(DataStorageElement a, decimal b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.FromObject((object)(-b)));
		}

		public static DataStorageElement operator /(DataStorageElement a, int b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.FromObject((object)(1m / (decimal)b)));
		}

		public static DataStorageElement operator /(DataStorageElement a, long b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.FromObject((object)(1m / (decimal)b)));
		}

		public static DataStorageElement operator /(DataStorageElement a, float b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.FromObject((object)(1.0 / (double)b)));
		}

		public static DataStorageElement operator /(DataStorageElement a, double b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.FromObject((object)(1.0 / b)));
		}

		public static DataStorageElement operator /(DataStorageElement a, decimal b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.FromObject((object)(1m / b)));
		}

		public static implicit operator DataStorageElement(bool b)
		{
			return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(b));
		}

		public static implicit operator DataStorageElement(int i)
		{
			return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(i));
		}

		public static implicit operator DataStorageElement(long l)
		{
			return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(l));
		}

		public static implicit operator DataStorageElement(decimal m)
		{
			return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(m));
		}

		public static implicit operator DataStorageElement(double d)
		{
			return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(d));
		}

		public static implicit operator DataStorageElement(float f)
		{
			return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(f));
		}

		public static implicit operator DataStorageElement(string s)
		{
			if (s != null)
			{
				return new DataStorageElement(OperationType.Replace, JToken.op_Implicit(s));
			}
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JValue.CreateNull());
		}

		public static implicit operator DataStorageElement(JToken o)
		{
			return new DataStorageElement(OperationType.Replace, o);
		}

		public static implicit operator DataStorageElement(Array a)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)a));
		}

		public static implicit operator DataStorageElement(List<bool> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<int> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<long> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<decimal> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<double> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<float> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<string> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator DataStorageElement(List<object> l)
		{
			return new DataStorageElement(OperationType.Replace, (JToken)(object)JArray.FromObject((object)l));
		}

		public static implicit operator bool(DataStorageElement e)
		{
			return RetrieveAndReturnBoolValue<bool>(e);
		}

		public static implicit operator bool?(DataStorageElement e)
		{
			return RetrieveAndReturnBoolValue<bool?>(e);
		}

		public static implicit operator int(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<int>(e);
		}

		public static implicit operator int?(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<int?>(e);
		}

		public static implicit operator long(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<long>(e);
		}

		public static implicit operator long?(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<long?>(e);
		}

		public static implicit operator float(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<float>(e);
		}

		public static implicit operator float?(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<float?>(e);
		}

		public static implicit operator double(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<double>(e);
		}

		public static implicit operator double?(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<double?>(e);
		}

		public static implicit operator decimal(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<decimal>(e);
		}

		public static implicit operator decimal?(DataStorageElement e)
		{
			return RetrieveAndReturnDecimalValue<decimal?>(e);
		}

		public static implicit operator string(DataStorageElement e)
		{
			return RetrieveAndReturnStringValue(e);
		}

		public static implicit operator bool[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<bool[]>(e);
		}

		public static implicit operator int[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<int[]>(e);
		}

		public static implicit operator long[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<long[]>(e);
		}

		public static implicit operator decimal[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<decimal[]>(e);
		}

		public static implicit operator double[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<double[]>(e);
		}

		public static implicit operator float[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<float[]>(e);
		}

		public static implicit operator string[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<string[]>(e);
		}

		public static implicit operator object[](DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<object[]>(e);
		}

		public static implicit operator List<bool>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<bool>>(e);
		}

		public static implicit operator List<int>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<int>>(e);
		}

		public static implicit operator List<long>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<long>>(e);
		}

		public static implicit operator List<decimal>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<decimal>>(e);
		}

		public static implicit operator List<double>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<double>>(e);
		}

		public static implicit operator List<float>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<float>>(e);
		}

		public static implicit operator List<string>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<string>>(e);
		}

		public static implicit operator List<object>(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<List<object>>(e);
		}

		public static implicit operator Array(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<Array>(e);
		}

		public static implicit operator JArray(DataStorageElement e)
		{
			return RetrieveAndReturnArrayValue<JArray>(e);
		}

		public static implicit operator JToken(DataStorageElement e)
		{
			return e.Context.GetData(e.Context.Key);
		}

		public static DataStorageElement operator +(DataStorageElement a, BigInteger b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.Parse(b.ToString()));
		}

		public static DataStorageElement operator *(DataStorageElement a, BigInteger b)
		{
			return new DataStorageElement(a, OperationType.Mul, JToken.Parse(b.ToString()));
		}

		public static DataStorageElement operator %(DataStorageElement a, BigInteger b)
		{
			return new DataStorageElement(a, OperationType.Mod, JToken.Parse(b.ToString()));
		}

		public static DataStorageElement operator ^(DataStorageElement a, BigInteger b)
		{
			return new DataStorageElement(a, OperationType.Pow, JToken.Parse(b.ToString()));
		}

		public static DataStorageElement operator -(DataStorageElement a, BigInteger b)
		{
			return new DataStorageElement(a, OperationType.Add, JToken.Parse((-b).ToString()));
		}

		public static DataStorageElement operator /(DataStorageElement a, BigInteger b)
		{
			throw new InvalidOperationException("DataStorage[Key] / BigInterger is not supported, due to loss of precision when using integer division");
		}

		public static implicit operator DataStorageElement(BigInteger bi)
		{
			return new DataStorageElement(OperationType.Replace, JToken.Parse(bi.ToString()));
		}

		public static implicit operator BigInteger(DataStorageElement e)
		{
			return RetrieveAndReturnBigIntegerValue<BigInteger>(e);
		}

		public static implicit operator BigInteger?(DataStorageElement e)
		{
			return RetrieveAndReturnBigIntegerValue<BigInteger?>(e);
		}

		private static T RetrieveAndReturnBigIntegerValue<T>(DataStorageElement e)
		{
			if (e.cachedValue != null)
			{
				if (!BigInteger.TryParse(((object)e.cachedValue).ToString(), out var result))
				{
					return default(T);
				}
				return (T)Convert.ChangeType(result, IsNullable<T>() ? Nullable.GetUnderlyingType(typeof(T)) : typeof(T));
			}
			BigInteger result2;
			BigInteger? bigInteger = (BigInteger.TryParse(((object)e.Context.GetData(e.Context.Key)).ToString(), out result2) ? new BigInteger?(result2) : null);
			if (!bigInteger.HasValue && !IsNullable<T>())
			{
				bigInteger = Activator.CreateInstance<BigInteger>();
			}
			foreach (OperationSpecification operation in e.Operations)
			{
				if (operation.OperationType == OperationType.Floor || operation.OperationType == OperationType.Ceil)
				{
					continue;
				}
				if (!BigInteger.TryParse(((object)operation.Value).ToString(), NumberStyles.AllowLeadingSign, null, out var result3))
				{
					throw new InvalidOperationException($"DataStorage[Key] cannot be converted to BigInterger as its value its not an integer number, value: {operation.Value}");
				}
				switch (operation.OperationType)
				{
				case OperationType.Replace:
					bigInteger = result3;
					break;
				case OperationType.Add:
					bigInteger += result3;
					break;
				case OperationType.Mul:
					bigInteger *= result3;
					break;
				case OperationType.Mod:
					bigInteger %= result3;
					break;
				case OperationType.Pow:
					bigInteger = BigInteger.Pow(bigInteger.Value, (int)operation.Value);
					break;
				case OperationType.Max:
				{
					BigInteger value = result3;
					BigInteger? bigInteger2 = bigInteger;
					if (value > bigInteger2)
					{
						bigInteger = result3;
					}
					break;
				}
				case OperationType.Min:
				{
					BigInteger value = result3;
					BigInteger? bigInteger2 = bigInteger;
					if (value < bigInteger2)
					{
						bigInteger = result3;
					}
					break;
				}
				case OperationType.Xor:
					bigInteger ^= result3;
					break;
				case OperationType.Or:
					bigInteger |= result3;
					break;
				case OperationType.And:
					bigInteger &= result3;
					break;
				case OperationType.LeftShift:
					bigInteger <<= (int)operation.Value;
					break;
				case OperationType.RightShift:
					bigInteger >>= (int)operation.Value;
					break;
				}
			}
			e.cachedValue = JToken.Parse(bigInteger.ToString());
			if (!bigInteger.HasValue)
			{
				return default(T);
			}
			return (T)Convert.ChangeType(bigInteger.Value, IsNullable<T>() ? Nullable.GetUnderlyingType(typeof(T)) : typeof(T));
		}

		public void Initialize(JToken value)
		{
			Context.Initialize(Context.Key, value);
		}

		public void Initialize(IEnumerable value)
		{
			Context.Initialize(Context.Key, (JToken)(object)JArray.FromObject((object)value));
		}

		public Task<T> GetAsync<T>()
		{
			return GetAsync().ContinueWith((Task<JToken> r) => r.Result.ToObject<T>());
		}

		public Task<JToken> GetAsync()
		{
			return Context.GetAsync(Context.Key);
		}

		private static T RetrieveAndReturnArrayValue<T>(DataStorageElement e)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Invalid comparison between Unknown and I4
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			if (e.cachedValue != null)
			{
				return ((JToken)(JArray)e.cachedValue).ToObject<T>();
			}
			JArray val = (JArray)(((object)e.Context.GetData(e.Context.Key).ToObject<JArray>()) ?? ((object)new JArray()));
			foreach (OperationSpecification operation in e.Operations)
			{
				switch (operation.OperationType)
				{
				case OperationType.Add:
					if ((int)operation.Value.Type != 2)
					{
						throw new InvalidOperationException($"Cannot perform operation {OperationType.Add} on Array value, with a non Array value: {operation.Value}");
					}
					((JContainer)val).Merge((object)operation.Value);
					break;
				case OperationType.Replace:
					if ((int)operation.Value.Type != 2)
					{
						throw new InvalidOperationException($"Cannot replace Array value, with a non Array value: {operation.Value}");
					}
					val = (JArray)(((object)operation.Value.ToObject<JArray>()) ?? ((object)new JArray()));
					break;
				default:
					throw new InvalidOperationException($"Cannot perform operation {operation.OperationType} on Array value");
				}
			}
			e.cachedValue = (JToken)(object)val;
			return ((JToken)val).ToObject<T>();
		}

		private static string RetrieveAndReturnStringValue(DataStorageElement e)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Invalid comparison between Unknown and I4
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Invalid comparison between Unknown and I4
			if (e.cachedValue != null)
			{
				return (string)e.cachedValue;
			}
			JToken val = e.Context.GetData(e.Context.Key);
			string text = (((int)val.Type == 10) ? null : ((object)val).ToString());
			foreach (OperationSpecification operation in e.Operations)
			{
				switch (operation.OperationType)
				{
				case OperationType.Add:
					text += (string)operation.Value;
					break;
				case OperationType.Mul:
					if ((int)operation.Value.Type != 6)
					{
						throw new InvalidOperationException($"Cannot perform operation {OperationType.Mul} on string value, with a non interger value: {operation.Value}");
					}
					text = string.Concat(Enumerable.Repeat(text, (int)operation.Value));
					break;
				case OperationType.Replace:
					text = (string)operation.Value;
					break;
				default:
					throw new InvalidOperationException($"Cannot perform operation {operation.OperationType} on string value");
				}
			}
			if (text == null)
			{
				e.cachedValue = (JToken)(object)JValue.CreateNull();
			}
			else
			{
				e.cachedValue = JToken.op_Implicit(text);
			}
			return (string)e.cachedValue;
		}

		private static T RetrieveAndReturnBoolValue<T>(DataStorageElement e)
		{
			if (e.cachedValue != null)
			{
				return e.cachedValue.ToObject<T>();
			}
			bool? flag = e.Context.GetData(e.Context.Key).ToObject<bool?>() ?? ((bool?)Activator.CreateInstance(typeof(T)));
			foreach (OperationSpecification operation in e.Operations)
			{
				if (operation.OperationType == OperationType.Replace)
				{
					flag = (bool?)operation.Value;
					continue;
				}
				throw new InvalidOperationException($"Cannot perform operation {operation.OperationType} on boolean value");
			}
			e.cachedValue = JToken.op_Implicit(flag);
			if (!flag.HasValue)
			{
				return default(T);
			}
			return (T)Convert.ChangeType(flag.Value, IsNullable<T>() ? Nullable.GetUnderlyingType(typeof(T)) : typeof(T));
		}

		private static T RetrieveAndReturnDecimalValue<T>(DataStorageElement e)
		{
			if (e.cachedValue != null)
			{
				return e.cachedValue.ToObject<T>();
			}
			decimal? num = e.Context.GetData(e.Context.Key).ToObject<decimal?>();
			if (!num.HasValue && !IsNullable<T>())
			{
				num = Activator.CreateInstance<decimal>();
			}
			foreach (OperationSpecification operation in e.Operations)
			{
				switch (operation.OperationType)
				{
				case OperationType.Replace:
					num = (decimal)operation.Value;
					break;
				case OperationType.Add:
					num += (decimal?)(decimal)operation.Value;
					break;
				case OperationType.Mul:
					num *= (decimal?)(decimal)operation.Value;
					break;
				case OperationType.Mod:
					num %= (decimal?)(decimal)operation.Value;
					break;
				case OperationType.Pow:
					num = (decimal)Math.Pow((double)num.Value, (double)operation.Value);
					break;
				case OperationType.Max:
					num = Math.Max(num.Value, (decimal)operation.Value);
					break;
				case OperationType.Min:
					num = Math.Min(num.Value, (decimal)operation.Value);
					break;
				case OperationType.Xor:
					num = (long)num.Value ^ (long)operation.Value;
					break;
				case OperationType.Or:
					num = (long)num.Value | (long)operation.Value;
					break;
				case OperationType.And:
					num = (long)num.Value & (long)operation.Value;
					break;
				case OperationType.LeftShift:
					num = (long)num.Value << (int)operation.Value;
					break;
				case OperationType.RightShift:
					num = (long)num.Value >> (int)operation.Value;
					break;
				case OperationType.Floor:
					num = Math.Floor(num.Value);
					break;
				case OperationType.Ceil:
					num = Math.Ceiling(num.Value);
					break;
				}
			}
			e.cachedValue = JToken.op_Implicit(num);
			if (!num.HasValue)
			{
				return default(T);
			}
			return (T)Convert.ChangeType(num.Value, IsNullable<T>() ? Nullable.GetUnderlyingType(typeof(T)) : typeof(T));
		}

		private static bool IsNullable<T>()
		{
			if (typeof(T).IsGenericType)
			{
				return typeof(T).GetGenericTypeDefinition() == typeof(Nullable<>).GetGenericTypeDefinition();
			}
			return false;
		}

		public T To<T>()
		{
			if (Operations.Count != 0)
			{
				throw new InvalidOperationException("DataStorageElement.To<T>() cannot be used together with other operations on the DataStorageElement");
			}
			return Context.GetData(Context.Key).ToObject<T>();
		}

		public override string ToString()
		{
			return (Context?.ToString() ?? "(null)") + ", (" + ListOperations() + ")";
		}

		private string ListOperations()
		{
			if (Operations != null)
			{
				return string.Join(", ", Operations.Select((OperationSpecification o) => o.ToString()).ToArray());
			}
			return "none";
		}
	}
	internal class DataStorageElementContext
	{
		internal string Key { get; set; }

		internal Action<string, DataStorageHelper.DataStorageUpdatedHandler> AddHandler { get; set; }

		internal Action<string, DataStorageHelper.DataStorageUpdatedHandler> RemoveHandler { get; set; }

		internal Func<string, JToken> GetData { get; set; }

		internal Action<string, JToken> Initialize { get; set; }

		internal Func<string, Task<JToken>> GetAsync { get; set; }

		public override string ToString()
		{
			return "Key: " + Key;
		}
	}
	public class GameData
	{
		[JsonProperty("location_name_to_id")]
		public Dictionary<string, long> LocationLookup { get; set; } = new Dictionary<string, long>();


		[JsonProperty("item_name_to_id")]
		public Dictionary<string, long> ItemLookup { get; set; } = new Dictionary<string, long>();


		[Obsolete("use Checksum instead")]
		[JsonProperty("version")]
		public int Version { get; set; }

		[JsonProperty("checksum")]
		public string Checksum { get; set; }
	}
	public class Hint
	{
		[JsonProperty("receiving_player")]
		public int ReceivingPlayer { get; set; }

		[JsonProperty("finding_player")]
		public int FindingPlayer { get; set; }

		[JsonProperty("item")]
		public long ItemId { get; set; }

		[JsonProperty("location")]
		public long LocationId { get; set; }

		[JsonProperty("item_flags")]
		public ItemFlags ItemFlags { get; set; }

		[JsonProperty("found")]
		public bool Found { get; set; }

		[JsonProperty("entrance")]
		public string Entrance { get; set; }

		[JsonProperty("status")]
		public HintStatus Status { get; set; }
	}
	public class ItemInfo
	{
		private readonly IItemInfoResolver itemInfoResolver;

		public long ItemId { get; }

		public long LocationId { get; }

		public PlayerInfo Player { get; }

		public ItemFlags Flags { get; }

		public string ItemName => itemInfoResolver.GetItemName(ItemId, ItemGame);

		public string ItemDisplayName => ItemName ?? $"Item: {ItemId}";

		public string LocationName => itemInfoResolver.GetLocationName(LocationId, LocationGame);

		public string LocationDisplayName => LocationName ?? $"Location: {LocationId}";

		public string ItemGame { get; }

		public string LocationGame { get; }

		public ItemInfo(NetworkItem item, string receiverGame, string senderGame, IItemInfoResolver itemInfoResolver, PlayerInfo player)
		{
			this.itemInfoResolver = itemInfoResolver;
			ItemGame = receiverGame;
			LocationGame = senderGame;
			ItemId = item.Item;
			LocationId = item.Location;
			Flags = item.Flags;
			Player = player;
		}

		public SerializableItemInfo ToSerializable()
		{
			return new SerializableItemInfo
			{
				IsScout = (GetType() == typeof(ScoutedItemInfo)),
				ItemId = ItemId,
				LocationId = LocationId,
				PlayerSlot = Player,
				Player = Player,
				Flags = Flags,
				ItemGame = ItemGame,
				ItemName = ItemName,
				LocationGame = LocationGame,
				LocationName = LocationName
			};
		}
	}
	public class ScoutedItemInfo : ItemInfo
	{
		public new PlayerInfo Player => base.Player;

		public bool IsReceiverRelatedToActivePlayer { get; }

		public ScoutedItemInfo(NetworkItem item, string receiverGame, string senderGame, IItemInfoResolver itemInfoResolver, IPlayerHelper players, PlayerInfo player)
			: base(item, receiverGame, senderGame, itemInfoResolver, player)
		{
			IsReceiverRelatedToActivePlayer = (players.ActivePlayer ?? new PlayerInfo()).IsRelatedTo(player);
		}
	}
	public class JsonMessagePart
	{
		[JsonProperty("type")]
		[JsonConverter(typeof(AttemptingStringEnumConverter), new object[] { typeof(SnakeCaseNamingStrategy) })]
		public JsonMessagePartType? Type { get; set; }

		[JsonProperty("color")]
		[JsonConverter(typeof(AttemptingStringEnumConverter), new object[] { typeof(SnakeCaseNamingStrategy) })]
		public JsonMessagePartColor? Color { get; set; }

		[JsonProperty("text")]
		public string Text { get; set; }

		[JsonProperty("player")]
		public int? Player { get; set; }

		[JsonProperty("flags")]
		public ItemFlags? Flags { get; set; }

		[JsonProperty("hint_status")]
		public HintStatus? HintStatus { get; set; }
	}
	public struct NetworkItem
	{
		[JsonProperty("item")]
		public long Item { get; set; }

		[JsonProperty("location")]
		public long Location { get; set; }

		[JsonProperty("player")]
		public int Player { get; set; }

		[JsonProperty("flags")]
		public ItemFlags Flags { get; set; }
	}
	public struct NetworkPlayer
	{
		[JsonProperty("team")]
		public int Team { get; set; }

		[JsonProperty("slot")]
		public int Slot { get; set; }

		[JsonProperty("alias")]
		public string Alias { get; set; }

		[JsonProperty("name")]
		public string Name { get; set; }
	}
	public struct NetworkSlot
	{
		[JsonProperty("name")]
		public string Name { get; set; }

		[JsonProperty("game")]
		public string Game { get; set; }

		[JsonProperty("type")]
		public SlotType Type { get; set; }

		[JsonProperty("group_members")]
		public int[] GroupMembers { get; set; }
	}
	public class NetworkVersion
	{
		[JsonProperty("major")]
		public int Major { get; set; }

		[JsonProperty("minor")]
		public int Minor { get; set; }

		[JsonProperty("build")]
		public int Build { get; set; }

		[JsonProperty("class")]
		public string Class => "Version";

		public NetworkVersion()
		{
		}

		public NetworkVersion(int major, int minor, int build)
		{
			Major = major;
			Minor = minor;
			Build = build;
		}

		public NetworkVersion(Version version)
		{
			Major = version.Major;
			Minor = version.Minor;
			Build = version.Build;
		}

		public Version ToVersion()
		{
			return new Version(Major, Minor, Build);
		}
	}
	public class OperationSpecification
	{
		[JsonProperty("operation")]
		[JsonConverter(typeof(AttemptingStringEnumConverter), new object[] { typeof(SnakeCaseNamingStrategy) })]
		public OperationType OperationType;

		[JsonProperty("value")]
		public JToken Value { get; set; }

		public override string ToString()
		{
			return $"{OperationType}: {Value}";
		}
	}
	public static class Operation
	{
		public static OperationSpecification Min(int i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Min(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Min(float i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Min(double i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Min(decimal i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Min(JToken i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = i
			};
		}

		public static OperationSpecification Min(BigInteger i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Min,
				Value = JToken.Parse(i.ToString())
			};
		}

		public static OperationSpecification Max(int i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Max(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Max(float i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Max(double i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Max(decimal i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Max(JToken i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = i
			};
		}

		public static OperationSpecification Max(BigInteger i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Max,
				Value = JToken.Parse(i.ToString())
			};
		}

		public static OperationSpecification Remove(JToken value)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Remove,
				Value = value
			};
		}

		public static OperationSpecification Pop(int value)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Pop,
				Value = JToken.op_Implicit(value)
			};
		}

		public static OperationSpecification Pop(JToken value)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Pop,
				Value = value
			};
		}

		public static OperationSpecification Update(IDictionary dictionary)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Update,
				Value = (JToken)(object)JObject.FromObject((object)dictionary)
			};
		}

		public static OperationSpecification Floor()
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Floor,
				Value = null
			};
		}

		public static OperationSpecification Ceiling()
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Ceil,
				Value = null
			};
		}
	}
	public static class Bitwise
	{
		public static OperationSpecification Xor(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Xor,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Xor(BigInteger i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Xor,
				Value = JToken.Parse(i.ToString())
			};
		}

		public static OperationSpecification Or(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Or,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification Or(BigInteger i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.Or,
				Value = JToken.Parse(i.ToString())
			};
		}

		public static OperationSpecification And(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.And,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification And(BigInteger i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.And,
				Value = JToken.Parse(i.ToString())
			};
		}

		public static OperationSpecification LeftShift(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.LeftShift,
				Value = JToken.op_Implicit(i)
			};
		}

		public static OperationSpecification RightShift(long i)
		{
			return new OperationSpecification
			{
				OperationType = OperationType.RightShift,
				Value = JToken.op_Implicit(i)
			};
		}
	}
	public class Callback
	{
		internal DataStorageHelper.DataStorageUpdatedHandler Method { get; set; }

		private Callback()
		{
		}

		public static Callback Add(DataStorageHelper.DataStorageUpdatedHandler callback)
		{
			return new Callback
			{
				Method = callback
			};
		}
	}
	public class AdditionalArgument
	{
		internal string Key { get; set; }

		internal JToken Value { get; set; }

		private AdditionalArgument()
		{
		}

		public static AdditionalArgument Add(string name, JToken value)
		{
			return new AdditionalArgument
			{
				Key = name,
				Value = value
			};
		}
	}
	public class MinimalSerializableItemInfo
	{
		public long ItemId { get; set; }

		public long LocationId { get; set; }

		public int PlayerSlot { get; set; }

		public ItemFlags Flags { get; set; }

		public string ItemGame { get; set; }

		public string LocationGame { get; set; }
	}
	public class SerializableItemInfo : MinimalSerializableItemInfo
	{
		public bool IsScout { get; set; }

		public PlayerInfo Player { get; set; }

		public string ItemName { get; set; }

		public string LocationName { get; set; }

		[JsonIgnore]
		public string ItemDisplayName => ItemName ?? $"Item: {base.ItemId}";

		[JsonIgnore]
		public string LocationDisplayName => LocationName ?? $"Location: {base.LocationId}";

		public string ToJson(bool full = false)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			MinimalSerializableItemInfo minimalSerializableItemInfo = this;
			if (!full)
			{
				minimalSerializableItemInfo = new MinimalSerializableItemInfo
				{
					ItemId = base.ItemId,
					LocationId = base.LocationId,
					PlayerSlot = base.PlayerSlot,
					Flags = base.Flags
				};
				if (IsScout)
				{
					minimalSerializableItemInfo.ItemGame = base.ItemGame;
				}
				else
				{
					minimalSerializableItemInfo.LocationGame = base.LocationGame;
				}
			}
			JsonSerializerSettings val = new JsonSerializerSettings
			{
				NullValueHandling = (NullValueHandling)1,
				Formatting = (Formatting)0
			};
			return JsonConvert.SerializeObject((object)minimalSerializableItemInfo, val);
		}

		public static SerializableItemInfo FromJson(string json, IArchipelagoSession session = null)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			ItemInfoStreamingContext additional = ((session != null) ? new ItemInfoStreamingContext
			{
				Items = session.Items,
				Locations = session.Locations,
				PlayerHelper = session.Players,
				ConnectionInfo = session.ConnectionInfo
			} : null);
			JsonSerializerSettings val = new JsonSerializerSettings
			{
				Context = new StreamingContext(StreamingContextStates.Other, additional)
			};
			return JsonConvert.DeserializeObject<SerializableItemInfo>(json, val);
		}

		[OnDeserialized]
		internal void OnDeserializedMethod(StreamingContext streamingContext)
		{
			if (base.ItemGame == null && base.LocationGame != null)
			{
				IsScout = false;
			}
			else if (base.ItemGame != null && base.LocationGame == null)
			{
				IsScout = true;
			}
			if (streamingContext.Context is ItemInfoStreamingContext itemInfoStreamingContext)
			{
				if (IsScout && base.LocationGame == null)
				{
					base.LocationGame = itemInfoStreamingContext.ConnectionInfo.Game;
				}
				else if (!IsScout && base.ItemGame == null)
				{
					base.ItemGame = itemInfoStreamingContext.ConnectionInfo.Game;
				}
				if (ItemName == null)
				{
					ItemName = itemInfoStreamingContext.Items.GetItemName(base.ItemId, base.ItemGame);
				}
				if (LocationName == null)
				{
					LocationName = itemInfoStreamingContext.Locations.GetLocationNameFromId(base.LocationId, base.LocationGame);
				}
				if (Player == null)
				{
					Player = itemInfoStreamingContext.PlayerHelper.GetPlayerInfo(base.PlayerSlot);
				}
			}
		}
	}
	internal class ItemInfoStreamingContext
	{
		public IReceivedItemsHelper Items { get; set; }

		public ILocationCheckHelper Locations { get; set; }

		public IPlayerHelper PlayerHelper { get; set; }

		public IConnectionInfoProvider ConnectionInfo { get; set; }
	}
}
namespace Archipelago.MultiClient.Net.MessageLog.Parts
{
	public class EntranceMessagePart : MessagePart
	{
		internal EntranceMessagePart(JsonMessagePart messagePart)
			: base(MessagePartType.Entrance, messagePart, Archipelago.MultiClient.Net.Colors.PaletteColor.Blue)
		{
			base.Text = messagePart.Text;
		}
	}
	public class HintStatusMessagePart : MessagePart
	{
		internal HintStatusMessagePart(JsonMessagePart messagePart)
			: base(MessagePartType.HintStatus, messagePart)
		{
			base.Text = messagePart.Text;
			if (messagePart.HintStatus.HasValue)
			{
				base.PaletteColor = ColorUtils.GetColor(messagePart.HintStatus.Value);
			}
		}
	}
	public class ItemMessagePart : MessagePart
	{
		public ItemFlags Flags { get; }

		public long ItemId { get; }

		public int Player { get; }

		internal ItemMessagePart(IPlayerHelper players, IItemInfoResolver items, JsonMessagePart part)
			: base(MessagePartType.Item, part)
		{
			Flags = part.Flags.GetValueOrDefault();
			base.PaletteColor = ColorUtils.GetColor(Flags);
			Player = part.Player.GetValueOrDefault();
			string game = (players.GetPlayerInfo(Player) ?? new PlayerInfo()).Game;
			JsonMessagePartType? type = part.Type;
			if (type.HasValue)
			{
				switch (type.GetValueOrDefault())
				{
				case JsonMessagePartType.ItemId:
					ItemId = long.Parse(part.Text);
					base.Text = items.GetItemName(ItemId, game) ?? $"Item: {ItemId}";
					break;
				case JsonMessagePartType.ItemName:
					ItemId = 0L;
					base.Text = part.Text;
					break;
				}
			}
		}
	}
	public class LocationMessagePart : MessagePart
	{
		public long LocationId { get; }

		public int Player { get; }

		internal LocationMessagePart(IPlayerHelper players, IItemInfoResolver itemInfoResolver, JsonMessagePart part)
			: base(MessagePartType.Location, part, Archipelago.MultiClient.Net.Colors.PaletteColor.Green)
		{
			Player = part.Player.GetValueOrDefault();
			string game = (players.GetPlayerInfo(Player) ?? new PlayerInfo()).Game;
			JsonMessagePartType? type = part.Type;
			if (type.HasValue)
			{
				switch (type.GetValueOrDefault())
				{
				case JsonMessagePartType.LocationId:
					LocationId = long.Parse(part.Text);
					base.Text = itemInfoResolver.GetLocationName(LocationId, game) ?? $"Location: {LocationId}";
					break;
				case JsonMessagePartType.LocationName:
					LocationId = itemInfoResolver.GetLocationId(part.Text, game);
					base.Text = part.Text;
					break;
				}
			}
		}
	}
	public class MessagePart
	{
		public string Text { get; internal set; }

		public MessagePartType Type { get; internal set; }

		public Color Color => GetColor(BuiltInPalettes.Dark);

		public PaletteColor? PaletteColor { get; protected set; }

		public bool IsBackgroundColor { get; internal set; }

		internal MessagePart(MessagePartType type, JsonMessagePart messagePart, PaletteColor? color = null)
		{
			Type = type;
			Text = messagePart.Text;
			if (color.HasValue)
			{
				PaletteColor = color.Value;
			}
			else if (messagePart.Color.HasValue)
			{
				PaletteColor = ColorUtils.GetColor(messagePart.Color.Value);
				IsBackgroundColor = messagePart.Color.Value >= JsonMessagePartColor.BlackBg;
			}
			else
			{
				PaletteColor = null;
			}
		}

		public T GetColor<T>(Palette<T> palette)
		{
			return palette[PaletteColor];
		}

		public override string ToString()
		{
			return Text;
		}
	}
	public enum MessagePartType
	{
		Text,
		Player,
		Item,
		Location,
		Entrance,
		HintStatus
	}
	public class PlayerMessagePart : MessagePart
	{
		public bool IsActivePlayer { get; }

		public int SlotId { get; }

		internal PlayerMessagePart(IPlayerHelper players, IConnectionInfoProvider connectionInfo, JsonMessagePart part)
			: base(MessagePartType.Player, part)
		{
			switch (part.Type)
			{
			case JsonMessagePartType.PlayerId:
				SlotId = int.Parse(part.Text);
				IsActivePlayer = SlotId == connectionInfo.Slot;
				base.Text = players.GetPlayerAlias(SlotId) ?? $"Player {SlotId}";
				break;
			case JsonMessagePartType.PlayerName:
				SlotId = 0;
				IsActivePlayer = false;
				base.Text = part.Text;
				break;
			}
			base.PaletteColor = (IsActivePlayer ? Archipelago.MultiClient.Net.Colors.PaletteColor.Magenta : Archipelago.MultiClient.Net.Colors.PaletteColor.Yellow);
		}
	}
}
namespace Archipelago.MultiClient.Net.MessageLog.Messages
{
	public class AdminCommandResultLogMessage : LogMessage
	{
		internal AdminCommandResultLogMessage(MessagePart[] parts)
			: base(parts)
		{
		}
	}
	public class ChatLogMessage : PlayerSpecificLogMessage
	{
		public string Message { get; }

		internal ChatLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot, string message)
			: base(parts, players, team, slot)
		{
			Message = message;
		}
	}
	public class CollectLogMessage : PlayerSpecificLogMessage
	{
		internal CollectLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot)
			: base(parts, players, team, slot)
		{
		}
	}
	public class CommandResultLogMessage : LogMessage
	{
		internal CommandResultLogMessage(MessagePart[] parts)
			: base(parts)
		{
		}
	}
	public class CountdownLogMessage : LogMessage
	{
		public int RemainingSeconds { get; }

		internal CountdownLogMessage(MessagePart[] parts, int remainingSeconds)
			: base(parts)
		{
			RemainingSeconds = remainingSeconds;
		}
	}
	public class GoalLogMessage : PlayerSpecificLogMessage
	{
		internal GoalLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot)
			: base(parts, players, team, slot)
		{
		}
	}
	public class HintItemSendLogMessage : ItemSendLogMessage
	{
		public bool IsFound { get; }

		internal HintItemSendLogMessage(MessagePart[] parts, IPlayerHelper players, int receiver, int sender, NetworkItem item, bool found, IItemInfoResolver itemInfoResolver)
			: base(parts, players, receiver, sender, item, itemInfoResolver)
		{
			IsFound = found;
		}
	}
	public class ItemCheatLogMessage : ItemSendLogMessage
	{
		internal ItemCheatLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot, NetworkItem item, IItemInfoResolver itemInfoResolver)
			: base(parts, players, slot, 0, item, team, itemInfoResolver)
		{
		}
	}
	public class ItemSendLogMessage : LogMessage
	{
		private PlayerInfo ActivePlayer { get; }

		public PlayerInfo Receiver { get; }

		public PlayerInfo Sender { get; }

		public bool IsReceiverTheActivePlayer => Receiver == ActivePlayer;

		public bool IsSenderTheActivePlayer => Sender == ActivePlayer;

		public bool IsRelatedToActivePlayer
		{
			get
			{
				if (!ActivePlayer.IsRelatedTo(Receiver))
				{
					return ActivePlayer.IsRelatedTo(Sender);
				}
				return true;
			}
		}

		public ItemInfo Item { get; }

		internal ItemSendLogMessage(MessagePart[] parts, IPlayerHelper players, int receiver, int sender, NetworkItem item, IItemInfoResolver itemInfoResolver)
			: this(parts, players, receiver, sender, item, players.ActivePlayer.Team, itemInfoResolver)
		{
		}

		internal ItemSendLogMessage(MessagePart[] parts, IPlayerHelper players, int receiver, int sender, NetworkItem item, int team, IItemInfoResolver itemInfoResolver)
			: base(parts)
		{
			ActivePlayer = players.ActivePlayer ?? new PlayerInfo();
			Receiver = players.GetPlayerInfo(team, receiver) ?? new PlayerInfo();
			Sender = players.GetPlayerInfo(team, sender) ?? new PlayerInfo();
			PlayerInfo player = players.GetPlayerInfo(team, item.Player) ?? new PlayerInfo();
			Item = new ItemInfo(item, Receiver.Game, Sender.Game, itemInfoResolver, player);
		}
	}
	public class JoinLogMessage : PlayerSpecificLogMessage
	{
		public string[] Tags { get; }

		internal JoinLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot, string[] tags)
			: base(parts, players, team, slot)
		{
			Tags = tags;
		}
	}
	public class LeaveLogMessage : PlayerSpecificLogMessage
	{
		internal LeaveLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot)
			: base(parts, players, team, slot)
		{
		}
	}
	public class LogMessage
	{
		public MessagePart[] Parts { get; }

		internal LogMessage(MessagePart[] parts)
		{
			Parts = parts;
		}

		public override string ToString()
		{
			if (Parts.Length == 1)
			{
				return Parts[0].Text;
			}
			StringBuilder stringBuilder = new StringBuilder();
			MessagePart[] parts = Parts;
			foreach (MessagePart messagePart in parts)
			{
				stringBuilder.Append(messagePart.Text);
			}
			return stringBuilder.ToString();
		}
	}
	public abstract class PlayerSpecificLogMessage : LogMessage
	{
		private PlayerInfo ActivePlayer { get; }

		public PlayerInfo Player { get; }

		public bool IsActivePlayer => Player == ActivePlayer;

		public bool IsRelatedToActivePlayer => ActivePlayer.IsRelatedTo(Player);

		internal PlayerSpecificLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot)
			: base(parts)
		{
			ActivePlayer = players.ActivePlayer ?? new PlayerInfo();
			Player = players.GetPlayerInfo(team, slot) ?? new PlayerInfo();
		}
	}
	public class ReleaseLogMessage : PlayerSpecificLogMessage
	{
		internal ReleaseLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot)
			: base(parts, players, team, slot)
		{
		}
	}
	public class ServerChatLogMessage : LogMessage
	{
		public string Message { get; }

		internal ServerChatLogMessage(MessagePart[] parts, string message)
			: base(parts)
		{
			Message = message;
		}
	}
	public class TagsChangedLogMessage : PlayerSpecificLogMessage
	{
		public string[] Tags { get; }

		internal TagsChangedLogMessage(MessagePart[] parts, IPlayerHelper players, int team, int slot, string[] tags)
			: base(parts, players, team, slot)
		{
			Tags = tags;
		}
	}
	public class TutorialLogMessage : LogMessage
	{
		internal TutorialLogMessage(MessagePart[] parts)
			: base(parts)
		{
		}
	}
}
namespace Archipelago.MultiClient.Net.Helpers
{
	public class ArchipelagoSocketHelper : BaseArchipelagoSocketHelper<ClientWebSocket>, IArchipelagoSocketHelper
	{
		public Uri Uri { get; }

		internal ArchipelagoSocketHelper(Uri hostUri)
			: base(CreateWebSocket(), 1024)
		{
			Uri = hostUri;
			SecurityProtocolType securityProtocolType = SecurityProtocolType.Tls13;
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | securityProtocolType;
		}

		private static ClientWebSocket CreateWebSocket()
		{
			return new ClientWebSocket();
		}

		public async Task ConnectAsync()
		{
			await ConnectToProvidedUri(Uri);
			StartPolling();
		}

		private async Task ConnectToProvidedUri(Uri uri)
		{
			if (uri.Scheme != "unspecified")
			{
				try
				{
					await Socket.ConnectAsync(uri, CancellationToken.None);
					return;
				}
				catch (Exception e)
				{
					OnError(e);
					throw;
				}
			}
			List<Exception> errors = new List<Exception>(0);
			try
			{
				await Socket.ConnectAsync(uri.AsWss(), CancellationToken.None);
				if (Socket.State == WebSocketState.Open)
				{
					return;
				}
			}
			catch (Exception item)
			{
				errors.Add(item);
				Socket = CreateWebSocket();
			}
			try
			{
				await Socket.ConnectAsync(uri.AsWs(), CancellationToken.None);
			}
			catch (Exception item2)
			{
				errors.Add(item2);
				OnError(new AggregateException(errors));
				throw;
			}
		}
	}
	public class BaseArchipelagoSocketHelper<T> where T : WebSocket
	{
		private static readonly ArchipelagoPacketConverter Converter = new ArchipelagoPacketConverter();

		private readonly BlockingCollection<Tuple<ArchipelagoPacketBase, TaskCompletionSource<bool>>> sendQueue = new BlockingCollection<Tuple<ArchipelagoPacketBase, TaskCompletionSource<bool>>>();

		internal T Socket;

		private readonly int bufferSize;

		public bool Connected
		{
			get
			{
				if (Socket.State != WebSocketState.Open)
				{
					return Socket.State == WebSocketState.CloseReceived;
				}
				return true;
			}
		}

		public event ArchipelagoSocketHelperDelagates.PacketReceivedHandler PacketReceived;

		public event ArchipelagoSocketHelperDelagates.PacketsSentHandler PacketsSent;

		public event ArchipelagoSocketHelperDelagates.ErrorReceivedHandler ErrorReceived;

		public event ArchipelagoSocketHelperDelagates.SocketClosedHandler SocketClosed;

		public event ArchipelagoSocketHelperDelagates.SocketOpenedHandler SocketOpened;

		internal BaseArchipelagoSocketHelper(T socket, int bufferSize = 1024)
		{
			Socket = socket;
			this.bufferSize = bufferSize;
		}

		internal void StartPolling()
		{
			if (this.SocketOpened != null)
			{
				this.SocketOpened();
			}
			Task.Run((Func<Task?>)PollingLoop);
			Task.Run((Func<Task?>)SendLoop);
		}

		private async Task PollingLoop()
		{
			byte[] buffer = new byte[bufferSize];
			while (Socket.State == WebSocketState.Open)
			{
				string message = null;
				try
				{
					message = await ReadMessageAsync(buffer);
				}
				catch (Exception e)
				{
					OnError(e);
				}
				OnMessageReceived(message);
			}
		}

		private async Task SendLoop()
		{
			while (Socket.State == WebSocketState.Open)
			{
				try
				{
					await HandleSendBuffer();
				}
				catch (Exception e)
				{
					OnError(e);
				}
				await Task.Delay(20);
			}
		}

		private async Task<string> ReadMessageAsync(byte[] buffer)
		{
			using MemoryStream readStream = new MemoryStream(buffer.Length);
			WebSocketReceiveResult result;
			do
			{
				result = await Socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
				if (result.MessageType == WebSocketMessageType.Close)
				{
					try
					{
						await Socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
					}
					catch
					{
					}
					OnSocketClosed();
				}
				else
				{
					readStream.Write(buffer, 0, result.Count);
				}
			}
			while (!result.EndOfMessage);
			return Encoding.UTF8.GetString(readStream.ToArray());
		}

		public async Task DisconnectAsync()
		{
			await Socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closure requested by client", CancellationToken.None);
			OnSocketClosed();
		}

		public void SendPacket(ArchipelagoPacketBase packet)
		{
			SendMultiplePackets(new List<ArchipelagoPacketBase> { packet });
		}

		public void SendMultiplePackets(List<ArchipelagoPacketBase> packets)
		{
			SendMultiplePackets(packets.ToArray());
		}

		public void SendMultiplePackets(params ArchipelagoPacketBase[] packets)
		{
			SendMultiplePacketsAsync(packets).Wait();
		}

		public Task SendPacketAsync(ArchipelagoPacketBase packet)
		{
			return SendMultiplePacketsAsync(new List<ArchipelagoPacketBase> { packet });
		}

		public Task SendMultiplePacketsAsync(List<ArchipelagoPacketBase> packets)
		{
			return SendMultiplePacketsAsync(packets.ToArray());
		}

		public Task SendMultiplePacketsAsync(params ArchipelagoPacketBase[] packets)
		{
			TaskCompletionSource<bool> taskCompletionSource = new TaskCompletionSource<bool>();
			foreach (ArchipelagoPacketBase item in packets)
			{
				sendQueue.Add(new Tuple<ArchipelagoPacketBase, TaskCompletionSource<bool>>(item, taskCompletionSource));
			}
			return taskCompletionSource.Task;
		}

		private async Task HandleSendBuffer()
		{
			List<ArchipelagoPacketBase> list = new List<ArchipelagoPacketBase>();
			List<TaskCompletionSource<bool>> tasks = new List<TaskCompletionSource<bool>>();
			Tuple<ArchipelagoPacketBase, TaskCompletionSource<bool>> tuple = sendQueue.Take();
			list.Add(tuple.Item1);
			tasks.Add(tuple.Item2);
			Tuple<ArchipelagoPacketBase, TaskCompletionSource<bool>> item;
			while (sendQueue.TryTake(out item))
			{
				list.Add(item.Item1);
				tasks.Add(item.Item2);
			}
			if (!list.Any())
			{
				return;
			}
			if (Socket.State != WebSocketState.Open)
			{
				throw new ArchipelagoSocketClosedException();
			}
			ArchipelagoPacketBase[] packets = list.ToArray();
			string s = JsonConvert.SerializeObject((object)packets);
			byte[] messageBuffer = Encoding.UTF8.GetBytes(s);
			int messagesCount = (int)Math.Ceiling((double)messageBuffer.Length / (double)bufferSize);
			for (int i = 0; i < messagesCount; i++)
			{
				int num = bufferSize * i;
				int num2 = bufferSize;
				bool endOfMessage = i + 1 == messagesCount;
				if (num2 * (i + 1) > messageBuffer.Length)
				{
					num2 = messageBuffer.Length - num;
				}
				await Socket.SendAsync(new ArraySegment<byte>(messageBuffer, num, num2), WebSocketMessageType.Text, endOfMessage, CancellationToken.None);
			}
			foreach (TaskCompletionSource<bool> item2 in tasks)
			{
				item2.TrySetResult(result: true);
			}
			OnPacketSend(packets);
		}

		private void OnPacketSend(ArchipelagoPacketBase[] packets)
		{
			try
			{
				if (this.PacketsSent != null)
				{
					this.PacketsSent(packets);
				}
			}
			catch (Exception e)
			{
				OnError(e);
			}
		}

		private void OnSocketClosed()
		{
			try
			{
				if (this.SocketClosed != null)
				{
					this.SocketClosed("");
				}
			}
			catch (Exception e)
			{
				OnError(e);
			}
		}

		private void OnMessageReceived(string message)
		{
			try
			{
				if (string.IsNullOrEmpty(message) || this.PacketReceived == null)
				{
					return;
				}
				List<ArchipelagoPacketBase> list = null;
				try
				{
					list = JsonConvert.DeserializeObject<List<ArchipelagoPacketBase>>(message, (JsonConverter[])(object)new JsonConverter[1] { Converter });
				}
				catch (Exception e)
				{
					OnError(e);
				}
				if (list == null)
				{
					return;
				}
				foreach (ArchipelagoPacketBase item in list)
				{
					this.PacketReceived(item);
				}
			}
			catch (Exception e2)
			{
				OnError(e2);
			}
		}

		protected void OnError(Exception e)
		{
			try
			{
				if (this.ErrorReceived != null)
				{
					this.ErrorReceived(e, e.Message);
				}
			}
			catch (Exception ex)
			{
				Console.Out.WriteLine("Error occured during reporting of errorOuter Errror: " + e.Message + " " + e.StackTrace + "Inner Errror: " + ex.Message + " " + ex.StackTrace);
			}
		}
	}
	public interface IConnectionInfoProvider
	{
		string Game { get; }

		int Team { get; }

		int Slot { get; }

		string[] Tags { get; }

		ItemsHandlingFlags ItemsHandlingFlags { get; }

		string Uuid { get; }

		void UpdateConnectionOptions(string[] tags);

		void UpdateConnectionOptions(ItemsHandlingFlags itemsHandlingFlags);

		void UpdateConnectionOptions(string[] tags, ItemsHandlingFlags itemsHandlingFlags);
	}
	public class ConnectionInfoHelper : IConnectionInfoProvider
	{
		private readonly IArchipelagoSocketHelper socket;

		public string Game { get; private set; }

		public int Team { get; private set; }

		public int Slot { get; private set; }

		public string[] Tags { get; internal set; }

		public ItemsHandlingFlags ItemsHandlingFlags { get; internal set; }

		public string Uuid { get; private set; }

		internal ConnectionInfoHelper(IArchipelagoSocketHelper socket)
		{
			this.socket = socket;
			Reset();
			socket.PacketReceived += PacketReceived;
		}

		private void PacketReceived(ArchipelagoPacketBase packet)
		{
			if (!(packet is ConnectedPacket connectedPacket))
			{
				if (packet is ConnectionRefusedPacket)
				{
					Reset();
				}
				return;
			}
			Team = connectedPacket.Team;
			Slot = connectedPacket.Slot;
			if (connectedPacket.SlotInfo != null && connectedPacket.SlotInfo.ContainsKey(Slot))
			{
				Game = connectedPacket.SlotInfo[Slot].Game;
			}
		}

		internal void SetConnectionParameters(string game, string[] tags, ItemsHandlingFlags itemsHandlingFlags, string uuid)
		{
			Game = game;
			Tags = tags ?? new string[0];
			ItemsHandlingFlags = itemsHandlingFlags;
			Uuid = uuid ?? Guid.NewGuid().ToString();
		}

		private void Reset()
		{
			Game = null;
			Team = -1;
			Slot = -1;
			Tags = new string[0];
			ItemsHandlingFlags = ItemsHandlingFlags.NoItems;
			Uuid = null;
		}

		public void UpdateConnectionOptions(string[] tags)
		{
			UpdateConnectionOptions(tags, ItemsHandlingFlags);
		}

		public void UpdateConnectionOptions(ItemsHandlingFlags itemsHandlingFlags)
		{
			UpdateConnectionOptions(Tags, ItemsHandlingFlags);
		}

		public void UpdateConnectionOptions(string[] tags, ItemsHandlingFlags itemsHandlingFlags)
		{
			SetConnectionParameters(Game, tags, itemsHandlingFlags, Uuid);
			socket.SendPacket(new ConnectUpdatePacket
			{
				Tags = Tags,
				ItemsHandling = ItemsHandlingFlags
			});
		}
	}
	public interface IDataStorageHelper : IDataStorageWrapper
	{
		DataStorageElement this[Scope scope, string key] { get; set; }

		DataStorageElement this[string key] { get; set; }
	}
	public class DataStorageHelper : IDataStorageHelper, IDataStorageWrapper
	{
		public delegate void DataStorageUpdatedHandler(JToken originalValue, JToken newValue, Dictionary<string, JToken> additionalArguments);

		private readonly Dictionary<string, DataStorageUpdatedHandler> onValueChangedEventHandlers = new Dictionary<string, DataStorageUpdatedHandler>();

		private readonly Dictionary<Guid, DataStorageUpdatedHandler> operationSpecificCallbacks = new Dictionary<Guid, DataStorageUpdatedHandler>();

		private readonly Dictionary<string, TaskCompletionSource<JToken>> asyncRetrievalTasks = new Dictionary<string, TaskCompletionSource<JToken>>();

		private readonly IArchipelagoSocketHelper socket;

		private readonly IConnectionInfoProvider connectionInfoProvider;

		public DataStorageElement this[Scope scope, string key]
		{
			get
			{
				return this[AddScope(scope, key)];
			}
			set
			{
				this[AddScope(scope, key)] = value;
			}
		}

		public DataStorageElement this[string key]
		{
			get
			{
				return new DataStorageElement(GetContextForKey(key));
			}
			set
			{
				SetValue(key, value);
			}
		}

		internal DataStorageHelper(IArchipelagoSocketHelper socket, IConnectionInfoProvider connectionInfoProvider)
		{
			this.socket = socket;
			this.connectionInfoProvider = connectionInfoProvider;
			socket.PacketReceived += OnPacketReceived;
		}

		private void OnPacketReceived(ArchipelagoPacketBase packet)
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Invalid comparison between Unknown and I4
			if (!(packet is RetrievedPacket retrievedPacket))
			{
				if (packet is SetReplyPacket setReplyPacket)
				{
					if (setReplyPacket.AdditionalArguments != null && setReplyPacket.AdditionalArguments.ContainsKey("Reference") && (int)setReplyPacket.AdditionalArguments["Reference"].Type == 8 && ((string)setReplyPacket.AdditionalArguments["Reference"]).TryParseNGuid(out var g) && operationSpecificCallbacks.TryGetValue(g, out var value))
					{
						value(setReplyPacket.OriginalValue, setReplyPacket.Value, setReplyPacket.AdditionalArguments);
						operationSpecificCallbacks.Remove(g);
					}
					if (onValueChangedEventHandlers.TryGetValue(setReplyPacket.Key, out var value2))
					{
						value2(setReplyPacket.OriginalValue, setReplyPacket.Value, setReplyPacket.AdditionalArguments);
					}
				}
				return;
			}
			foreach (KeyValuePair<string, JToken> datum in retrievedPacket.Data)
			{
				if (asyncRetrievalTasks.TryGetValue(datum.Key, out var value3))
				{
					value3.TrySetResult(datum.Value);
					asyncRetrievalTasks.Remove(datum.Key);
				}
			}
		}

		private Task<JToken> GetAsync(string key)
		{
			if (asyncRetrievalTasks.TryGetValue(key, out var value))
			{
				return value.Task;
			}
			TaskCompletionSource<JToken> taskCompletionSource = new TaskCompletionSource<JToken>();
			asyncRetrievalTasks[key] = taskCompletionSource;
			socket.SendPacketAsync(new GetPacket
			{
				Keys = new string[1] { key }
			});
			return taskCompletionSource.Task;
		}

		private void Initialize(string key, JToken value)
		{
			socket.SendPacketAsync(new SetPacket
			{
				Key = key,
				DefaultValue = value,
				Operations = new OperationSpecification[1]
				{
					new OperationSpecification
					{
						OperationType = OperationType.Default
					}
				}
			});
		}

		private JToken GetValue(string key)
		{
			Task<JToken> async = GetAsync(key);
			if (!async.Wait(TimeSpan.FromSeconds(2.0)))
			{
				throw new TimeoutException("Timed out retrieving data for key `" + key + "`. This may be due to an attempt to retrieve a value from the DataStorageHelper in a synchronous fashion from within a PacketReceived handler. When using the DataStorageHelper from within code which runs on the websocket thread then use the asynchronous getters. Ex: `DataStorageHelper[\"" + key + "\"].GetAsync().ContinueWith(x => {});`Be aware that DataStorageHelper calls tend to cause packet responses, so making a call from within a PacketReceived handler may cause an infinite loop.");
			}
			return async.Result;
		}

		private void SetValue(string key, DataStorageElement e)
		{
			if (key.StartsWith("_read_"))
			{
				throw new InvalidOperationException("DataStorage write operation on readonly key '" + key + "' is not allowed");
			}
			if (e == null)
			{
				e = new DataStorageElement(OperationType.Replace, (JToken)(object)JValue.CreateNull());
			}
			if (e.Context == null)
			{
				e.Context = GetContextForKey(key);
			}
			else if (e.Context.Key != key)
			{
				e.Operations.Insert(0, new OperationSpecification
				{
					OperationType = OperationType.Replace,
					Value = GetValue(e.Context.Key)
				});
			}
			Dictionary<string, JToken> dictionary = e.AdditionalArguments ?? new Dictionary<string, JToken>(0);
			if (e.Callbacks != null)
			{
				Guid key2 = Guid.NewGuid();
				operationSpecificCallbacks[key2] = e.Callbacks;
				dictionary["Reference"] = JToken.op_Implicit(key2.ToString("N"));
				socket.SendPacketAsync(new SetPacket
				{
					Key = key,
					Operations = e.Operations.ToArray(),
					WantReply = true,
					AdditionalArguments = dictionary
				});
			}
			else
			{
				socket.SendPacketAsync(new SetPacket
				{
					Key = key,
					Operations = e.Operations.ToArray(),
					AdditionalArguments = dictionary
				});
			}
		}

		private DataStorageElementContext GetContextForKey(string key)
		{
			return new DataStorageElementContext
			{
				Key = key,
				GetData = GetValue,
				GetAsync = GetAsync,
				Initialize = Initialize,
				AddHandler = AddHandler,
				RemoveHandler = RemoveHandler
			};
		}

		private void AddHandler(string key, DataStorageUpdatedHandler handler)
		{
			if (onValueChangedEventHandlers.ContainsKey(key))
			{
				Dictionary<string, DataStorageUpdatedHandler> dictionary = onValueChangedEventHandlers;
				dictionary[key] = (DataStorageUpdatedHandler)Delegate.Combine(dictionary[key], handler);
			}
			else
			{
				onValueChangedEventHandlers[key] = handler;
			}
			socket.SendPacketAsync(new SetNotifyPacket
			{
				Keys = new string[1] { key }
			});
		}

		private void RemoveHandler(string key, DataStorageUpdatedHandler handler)
		{
			if (onValueChangedEventHandlers.ContainsKey(key))
			{
				Dictionary<string, DataStorageUpdatedHandler> dictionary = onValueChangedEventHandlers;
				dictionary[key] = (DataStorageUpdatedHandler)Delegate.Remove(dictionary[key], handler);
				if (onValueChangedEventHandlers[key] == null)
				{
					onValueChangedEventHandlers.Remove(key);
				}
			}
		}

		private string AddScope(Scope scope, string key)
		{
			return scope switch
			{
				Scope.Global => key, 
				Scope.Game => $"{scope}:{connectionInfoProvider.Game}:{key}", 
				Scope.Team => $"{scope}:{connectionInfoProvider.Team}:{key}", 
				Scope.Slot => $"{scope}:{connectionInfoProvider.Slot}:{key}", 
				Scope.ReadOnly => "_read_" + key, 
				_ => throw new ArgumentOutOfRangeException("scope", scope, "Invalid scope for key " + key), 
			};
		}

		private DataStorageElement GetHintsElement(int? slot = null, int? team = null)
		{
			return this[Scope.ReadOnly, $"hints_{team ?? connectionInfoProvider.Team}_{slot ?? connectionInfoProvider.Slot}"];
		}

		private DataStorageElement GetSlotDataElement(int? slot = null)
		{
			return this[Scope.ReadOnly, $"slot_data_{slot ?? connectionInfoProvider.Slot}"];
		}

		private DataStorageElement GetItemNameGroupsElement(string game = null)
		{
			return this[Scope.ReadOnly, "item_name_groups_" + (game ?? connectionInfoProvider.Game)];
		}

		private DataStorageElement GetLocationNameGroupsElement(string game = null)
		{
			return this[Scope.ReadOnly, "location_name_groups_" + (game ?? connectionInfoProvider.Game)];
		}

		private DataStorageElement GetClientStatusElement(int? slot = null, int? team = null)
		{
			return this[Scope.ReadOnly, $"client_status_{team ?? connectionInfoProvider.Team}_{slot ?? connectionInfoProvider.Slot}"];
		}

		private DataStorageElement GetRaceModeElement()
		{
			return this[Scope.ReadOnly, "race_mode"];
		}

		public Hint[] GetHints(int? slot = null, int? team = null)
		{
			return GetHintsElement(slot, team).To<Hint[]>();
		}

		public Task<Hint[]> GetHintsAsync(int? slot = null, int? team = null)
		{
			return GetHintsElement(slot, team).GetAsync<Hint[]>();
		}

		public void TrackHints(Action<Hint[]> onHintsUpdated, bool retrieveCurrentlyUnlockedHints = true, int? slot = null, int? team = null)
		{
			GetHintsElement(slot, team).OnValueChanged += delegate(JToken _, JToken newValue, Dictionary<string, JToken> x)
			{
				onHintsUpdated(newValue.ToObject<Hint[]>());
			};
			if (retrieveCurrentlyUnlockedHints)
			{
				GetHintsAsync(slot, team).ContinueWith(delegate(Task<Hint[]> t)
				{
					onHintsUpdated(t.Result);
				});
			}
		}

		public Dictionary<string, object> GetSlotData(int? slot = null)
		{
			return GetSlotData<Dictionary<string, object>>(slot);
		}

		public T GetSlotData<T>(int? slot = null) where T : class
		{
			return GetSlotDataElement(slot).To<T>();
		}

		public Task<Dictionary<string, object>> GetSlotDataAsync(int? slot = null)
		{
			return GetSlotDataAsync<Dictionary<string, object>>(slot);
		}

		public Task<T> GetSlotDataAsync<T>(int? slot = null) where T : class
		{
			return GetSlotDataElement(slot).GetAsync<T>();
		}

		public Dictionary<string, string[]> GetItemNameGroups(string game = null)
		{
			return GetItemNameGroupsElement(game).To<Dictionary<string, string[]>>();
		}

		public Task<Dictionary<string, string[]>> GetItemNameGroupsAsync(string game = null)
		{
			return GetItemNameGroupsElement(game).GetAsync<Dictionary<string, string[]>>();
		}

		public Dictionary<string, string[]> GetLocationNameGroups(string game = null)
		{
			return GetLocationNameGroupsElement(game).To<Dictionary<string, string[]>>();
		}

		public Task<Dictionary<string, string[]>> GetLocationNameGroupsAsync(string game = null)
		{
			return GetLocationNameGroupsElement(game).GetAsync<Dictionary<string, string[]>>();
		}

		public ArchipelagoClientState GetClientStatus(int? slot = null, int? team = null)
		{
			return GetClientStatusElement(slot, team).To<ArchipelagoClientState?>().GetValueOrDefault();
		}

		public Task<ArchipelagoClientState> GetClientStatusAsync(int? slot = null, int? team = null)
		{
			return GetClientStatusElement(slot, team).GetAsync<ArchipelagoClientState?>().ContinueWith((Task<ArchipelagoClientState?> r) => r.Result.GetValueOrDefault());
		}

		public void TrackClientStatus(Action<ArchipelagoClientState> onStatusUpdated, bool retrieveCurrentClientStatus = true, int? slot = null, int? team = null)
		{
			Get

plugins/Newtonsoft.Json.dll

Decompiled 5 days ago
#define DEBUG
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Numerics;
using System.Reflection;
using System.Reflection.Emit;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Linq.JsonPath;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AllowPartiallyTrustedCallers]
[assembly: InternalsVisibleTo("Newtonsoft.Json.Schema")]
[assembly: InternalsVisibleTo("Newtonsoft.Json.Tests")]
[assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")]
[assembly: CLSCompliant(true)]
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
[assembly: AssemblyCompany("Newtonsoft")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyCopyright("Copyright © James Newton-King 2008")]
[assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")]
[assembly: AssemblyFileVersion("11.0.1")]
[assembly: AssemblyInformationalVersion("11.0.1-beta2+0eb477a285cdf06aa7bf5e103583768eba37fed6")]
[assembly: AssemblyProduct("Json.NET")]
[assembly: AssemblyTitle("Json.NET")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArchipelagoMW/Archipelago.MultiClient.Net.git")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: AssemblyVersion("11.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)]
	internal sealed class NotNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
	internal sealed class NotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public NotNullWhenAttribute(bool returnValue)
		{
			ReturnValue = returnValue;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)]
	internal sealed class MaybeNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)]
	internal sealed class AllowNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	internal class DoesNotReturnIfAttribute : Attribute
	{
		public bool ParameterValue { get; }

		public DoesNotReturnIfAttribute(bool parameterValue)
		{
			ParameterValue = parameterValue;
		}
	}
}
namespace Newtonsoft.Json
{
	public enum ConstructorHandling
	{
		Default,
		AllowNonPublicDefaultConstructor
	}
	public enum DateFormatHandling
	{
		IsoDateFormat,
		MicrosoftDateFormat
	}
	public enum DateParseHandling
	{
		None,
		DateTime,
		DateTimeOffset
	}
	public enum DateTimeZoneHandling
	{
		Local,
		Utc,
		Unspecified,
		RoundtripKind
	}
	public class DefaultJsonNameTable : JsonNameTable
	{
		private class Entry
		{
			internal readonly string Value;

			internal readonly int HashCode;

			internal Entry Next;

			internal Entry(string value, int hashCode, Entry next)
			{
				Value = value;
				HashCode = hashCode;
				Next = next;
			}
		}

		private static readonly int HashCodeRandomizer;

		private int _count;

		private Entry[] _entries;

		private int _mask = 31;

		static DefaultJsonNameTable()
		{
			HashCodeRandomizer = Environment.TickCount;
		}

		public DefaultJsonNameTable()
		{
			_entries = new Entry[_mask + 1];
		}

		public override string? Get(char[] key, int start, int length)
		{
			if (length == 0)
			{
				return string.Empty;
			}
			int num = length + HashCodeRandomizer;
			num += (num << 7) ^ key[start];
			int num2 = start + length;
			for (int i = start + 1; i < num2; i++)
			{
				num += (num << 7) ^ key[i];
			}
			num -= num >> 17;
			num -= num >> 11;
			num -= num >> 5;
			int num3 = num & _mask;
			Entry[] entries = _entries;
			for (Entry entry = entries[num3]; entry != null; entry = entry.Next)
			{
				if (entry.HashCode == num && TextEquals(entry.Value, key, start, length))
				{
					return entry.Value;
				}
			}
			return null;
		}

		public string Add(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			int length = key.Length;
			if (length == 0)
			{
				return string.Empty;
			}
			int num = length + HashCodeRandomizer;
			for (int i = 0; i < key.Length; i++)
			{
				num += (num << 7) ^ key[i];
			}
			num -= num >> 17;
			num -= num >> 11;
			num -= num >> 5;
			for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next)
			{
				if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal))
				{
					return entry.Value;
				}
			}
			return AddEntry(key, num);
		}

		private string AddEntry(string str, int hashCode)
		{
			int num = hashCode & _mask;
			Entry entry = new Entry(str, hashCode, _entries[num]);
			_entries[num] = entry;
			if (_count++ == _mask)
			{
				Grow();
			}
			return entry.Value;
		}

		private void Grow()
		{
			Entry[] entries = _entries;
			int num = _mask * 2 + 1;
			Entry[] array = new Entry[num + 1];
			for (int i = 0; i < entries.Length; i++)
			{
				Entry entry = entries[i];
				while (entry != null)
				{
					int num2 = entry.HashCode & num;
					Entry next = entry.Next;
					entry.Next = array[num2];
					array[num2] = entry;
					entry = next;
				}
			}
			_entries = array;
			_mask = num;
		}

		private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length)
		{
			if (str1.Length != str2Length)
			{
				return false;
			}
			for (int i = 0; i < str1.Length; i++)
			{
				if (str1[i] != str2[str2Start + i])
				{
					return false;
				}
			}
			return true;
		}
	}
	[Flags]
	public enum DefaultValueHandling
	{
		Include = 0,
		Ignore = 1,
		Populate = 2,
		IgnoreAndPopulate = 3
	}
	public enum FloatFormatHandling
	{
		String,
		Symbol,
		DefaultValue
	}
	public enum FloatParseHandling
	{
		Double,
		Decimal
	}
	public enum Formatting
	{
		None,
		Indented
	}
	public interface IArrayPool<T>
	{
		T[] Rent(int minimumLength);

		void Return(T[]? array);
	}
	public interface IJsonLineInfo
	{
		int LineNumber { get; }

		int LinePosition { get; }

		bool HasLineInfo();
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
	public sealed class JsonArrayAttribute : JsonContainerAttribute
	{
		private bool _allowNullItems;

		public bool AllowNullItems
		{
			get
			{
				return _allowNullItems;
			}
			set
			{
				_allowNullItems = value;
			}
		}

		public JsonArrayAttribute()
		{
		}

		public JsonArrayAttribute(bool allowNullItems)
		{
			_allowNullItems = allowNullItems;
		}

		public JsonArrayAttribute(string id)
			: base(id)
		{
		}
	}
	[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)]
	public sealed class JsonConstructorAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
	public abstract class JsonContainerAttribute : Attribute
	{
		internal bool? _isReference;

		internal bool? _itemIsReference;

		internal ReferenceLoopHandling? _itemReferenceLoopHandling;

		internal TypeNameHandling? _itemTypeNameHandling;

		private Type? _namingStrategyType;

		private object[]? _namingStrategyParameters;

		public string? Id { get; set; }

		public string? Title { get; set; }

		public string? Description { get; set; }

		public Type? ItemConverterType { get; set; }

		public object[]? ItemConverterParameters { get; set; }

		public Type? NamingStrategyType
		{
			get
			{
				return _namingStrategyType;
			}
			set
			{
				_namingStrategyType = value;
				NamingStrategyInstance = null;
			}
		}

		public object[]? NamingStrategyParameters
		{
			get
			{
				return _namingStrategyParameters;
			}
			set
			{
				_namingStrategyParameters = value;
				NamingStrategyInstance = null;
			}
		}

		internal NamingStrategy? NamingStrategyInstance { get; set; }

		public bool IsReference
		{
			get
			{
				return _isReference.GetValueOrDefault();
			}
			set
			{
				_isReference = value;
			}
		}

		public bool ItemIsReference
		{
			get
			{
				return _itemIsReference.GetValueOrDefault();
			}
			set
			{
				_itemIsReference = value;
			}
		}

		public ReferenceLoopHandling ItemReferenceLoopHandling
		{
			get
			{
				return _itemReferenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_itemReferenceLoopHandling = value;
			}
		}

		public TypeNameHandling ItemTypeNameHandling
		{
			get
			{
				return _itemTypeNameHandling.GetValueOrDefault();
			}
			set
			{
				_itemTypeNameHandling = value;
			}
		}

		protected JsonContainerAttribute()
		{
		}

		protected JsonContainerAttribute(string id)
		{
			Id = id;
		}
	}
	public static class JsonConvert
	{
		public static readonly string True = "true";

		public static readonly string False = "false";

		public static readonly string Null = "null";

		public static readonly string Undefined = "undefined";

		public static readonly string PositiveInfinity = "Infinity";

		public static readonly string NegativeInfinity = "-Infinity";

		public static readonly string NaN = "NaN";

		public static Func<JsonSerializerSettings>? DefaultSettings { get; set; }

		public static string ToString(DateTime value)
		{
			return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind);
		}

		public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling)
		{
			DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling);
			using StringWriter stringWriter = StringUtils.CreateStringWriter(64);
			stringWriter.Write('"');
			DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture);
			stringWriter.Write('"');
			return stringWriter.ToString();
		}

		public static string ToString(DateTimeOffset value)
		{
			return ToString(value, DateFormatHandling.IsoDateFormat);
		}

		public static string ToString(DateTimeOffset value, DateFormatHandling format)
		{
			using StringWriter stringWriter = StringUtils.CreateStringWriter(64);
			stringWriter.Write('"');
			DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture);
			stringWriter.Write('"');
			return stringWriter.ToString();
		}

		public static string ToString(bool value)
		{
			return value ? True : False;
		}

		public static string ToString(char value)
		{
			return ToString(char.ToString(value));
		}

		public static string ToString(Enum value)
		{
			return value.ToString("D");
		}

		public static string ToString(int value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(short value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(ushort value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(uint value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(long value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		private static string ToStringInternal(BigInteger value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(ulong value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(float value)
		{
			return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture));
		}

		internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable)
		{
			return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable);
		}

		private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable)
		{
			if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value)))
			{
				return text;
			}
			if (floatFormatHandling == FloatFormatHandling.DefaultValue)
			{
				return (!nullable) ? "0.0" : Null;
			}
			return quoteChar + text + quoteChar;
		}

		public static string ToString(double value)
		{
			return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture));
		}

		internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable)
		{
			return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable);
		}

		private static string EnsureDecimalPlace(double value, string text)
		{
			if (double.IsNaN(value) || double.IsInfinity(value) || text.IndexOf('.') != -1 || text.IndexOf('E') != -1 || text.IndexOf('e') != -1)
			{
				return text;
			}
			return text + ".0";
		}

		private static string EnsureDecimalPlace(string text)
		{
			if (text.IndexOf('.') != -1)
			{
				return text;
			}
			return text + ".0";
		}

		public static string ToString(byte value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(sbyte value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(decimal value)
		{
			return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture));
		}

		public static string ToString(Guid value)
		{
			return ToString(value, '"');
		}

		internal static string ToString(Guid value, char quoteChar)
		{
			string text = value.ToString("D", CultureInfo.InvariantCulture);
			string text2 = quoteChar.ToString(CultureInfo.InvariantCulture);
			return text2 + text + text2;
		}

		public static string ToString(TimeSpan value)
		{
			return ToString(value, '"');
		}

		internal static string ToString(TimeSpan value, char quoteChar)
		{
			return ToString(value.ToString(), quoteChar);
		}

		public static string ToString(Uri? value)
		{
			if (value == null)
			{
				return Null;
			}
			return ToString(value, '"');
		}

		internal static string ToString(Uri value, char quoteChar)
		{
			return ToString(value.OriginalString, quoteChar);
		}

		public static string ToString(string? value)
		{
			return ToString(value, '"');
		}

		public static string ToString(string? value, char delimiter)
		{
			return ToString(value, delimiter, StringEscapeHandling.Default);
		}

		public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling)
		{
			if (delimiter != '"' && delimiter != '\'')
			{
				throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter");
			}
			return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling);
		}

		public static string ToString(object? value)
		{
			if (value == null)
			{
				return Null;
			}
			return ConvertUtils.GetTypeCode(value.GetType()) switch
			{
				PrimitiveTypeCode.String => ToString((string)value), 
				PrimitiveTypeCode.Char => ToString((char)value), 
				PrimitiveTypeCode.Boolean => ToString((bool)value), 
				PrimitiveTypeCode.SByte => ToString((sbyte)value), 
				PrimitiveTypeCode.Int16 => ToString((short)value), 
				PrimitiveTypeCode.UInt16 => ToString((ushort)value), 
				PrimitiveTypeCode.Int32 => ToString((int)value), 
				PrimitiveTypeCode.Byte => ToString((byte)value), 
				PrimitiveTypeCode.UInt32 => ToString((uint)value), 
				PrimitiveTypeCode.Int64 => ToString((long)value), 
				PrimitiveTypeCode.UInt64 => ToString((ulong)value), 
				PrimitiveTypeCode.Single => ToString((float)value), 
				PrimitiveTypeCode.Double => ToString((double)value), 
				PrimitiveTypeCode.DateTime => ToString((DateTime)value), 
				PrimitiveTypeCode.Decimal => ToString((decimal)value), 
				PrimitiveTypeCode.DBNull => Null, 
				PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), 
				PrimitiveTypeCode.Guid => ToString((Guid)value), 
				PrimitiveTypeCode.Uri => ToString((Uri)value), 
				PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), 
				PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), 
				_ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), 
			};
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value)
		{
			return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Formatting formatting)
		{
			return SerializeObject(value, formatting, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, params JsonConverter[] converters)
		{
			JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings
			{
				Converters = converters
			} : null);
			return SerializeObject(value, null, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters)
		{
			JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings
			{
				Converters = converters
			} : null);
			return SerializeObject(value, null, formatting, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, JsonSerializerSettings? settings)
		{
			return SerializeObject(value, null, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			return SerializeObjectInternal(value, type, jsonSerializer);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings)
		{
			return SerializeObject(value, null, formatting, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			jsonSerializer.Formatting = formatting;
			return SerializeObjectInternal(value, type, jsonSerializer);
		}

		private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer)
		{
			StringBuilder sb = new StringBuilder(256);
			StringWriter stringWriter = new StringWriter(sb, CultureInfo.InvariantCulture);
			using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter))
			{
				jsonTextWriter.Formatting = jsonSerializer.Formatting;
				jsonSerializer.Serialize(jsonTextWriter, value, type);
			}
			return stringWriter.ToString();
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value)
		{
			return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value, JsonSerializerSettings settings)
		{
			return DeserializeObject(value, null, settings);
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value, Type type)
		{
			return DeserializeObject(value, type, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static T? DeserializeObject<T>(string value)
		{
			return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject)
		{
			return DeserializeObject<T>(value);
		}

		[DebuggerStepThrough]
		public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings)
		{
			return DeserializeObject<T>(value, settings);
		}

		[DebuggerStepThrough]
		public static T? DeserializeObject<T>(string value, params JsonConverter[] converters)
		{
			return (T)DeserializeObject(value, typeof(T), converters);
		}

		[DebuggerStepThrough]
		public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings)
		{
			return (T)DeserializeObject(value, typeof(T), settings);
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters)
		{
			JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings
			{
				Converters = converters
			} : null);
			return DeserializeObject(value, type, settings);
		}

		public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings)
		{
			ValidationUtils.ArgumentNotNull(value, "value");
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			if (!jsonSerializer.IsCheckAdditionalContentSet())
			{
				jsonSerializer.CheckAdditionalContent = true;
			}
			using JsonTextReader reader = new JsonTextReader(new StringReader(value));
			return jsonSerializer.Deserialize(reader, type);
		}

		[DebuggerStepThrough]
		public static void PopulateObject(string value, object target)
		{
			PopulateObject(value, target, null);
		}

		public static void PopulateObject(string value, object target, JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			using JsonReader jsonReader = new JsonTextReader(new StringReader(value));
			jsonSerializer.Populate(jsonReader, target);
			if (settings == null || !settings.CheckAdditionalContent)
			{
				return;
			}
			while (jsonReader.Read())
			{
				if (jsonReader.TokenType != JsonToken.Comment)
				{
					throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object.");
				}
			}
		}

		public static string SerializeXmlNode(XmlNode? node)
		{
			return SerializeXmlNode(node, Formatting.None);
		}

		public static string SerializeXmlNode(XmlNode? node, Formatting formatting)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter();
			return SerializeObject(node, formatting, xmlNodeConverter);
		}

		public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter
			{
				OmitRootObject = omitRootObject
			};
			return SerializeObject(node, formatting, xmlNodeConverter);
		}

		public static XmlDocument? DeserializeXmlNode(string value)
		{
			return DeserializeXmlNode(value, null);
		}

		public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName)
		{
			return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false);
		}

		public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute)
		{
			return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false);
		}

		public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter();
			xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName;
			xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute;
			xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters;
			return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter);
		}

		public static string SerializeXNode(XObject? node)
		{
			return SerializeXNode(node, Formatting.None);
		}

		public static string SerializeXNode(XObject? node, Formatting formatting)
		{
			return SerializeXNode(node, formatting, omitRootObject: false);
		}

		public static string SerializeXNode(XObject? node, Formatting formatting, bool omitRootObject)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter
			{
				OmitRootObject = omitRootObject
			};
			return SerializeObject(node, formatting, xmlNodeConverter);
		}

		public static XDocument? DeserializeXNode(string value)
		{
			return DeserializeXNode(value, null);
		}

		public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName)
		{
			return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false);
		}

		public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute)
		{
			return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false);
		}

		public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter();
			xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName;
			xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute;
			xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters;
			return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter);
		}
	}
	public abstract class JsonConverter
	{
		public virtual bool CanRead => true;

		public virtual bool CanWrite => true;

		public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer);

		public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer);

		public abstract bool CanConvert(Type objectType);
	}
	public abstract class JsonConverter<T> : JsonConverter
	{
		public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
		{
			if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T))))
			{
				throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T)));
			}
			WriteJson(writer, (T)value, serializer);
		}

		public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer);

		public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
		{
			bool flag = existingValue == null;
			if (!flag && !(existingValue is T))
			{
				throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T)));
			}
			return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer);
		}

		public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer);

		public sealed override bool CanConvert(Type objectType)
		{
			return typeof(T).IsAssignableFrom(objectType);
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)]
	public sealed class JsonConverterAttribute : Attribute
	{
		private readonly Type _converterType;

		public Type ConverterType => _converterType;

		public object[]? ConverterParameters { get; }

		public JsonConverterAttribute(Type converterType)
		{
			if (converterType == null)
			{
				throw new ArgumentNullException("converterType");
			}
			_converterType = converterType;
		}

		public JsonConverterAttribute(Type converterType, params object[] converterParameters)
			: this(converterType)
		{
			ConverterParameters = converterParameters;
		}
	}
	public class JsonConverterCollection : Collection<JsonConverter>
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
	public sealed class JsonDictionaryAttribute : JsonContainerAttribute
	{
		public JsonDictionaryAttribute()
		{
		}

		public JsonDictionaryAttribute(string id)
			: base(id)
		{
		}
	}
	[Serializable]
	public class JsonException : Exception
	{
		public JsonException()
		{
		}

		public JsonException(string message)
			: base(message)
		{
		}

		public JsonException(string message, Exception? innerException)
			: base(message, innerException)
		{
		}

		public JsonException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
		}

		internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message)
		{
			message = JsonPosition.FormatMessage(lineInfo, path, message);
			return new JsonException(message);
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
	public class JsonExtensionDataAttribute : Attribute
	{
		public bool WriteData { get; set; }

		public bool ReadData { get; set; }

		public JsonExtensionDataAttribute()
		{
			WriteData = true;
			ReadData = true;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
	public sealed class JsonIgnoreAttribute : Attribute
	{
	}
	public abstract class JsonNameTable
	{
		public abstract string? Get(char[] key, int start, int length);
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)]
	public sealed class JsonObjectAttribute : JsonContainerAttribute
	{
		private MemberSerialization _memberSerialization = MemberSerialization.OptOut;

		internal MissingMemberHandling? _missingMemberHandling;

		internal Required? _itemRequired;

		internal NullValueHandling? _itemNullValueHandling;

		public MemberSerialization MemberSerialization
		{
			get
			{
				return _memberSerialization;
			}
			set
			{
				_memberSerialization = value;
			}
		}

		public MissingMemberHandling MissingMemberHandling
		{
			get
			{
				return _missingMemberHandling.GetValueOrDefault();
			}
			set
			{
				_missingMemberHandling = value;
			}
		}

		public NullValueHandling ItemNullValueHandling
		{
			get
			{
				return _itemNullValueHandling.GetValueOrDefault();
			}
			set
			{
				_itemNullValueHandling = value;
			}
		}

		public Required ItemRequired
		{
			get
			{
				return _itemRequired.GetValueOrDefault();
			}
			set
			{
				_itemRequired = value;
			}
		}

		public JsonObjectAttribute()
		{
		}

		public JsonObjectAttribute(MemberSerialization memberSerialization)
		{
			MemberSerialization = memberSerialization;
		}

		public JsonObjectAttribute(string id)
			: base(id)
		{
		}
	}
	internal enum JsonContainerType
	{
		None,
		Object,
		Array,
		Constructor
	}
	internal struct JsonPosition
	{
		private static readonly char[] SpecialCharacters = new char[18]
		{
			'.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t',
			'\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029'
		};

		internal JsonContainerType Type;

		internal int Position;

		internal string? PropertyName;

		internal bool HasIndex;

		public JsonPosition(JsonContainerType type)
		{
			Type = type;
			HasIndex = TypeHasIndex(type);
			Position = -1;
			PropertyName = null;
		}

		internal int CalculateLength()
		{
			switch (Type)
			{
			case JsonContainerType.Object:
				return PropertyName.Length + 5;
			case JsonContainerType.Array:
			case JsonContainerType.Constructor:
				return MathUtils.IntLength((ulong)Position) + 2;
			default:
				throw new ArgumentOutOfRangeException("Type");
			}
		}

		internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer)
		{
			switch (Type)
			{
			case JsonContainerType.Object:
			{
				string propertyName = PropertyName;
				if (propertyName.IndexOfAny(SpecialCharacters) != -1)
				{
					sb.Append("['");
					if (writer == null)
					{
						writer = new StringWriter(sb);
					}
					JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer);
					sb.Append("']");
				}
				else
				{
					if (sb.Length > 0)
					{
						sb.Append('.');
					}
					sb.Append(propertyName);
				}
				break;
			}
			case JsonContainerType.Array:
			case JsonContainerType.Constructor:
				sb.Append('[');
				sb.Append(Position);
				sb.Append(']');
				break;
			}
		}

		internal static bool TypeHasIndex(JsonContainerType type)
		{
			return type == JsonContainerType.Array || type == JsonContainerType.Constructor;
		}

		internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition)
		{
			int num = 0;
			if (positions != null)
			{
				for (int i = 0; i < positions.Count; i++)
				{
					num += positions[i].CalculateLength();
				}
			}
			if (currentPosition.HasValue)
			{
				num += currentPosition.GetValueOrDefault().CalculateLength();
			}
			StringBuilder stringBuilder = new StringBuilder(num);
			StringWriter writer = null;
			char[] buffer = null;
			if (positions != null)
			{
				foreach (JsonPosition position in positions)
				{
					position.WriteTo(stringBuilder, ref writer, ref buffer);
				}
			}
			currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer);
			return stringBuilder.ToString();
		}

		internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message)
		{
			if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal))
			{
				message = message.Trim();
				if (!StringUtils.EndsWith(message, '.'))
				{
					message += ".";
				}
				message += " ";
			}
			message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path);
			if (lineInfo != null && lineInfo.HasLineInfo())
			{
				message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition);
			}
			message += ".";
			return message;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
	public sealed class JsonPropertyAttribute : Attribute
	{
		internal NullValueHandling? _nullValueHandling;

		internal DefaultValueHandling? _defaultValueHandling;

		internal ReferenceLoopHandling? _referenceLoopHandling;

		internal ObjectCreationHandling? _objectCreationHandling;

		internal TypeNameHandling? _typeNameHandling;

		internal bool? _isReference;

		internal int? _order;

		internal Required? _required;

		internal bool? _itemIsReference;

		internal ReferenceLoopHandling? _itemReferenceLoopHandling;

		internal TypeNameHandling? _itemTypeNameHandling;

		public Type? ItemConverterType { get; set; }

		public object[]? ItemConverterParameters { get; set; }

		public Type? NamingStrategyType { get; set; }

		public object[]? NamingStrategyParameters { get; set; }

		public NullValueHandling NullValueHandling
		{
			get
			{
				return _nullValueHandling.GetValueOrDefault();
			}
			set
			{
				_nullValueHandling = value;
			}
		}

		public DefaultValueHandling DefaultValueHandling
		{
			get
			{
				return _defaultValueHandling.GetValueOrDefault();
			}
			set
			{
				_defaultValueHandling = value;
			}
		}

		public ReferenceLoopHandling ReferenceLoopHandling
		{
			get
			{
				return _referenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_referenceLoopHandling = value;
			}
		}

		public ObjectCreationHandling ObjectCreationHandling
		{
			get
			{
				return _objectCreationHandling.GetValueOrDefault();
			}
			set
			{
				_objectCreationHandling = value;
			}
		}

		public TypeNameHandling TypeNameHandling
		{
			get
			{
				return _typeNameHandling.GetValueOrDefault();
			}
			set
			{
				_typeNameHandling = value;
			}
		}

		public bool IsReference
		{
			get
			{
				return _isReference.GetValueOrDefault();
			}
			set
			{
				_isReference = value;
			}
		}

		public int Order
		{
			get
			{
				return _order.GetValueOrDefault();
			}
			set
			{
				_order = value;
			}
		}

		public Required Required
		{
			get
			{
				return _required.GetValueOrDefault();
			}
			set
			{
				_required = value;
			}
		}

		public string? PropertyName { get; set; }

		public ReferenceLoopHandling ItemReferenceLoopHandling
		{
			get
			{
				return _itemReferenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_itemReferenceLoopHandling = value;
			}
		}

		public TypeNameHandling ItemTypeNameHandling
		{
			get
			{
				return _itemTypeNameHandling.GetValueOrDefault();
			}
			set
			{
				_itemTypeNameHandling = value;
			}
		}

		public bool ItemIsReference
		{
			get
			{
				return _itemIsReference.GetValueOrDefault();
			}
			set
			{
				_itemIsReference = value;
			}
		}

		public JsonPropertyAttribute()
		{
		}

		public JsonPropertyAttribute(string propertyName)
		{
			PropertyName = propertyName;
		}
	}
	public abstract class JsonReader : IDisposable
	{
		protected internal enum State
		{
			Start,
			Complete,
			Property,
			ObjectStart,
			Object,
			ArrayStart,
			Array,
			Closed,
			PostValue,
			ConstructorStart,
			Constructor,
			Error,
			Finished
		}

		private JsonToken _tokenType;

		private object? _value;

		internal char _quoteChar;

		internal State _currentState;

		private JsonPosition _currentPosition;

		private CultureInfo? _culture;

		private DateTimeZoneHandling _dateTimeZoneHandling;

		private int? _maxDepth;

		private bool _hasExceededMaxDepth;

		internal DateParseHandling _dateParseHandling;

		internal FloatParseHandling _floatParseHandling;

		private string? _dateFormatString;

		private List<JsonPosition>? _stack;

		protected State CurrentState => _currentState;

		public bool CloseInput { get; set; }

		public bool SupportMultipleContent { get; set; }

		public virtual char QuoteChar
		{
			get
			{
				return _quoteChar;
			}
			protected internal set
			{
				_quoteChar = value;
			}
		}

		public DateTimeZoneHandling DateTimeZoneHandling
		{
			get
			{
				return _dateTimeZoneHandling;
			}
			set
			{
				if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_dateTimeZoneHandling = value;
			}
		}

		public DateParseHandling DateParseHandling
		{
			get
			{
				return _dateParseHandling;
			}
			set
			{
				if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_dateParseHandling = value;
			}
		}

		public FloatParseHandling FloatParseHandling
		{
			get
			{
				return _floatParseHandling;
			}
			set
			{
				if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_floatParseHandling = value;
			}
		}

		public string? DateFormatString
		{
			get
			{
				return _dateFormatString;
			}
			set
			{
				_dateFormatString = value;
			}
		}

		public int? MaxDepth
		{
			get
			{
				return _maxDepth;
			}
			set
			{
				if (value <= 0)
				{
					throw new ArgumentException("Value must be positive.", "value");
				}
				_maxDepth = value;
			}
		}

		public virtual JsonToken TokenType => _tokenType;

		public virtual object? Value => _value;

		public virtual Type? ValueType => _value?.GetType();

		public virtual int Depth
		{
			get
			{
				int num = _stack?.Count ?? 0;
				if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None)
				{
					return num;
				}
				return num + 1;
			}
		}

		public virtual string Path
		{
			get
			{
				if (_currentPosition.Type == JsonContainerType.None)
				{
					return string.Empty;
				}
				JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null);
				return JsonPosition.BuildPath(_stack, currentPosition);
			}
		}

		public CultureInfo Culture
		{
			get
			{
				return _culture ?? CultureInfo.InvariantCulture;
			}
			set
			{
				_culture = value;
			}
		}

		public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync();
		}

		public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			if (TokenType == JsonToken.PropertyName)
			{
				await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
			}
			if (JsonTokenUtils.IsStartToken(TokenType))
			{
				int depth = Depth;
				while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth)
				{
				}
			}
		}

		internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken)
		{
			if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
			{
				throw CreateUnexpectedEndException();
			}
		}

		public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean());
		}

		public virtual Task<byte[]?> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes());
		}

		internal async Task<byte[]?> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken)
		{
			List<byte> buffer = new List<byte>();
			do
			{
				if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
				{
					SetToken(JsonToken.None);
				}
			}
			while (!ReadArrayElementIntoByteArrayReportDone(buffer));
			byte[] d = buffer.ToArray();
			SetToken(JsonToken.Bytes, d, updateIndex: false);
			return d;
		}

		public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime());
		}

		public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset());
		}

		public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal());
		}

		public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return Task.FromResult(ReadAsDouble());
		}

		public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32());
		}

		public virtual Task<string?> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString());
		}

		internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken)
		{
			bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
			if (flag)
			{
				flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
			}
			return flag;
		}

		internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken)
		{
			JsonToken tokenType = TokenType;
			JsonToken jsonToken = tokenType;
			if (jsonToken == JsonToken.None || jsonToken == JsonToken.Comment)
			{
				return MoveToContentFromNonContentAsync(cancellationToken);
			}
			return AsyncUtils.True;
		}

		private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken)
		{
			JsonToken jsonToken2;
			do
			{
				if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
				{
					return false;
				}
				JsonToken tokenType = TokenType;
				JsonToken jsonToken = tokenType;
				jsonToken2 = jsonToken;
			}
			while (jsonToken2 == JsonToken.None || jsonToken2 == JsonToken.Comment);
			return true;
		}

		internal JsonPosition GetPosition(int depth)
		{
			if (_stack != null && depth < _stack.Count)
			{
				return _stack[depth];
			}
			return _currentPosition;
		}

		protected JsonReader()
		{
			_currentState = State.Start;
			_dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
			_dateParseHandling = DateParseHandling.DateTime;
			_floatParseHandling = FloatParseHandling.Double;
			_maxDepth = 64;
			CloseInput = true;
		}

		private void Push(JsonContainerType value)
		{
			UpdateScopeWithFinishedValue();
			if (_currentPosition.Type == JsonContainerType.None)
			{
				_currentPosition = new JsonPosition(value);
				return;
			}
			if (_stack == null)
			{
				_stack = new List<JsonPosition>();
			}
			_stack.Add(_currentPosition);
			_currentPosition = new JsonPosition(value);
			if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth)
			{
				return;
			}
			_hasExceededMaxDepth = true;
			throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth));
		}

		private JsonContainerType Pop()
		{
			JsonPosition currentPosition;
			if (_stack != null && _stack.Count > 0)
			{
				currentPosition = _currentPosition;
				_currentPosition = _stack[_stack.Count - 1];
				_stack.RemoveAt(_stack.Count - 1);
			}
			else
			{
				currentPosition = _currentPosition;
				_currentPosition = default(JsonPosition);
			}
			if (_maxDepth.HasValue && Depth <= _maxDepth)
			{
				_hasExceededMaxDepth = false;
			}
			return currentPosition.Type;
		}

		private JsonContainerType Peek()
		{
			return _currentPosition.Type;
		}

		public abstract bool Read();

		public virtual int? ReadAsInt32()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				object value = Value;
				if (value is int value2)
				{
					return value2;
				}
				int num;
				if (value is BigInteger bigInteger)
				{
					num = (int)bigInteger;
				}
				else
				{
					try
					{
						num = Convert.ToInt32(value, CultureInfo.InvariantCulture);
					}
					catch (Exception ex)
					{
						throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex);
					}
				}
				SetToken(JsonToken.Integer, num, updateIndex: false);
				return num;
			}
			case JsonToken.String:
			{
				string s = (string)Value;
				return ReadInt32String(s);
			}
			default:
				throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal int? ReadInt32String(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (int.TryParse(s, NumberStyles.Integer, Culture, out var result))
			{
				SetToken(JsonToken.Integer, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual string? ReadAsString()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.String:
				return (string)Value;
			default:
				if (JsonTokenUtils.IsPrimitiveToken(contentToken))
				{
					object value = Value;
					if (value != null)
					{
						string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture));
						SetToken(JsonToken.String, text, updateIndex: false);
						return text;
					}
				}
				throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		public virtual byte[]? ReadAsBytes()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.StartObject:
			{
				ReadIntoWrappedTypeObject();
				byte[] array3 = ReadAsBytes();
				ReaderReadAndAssert();
				if (TokenType != JsonToken.EndObject)
				{
					throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
				}
				SetToken(JsonToken.Bytes, array3, updateIndex: false);
				return array3;
			}
			case JsonToken.String:
			{
				string text = (string)Value;
				Guid g;
				byte[] array2 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray()));
				SetToken(JsonToken.Bytes, array2, updateIndex: false);
				return array2;
			}
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Bytes:
				if (Value is Guid guid)
				{
					byte[] array = guid.ToByteArray();
					SetToken(JsonToken.Bytes, array, updateIndex: false);
					return array;
				}
				return (byte[])Value;
			case JsonToken.StartArray:
				return ReadArrayIntoByteArray();
			default:
				throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal byte[] ReadArrayIntoByteArray()
		{
			List<byte> list = new List<byte>();
			do
			{
				if (!Read())
				{
					SetToken(JsonToken.None);
				}
			}
			while (!ReadArrayElementIntoByteArrayReportDone(list));
			byte[] array = list.ToArray();
			SetToken(JsonToken.Bytes, array, updateIndex: false);
			return array;
		}

		private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer)
		{
			switch (TokenType)
			{
			case JsonToken.None:
				throw JsonReaderException.Create(this, "Unexpected end when reading bytes.");
			case JsonToken.Integer:
				buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture));
				return false;
			case JsonToken.EndArray:
				return true;
			case JsonToken.Comment:
				return false;
			default:
				throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
			}
		}

		public virtual double? ReadAsDouble()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				object value = Value;
				if (value is double value2)
				{
					return value2;
				}
				double num = ((!(value is BigInteger bigInteger) || 1 == 0) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger));
				SetToken(JsonToken.Float, num, updateIndex: false);
				return num;
			}
			case JsonToken.String:
				return ReadDoubleString((string)Value);
			default:
				throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal double? ReadDoubleString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result))
			{
				SetToken(JsonToken.Float, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual bool? ReadAsBoolean()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				bool flag = ((!(Value is BigInteger bigInteger) || 1 == 0) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L));
				SetToken(JsonToken.Boolean, flag, updateIndex: false);
				return flag;
			}
			case JsonToken.String:
				return ReadBooleanString((string)Value);
			case JsonToken.Boolean:
				return (bool)Value;
			default:
				throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal bool? ReadBooleanString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (bool.TryParse(s, out var result))
			{
				SetToken(JsonToken.Boolean, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual decimal? ReadAsDecimal()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				object value = Value;
				if (value is decimal value2)
				{
					return value2;
				}
				decimal num;
				if (value is BigInteger bigInteger)
				{
					num = (decimal)bigInteger;
				}
				else
				{
					try
					{
						num = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
					}
					catch (Exception ex)
					{
						throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex);
					}
				}
				SetToken(JsonToken.Float, num, updateIndex: false);
				return num;
			}
			case JsonToken.String:
				return ReadDecimalString((string)Value);
			default:
				throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal decimal? ReadDecimalString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result))
			{
				SetToken(JsonToken.Float, result, updateIndex: false);
				return result;
			}
			if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success)
			{
				SetToken(JsonToken.Float, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual DateTime? ReadAsDateTime()
		{
			switch (GetContentToken())
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Date:
				if (Value is DateTimeOffset dateTimeOffset)
				{
					SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false);
				}
				return (DateTime)Value;
			case JsonToken.String:
				return ReadDateTimeString((string)Value);
			default:
				throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
			}
		}

		internal DateTime? ReadDateTimeString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt))
			{
				dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
			{
				dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual DateTimeOffset? ReadAsDateTimeOffset()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Date:
				if (Value is DateTime dateTime)
				{
					SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false);
				}
				return (DateTimeOffset)Value;
			case JsonToken.String:
			{
				string s = (string)Value;
				return ReadDateTimeOffsetString(s);
			}
			default:
				throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal DateTimeOffset? ReadDateTimeOffsetString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt))
			{
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
			{
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		internal void ReaderReadAndAssert()
		{
			if (!Read())
			{
				throw CreateUnexpectedEndException();
			}
		}

		internal JsonReaderException CreateUnexpectedEndException()
		{
			return JsonReaderException.Create(this, "Unexpected end when reading JSON.");
		}

		internal void ReadIntoWrappedTypeObject()
		{
			ReaderReadAndAssert();
			if (Value != null && Value.ToString() == "$type")
			{
				ReaderReadAndAssert();
				if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal))
				{
					ReaderReadAndAssert();
					if (Value.ToString() == "$value")
					{
						return;
					}
				}
			}
			throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject));
		}

		public void Skip()
		{
			if (TokenType == JsonToken.PropertyName)
			{
				Read();
			}
			if (JsonTokenUtils.IsStartToken(TokenType))
			{
				int depth = Depth;
				while (Read() && depth < Depth)
				{
				}
			}
		}

		protected void SetToken(JsonToken newToken)
		{
			SetToken(newToken, null, updateIndex: true);
		}

		protected void SetToken(JsonToken newToken, object? value)
		{
			SetToken(newToken, value, updateIndex: true);
		}

		protected void SetToken(JsonToken newToken, object? value, bool updateIndex)
		{
			_tokenType = newToken;
			_value = value;
			switch (newToken)
			{
			case JsonToken.StartObject:
				_currentState = State.ObjectStart;
				Push(JsonContainerType.Object);
				break;
			case JsonToken.StartArray:
				_currentState = State.ArrayStart;
				Push(JsonContainerType.Array);
				break;
			case JsonToken.StartConstructor:
				_currentState = State.ConstructorStart;
				Push(JsonContainerType.Constructor);
				break;
			case JsonToken.EndObject:
				ValidateEnd(JsonToken.EndObject);
				break;
			case JsonToken.EndArray:
				ValidateEnd(JsonToken.EndArray);
				break;
			case JsonToken.EndConstructor:
				ValidateEnd(JsonToken.EndConstructor);
				break;
			case JsonToken.PropertyName:
				_currentState = State.Property;
				_currentPosition.PropertyName = (string)value;
				break;
			case JsonToken.Raw:
			case JsonToken.Integer:
			case JsonToken.Float:
			case JsonToken.String:
			case JsonToken.Boolean:
			case JsonToken.Null:
			case JsonToken.Undefined:
			case JsonToken.Date:
			case JsonToken.Bytes:
				SetPostValueState(updateIndex);
				break;
			case JsonToken.Comment:
				break;
			}
		}

		internal void SetPostValueState(bool updateIndex)
		{
			if (Peek() != 0 || SupportMultipleContent)
			{
				_currentState = State.PostValue;
			}
			else
			{
				SetFinished();
			}
			if (updateIndex)
			{
				UpdateScopeWithFinishedValue();
			}
		}

		private void UpdateScopeWithFinishedValue()
		{
			if (_currentPosition.HasIndex)
			{
				_currentPosition.Position++;
			}
		}

		private void ValidateEnd(JsonToken endToken)
		{
			JsonContainerType jsonContainerType = Pop();
			if (GetTypeForCloseToken(endToken) != jsonContainerType)
			{
				throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType));
			}
			if (Peek() != 0 || SupportMultipleContent)
			{
				_currentState = State.PostValue;
			}
			else
			{
				SetFinished();
			}
		}

		protected void SetStateBasedOnCurrent()
		{
			JsonContainerType jsonContainerType = Peek();
			switch (jsonContainerType)
			{
			case JsonContainerType.Object:
				_currentState = State.Object;
				break;
			case JsonContainerType.Array:
				_currentState = State.Array;
				break;
			case JsonContainerType.Constructor:
				_currentState = State.Constructor;
				break;
			case JsonContainerType.None:
				SetFinished();
				break;
			default:
				throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType));
			}
		}

		private void SetFinished()
		{
			_currentState = ((!SupportMultipleContent) ? State.Finished : State.Start);
		}

		private JsonContainerType GetTypeForCloseToken(JsonToken token)
		{
			return token switch
			{
				JsonToken.EndObject => JsonContainerType.Object, 
				JsonToken.EndArray => JsonContainerType.Array, 
				JsonToken.EndConstructor => JsonContainerType.Constructor, 
				_ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), 
			};
		}

		void IDisposable.Dispose()
		{
			Dispose(disposing: true);
			GC.SuppressFinalize(this);
		}

		protected virtual void Dispose(bool disposing)
		{
			if (_currentState != State.Closed && disposing)
			{
				Close();
			}
		}

		public virtual void Close()
		{
			_currentState = State.Closed;
			_tokenType = JsonToken.None;
			_value = null;
		}

		internal void ReadAndAssert()
		{
			if (!Read())
			{
				throw JsonSerializationException.Create(this, "Unexpected end when reading JSON.");
			}
		}

		internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter)
		{
			if (!ReadForType(contract, hasConverter))
			{
				throw JsonSerializationException.Create(this, "Unexpected end when reading JSON.");
			}
		}

		internal bool ReadForType(JsonContract? contract, bool hasConverter)
		{
			if (hasConverter)
			{
				return Read();
			}
			switch (contract?.InternalReadType ?? ReadType.Read)
			{
			case ReadType.Read:
				return ReadAndMoveToContent();
			case ReadType.ReadAsInt32:
				ReadAsInt32();
				break;
			case ReadType.ReadAsInt64:
			{
				bool result = ReadAndMoveToContent();
				if (TokenType == JsonToken.Undefined)
				{
					throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long)));
				}
				return result;
			}
			case ReadType.ReadAsDecimal:
				ReadAsDecimal();
				break;
			case ReadType.ReadAsDouble:
				ReadAsDouble();
				break;
			case ReadType.ReadAsBytes:
				ReadAsBytes();
				break;
			case ReadType.ReadAsBoolean:
				ReadAsBoolean();
				break;
			case ReadType.ReadAsString:
				ReadAsString();
				break;
			case ReadType.ReadAsDateTime:
				ReadAsDateTime();
				break;
			case ReadType.ReadAsDateTimeOffset:
				ReadAsDateTimeOffset();
				break;
			default:
				throw new ArgumentOutOfRangeException();
			}
			return TokenType != JsonToken.None;
		}

		internal bool ReadAndMoveToContent()
		{
			return Read() && MoveToContent();
		}

		internal bool MoveToContent()
		{
			JsonToken tokenType = TokenType;
			while (tokenType == JsonToken.None || tokenType == JsonToken.Comment)
			{
				if (!Read())
				{
					return false;
				}
				tokenType = TokenType;
			}
			return true;
		}

		private JsonToken GetContentToken()
		{
			JsonToken tokenType;
			do
			{
				if (!Read())
				{
					SetToken(JsonToken.None);
					return JsonToken.None;
				}
				tokenType = TokenType;
			}
			while (tokenType == JsonToken.Comment);
			return tokenType;
		}
	}
	[Serializable]
	public class JsonReaderException : JsonException
	{
		public int LineNumber { get; }

		public int LinePosition { get; }

		public string? Path { get; }

		public JsonReaderException()
		{
		}

		public JsonReaderException(string message)
			: base(message)
		{
		}

		public JsonReaderException(string message, Exception innerException)
			: base(message, innerException)
		{
		}

		public JsonReaderException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
		}

		public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException)
			: base(message, innerException)
		{
			Path = path;
			LineNumber = lineNumber;
			LinePosition = linePosition;
		}

		internal static JsonReaderException Create(JsonReader reader, string message)
		{
			return Create(reader, message, null);
		}

		internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex)
		{
			return Create(reader as IJsonLineInfo, reader.Path, message, ex);
		}

		internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex)
		{
			message = JsonPosition.FormatMessage(lineInfo, path, message);
			int lineNumber;
			int linePosition;
			if (lineInfo != null && lineInfo.HasLineInfo())
			{
				lineNumber = lineInfo.LineNumber;
				linePosition = lineInfo.LinePosition;
			}
			else
			{
				lineNumber = 0;
				linePosition = 0;
			}
			return new JsonReaderException(message, path, lineNumber, linePosition, ex);
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
	public sealed class JsonRequiredAttribute : Attribute
	{
	}
	[Serializable]
	public class JsonSerializationException : JsonException
	{
		public int LineNumber { get; }

		public int LinePosition { get; }

		public string? Path { get; }

		public JsonSerializationException()
		{
		}

		public JsonSerializationException(string message)
			: base(message)
		{
		}

		public JsonSerializationException(string message, Exception innerException)
			: base(message, innerException)
		{
		}

		public JsonSerializationException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
		}

		public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException)
			: base(message, innerException)
		{
			Path = path;
			LineNumber = lineNumber;
			LinePosition = linePosition;
		}

		internal static JsonSerializationException Create(JsonReader reader, string message)
		{
			return Create(reader, message, null);
		}

		internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex)
		{
			return Create(reader as IJsonLineInfo, reader.Path, message, ex);
		}

		internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex)
		{
			message = JsonPosition.FormatMessage(lineInfo, path, message);
			int lineNumber;
			int linePosition;
			if (lineInfo != null && lineInfo.HasLineInfo())
			{
				lineNumber = lineInfo.LineNumber;
				linePosition = lineInfo.LinePosition;
			}
			else
			{
				lineNumber = 0;
				linePosition = 0;
			}
			return new JsonSerializationException(message, path, lineNumber, linePosition, ex);
		}
	}
	public class JsonSerializer
	{
		internal TypeNameHandling _typeNameHandling;

		internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling;

		internal PreserveReferencesHandling _preserveReferencesHandling;

		internal ReferenceLoopHandling _referenceLoopHandling;

		internal MissingMemberHandling _missingMemberHandling;

		internal ObjectCreationHandling _objectCreationHandling;

		internal NullValueHandling _nullValueHandling;

		internal DefaultValueHandling _defaultValueHandling;

		internal ConstructorHandling _constructorHandling;

		internal MetadataPropertyHandling _metadataPropertyHandling;

		internal JsonConverterCollection? _converters;

		internal IContractResolver _contractResolver;

		internal ITraceWriter? _traceWriter;

		internal IEqualityComparer? _equalityComparer;

		internal ISerializationBinder _serializationBinder;

		internal StreamingContext _context;

		private IReferenceResolver? _referenceResolver;

		private Formatting? _formatting;

		private DateFormatHandling? _dateFormatHandling;

		private DateTimeZoneHandling? _dateTimeZoneHandling;

		private DateParseHandling? _dateParseHandling;

		private FloatFormatHandling? _floatFormatHandling;

		private FloatParseHandling? _floatParseHandling;

		private StringEscapeHandling? _stringEscapeHandling;

		private CultureInfo _culture;

		private int? _maxDepth;

		private bool _maxDepthSet;

		private bool? _checkAdditionalContent;

		private string? _dateFormatString;

		private bool _dateFormatStringSet;

		public virtual IReferenceResolver? ReferenceResolver
		{
			get
			{
				return GetReferenceResolver();
			}
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value", "Reference resolver cannot be null.");
				}
				_referenceResolver = value;
			}
		}

		[Obsolete("Binder is obsolete. Use SerializationBinder instead.")]
		public virtual SerializationBinder Binder
		{
			get
			{
				if (_serializationBinder is SerializationBinder result)
				{
					return result;
				}
				if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter)
				{
					return serializationBinderAdapter.SerializationBinder;
				}
				throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set.");
			}
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value", "Serialization binder cannot be null.");
				}
				_serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value);
			}
		}

		public virtual ISerializationBinder SerializationBinder
		{
			get
			{
				return _serializationBinder;
			}
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value", "Serialization binder cannot be null.");
				}
				_serializationBinder = value;
			}
		}

		public virtual ITraceWriter? TraceWriter
		{
			get
			{
				return _traceWriter;
			}
			set
			{
				_traceWriter = value;
			}
		}

		public virtual IEqualityComparer? EqualityComparer
		{
			get
			{
				return _equalityComparer;
			}
			set
			{
				_equalityComparer = value;
			}
		}

		public virtual TypeNameHandling TypeNameHandling
		{
			get
			{
				return _typeNameHandling;
			}
			set
			{
				if (value < TypeNameHandling.None || value > TypeNameHandling.Auto)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_typeNameHandling = value;
			}
		}

		[Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")]
		public virtual FormatterAssemblyStyle TypeNameAssemblyFormat
		{
			get
			{
				return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling;
			}
			set
			{
				if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value;
			}
		}

		public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling
		{
			get
			{
				return _typeNameAssemblyFormatHandling;
			}
			set
			{
				if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_typeNameAssemblyFormatHandling = value;
			}
		}

		public virtual PreserveReferencesHandling PreserveReferencesHandling
		{
			get
			{
				return _preserveReferencesHandling;
			}
			set
			{
				if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_preserveReferencesHandling = value;
			}
		}

		public virtual ReferenceLoopHandling ReferenceLoopHandling
		{
			get
			{
				return _referenceLoopHandling;
			}
			set
			{
				if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_referenceLoopHandling = value;
			}
		}

		public virtual MissingMemberHandling MissingMemberHandling
		{
			get
			{
				return _missingMemberHandling;
			}
			set
			{
				if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_missingMemberHandling = value;
			}
		}

		public virtual NullValueHandling NullValueHandling
		{
			get
			{
				return _nullValueHandling;
			}
			set
			{
				if (value < NullValueHandling.Include || value > NullValueHandling.Ignore)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_nullValueHandling = value;
			}
		}

		public virtual DefaultValueHandling DefaultValueHandling
		{
			get
			{
				return _defaultValueHandling;
			}
			set
			{
				if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_defaultValueHandling = value;
			}
		}

		public virtual ObjectCreationHandling ObjectCreationHandling
		{
			get
			{
				return _objectCreationHandling;
			}
			set
			{
				if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_objectCreationHandling = value;
			}
		}

		public virtual ConstructorHandling ConstructorHandling
		{
			get
			{
				return _constructorHandling;
			}
			set
			{
				if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_constructorHandling = value;
			}
		}

		public virtual MetadataPropertyHandling MetadataPropertyHandling
		{
			get
			{
				return _metadataPropertyHandling;
			}
			set
			{
				if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_metadataPropertyHandling = value;
			}
		}

		public virtual JsonConverterCollection Converters
		{
			get
			{
				if (_converters == null)
				{
					_converters = new JsonConverterCollection();
				}
				return _converters;
			}
		}

		public virtual IContractResolver ContractResolver
		{
			get
			{
				return _contractResolver;
			}
			set
			{
				_contractResolver = value ?? DefaultContractResolver.Instance;
			}
		}

		public virtual StreamingContext Context
		{
			get
			{
				return _context;
			}
			set
			{
				_context = value;
			}
		}

		public virtual Formatting Formatting
		{
			get
			{
				return _formatting.GetValueOrDefault();
			}
			set
			{
				_formatting = value;
			}
		}

		public virtual DateFormatHandling DateFormatHandling
		{
			get
			{
				return _dateFormatHandling.GetValueOrDefault();
			}
			set
			{
				_dateFormatHandling = value;
			}
		}

		public virtual DateTimeZoneHandling DateTimeZoneHandling
		{
			get
			{
				return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind;
			}
			set
			{
				_dateTimeZoneHandling = value;
			}
		}

		public virtual DateParseHandling DateParseHandling
		{
			get
			{
				return _dateParseHandling ?? DateParseHandling.DateTime;
			}
			set
			{
				_dateParseHandling = value;
			}
		}

		public virtual FloatParseHandling FloatParseHandling
		{
			get
			{
				return _floatParseHandling.GetValueOrDefault();
			}
			set
			{
				_floatParseHandling = value;
			}
		}

		public virtual FloatFormatHandling FloatFormatHandling
		{
			get
			{
				return _floatFormatHandling.GetValueOrDefault();
			}
			set
			{
				_floatFormatHandling = value;
			}
		}

		public virtual StringEscapeHandling StringEscapeHandling
		{
			get
			{
				return _stringEscapeHandling.GetValueOrDefault();
			}
			set
			{
				_stringEscapeHandling = value;
			}
		}

		public virtual string DateFormatString
		{
			get
			{
				return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
			}
			set
			{
				_dateFormatString = value;
				_dateFormatStringSet = true;
			}
		}

		public virtual CultureInfo Culture
		{
			get
			{
				return _culture ?? JsonSerializerSettings.DefaultCulture;
			}
			set
			{
				_culture = value;
			}
		}

		public virtual int? MaxDepth
		{
			get
			{
				return _maxDepth;
			}
			set
			{
				if (value <= 0)
				{
					throw new ArgumentException("Value must be positive.", "value");
				}
				_maxDepth = value;
				_maxDepthSet = true;
			}
		}

		public virtual bool CheckAdditionalContent
		{
			get
			{
				return _checkAdditionalContent.GetValueOrDefault();
			}
			set
			{
				_checkAdditionalContent = value;
			}
		}

		public virtual event EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs>? Error;

		internal bool IsCheckAdditionalContentSet()
		{
			return _checkAdditionalContent.HasValue;
		}

		public JsonSerializer()
		{
			_referenceLoopHandling = ReferenceLoopHandling.Error;
			_missingMemberHandling = MissingMemberHandling.Ignore;
			_nullValueHandling = NullValueHandling.Include;
			_defaultValueHandling = DefaultValueHandling.Include;
			_objectCreationHandling = ObjectCreationHandling.Auto;
			_preserveReferencesHandling = PreserveReferencesHandling.None;
			_constructorHandling = ConstructorHandling.Default;
			_typeNameHandling = TypeNameHandling.None;
			_metadataPropertyHandling = MetadataPropertyHandling.Default;
			_context = JsonSerializerSettings.DefaultContext;
			_serializationBinder = DefaultSerializationBinder.Instance;
			_culture = JsonSerializerSettings.DefaultCulture;
			_contractResolver = DefaultContractResolver.Instance;
		}

		public static JsonSerializer Create()
		{
			return new JsonSerializer();
		}

		public static JsonSerializer Create(JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = Create();
			if (settings != null)
			{
				ApplySerializerSettings(jsonSerializer, settings);
			}
			return jsonSerializer;
		}

		public static JsonSerializer CreateDefault()
		{
			JsonSerializerSettings settings = JsonConvert.DefaultSettings?.Invoke();
			return Create(settings);
		}

		public static JsonSerializer CreateDefault(JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = CreateDefault();
			if (settings != null)
			{
				ApplySerializerSettings(jsonSerializer, settings);
			}
			return jsonSerializer;
		}

		private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings)
		{
			if (!CollectionUtils.IsNullOrEmpty(settings.Converters))
			{
				for (int i = 0; i < settings.Converters.Count; i++)
				{
					serializer.Converters.Insert(i, settings.Converters[i]);
				}
			}
			if (settings._typeNameHandling.HasValue)
			{
				serializer.TypeNameHandling = settings.TypeNameHandling;
			}
			if (settings._metadataPropertyHandling.HasValue)
			{
				serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling;
			}
			if (settings._typeNameAssemblyFormatHandling.HasValue)
			{
				serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling;
			}
			if (settings._preserveReferencesHandling.HasValue)
			{
				serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling;
			}
			if (settings._referenceLoopHandling.HasValue)
			{
				serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling;
			}
			if (settings._missingMemberHandling.HasValue)
			{
				serializer.MissingMemberHandling = settings.MissingMemberHandling;
			}
			if (settings._objectCreationHandling.HasValue)
			{
				serializer.ObjectCreationHandling = settings.ObjectCreationHandling;
			}
			if (settings._nullValueHandling.HasValue)
			{
				serializer.NullValueHandling = settings.NullValueHandling;
			}
			if (settings._defaultValueHandling.HasValue)
			{
				serializer.DefaultValueHandling = settings.DefaultValueHandling;
			}
			if (settings._constructorHandling.HasValue)
			{
				serializer.ConstructorHandling = settings.ConstructorHandling;
			}
			if (settings._context.HasValue)
			{
				serializer.Context = settings.Context;
			}
			if (settings._checkAdditionalContent.HasValue)
			{
				serializer._checkAdditionalContent = settings._checkAdditionalContent;
			}
			if (settings.Error != null)
			{
				serializer.Error += settings.Error;
			}
			if (settings.ContractResolver != null)
			{
				serializer.ContractResolver = settings.ContractResolver;
			}
			if (settings.ReferenceResolverProvider != null)
			{
				serializer.ReferenceResolver = settings.ReferenceResolverProvider();
			}
			if (settings.TraceWriter != null)
			{
				serializer.TraceWriter = settings.TraceWriter;
			}
			if (settings.EqualityComparer != null)
			{
				serializer.EqualityComparer = settings.EqualityComparer;
			}
			if (settings.SerializationBinder != null)
			{
				serializer.SerializationBinder = settings.SerializationBinder;
			}
			if (settings._formatting.HasValue)
			{
				serializer._formatting = settings._formatting;
			}
			if (settings._dateFormatHandling.HasValue)
			{
				serializer._dateFormatHandling = settings._dateFormatHandling;
			}
			if (settings._dateTimeZoneHandling.HasValue)
			{
				serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling;
			}
			if (settings._dateParseHandling.HasValue)
			{
				serializer._dateParseHandling = settings._dateParseHandling;
			}
			if (settings._dateFormatStringSet)
			{
				serializer._dateFormatString = settings._dateFormatString;
				serializer._dateFormatStringSet = settings._dateFormatStringSet;
			}
			if (settings._floatFormatHandling.HasValue)
			{
				serializer._floatFormatHandling = settings._floatFormatHandling;
			}
			if (settings._floatParseHandling.HasValue)
			{
				serializer._floatParseHandling = settings._floatParseHandling;
			}
			if (settings._stringEscapeHandling.HasValue)
			{
				serializer._stringEscapeHandling = settings._stringEscapeHandling;
			}
			if (settings._culture != null)
			{
				serializer._culture = settings._culture;
			}
			if (settings._maxDepthSet)
			{
				serializer._maxDepth = settings._maxDepth;
				serializer._maxDepthSet = settings._maxDepthSet;
			}
		}

		[DebuggerStepThrough]
		public void Populate(TextReader reader, object target)
		{
			Populate(new JsonTextReader(reader), target);
		}

		[DebuggerStepThrough]
		public void Populate(JsonReader reader, object target)
		{
			PopulateInternal(reader, target);
		}

		internal virtual void PopulateInternal(JsonReader reader, object target)
		{
			ValidationUtils.ArgumentNotNull(reader, "reader");
			ValidationUtils.ArgumentNotNull(target, "target");
			SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString);
			TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null);
			JsonSerializerInternalReader jsonSerializerInternalReader = new JsonSerializerInternalReader(this);
			jsonSerializerInternalReader.Populate(traceJsonReader ?? reader, target);
			if (traceJsonReader != null)
			{
				TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null);
			}
			ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString);
		}

		[DebuggerStepThrough]
		public object? Deserialize(JsonReader reader)
		{
			return Deserialize(reader, null);
		}

		[DebuggerStepThrough]
		public object? Deserialize(TextReader reader, Type objectType)
		{
			return Deserialize(new JsonTextReader(reader), objectType);
		}

		[DebuggerStepThrough]
		public T? Deserialize<T>(JsonReader reader)
		{
			return (T)Deserialize(reader, typeof(T));
		}

		[DebuggerStepThrough]
		public object? Deserialize(JsonReader reader, Type? objectType)
		{
			return DeserializeInternal(reader, objectType);
		}

		internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType)
		{
			ValidationUtils.ArgumentNotNull(reader, "reader");
			SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString);
			TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null);
			JsonSerializerInternalReader jsonSerializerInternalReader = new JsonSerializerInternalReader(this);
			object result = jsonSerializerInternalReader.Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent);
			if (traceJsonReader != null)
			{
				TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null);
			}
			ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString);
			return result;
		}

		internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString)
		{
			if (_culture != null && !_culture.Equals(reader.Culture))
			{
				previousCulture = reader.Culture;
				reader.Culture = _culture;
			}
			else
			{
				previousCulture = null;
			}
			if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling)
			{
				previousDateTimeZoneHandling = reader.DateTimeZoneHandling;
				reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault();
			}
			else
			{
				previousDateTimeZoneHandling = null;
			}
			if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling)
			{
				previousDateParseHandling = reader.DateParseHandling;
				reader.DateParseHandling = _dateParseHandling.GetValueOrDefault();
			}
			else
			{
				previousDateParseHandling = null;
			}
			if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling)
			{
				previousFloatParseHandling = reader.FloatParseHandling;
				reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault();
			}
			else
			{
				previousFloatParseHandling = null;
			}
			if (_maxDepthSet && reader.MaxDepth != _maxDepth)
			{
				previousMaxDepth = reader.MaxDepth;
				reader.MaxDepth = _maxDepth;
			}
			else
			{
				previousMaxDepth = null;
			}
			if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString)
			{
				previousDateFormatString = reader.DateFormatString;
				reader.DateFormatString = _dateFormatString;
			}
			else
			{
				previousDateFormatString = null;
			}
			if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver)
			{
				jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable();
			}
		}

		private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString)
		{
			if (previousCulture != null)
			{
				reader.Culture = previousCulture;
			}
			if (previousDateTimeZoneHandling.HasValue)
			{
				reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault();
			}
			if (previousDateParseHandling.HasValue)
			{
				reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault();
			}
			if (previousFloatParseHandling.HasValue)
			{
				reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault();
			}
			if (_maxDepthSet)
			{
				reader.MaxDepth = previousMaxDepth;
			}
			if (_dateFormatStringSet)
			{
				reader.DateFormatString = previousDateFormatString;
			}
			if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable())
			{
				jsonTextReader.PropertyNameTable = null;
			}
		}

		public void Serialize(TextWriter textWriter, object? value)
		{
			Serialize(new JsonTextWriter(textWriter), value);
		}

		public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType)
		{
			SerializeInternal(jsonWriter, value, objectType);
		}

		public void Serialize(TextWriter textWriter, object? value, Type objectType)
		{
			Serialize(new JsonTextWriter(textWriter), value, objectType);
		}

		public void Serialize(JsonWriter jsonWriter, object? value)
		{
			SerializeInternal(jsonWriter, value, null);
		}

		private TraceJsonReader CreateTraceJsonReader(JsonReader reader)
		{
			TraceJsonReader traceJsonReader = new TraceJsonReader(reader);
			if (reader.TokenType != 0)
			{
				traceJsonReader.WriteCurrentToken();
			}
			return traceJsonReader;
		}

		internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType)
		{
			ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter");
			Formatting? formatting = null;
			if (_formatting.HasValue && jsonWriter.Formatting != _formatting)
			{
				formatting = jsonWriter.Formatting;
				jsonWriter.Formatting = _formatting.GetValueOrDefault();
			}
			DateFormatHandling? dateFormatHandling = null;
			if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling)
			{
				dateFormatHandling = jsonWriter.DateFormatHandling;
				jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault();
			}
			DateTimeZoneHandling? dateTimeZoneHandling = null;
			if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling)
			{
				dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling;
				jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault();
			}
			FloatFormatHandling? floatFormatHandling = null;
			if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling)
			{
				floatFormatHandling = jsonWriter.FloatFormatHandling;
				jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault();
			}
			StringEscapeHandling? stringEscapeHandling = null;
			if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling)
			{
				stringEscapeHandling = jsonWriter.StringEscapeHandling;
				jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault();
			}
			CultureInfo cultureInfo = null;
			if (_culture != null && !_culture.Equals(jsonWriter.Culture))
			{
				cultureInfo = jsonWriter.Culture;
				jsonWriter.Culture = _culture;
			}
			string dateFormatString = null;
			if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString)
			{
				dateFormatString = jsonWriter.DateFormatString;
				jsonWriter.DateFormatString = _dateFormatString;
			}
			TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null);
			JsonSerializerInternalWriter jsonSerializerInternalWriter = new JsonSerializerInternalWriter(this);
			jsonSerializerInternalWriter.Serialize(traceJsonWriter ?? jsonWriter, value, objectType);
			if (traceJsonWriter != null)
			{
				TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null);
			}
			if (formatting.HasValue)
			{
				jsonWriter.Formatting = formatting.GetValueOrDefault();
			}
			if (dateFormatHandling.HasValue)
			{
				jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault();
			}
			if (dateTimeZoneHandling.HasValue)
			{
				jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault();
			}
			if (floatFormatHandling.HasValue)
			{
				jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault();
			}
			if (stringEscapeHandling.HasValue)
			{
				jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault();
			}
			if (_dateFormatStringSet)
			{
				jsonWriter.DateFormatString = dateFormatString;
			}
			if (cultureInfo != null)
			{
				jsonWriter.Culture = cultureInfo;
			}
		}

		internal IReferenceResolver GetReferenceResolver()
		{
			if (_referenceResolver == null)
			{
				_referenceResolver = new DefaultReferenceResolver();
			}
			return _referenceResolver;
		}

		internal JsonConverter? GetMatchingConverter(Type type)
		{
			return GetMatchingConverter(_converters, type);
		}

		internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType)
		{
			ValidationUtils.ArgumentNotNull(objectType, "objectType");
			if (converters != null)
			{
				for (int i = 0; i < converters.Count; i++)
				{
					JsonConverter jsonConverter = converters[i];
					if (jsonConverter.CanConvert(objectType))
					{
						return jsonConverter;
					}
				}
			}
			return null;
		}

		internal void OnError(Newtonsoft.Json.Serialization.ErrorEventArgs e)
		{
			this.Error?.Invoke(this, e);
		}
	}
	public class JsonSerializerSettings
	{
		internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error;

		internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore;

		internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include;

		internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include;

		internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto;

		internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None;

		internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default;

		internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None;

		internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default;

		internal static readonly StreamingContext DefaultContext;

		internal const Formatting DefaultFormatting = Formatting.None;

		internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat;

		internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;

		internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime;

		internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double;

		internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String;

		internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default;

		internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple;

		internal static readonly CultureInfo DefaultCulture;

		internal const bool DefaultCheckAdditionalContent = false;

		internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";

		internal const int DefaultMaxDepth = 64;

		internal Formatting? _formatting;

		internal DateFormatHandling? _dateFormatHandling;

		internal DateTimeZoneHandling? _dateTimeZoneHandling;

		internal DateParseHandling? _dateParseHandling;

		internal FloatFormatHandling? _floatFormatHandling;

		internal FloatParseHandling? _floatParseHandling;

		internal StringEscapeHandling? _stringEscapeHandling;

		internal CultureInfo? _culture;

		internal bool? _checkAdditionalContent;

		internal int? _maxDepth;

		internal bool _maxDepthSet;

		internal string? _dateFormatString;

		internal bool _dateFormatStringSet;

		internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling;

		internal DefaultValueHandling? _defaultValueHandling;

		internal PreserveReferencesHandling? _preserveReferencesHandling;

		internal NullValueHandling? _nullValueHandling;

		internal ObjectCreationHandling? _objectCreationHandling;

		internal MissingMemberHandling? _missingMemberHandling;

		internal ReferenceLoopHandling? _referenceLoopHandling;

		internal StreamingContext? _context;

		internal ConstructorHandling? _constructorHandling;

		internal TypeNameHandling? _typeNameHandling;

		internal MetadataPropertyHandling? _metadataPropertyHandling;

		public ReferenceLoopHandling ReferenceLoopHandling
		{
			get
			{
				return _referenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_referenceLoopHandling = value;
			}
		}

		public MissingMemberHandling MissingMemberHandling
		{
			get
			{
				return _missingMemberHandling.GetValueOrDefault();
			}
			set
			{
				_missingMemberHandling = value;
			}
		}

		public ObjectCreationHandling ObjectCreationHandling
		{
			get
			{
				return _objectCreationHandling.GetValueOrDefault();
			}
			set
			{
				_objectCreationHandling = value;
			}
		}

		public NullValueHandling NullValueHandling
		{
			get
			{
				return _nullValueHandling.GetValueOrDefault();
			}
			set
			{
				_nullValueHandling = value;
			}
		}

		public DefaultValueHandling DefaultValueHandling
		{
			get
			{
				return _defaultValueHandling.GetValueOrDefault();
			}
			set
			{
				_defaultValueHandling = value;
			}
		}

		public IList<JsonConverter> Converters { get; set; }

		public PreserveReferencesHandling PreserveReferencesHandling
		{
			get
			{
				return _preserveReferencesHandling.GetValueOrDefault();
			}
			set
			{
				_preserveReferencesHandling = value;
			}
		}

		public TypeNameHandling TypeName

plugins/OutwardArchipelago.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using Archipelago.MultiClient.Net;
using Archipelago.MultiClient.Net.BounceFeatures.DeathLink;
using Archipelago.MultiClient.Net.Enums;
using Archipelago.MultiClient.Net.Exceptions;
using Archipelago.MultiClient.Net.Helpers;
using Archipelago.MultiClient.Net.MessageLog.Messages;
using Archipelago.MultiClient.Net.MessageLog.Parts;
using Archipelago.MultiClient.Net.Models;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using NodeCanvas.DialogueTrees;
using NodeCanvas.Framework;
using NodeCanvas.Tasks.Actions;
using OutwardArchipelago.Archipelago;
using OutwardArchipelago.Archipelago.APItemGivers;
using OutwardArchipelago.Dialogue;
using OutwardArchipelago.Dialogue.Actions;
using OutwardArchipelago.Dialogue.Builders.Actions;
using OutwardArchipelago.Dialogue.Builders.BBParameters;
using OutwardArchipelago.Dialogue.Builders.Conditions;
using OutwardArchipelago.Dialogue.Builders.Nodes;
using OutwardArchipelago.Dialogue.Builders.Statements;
using OutwardArchipelago.Dialogue.Conditions;
using OutwardArchipelago.Dialogue.Patches;
using OutwardArchipelago.QuestEvents;
using OutwardArchipelago.Utils;
using ParadoxNotion;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("OutwardArchipelago")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OutwardArchipelago")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c5450fe0-edcf-483f-b9ea-4b1ef9d36da7")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.0.0")]
[module: UnverifiableCode]
public class RgbShaderEffect : MonoBehaviour
{
	public float Speed = 0.5f;

	public float Intensity = 2f;

	private MeshRenderer _renderer;

	private int _emissionID;

	private void Awake()
	{
		_renderer = ((Component)this).GetComponentInChildren<MeshRenderer>();
		_emissionID = Shader.PropertyToID("_Color");
	}

	private void Update()
	{
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)_renderer == (Object)null))
		{
			float num = Mathf.Repeat(Time.time * Speed, 1f);
			Color val = Color.HSVToRGB(num, 1f, 1f);
			((Renderer)_renderer).material.SetColor(_emissionID, val * Intensity);
		}
	}
}
namespace OutwardArchipelago
{
	internal class ChatPanelManager
	{
		private static readonly ChatPanelManager _instance = new ChatPanelManager();

		public static ChatPanelManager Instance => _instance;

		private ChatPanelManager()
		{
		}

		public void SendSystemMessage(string message, Character character = null)
		{
			if (character == null)
			{
				character = CharacterManager.Instance.GetFirstLocalCharacter();
			}
			ChatPanel chatPanel = character.CharacterUI.ChatPanel;
			ChatEntry val;
			if (chatPanel.m_messageArchive.Count < chatPanel.MaxMessageCount)
			{
				val = Object.Instantiate<ChatEntry>(UIUtilities.ChatEntryPrefab);
				((Component)val).transform.SetParent((Transform)(object)chatPanel.m_chatDisplay.content);
				UnityEngineExtensions.ResetLocal(((Component)val).transform, true);
				((UIElement)val).SetCharacterUI(((UIElement)chatPanel).m_characterUI);
				chatPanel.m_messageArchive.Insert(0, val);
			}
			else
			{
				val = chatPanel.m_messageArchive[chatPanel.m_messageArchive.Count - 1];
				chatPanel.m_messageArchive.RemoveAt(chatPanel.m_messageArchive.Count - 1);
				chatPanel.m_messageArchive.Insert(0, val);
			}
			if (val != null)
			{
				((Component)chatPanel.m_messageArchive[0]).transform.SetAsLastSibling();
				if (val.m_lblPlayerName != null)
				{
					val.m_lblPlayerName.text = string.Empty;
				}
				if (val.m_lblMessage != null)
				{
					val.m_lblMessage.text = message;
				}
			}
			chatPanel.m_lastHideTime = Time.time;
			if (!((UIElement)chatPanel).IsDisplayed)
			{
				((UIElement)chatPanel).Show();
			}
			((MonoBehaviour)chatPanel).Invoke("DelayedScroll", 0.1f);
		}

		public bool ChatPanel_SendChatMessage(ChatPanel chatPanel)
		{
			string text = chatPanel.m_chatEntry.text;
			if (text.StartsWith("/ap ", StringComparison.InvariantCultureIgnoreCase))
			{
				string message = text.Substring("/ap ".Length);
				ArchipelagoConnector.Instance.Messages.SendMessage(message);
				chatPanel.m_chatEntry.text = string.Empty;
				chatPanel.HideInput();
				return false;
			}
			return true;
		}
	}
	internal class LocationCheckQuestEventAddedListener : IQuestEventAddedListener
	{
		[HarmonyPatch(typeof(QuestEventManager), "Awake")]
		public static class QuestEventManager_Awake
		{
			private static void Postfix(QuestEventManager __instance)
			{
				OutwardArchipelagoMod.Log.LogDebug((object)"QuestEventManager Awake postfix called.");
				RegisterAll();
			}
		}

		public string OutwardEventId { get; private set; }

		public APWorld.Location Location { get; private set; }

		public int StackCount { get; private set; }

		public LocationCheckQuestEventAddedListener(string outwardEventId, APWorld.Location location, int stackCount = 1)
		{
			OutwardEventId = outwardEventId;
			Location = location;
			StackCount = stackCount;
		}

		public void OnQuestEventAdded(QuestEventData _eventData)
		{
			OutwardArchipelagoMod.Log.LogInfo((object)("LocationCheckQuestEventAddedListener received OnQuestEventAdded for EventUID = " + _eventData.EventUID + "."));
			if (string.Equals(_eventData.EventUID, OutwardEventId, StringComparison.Ordinal) && _eventData.StackCount >= StackCount)
			{
				OutwardArchipelagoMod.Log.LogInfo((object)("LocationCheckQuestEventAddedListener triggered for EventUID = " + OutwardEventId + "."));
				ArchipelagoConnector.Instance.Locations.Complete(Location);
			}
		}

		public void Register()
		{
			OutwardArchipelagoMod.Log.LogInfo((object)("Registering LocationCheckQuestEventAddedListener for OutwardEventId = " + OutwardEventId + "."));
			QuestEventManager.Instance.RegisterOnQEAddedListener(OutwardEventId, (IQuestEventAddedListener)(object)this);
		}

		private static void RegisterAll()
		{
			if (!Object.op_Implicit((Object)(object)QuestEventManager.Instance))
			{
				return;
			}
			OutwardArchipelagoMod.Log.LogInfo((object)"Registering all LocationCheckQuestEventAddedListeners.");
			List<LocationCheckQuestEventAddedListener> list = new List<LocationCheckQuestEventAddedListener>
			{
				new LocationCheckQuestEventAddedListener("HteYicnCK0atCgd4j5TV1Q", APWorld.Location.QuestMain01),
				new LocationCheckQuestEventAddedListener("ZYzrMi1skUiJ4BgXXQ3sfw", APWorld.Location.QuestMain02),
				new LocationCheckQuestEventAddedListener("P2rqNERqN0O1RhkD1ff7_w", APWorld.Location.QuestMain03),
				new LocationCheckQuestEventAddedListener("HbTd6ustoU-VhQeidJcAEw", APWorld.Location.QuestMain04),
				new LocationCheckQuestEventAddedListener("Wl08NWMJokemPVfTEyT3UA", APWorld.Location.QuestMain05),
				new LocationCheckQuestEventAddedListener("Og71f8G5a0eVmLxZB0yOKg", APWorld.Location.QuestMain06),
				new LocationCheckQuestEventAddedListener("1nGk1TyMbUi3VmSdn32zCg", APWorld.Location.QuestMain07),
				new LocationCheckQuestEventAddedListener("uEg8NE3nckWyTs_Y7jSTrQ", APWorld.Location.QuestMain08),
				new LocationCheckQuestEventAddedListener("kXbeBrICkEWs8GS6YTfKRA", APWorld.Location.QuestMain09),
				new LocationCheckQuestEventAddedListener("QVkuDH0_nkKwVNaCEy5Zww", APWorld.Location.QuestMain10),
				new LocationCheckQuestEventAddedListener("hedPnIOK20iOKSVgWk8cFw", APWorld.Location.QuestMain11),
				new LocationCheckQuestEventAddedListener("gSCCl5ZSXkC-2awJWrCAFw", APWorld.Location.QuestMain12),
				new LocationCheckQuestEventAddedListener("dFHmqMB8fEuUB0qRW", APWorld.Location.QuestParallelBloodUnderTheSun),
				new LocationCheckQuestEventAddedListener("cScnPPdRMEKaGZXNS4-gyQ", APWorld.Location.QuestParallelPurifier),
				new LocationCheckQuestEventAddedListener("HQkEW3Dz2U-MFBNzI73tqg", APWorld.Location.QuestParallelPurifier),
				new LocationCheckQuestEventAddedListener("WvGjemEntk6quLjy4rLrJQ", APWorld.Location.QuestParallelPurifier),
				new LocationCheckQuestEventAddedListener("3ghaq31OMECM4M-WdFnGcQ", APWorld.Location.QuestMinorAcquireMana),
				new LocationCheckQuestEventAddedListener("awSSujcoqUWqbbzX1ZjJXQ", APWorld.Location.QuestMinorArcaneMachine),
				new LocationCheckQuestEventAddedListener("DGExeNT-PE-ML4c654P9pA", APWorld.Location.QuestMinorCraftBlueSandArmor),
				new LocationCheckQuestEventAddedListener("MOSnQaJ9aUi8VNaciTKQHg", APWorld.Location.QuestMinorCraftCopalAndPetrifiedArmor),
				new LocationCheckQuestEventAddedListener("ap4aHgZ2aUKQh_rvXgulJg", APWorld.Location.QuestMinorCraftPalladiumArmor),
				new LocationCheckQuestEventAddedListener("uogu2mPV_k-JOYNGnU6jqw", APWorld.Location.QuestMinorCraftTsarAndTenebrousArmor),
				new LocationCheckQuestEventAddedListener("TgeCOUjVVEqbAr5Yn4iEkA", APWorld.Location.QuestMinorCraftAntiquePlateGarbArmor),
				new LocationCheckQuestEventAddedListener("fXICR4YvV0-v-fjujtU4tA", APWorld.Location.QuestMinorLostMerchant),
				new LocationCheckQuestEventAddedListener("ANSbO0nz7EiswqDPr3iMeQ", APWorld.Location.QuestMinorPurifyTheWater),
				new LocationCheckQuestEventAddedListener("x7hF_Sx8BEWFuEOf3KohGQ", APWorld.Location.QuestMinorRedIdol),
				new LocationCheckQuestEventAddedListener("FVym6FbQp0SCJA4jtY9Ldw", APWorld.Location.QuestMinorSilverForTheSlums, 5)
			};
			foreach (LocationCheckQuestEventAddedListener item in list)
			{
				item.Register();
			}
		}
	}
	[BepInPlugin("com.daemonarium.apoutward", "Outward Archipelago", "0.1.0")]
	public class OutwardArchipelagoMod : BaseUnityPlugin
	{
		public const string GUID = "com.daemonarium.apoutward";

		public const string NAME = "Outward Archipelago";

		public const string VERSION = "0.1.0";

		public static OutwardArchipelagoMod Instance;

		internal static ManualLogSource Log;

		public static ConfigEntry<string> ArchipelagoHost;

		public static ConfigEntry<int> ArchipelagoPort;

		public static ConfigEntry<string> ArchipelagoPassword;

		public static ConfigEntry<string> ArchipelagoSlotName;

		private bool hasInitializedScene = true;

		public bool IsInMainMenu => Global.Lobby.PlayersInLobbyCount == 0;

		public bool IsArchipelagoEnabled => PhotonNetwork.isMasterClient;

		public bool IsInGame => !IsInMainMenu && NetworkLevelLoader.Instance.IsOverallLoadingDone && !NetworkLevelLoader.Instance.IsGameplayPaused;

		public bool IsInArchipelagoGame => IsArchipelagoEnabled && IsInGame;

		private void BindConfig()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			ArchipelagoHost = ((BaseUnityPlugin)this).Config.Bind<string>("Archipelago", "Host", "archipelago.gg", "Archipelago server host name.");
			ArchipelagoPort = ((BaseUnityPlugin)this).Config.Bind<int>("Archipelago", "Port", 38281, new ConfigDescription("Archipelago server port.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 65535), Array.Empty<object>()));
			ArchipelagoPassword = ((BaseUnityPlugin)this).Config.Bind<string>("Archipelago", "Password", "", "The password to use when logging into the Archipelago server. Leave blank for no password.");
			ArchipelagoSlotName = ((BaseUnityPlugin)this).Config.Bind<string>("Archipelago", "Slot", "Player1", "The name of the slot to connect to on the Archipelago server.");
		}

		internal void Awake()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogMessage((object)"Starting Outward Archipelago 0.1.0...");
			BindConfig();
			new Harmony("com.daemonarium.apoutward").PatchAll();
			ArchipelagoConnector.Create();
			DialoguePatcher.Instance.Awake();
			SceneManager.sceneLoaded += OnSceneLoaded;
			Log.LogMessage((object)"Outward Archipelago 0.1.0 started successfully");
		}

		internal void Update()
		{
			if (!hasInitializedScene && IsInGame)
			{
				if (IsArchipelagoEnabled && NetworkLevelLoader.Instance.LevelLoadedForFirstTime)
				{
					InitScene();
				}
				hasInitializedScene = true;
			}
		}

		public byte[] LoadAsset(string fileName)
		{
			string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "assets", fileName);
			if (File.Exists(text))
			{
				return File.ReadAllBytes(text);
			}
			Log.LogError((object)("Could not find asset at: " + text));
			return null;
		}

		public string GetLocalizedModString(string key)
		{
			string text = "com.daemonarium.apoutward." + key;
			string result = default(string);
			if (!LocalizationManager.Instance.TryGetLoc(text, ref result))
			{
				Log.LogError((object)("Failed to find localized string: " + text));
				return "[LOC] " + text;
			}
			return result;
		}

		private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			hasInitializedScene = false;
		}

		private void InitScene()
		{
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			Item[] array = ItemManager.Instance.WorldItems.Values.ToArray();
			Item[] array2 = array;
			foreach (Item val in array2)
			{
				if (!((Object)(object)val != (Object)null))
				{
					continue;
				}
				Transform transform = ((Component)val).transform;
				if (((transform != null) ? transform.parent : null) == null || !APWorld.ItemToLocation.TryGetValue(val.ItemID, out var value))
				{
					continue;
				}
				bool flag = true;
				Transform val2 = ((Component)val).transform;
				while ((Object)(object)val2 != (Object)null)
				{
					if (((Object)val2).name == "Content" || ((Object)val2).name == "EquipmentSlots" || ((Object)val2).name.StartsWith("PlayerChar "))
					{
						flag = false;
						break;
					}
					val2 = val2.parent;
				}
				if (flag)
				{
					List<string> list = new List<string>();
					Transform val3 = ((Component)val).transform;
					while ((Object)(object)val3 != (Object)null)
					{
						list.Add(((Object)val3).name);
						val3 = val3.parent;
					}
					Log.LogInfo((object)string.Format("world spawned item ({0}) associated with location ({1}) with transform {2}; replacing with AP Item", val.ItemID, value, string.Join(" > ", list)));
					Item val4 = ItemManager.Instance.GenerateItemNetwork(8861511);
					val4.SetSideData("AP_Location", value);
					val4.ChangeParent(((Component)val).transform.parent, ((Component)val).transform.position, ((Component)val).transform.rotation);
					ItemManager.Instance.DestroyItem(val);
				}
			}
		}
	}
	internal static class OutwardItem
	{
		internal const int AnglerShield = 2300365;

		internal const int AntiquePlateBoots = 3100252;

		internal const int AntiquePlateGarb = 3100250;

		internal const int AntiquePlateSallet = 3100251;

		internal const int APItem = 8861511;

		internal const int BlueSandArmor = 3100080;

		internal const int BlueSandBoots = 3100082;

		internal const int BlueSandHelm = 3100081;

		internal const int Brand = 2000150;

		internal const int BrassWolfBackpack = 5300070;

		internal const int CandlePlateArmor = 3100040;

		internal const int CandlePlateBoots = 3100042;

		internal const int CandlePlateHelm = 3100041;

		internal const int CeremonialBow = 2200190;

		internal const int CompasswoodStaff = 2150030;

		internal const int CopalArmor = 3000160;

		internal const int CopalBoots = 3000162;

		internal const int CopalHelm = 3000161;

		internal const int CrackedRedMoon = 2150180;

		internal const int CrimsonPlateArmor = 3100090;

		internal const int CrimsonPlateBoots = 3100092;

		internal const int CrimsonPlateMask = 3100091;

		internal const int CrimsonShield = 2300130;

		internal const int DepoweredBludgeon = 2120270;

		internal const int DistortedExperiment = 5110111;

		internal const int DjinnsLamp = 5100110;

		internal const int DreamerHalberd = 2140120;

		internal const int Duty = 2150175;

		internal const int ExperimentalChakram = 5110112;

		internal const int FabulousPalladiumShield = 2300171;

		internal const int FossilizedGreataxe = 2110260;

		internal const int GepsBlade = 2000310;

		internal const int GepsLongblade = 2100305;

		internal const int GhostParallel = 2120275;

		internal const int GildedShiverOfTramontane = 5110345;

		internal const int GlowstoneBackpack = 5300050;

		internal const int GoldLichArmor = 3000210;

		internal const int GoldLichBoots = 3000212;

		internal const int GoldLichClaymore = 2100050;

		internal const int GoldLichKnuckles = 2160050;

		internal const int GoldLichMace = 2020060;

		internal const int GoldLichMask = 3000211;

		internal const int GoldLichShield = 2300100;

		internal const int GoldLichSpear = 2130060;

		internal const int GoldLichSword = 2000080;

		internal const int Grind = 2110265;

		internal const int JadeLichBoots = 3000043;

		internal const int JadeLichMace = 2020030;

		internal const int JadeLichMask = 3000041;

		internal const int JadeLichRobes = 3000040;

		internal const int JadeLichStaff = 2150010;

		internal const int JadeScimitar = 2000120;

		internal const int KrypteiaTombKey = 5600032;

		internal const int LightMendersBackpack = 5300170;

		internal const int LightMendersLexicon = 5100510;

		internal const int MefinosTradeBackpack = 5300030;

		internal const int MertonsFirepoker = 2020070;

		internal const int MertonsRibcage = 3200030;

		internal const int MertonsShinbones = 3200032;

		internal const int MertonsSkull = 3200031;

		internal const int Murmure = 2200191;

		internal const int MyrmitaurHavenGateKey = 5600175;

		internal const int MysteriousBlade = 2000320;

		internal const int MysteriousChakram = 5110070;

		internal const int MysteriousLongblade = 2100300;

		internal const int OrnateBoneShield = 2300180;

		internal const int PalladiumArmor = 3100060;

		internal const int PalladiumBoots = 3100062;

		internal const int PalladiumHelm = 3100061;

		internal const int PeacemakerElixir = 4300270;

		internal const int PearlescentMail = 3000150;

		internal const int PetrifiedWoodArmor = 3100020;

		internal const int PetrifiedWoodBoots = 3100022;

		internal const int PetrifiedWoodHelm = 3100021;

		internal const int PillarGreathammer = 2120070;

		internal const int PorcelainFists = 2160090;

		internal const int PreservationBackpack = 5300160;

		internal const int RadiantWolfSword = 2000031;

		internal const int RedLadysDagger = 5110002;

		internal const int RevenantMoon = 2150185;

		internal const int RotwoodStaff = 2150031;

		internal const int RoyalGreatKhopesh = 2100150;

		internal const int RuinedHalberd = 2150170;

		internal const int RustedSpear = 2130310;

		internal const int RustLichArmor = 3000360;

		internal const int RustLichBoots = 3000362;

		internal const int RustLichHelmet = 3000361;

		internal const int Sandrose = 2010285;

		internal const int ScarletBoots = 3100482;

		internal const int ScarletGem = 4400110;

		internal const int ScarletLichsIdol = 5600030;

		internal const int ScarletMask = 3100481;

		internal const int ScarletRobes = 3100480;

		internal const int ScarredDagger = 5110340;

		internal const int ScepterOfTheCruelPriest = 2020335;

		internal const int SealedMace = 2020330;

		internal const int Shriek = 2130315;

		internal const int SkycrownMace = 2020140;

		internal const int SlumberingShield = 2300360;

		internal const int SmellySealedBox = 5600174;

		internal const int StarchildClaymore = 2100100;

		internal const int StrangeRustedSword = 2000151;

		internal const int SunfallAxe = 2010070;

		internal const int TenebrousArmor = 3000140;

		internal const int TenebrousBoots = 3000142;

		internal const int TenebrousHelm = 3000141;

		internal const int ThriceWroughtHalberd = 2140060;

		internal const int Tokebakicit = 2160235;

		internal const int TsarArmor = 3100140;

		internal const int TsarBoots = 3100142;

		internal const int TsarBow = 2200100;

		internal const int TsarChakram = 5110097;

		internal const int TsarFists = 2160100;

		internal const int TsarHelm = 3100141;

		internal const int UnusualKnuckles = 2160230;

		internal const int WarmAxe = 2010280;

		internal const int WerligSpear = 2130021;

		internal const int WillOWisp = 2300600;

		internal const int WorldedgeGreataxe = 2110100;

		internal const int ZagisArmor = 3100031;

		internal const int ZagisMask = 3100030;

		internal const int ZagisSaw = 2100030;

		internal const int ZhornsDemonShield = 2300030;

		internal const int ZhornsGlowstoneDagger = 5110005;

		internal const int ZhornsHuntingBackpack = 5300180;
	}
	internal static class OutwardItemSideData
	{
		internal const string KEY_PREFIX = "__side_data_";

		public static void SetSideData<T>(this Item item, string key, T value)
		{
			item.m_tempExtraData[SafeKey(key)] = Base64SafeEncoder<T>.Default.Encode(value);
		}

		public static T GetSideData<T>(this Item item, string key)
		{
			return Base64SafeDecoder<T>.Default.Decode(item.m_tempExtraData[SafeKey(key)]);
		}

		public static bool TryGetSideData<T>(this Item item, string key, out T value)
		{
			if (item.m_tempExtraData.TryGetValue(SafeKey(key), out var value2))
			{
				value = Base64SafeDecoder<T>.Default.Decode(value2);
				return true;
			}
			value = default(T);
			return false;
		}

		private static string SafeKey(string key)
		{
			return "__side_data_" + Base64SafeEncoder<string>.Default.Encode(key);
		}
	}
	internal static class OutwardQuestEvents
	{
		public const string _Defeat_BootStealerGolem = "MgB4Mh0qAkCR_zlanuNsKg";

		public const string _Defeat_CaravanerRescue_Saved = "2vz-SZkKU0mpscbarv9kZg";

		public const string _Defeat_CaravanerRescueEscape_Ephemeral = "MaNShNU9sES3LxTU0tR7BA";

		public const string _Defeat_CaravanerRescueGuardDeath = "O57Vn-IXZkOLH0z0f5EKwA";

		public const string _Defeat_CaravanerRescueTimer = "ivZiQK_N-kynGo5WByVkXA";

		public const string _Defeat_HorrorAndGhost = "DXzUo6k5PEWWe3rM-TWGzw";

		public const string _Defeat_StampedingPhyto = "BP4ldwl8gUGPcYTeUjGzCQ";

		public const string _Defeat_SwampSavior_Saved = "i6sXev2ZzECrl-aHCQlabg";

		public const string _Defeat_SwampSavior_Triggered = "yX2fvNy5Ak2qAYZOas7v-g";

		public const string _Defeat_UndercityGoonsActive = "7a1tA5Ecs0eovw8aX6P9rA";

		public const string _Defeat_UndercityGoonsHostile = "FrQ7gW38Xk-32IL4UnaUGA";

		public const string _Defeat_UndercityGoonsLOCKED = "EapmIK8UwUiJ7WTAUaBkAA";

		public const string _Defeat_UndercityGoonsPaid = "JrgKnTGTYkSnqOSjnkr_dQ";

		public const string _Defeat_UndercityGoonsQuestGiven = "P0w2aTujF0-kbI3KmyllxQ";

		public const string _Defed_HMQ2_exits = "KXj2w5-XCEquGsKDjuZ-Lg";

		public const string _DefEd_PurifierTimedOut = "0IiJ0XwxzEaA9-aq4Lo-xQ";

		public const string _Expedition_Timer = "oJmIo-MhpEqmY_RsK9U6mw";

		public const string _GhostAshesP1_Saved = "I5M6hUNkkU-tFwTI2hshQw";

		public const string _GhostAshesP2_Ashes = "Q_6RyTn7ZEaeHHE2bScrcg";

		public const string _GhostAshesP3_Complete = "FQNZBMYZDUWaxiBeLYje8Q";

		public const string _Samples_Handed_In = "YfjkyMAQsUm6a2ubuh76UA";

		public const string _TotemWorkshopsUnlocked = "uWyfl7A8NU-NOGawhdduyQ";

		public const string _Vendavel_BriberyEscape = "9Id0yEZSqUa-HsvG6zftCQ";

		public const string _Vendavel_CookTimer = "zhwGCJsVS0G7sPmm831D1w";

		public const string _Vendavel_GuardBackstoryAid = "czPyV3yNf02i3VrVeaEg1w";

		public const string _Vendavel_HostilityReset = "fK1IzYgaV0WBx0d602rh_A";

		public const string _Vendavel_InnWarning = "OM1HWvsGCES60Z9qeYs_uQ";

		public const string _Vendavel_Slaves_Escaped = "IiJ8YEx-hkyF-w8GySaDMw";

		public const string AccursedWendigoDeath = "kAhGzaGtYky90rR_iZH7WQ";

		public const string ACHV_CalderaBossesCleared = "RKGyXCLzdkSiZGQAXQeq1A";

		public const string ACHV_UArenaA_BeastGolem = "UAt-JYPZO0aZYNEP8IT4Cw";

		public const string ACHV_UArenaA_Calixa = "NedSZBRkGUqfjkud_6JfKQ";

		public const string ACHV_UArenaA_Shark = "jlGyRS_byk6P6XCvDidZKQ";

		public const string ACHV_UArenaAP_BoozuProudBest = "XyxXMVP87Ea6_uB_8Xpy5Q";

		public const string ACHV_UArenaAP_CageBoss = "nzVXvcXFxkWNgtKPDwSMyg";

		public const string ACHV_UArenaAP_EliteSupremeShell = "H3zDib2oVESDiw9QHZvKMQ";

		public const string ACHV_UArenaC_BrandHero = "Hny2viqjlk2OxkeqUCIbHg";

		public const string ACHV_UArenaC_EliteShrimp = "C8eNY9hi9kmBOgHmzQVWEw";

		public const string ACHV_UArenaC_TrogQueen = "qTNrgMxVJE6lEqQUjkHu4w";

		public const string ACHV_UArenaCa_Crimson = "Eu-LQALYsUCGfHQKhkwFmg";

		public const string ACHV_UArenaCa_Gargoyles = "88wUtLAJWUKwjqW8GxUhig";

		public const string ACHV_UArenaCa_Grandmother = "Dh98R2q8J0O0Bl1Ra8xzPQ";

		public const string ACHV_UArenaCa_Torcrab = "-JaQQcDH10qZg1doTPPj-Q";

		public const string ACHV_UArenaE_FireMan = "k899xEO3zU6qQUAgEcZXwQ";

		public const string ACHV_UArenaE_Immaculate = "K4T6bphch0OK_wnroZL3pg";

		public const string ACHV_UArenaE_Liches = "h-DN3vhiREeVn0A0qhKYcQ";

		public const string ACHV_UArenaH_Giants = "uSLt7J9r-0WVbr6K70ZBsQ";

		public const string ACHV_UArenaH_Priest = "KCM3RNwz9UCj3SgytTHwwg";

		public const string ACHV_UArenaH_Tuano = "ScMoZkp2XEiJoLmuUJkE7Q";

		public const string AfterBattle_Immaculate_Defeated_Q4 = "Kp716bN-p0ODGUe1_Sp5-g";

		public const string AfterBattle_MercenaryChief_Defeated_Q4 = "l0LF2l5j4UmT6_WhhrF6aQ";

		public const string Akiyuki_Met = "NNnP2K2KVU2HjqmZAjnfQg";

		public const string Akiyuki_Trained = "mjJgr4fEN02l53EWTE43Ng";

		public const string AlteredGargoyleDeath = "B3imiPWmJE-eUBDUEmF9Aw";

		public const string AnalyzeWater = "phYSIbhMbUCkIGG5Nhulsg";

		public const string AncPeace_AgressifBattleborn = "_ZoYiXnjckmCoSPEf3fnqA";

		public const string AncPeace_BetterReward = "dCqaEXRpI0m16TbNF-G0hg";

		public const string AncPeace_CouncilChecked = "kfcuDzXmn0SnSqoR9Uz0DA";

		public const string AncPeace_DeathBattleborn = "XI6FrYs-VUSmKTQuVN9F2A";

		public const string AncPeace_DefeatedByShellHorror = "vstF8FsBHUSGuBANS5fb8Q";

		public const string AncPeace_DefeatFromBattleborn = "cL_IvJSCFEWagDwmq-m6gg";

		public const string AncPeace_DiscipleDeathBatch1 = "5i4mxMMM1UuDW1f92CE13Q";

		public const string AncPeace_DiscipleDeathBatch2 = "HkZaMwgcDEKoGah1zEuftQ";

		public const string AncPeace_DoneRamza = "fKonyAf-yEyTKkVovRJOkQ";

		public const string AncPeace_DoneSagard = "lcTSMPygZkCkw_N0Bh7kIQ";

		public const string AncPeace_Elixir = "0sEVDox_FUWTGAA3W8lW5g";

		public const string AncPeace_EventGive = "bT0m0H6Fd0GSMnadiP37CA";

		public const string AncPeace_FailBattleborn = "M4r4R8hH0Ey8hZalHbj7dw";

		public const string AncPeace_FailNegociation = "SVWmR2edtkKxacn6J5J9Eg";

		public const string AncPeace_FailRamza = "dJJBXv0s6k6id0prsgKeMQ";

		public const string AncPeace_GoodReward = "icCGRD0mkUy89p-rWTKKng";

		public const string AncPeace_GotFinalReward = "PeySuUam6UGq6rzHRAgQ4g";

		public const string AncPeace_MetGiants = "Va1qKuew3UyfiG4iWZHI1A";

		public const string AncPeace_MetPower = "oJfvHJTMX0q4yspT5LKjEg";

		public const string AncPeace_NegociationDone = "0y4f5zTcmUKqRT7zMUkZPw";

		public const string AncPeace_NegociationPower = "CJH-TTxIJUy8Ayc65kUYfA";

		public const string AncPeace_PoorRewad = "pKNaTj_OLEWg5Wb0bkT_lQ";

		public const string AncPeace_ReadyToDefend = "sauvg_41hU2TtEcHgzl1Ow";

		public const string AncPeace_RewardChoice = "bFwzATL0zkqxX7KpIYgX6Q";

		public const string AncPeace_RewardTime = "2SiNTZYpnEyuPzPRta2qVA";

		public const string AncPeace_SagardFight = "RHoYMSFgIUaC6WiF5DYJ2A";

		public const string AncPeace_ShellDeath = "bRGI2Ws5DEm0Xy6S-Hcumw";

		public const string AncPeace_StartedRissa = "TgLS5hK3fE-pofU_R730ww";

		public const string AncPeace_SuccessBattleborn = "ge4uFxQLPku1yCssyKDJtg";

		public const string AncPeace_SuccessRamza = "s1cho7sD1kyq4rfA-YxEPQ";

		public const string AncPeace_Tablet = "-6GebSgBm0mbUPIc9AZFUQ";

		public const string AncPeace_Timeout = "Ut_b4qIDZUmEcxTjirr7JA";

		public const string AncPeace_Tsar = "kaqjB8zJ1U6sKxW2KRYQhQ";

		public const string AngryWolf = "fdYpPsIx00ybETUTaV8Hcw";

		public const string AnnoyingTroglodyteDeath = "DyOKE1ha0ky4L8po2Qx1Sg";

		public const string Argenson_Furax = "t7BcyPBUFEmdcEfe5UZhzA";

		public const string Argenson_Met = "QMe_j2TIWEKpssXkLHMMZA";

		public const string Argenson_Stash = "h8jI-dDsfkStb3XkCjqMPw";

		public const string ArgensonStashLooted = "Cwi281popU2_qZ1fEFyPdA";

		public const string ArmoredThugDeath = "RBVwDLWc5UOvgctRVtd4Uw";

		public const string ArmyOfTheAncestorsDeath = "hxEEGgCQrk2SZmo4tHuJDA";

		public const string Artifact_Sunfall_TextA = "FJGOETc8okazQ7RCYGP8SQ";

		public const string Artifact_Sunfall_TextB = "FTuYaldTUEmxqXV67GK63A";

		public const string Artifact_Sunfall_TextC = "u1Nj953RgEi8DNWw4TpmxQ";

		public const string Artifact_Sunfall_TextD = "y0nZVw9IBE2JgOWAVodNYQ";

		public const string Artifacts_BlisterAqua = "3OnCz-Vn002TlCNYfRAqtQ";

		public const string Artifacts_BlisterSapphire = "hRGgVyjQjEyO5DPm69qsTQ";

		public const string Artifacts_Book = "OSYVhA_aikKtNYjG1WV9rg";

		public const string Artifacts_BookSwitchA = "76zfURmHKECuL6V2hyHDQQ";

		public const string Artifacts_BookSwitchB = "FOTQlv5qGEyglRQyUSgpGg";

		public const string Artifacts_BookSwitchC = "D7jZZVQi2ECe0bv4IXUMpQ";

		public const string Artifacts_Brand = "DSumf3bobUeOCIVsfT8KcQ";

		public const string Artifacts_BurrowArmor = "BWW2HUwUlUy7wMdmCIUBaA";

		public const string Artifacts_BurrowBoots = "TbBa8EMLS0udfXI39iU5vQ";

		public const string Artifacts_BurrowRecipe = "CSFOJvTRcEuTew3ri8Z8gw";

		public const string Artifacts_BurrowSaber = "004zP29YrEqZk0x4LpZOgw";

		public const string Artifacts_ChimeraPistol = "YbncjRl-00-Oz_H775BzoQ";

		public const string Artifacts_CompassWood = "S6m2c-qxmUKxQM4oIsnUHQ";

		public const string Artifacts_D9DoorOpen = "YIG3WQKmKUqiNrIstOYNVA";

		public const string Artifacts_DemonShield = "hIqn_fTv90ybYhO7G2tPMw";

		public const string Artifacts_ElementalChakram = "BJ8GkFllp0mxlIWd9PHHOQ";

		public const string Artifacts_EmeraldDoor = "OW_H7f_C1U6MEiMhfh2xRg";

		public const string Artifacts_GlowBag = "T11yFkJdyUKr-X-YDyVJQw";

		public const string Artifacts_GlowstoneDagger = "Ecm89L34lEOhogFtQJIlww";

		public const string Artifacts_HunterBag = "0sG4nxf9CESQ00ByPr_62w";

		public const string Artifacts_Lantern = "OnWhmFejGUCKbPZtUGWAmg";

		public const string Artifacts_MertonBody = "RdEb-aV_DkWap-j6hBFq-g";

		public const string Artifacts_MertonDoor = "QsI4s72pFUCc8GYcZTsTnA";

		public const string Artifacts_MertonHead = "vkWTubKmK0q6moK9oar3KA";

		public const string Artifacts_Murton = "bYPHUPScYEeilhgCqXbPAg";

		public const string Artifacts_PillarHammer = "3z29X2xZ1kmzJBSonf3LBQ";

		public const string Artifacts_PowerCoilA = "CUT2voPx00GHtMm2yxybMA";

		public const string Artifacts_PowerCoilB = "B2ul_F2JJEq6FqVEu9YnPg";

		public const string Artifacts_PowerCoilC = "mOcF2EtF_0SBIUPsPAUhlg";

		public const string Artifacts_RainbowAqua = "rvB1Udl_2ke-M9rAXbXIvw";

		public const string Artifacts_RainbowCount = "VD1E5BU-hE6es4CWmyiAVQ";

		public const string Artifacts_RainbowEmerald = "vKWa8JxWeUmLE11-62rAKQ";

		public const string Artifacts_RainbowHackmanite = "F1AMB0XiJk-X8jfrV1e7bQ";

		public const string Artifacts_RainbowRuby = "sCSSgqp9mU6rjtEmb_-new";

		public const string Artifacts_RainbowSapphire = "aAyZAHSMokiVE85iDJxd6Q";

		public const string Artifacts_RainbowShield = "isyBw2JBzEm_Ii_iCjfqoA";

		public const string Artifacts_RedDagger = "ju-4QUvTxE-QKn0gbq4rTQ";

		public const string Artifacts_RubyDoor = "1fxEdW6BxU60ghOmgTiBCw";

		public const string Artifacts_SkullMertA = "ActwxnX4N0esEVFiWVuamg";

		public const string Artifacts_SkullMertB = "sDohe1_H306EleZmp8C4Iw";

		public const string Artifacts_SkullMertC = "uRcrDx6jKEK12zX-f368cQ";

		public const string Artifacts_SkullMertD = "TO-wlZ35V0aaZpOYIZui6A";

		public const string Artifacts_SkyCrown = "qcbJ90wGoUmG7MQybwa9Kg";

		public const string Artifacts_Starchild = "iz_ossCe3UKCRDXm9sfUTQ";

		public const string Artifacts_StatueA = "26IKnZhBu02GQ4dSOqMubg";

		public const string Artifacts_statueB = "DCd2N-IgIkeae-bjVs4HDA";

		public const string Artifacts_StatueC = "6wbuw-q3Rk22UVzHl7clHA";

		public const string Artifacts_StatueD = "DiDQG8ss7UGvpx4VqXjSiw";

		public const string Artifacts_StatueE = "RjGcdsOSHkGJv-R_gJzOuw";

		public const string Artifacts_StatueReward = "vZlRswxiGEGJG8BGpFY1pw";

		public const string Artifacts_StatuesBag = "Ui3efp0CCEqf2kr9-S_EeA";

		public const string Artifacts_Sunfall = "ONbsrFs27kqwIA2hzLnEsw";

		public const string Artifacts_TraderBag = "JacC5DLsfUWDrWlSYdKUgA";

		public const string Artifacts_Werlig = "67bhoSQt4kKEREQ97dxd4g";

		public const string Artifacts_WolfCase = "xw5v9r3rEE2j1XG0X_1UsA";

		public const string Artifacts_WorldEdge = "CzbQHpFxQUK7-ZBGxYNFmg";

		public const string Artifacts_WroughtHalbert = "A-Gy9aKJVEmhgysugIwsFQ";

		public const string asdasd = "1o6ZuQVolkGUT20_29tk-w";

		public const string AshGiants_AllyFail = "nDy01eTHlUa_BPDlbIhZPQ";

		public const string AshGiants_AllySuccess = "I0ZciWg9iUWxQMRdAU7vIg";

		public const string AshGiants_AutoDialogue = "bebV8aosoku_fOCFETDDQA";

		public const string AshGiants_CompleteFail = "f1JVZyhg2UiBA8xmC-w6Hw";

		public const string AshGiants_CyrCountdown = "Rf6m7-vRqkeZhm32Up6zcw";

		public const string AshGiants_CyrDefeated = "KXjwn23a5kaVsC3cuDK5mg";

		public const string AshGiants_CyrFight = "XqlcpbTJC0aTDZfjD4xCTg";

		public const string AshGiants_CyrilFail = "ju4UNxrr50OxTy9W_r6bCg";

		public const string AshGiants_CyrillSign = "HeT_YTW4wky3lurFIj7VCg";

		public const string AshGiants_CyrilSuccess = "V8u22ZnC5k2M8JbQfzEDfA";

		public const string AshGiants_DamianFail = "8_1XTI3jOUW2PN2BTT9jHA";

		public const string AshGiants_DamianSign = "ZEG9oo34DU61klqF7jN0ag";

		public const string AshGiants_DamianSuccess = "9BwFGg2oUUOV_9B3hknEHA";

		public const string AshGiants_GiantCulture = "9vQDz-AmckOriPJjiM4pfA";

		public const string AshGiants_GiantInfluence = "TsLXb4l4SUuRJo8HFTbmNw";

		public const string AshGiants_GiantPolitic = "kzhw3CC8xk-_nOAkLYqDpA";

		public const string AshGiants_GiantReligion = "d0gE2jmJ602xjO8dJXtCUg";

		public const string AshGiants_GoldBellyDidDialogue = "VoqX-D_110KTHYh5feInqw";

		public const string AshGiants_GotReward = "QrDHfm8z_EWjFfh1gFKrtw";

		public const string AshGiants_HeartGiven = "UAX41DX4DUehYdWlWYgEXg";

		public const string AshGiants_InfCult = "CTKm5HC6XEy596CpfH6kHg";

		public const string AshGiants_InfPolit = "5e3xORiclE-gkNSZcrxCZw";

		public const string AshGiants_InfRel = "a-swKQ83IEi3uCGbfpeAfg";

		public const string AshGiants_NotCompleteFail = "biSH0yKSNUuAegDIrnziGA";

		public const string AshGiants_RissaInformed = "aIZ94gQackq6PxaZfQ3siQ";

		public const string AshGiants_RissaStart = "pOHuHF0q9Uu5W3ccIwIZBQ";

		public const string AshGiants_RootA = "yYQ65Zlp7E-QvFQIkbLU7A";

		public const string AshGiants_RootB = "FsdlPeGd3U68fk7wrkokFA";

		public const string AshGiants_RootC = "WuAGtAP640aU0S_nBvYkdQ";

		public const string AshGiants_SpecialRoot = "drAE_kExV06xJQNf_tAdUg";

		public const string AshGiants_SpecialRootGave = "Z96nFCQTeUKSbIq_MOfPQg";

		public const string AshGiants_StartDebate = "2dWdXcWLEEShzLoDZSICKw";

		public const string AshGiants_Teleport = "JpjkewzNr0aj8xINw7SjDw";

		public const string AshGiants_WarpGiant = "oGkuUgWvfkej_El-rhz2gw";

		public const string Asked_Molepig_DigestedMana = "tzsYyyPgg0m4nM7Pklkqaw";

		public const string Asked_Molepig_Ectoplasm = "IsT-dgAHck-HdnjXWq1y7w";

		public const string Asked_Molepig_Petrified = "ofkGi59xeEGU4B-hRm2uAA";

		public const string Asked_Plant_Bloodroot = "u3KwmbxREE2SwAuBqjxQ7g";

		public const string Asked_Plant_FlashMoss = "-fbEFSC23kWuBDz8Zmfxag";

		public const string Asked_Plant_Voltaic = "2tKGnErwIUic_9v9r7usCg";

		public const string Asked_Rock_Amethyst = "aqFl6GO8nUKP8-rGl92wVw";

		public const string Asked_Rock_Chromium = "JmqxDmCzaUGcjUXjtU9Zjg";

		public const string Asked_Rock_Diamond = "3JlwdNGVjE6oHbtGWrIZHg";

		public const string BannerHistorian = "QC-M_K_eJk2W-yb6FEkr9Q";

		public const string BannerKept = "6jraJepfMkqy6o32sIcaBw";

		public const string BC_Necropolis_CalmLvl = "SLUW_BFdLUyl3XqeUHekeg";

		public const string BC_Necropolis_DeathA = "sJ2ltu8TCUWXmEUi5DGtXw";

		public const string BC_Necropolis_DeathB = "lMTK66pOy0O3LkS6XeDmjA";

		public const string BC_Necropolis_DeathC = "UNxoBFvcVUuJyeI6hUqN4A";

		public const string BC_Necropolis_DeathD = "ylrI8m25gEWZD-U4dFBDUQ";

		public const string BC_Necropolis_GhostA = "vAfI8cmPoEO5JWD-RY0LlQ";

		public const string BC_Necropolis_GhostB = "pz3GmVIqBUiNLiOdN9b6hg";

		public const string BC_Necropolis_GhostRoomA = "J68NrPiFBE-SPWA_U9F69w";

		public const string BC_Necropolis_GhostRoomB = "2tki_CidTEmrM9K9HDyvLQ";

		public const string BC_Necropolis_GhostRoomC = "PEXnQqH-xUWNzReVf3AoeA";

		public const string BC_Necropolis_GhostRoomD = "oHj-S_G_3UeV5dn71VulEg";

		public const string BC_Necropolis_GhostWave = "-6U6yb8Sc0uxJM92HMjQnQ";

		public const string BC_Necropolis_LeftAltar = "NI04g3-pUUi0fNJ5RFwwVg";

		public const string BC_Necropolis_RightAltar = "7TiDsioyfE-rOJhxYxRsYA";

		public const string BC_Necropolis_Steal = "hDQ-ZQwgzkinibVyfNuseg";

		public const string BC_Necropolis_SuccessA = "z4_vrXgKfEmGMUubEjZYTw";

		public const string BC_Necropolis_SuccessB = "S-jcUI47CE2feknqjX-KhQ";

		public const string BC_Necropolis_SuccessC = "HwV1n8cekEuQUm2qGHKcpQ";

		public const string BC_Necropolis_TotalFail = "hiCOs_8kBUiPpl2w23yc3g";

		public const string BlackStekosaurDeath = "IBhOKj_NN0SIUZzehY0mHA";

		public const string BloodMage_FortressMinionKilled = "EfZ85UFhc0iNUZ3Dr7OT_w";

		public const string BloodMage_GazeeboMinionKilled = "HC7Q2_OHr0SyTA5wk1MoJg";

		public const string BloodMage_TempleMinionKilled = "oeO8M3a5bEaxaBEIFThQWg";

		public const string BloodMage_WindmillMinionKilled = "mLOqr7As8kGKm3KC34irDA";

		public const string BloodWeapon_ActivatedNE = "U6YOglWrs0yry1YTT3iHVQ";

		public const string BloodWeapon_ActivatedNW = "ezpXAM9ZkEeoJQuux7_4cA";

		public const string BloodWeapon_ActivatedSE = "SS6zpGbUqkyC7vtpiyHqxg";

		public const string BloodWeapon_ActivatedSW = "UqCCti1UDki1kZdJSS_mJg";

		public const string Bosses_BaliraCierzo = "2eEYwJZCgUSwNHUAhfHZlw";

		public const string Bosses_BrandHeroDefeat = "29P6K0yqC0e0kSLEvjN9Gg";

		public const string Bosses_BrandHeroOpen = "Mm8F2-2K-k6gam4V2idlsA";

		public const string Bosses_CalixaDefeat = "D1tmLZmFREKtnBbunfH8Lw";

		public const string Bosses_CalixaOpen = "emnMHv6Zrk6NCTGdSduCVQ";

		public const string Bosses_CrockCierzo = "mbf4Iu5m00eqOWgvdMHUzA";

		public const string Bosses_EliteBeasGolemDefeat = "KEZJM24S40KH5_pZoVjdtg";

		public const string Bosses_EliteBeasGolemOpen = "gmjpAJBVRUKOcEziywOEBg";

		public const string Bosses_EliteBurnManDefeat = "q06I_M_dW0C_LnH01AlcCg";

		public const string Bosses_EliteBurnManOpen = "cy8hocOvPEGE-Khxa6XYbg";

		public const string Bosses_EliteGiantsDefeat = "in8wPr6TwUGR-8pVJ3weFA";

		public const string Bosses_EliteGiantsOpen = "9cAfSinvNU-007L0srQIKQ";

		public const string Bosses_EliteImmaculateDefeat = "VpZXfLR-nE28EhqZCuIkWg";

		public const string Bosses_EliteImmaculateOpen = "_9wGVsrgO02yUHPm9E25fA";

		public const string Bosses_EliteLichesDefeat = "1iKdNwqb3kO9rDnlmTzAyw";

		public const string Bosses_EliteLichesOpen = "Pn7UqGQkz0aQW19qeF3uGw";

		public const string Bosses_ElitePriestDefeat = "ZUm3uQfEQU27VPTc4QupWg";

		public const string Bosses_ElitePriestOpen = "OJ0LaX6K40i-rEKHrCrRUA";

		public const string Bosses_EliteSharkDefeat = "hVQfbH-2KEGdcLY6X2HVAw";

		public const string Bosses_EliteSharkOpen = "pHuyASp7OEqBGPDWT4A3rA";

		public const string Bosses_EliteShrimpDefeat = "Tr5ghMJXx0uRi8mfSem64w";

		public const string Bosses_EliteShrimpOpen = "9BOUcw8gfE26m7ziRcz4JQ";

		public const string Bosses_EliteTuanoDefeat = "uN6GT7burE6lKbfwuTYEuw";

		public const string Bosses_EliteTuanoOpen = "JU58JDFfOkmsXE7i-DNGXg";

		public const string Bosses_RospaCierzo = "FaXYW8WcT0ixDz2-OoxLxQ";

		public const string Bosses_TrogQueenDefeat = "SFxLOR5n6UWHrN96etxNWQ";

		public const string Bosses_TrogQueenOpen = "ZvvEVRP4YEGjIDKqgBzFVg";

		public const string BossesDLC2_CrimsonDefeat = "cYo22Tcr1keKmmXwSme14g";

		public const string BossesDLC2_CrimsonOpen = "A2Yt2GByhkudG_UG55-xPQ";

		public const string BossesDLC2_GargoylesDefeat = "DA291kIoUEC8-iL5InPWLQ";

		public const string BossesDLC2_GargoylesOpen = "ap9PV6Ppx0aNIoHJXFWBjQ";

		public const string BossesDLC2_GrandmotherDefeat = "aofDMt9K3USEr6XZfyEFNQ";

		public const string BossesDLC2_GrandmotherOpen = "m1c-VpVEJ0qpLBRW6kalOQ";

		public const string BossesDLC2_TorcrabDefeat = "NZb4gOMxZ02app3uNVNj6A";

		public const string BossesDLC2_TorcrabOpen = "_3xBI34fOU22sV7gNo2PEg";

		public const string BourlamaqueStoryOne = "LJXWRf-NykKUj_OSOoGRog";

		public const string BourlamaqueStoryTwo = "eO-0Ssb5G0mixCjfvxOjGw";

		public const string Bribe_Bubu = "Ahg_xGO1g027aCM3kwaC_Q";

		public const string BuracDone = "90F4cEvSzEW6e15114mm1w";

		public const string BurningSandroseHorrorDeath = "uxjyCn0c7ECj_7kzBt_KGA";

		public const string CA_Basebuilding_Enabled = "3L2rnG3UWEmfuLU3gy76yQ";

		public const string CA_Done_Engineering_Tuto = "gE0Tx76ol0mtNBTjB1t_Kw";

		public const string CA_Done_Scholar_tuto = "6XpxE5dL2kqDJsJ9ZBXSPg";

		public const string CA_Done_Supplier_tuto = "ZHxEHMlTnUCdYlZgTLp_Hg";

		public const string CA_EnteredCaldera = "hs9Mw1naPUaTVquXAze8QA";

		public const string CA_epilogueLetter = "j5WTg9CBFEihidjVZTbUsQ";

		public const string CA_EvangelineKill = "2m36LE1eYE-VrIc3c5e6JA";

		public const string CA_Informed_Flooding = "xqSAhUbKyEWWv5T0Q6SVPA";

		public const string CA_Initial_Hail = "aQU8xfhzYUSiMIlEqI45cA";

		public const string CA_Nobles_Drop = "VjJooMEPME2bov4V8LptBQ";

		public const string CA_ObsidianPetUnlocked = "3cMd1oQEDkKyN8hGAcZhdg";

		public const string CA_Old_Sirocco_Access = "Z3flMjR08UGADVVuPAd_BA";

		public const string CA_Q0_Construction_Started = "O0b6vsE_dEm8r8wsgNK4eQ";

		public const string CA_Q1_Construct_Started = "_SBN-wMthkiRulfLDnfUog";

		public const string CA_Q1_D2Reseted = "IpnZOK0R80qnf7Kz2kWcAQ";

		public const string CA_Q1_Got_Egg = "f_Uu3XcpakS2mmS8qyVOCQ";

		public const string CA_Q1_Got_Sulphur = "xileZhoZEU6E8Y-DJqGcyQ";

		public const string CA_Q1_Hostile_Nobles = "RZjsOu8DrkGr-BmTVxK-zg";

		public const string CA_Q1_Nobles_Defeated = "F3RsZZhARk2WI-WFYJTuMA";

		public const string CA_Q1_Quest_1_Complete = "IjuCygb0OkS9rJ5XvjzC0g";

		public const string CA_Q1_Quest_Open = "-0hOgnfwxkKgXuVcfbFSSg";

		public const string CA_Q1_Sent_To_Eggs = "TEsBAtH7aU26pCxpfAR_OA";

		public const string CA_Q1_Slow_Construction = "j0RhlWcx3ESlKVujoqUqtg";

		public const string CA_Q1_Sulphur_Pool_Active = "XAOcaLpZV0e_UWP4gYIcJQ";

		public const string CA_Q1_Timer_Start = "6Kx88F4WvUKcHTf-pMf4CQ";

		public const string CA_Q1_Tuto_ImprovedBuildings = "zMbRoS5xCkChnck4JJtnZA";

		public const string CA_Q1_Tuto_SpecializedBuildings = "bHDGVgBku0i3v83GiFcwxA";

		public const string CA_Q1_WarpNoble = "dFFi9fHplEOjLy8jejLhFA";

		public const string CA_Q2_Improved_Resource_Costs = "15qqcupK4UiBUW-3kJ8Mgg";

		public const string CA_Q2_Quartz_Given = "ab-MlqvW9kGprZB7kmFx4g";

		public const string CA_Q2_Quest_Complete = "UAohg3FN3UW_pSYkyImpiA";

		public const string CA_Q2_Quest_Open = "1f7tgc76i0STto-_kCO7Tw";

		public const string CA_Q2_Timer_Start = "X8HNRwUVzEmJWyKBVsOcBg";

		public const string CA_Q2_ZzBeginWorkaround = "L_FfrfXO8Ua8zwx25Q-ovw";

		public const string CA_Q2_ZzWorkaround = "zx4y8ix0vUajo_RMtYDXrQ";

		public const string CA_Q3__DjinnPredefeatFix = "PT9LrMVHcEe6FuOkTIfQ0w";

		public const string CA_Q3_Djinn_Defeated = "TRpGyRkrsEGDcJtnqKl3Cw";

		public const string CA_Q3_Djinn_Fully_beaten = "r5dHbrU170G0-A80h994tg";

		public const string CA_Q3_Djinn_Hostile = "5KFFA16sPkaFkQs5wO5Q_g";

		public const string CA_Q3_Djinn_Huge = "aoLKME02w0aUTG8oYekmEg";

		public const string CA_Q3_Djinn_in_Settlement = "EU5zUiBL5EGFNna2iZZvnw";

		public const string CA_Q3_Djinn_Warp = "0EMolWeP2UGLwZ8hJUSC3Q";

		public const string CA_Q3_DjinnDisapear = "4-ldZGK7hk29vd1CtuFziw";

		public const string CA_Q3_DjinnFinished = "DXeP2IkXuUqJ88ilRWc6qA";

		public const string CA_Q3_DjinnLeaveSettlement = "fGI6UErUnkaEXLTgt1L9Fg";

		public const string CA_Q3_EmissaryDefeated = "QMJbRRZarE2-p5RCPuzAFQ";

		public const string CA_Q3_EmissaryFX = "2MiGVLDFcUO0v74otd2SrQ";

		public const string CA_Q3_Failed_Building_Cap = "giWrkHKjfEGqwukNHT7oQQ";

		public const string CA_Q3_Full_Building_Cap = "JgBgWVQLdES6Tb5ZLvmHkw";

		public const string CA_Q3_Got_Talisman = "IGBIhW9qYUqx_-WDoKUdOA";

		public const string CA_Q3_Left_Ark = "pD6U6-ozskaUYC8LMwNqIQ";

		public const string CA_Q3_Quest_Complete = "_4YUNgBjc0q6UKjhKc0Diw";

		public const string CA_Q3_Quest_Open = "qGWxz91GL0q3AsGzEXbGAQ";

		public const string CA_Q3_Sent_To_Ark = "nDQwF0e2OUaFRWWF0JK77Q";

		public const string CA_Q3_Skip_To_Fight = "ujlswBitB0mIYcfl2XxJUQ";

		public const string CA_Q3_Small_Building_Cap = "L8G_pwn9NkuhYXFaxwokeg";

		public const string CA_Q3_Timer_Start = "iZ5BbRMU_UyM9DBZQ8hiEQ";

		public const string CA_Q4_Avatar_Hostile = "XPelURNZ7UOv6ceTXHwmCA";

		public const string CA_Q4_Avatar_In_Settlement = "5d0ITIpOz02xCMwRanDGKw";

		public const string CA_Q4_Avatar_Killed = "fdjIUv8dakSJvPxvB39AUQ";

		public const string CA_Q4_AvatarDead = "iQsYJddTjkWvDjthKbWEIg";

		public const string CA_Q4_Complete = "gzD5gDhnXESbqWxsq2Cxyg";

		public const string CA_Q4_EvangelineConfessed = "9Qk9oaCt9U6mjSPIXbX6Zw";

		public const string CA_Q4_FoundDungeon = "cbmT8ilXdU-_dS-zwD2-jw";

		public const string CA_Q4_Magma_Settlement = "V4vQ3oOEj0ibyNrmoja6AA";

		public const string CA_Q4_Quest_Open = "-U5Gw7xpwUOKjBqjqzrgpw";

		public const string CA_Q4_Scarlet_Convo_Done = "9xRfpWUrKE2eyCDbRlGWMA";

		public const string CA_Q4_Send_To_Final_Dungeon = "GEVj_EXWI0aVO2QEr_vcEQ";

		public const string CA_Q4_Timer_Start = "3YcM09jl00ylFqSd9dt7Qg";

		public const string CA_Q4_WithinFightZone = "vxqnpBozZ0e9ej3C_cCqEA";

		public const string CA_Settlement_Unlocked = "_Ps1AThRe0WlmNsZpZSWgA";

		public const string Caldera_AncientDwellOut = "0A1tqQKKMkCS1zFrEsGrAw";

		public const string Caldera_ArenaChestReward = "L6ou-MG7Jk-E5BO2yJPbaQ";

		public const string Caldera_ArenaFightA = "WDEyDk1Y90iJvUvfGTxDZA";

		public const string Caldera_ArenaFightB = "80IR9hn-00-HQGENZyDRFQ";

		public const string Caldera_ArenaFightC = "6kmrsMErukiwGqX-C42AKg";

		public const string Caldera_ArenaFightD = "5CNibaw8pUmLAsWWfUEVFQ";

		public const string Caldera_ArenaFightE = "3hGGw6lu00mZjDDkjugGGA";

		public const string Caldera_ArenaFightProgress = "1ms7Yjkh9kSJB6ALy0wJIw";

		public const string Caldera_ArenaFightWon = "P81jubsgIkC3HCVw2BADpw";

		public const string Caldera_ArenaRandomChest = "Ko0TXYiyskKlQ7ysll03aA";

		public const string Caldera_ArenaTimerA = "lWtrihXdvUK90tUzS7t9bg";

		public const string Caldera_ArenaTimerB = "P2V_pqPU6ECFnorC2-YINQ";

		public const string Caldera_ArenaTimerC = "I72vdNcIx0Oeb22_2o6T5Q";

		public const string Caldera_ArenaTimerD = "807loDqdiEu9VU-HAIorng";

		public const string Caldera_ArenaTimerE = "ZlFi-7qMWka5h32x_OX6vA";

		public const string Caldera_ArkExileElder = "L9JKJOqEDUW6rA95MUeTlA";

		public const string Caldera_Blacksmith_1haxe = "3Unwqf1E9keSZgTAU4GnoQ";

		public const string Caldera_Blacksmith_1hmace = "gUNkSq7h2UmwTlmLvHzskQ";

		public const string Caldera_Blacksmith_1hSword = "vEoAP6AWsEGTLWQbZ_NFgA";

		public const string Caldera_Blacksmith_2haxe = "RI7kgjjGVUqlZmXgaqDDLA";

		public const string Caldera_Blacksmith_2hmace = "rKmA7J4cjE-e2mTU9FbV8w";

		public const string Caldera_Blacksmith_2hsword = "wpAVjFAbBECaAIIXFkj0Kg";

		public const string Caldera_Blacksmith_Armor = "mgnH4EdZ8kyK6Jx5966t5w";

		public const string Caldera_Blacksmith_Boots = "8sVvr0VpuE-_28mdOjcB4g";

		public const string Caldera_Blacksmith_complete = "7p_vxI3fl0yHFQJ1wJSO4A";

		public const string Caldera_Blacksmith_Dagger = "r0rH6RnpuU-ap584SJSpBg";

		public const string Caldera_Blacksmith_Gauntlet = "KM4s5-aeAESaeqtUeI4wuA";

		public const string Caldera_Blacksmith_Halberd = "q8ZrQNJwZ0CKrwsoZWbBuw";

		public const string Caldera_Blacksmith_Helmet = "EhUQ-YLAi0ysMAMXztA1wg";

		public const string Caldera_Blacksmith_Pistol = "zKt5LYy3d0OHpMUoMRN-Jw";

		public const string Caldera_Blacksmith_Spear = "yBTmYqC91kWS1yjnQ23KcQ";

		public const string Caldera_BlackSmith_Timer = "Y-fk7tCY3EqMfzDw2-3WqQ";

		public const string Caldera_BridgeShortcut = "svp7bJzJ80KxX2QUscoL0Q";

		public const string Caldera_CalygreyArenaA = "ngyZ5VloAUSnFfwNZEozFg";

		public const string Caldera_CalygreyArenaB = "5_RgF_VfHEOm453ZhhOB-A";

		public const string Caldera_CalygreyArenaC = "O_IPw2J1iEC_p1MHHK8VVw";

		public const string Caldera_CalygreyArenaVictories = "XUkhmnieTEuMAz1MMpBNqQ";

		public const string Caldera_CalygreyBattle = "sogLhJWMBkehyw9gxiKJ2w";

		public const string Caldera_CalygreyDefeat = "vq5CG4lF2Eid3VubVrG0Dg";

		public const string Caldera_CalygreyDefeatA = "V_QvZBB7MEm8_cGIFupQ_w";

		public const string Caldera_CalygreyDefeatB = "n5bzTwWkZUaae3cJMb6oOw";

		public const string Caldera_CalygreyDefeatC = "FfIffExLeUaBQPNu_xq5Rw";

		public const string Caldera_CalygreyWonA = "eftFlBwMWEmEeMNb6Va5TA";

		public const string Caldera_CalygreyWonB = "9K3TnzrmtE6GkHAmyQVtew";

		public const string Caldera_CalygreyWonC = "QsXAMoTiAk61bmFL6XrG-A";

		public const string Caldera_CaravanUnlock = "eYmZGb_BJ0qAtpcwrndhTg";

		public const string Caldera_CityHall = "krCnf70uMUCZ7J6KJKOrTQ";

		public const string Caldera_ColosseumGateOn = "_njN2YhZgk2jEtNMqnvf5Q";

		public const string Caldera_Courier_Exotic_Shop_Tracker = "xzCupALfTkuvyP9lPcGwhg";

		public const string Caldera_D01Gate = "YSDXPs-S9EajI5XywMHSAA";

		public const string Caldera_D04GateA = "G3DYuVjj70WDBrS74i1iEQ";

		public const string Caldera_D04GateB = "9i91FSzv2EKvt4K399FPjg";

		public const string Caldera_D04GateC = "l82Vypt8v0ipc0mW1g_fmA";

		public const string Caldera_D04GateD = "0UJGqUMpOUuSEgl52PMnoA";

		public const string caldera_D07GateA = "zynKXWfAJU2wHtaLgXqFSA";

		public const string Caldera_D07GateB = "WLA7mtcnKEidvzyfJwtPaw";

		public const string Caldera_D09GateA = "PU_QHbkPdkGudVhq-kv2qg";

		public const string Caldera_D09GateB = "65MCT04dtU24T7A6BvY3rg";

		public const string Caldera_D10Bottom = "m0TgSzEyYUmzSdbQ_WpA_g";

		public const string Caldera_D10GateA = "K29hhQikIEWPMccn7qJMPA";

		public const string Caldera_D10GateB = "7RnPnAffTkq9ra8FLlqCXA";

		public const string Caldera_DamasceneSpear = "bUGTTlJiLUuZZxqCCIVJpg";

		public const string Caldera_Enchanter_UpgradeToLibrary = "g3qxNqCFQU6rnMm7myDWVA";

		public const string Caldera_FortressDungeonExit = "2CGh_ps9n0GR6Ixv1GsDZg";

		public const string Caldera_FortressPosA = "lcFn359Fk0OQguBZOXNcIw";

		public const string Caldera_FortressPosB = "q9V0HlVJ6UuX7K6JsvkA_A";

		public const string Caldera_FortressPosC = "I7PZUvcS20m--SO1Qt-ssg";

		public const string Caldera_FortressPosD = "OGjpgwGjJ02OJLvEb1EWpg";

		public const string Caldera_FortressPosE = "ZHcN_Vdw3k2UJGP1KPN5cg";

		public const string Caldera_FortressPosF = "slaQ5Xe1ak-mCVk1LlBoJw";

		public const string Caldera_FortressTimer = "J9Bp3-074UKoUVTZ1fiQ-w";

		public const string Caldera_FrortressRandomizePos = "PDMIcMqRakyE8BODbZlraA";

		public const string Caldera_GateTowerLever = "ATOlJqjFUE6ia7eVySELMg";

		public const string Caldera_Giant_Inn_Access = "5kQe3jKdy0S4boyxL2qSmQ";

		public const string Caldera_Hidden = "Fk-272D_Cke_gCAHTWNTMg";

		public const string Caldera_HiddenFeedback = "6is_IO9VzEKT28HLNfgErA";

		public const string Caldera_Immaculate_met = "nWcZgFRgwkilRj8koIaTRw";

		public const string Caldera_MedysePetDefeat = "f9FaOBLEi0mBC6BH_rNT3Q";

		public const string Caldera_MedysePetLearnt = "Cyfhn1rVa0Clbp9WmRWeaw";

		public const string Caldera_PlayerInNewSirocco = "pKdDFd6IdUGF6C11co6zLw";

		public const string Caldera_RedLadyArtifact = "APZpgm9do0-xdUdXdzh7cA";

		public const string Caldera_Refugees = "KQpQYfiKs0KVx8ISEbiPwg";

		public const string Caldera_ResetChest = "rcgfpuhGG0OkgwbylGlD6Q";

		public const string Caldera_Sample_Mineral_Gold = "FPn4ARwh-ESnIekFUZewJA";

		public const string Caldera_Sample_Mineral_Resources = "mUUF8EDTIkugmY1vC-_lxQ";

		public const string Caldera_Sample_Mineral_Special = "F_pg8ZeLAku2SMAcQewy4g";

		public const string Caldera_Sample_Molepig_Ectoplasm = "w9Uij4b2MkuNp001XqyniA";

		public const string Caldera_Sample_Molepig_Gold = "16ooPv5on06hpOAccO9EWg";

		public const string Caldera_Sample_Molepig_ManaStone = "52tJd-TM6E-lE61B5bBZuQ";

		public const string Caldera_Sample_Molepig_Organs = "BaArzrmMOEmj0WKOz54hnQ";

		public const string Caldera_Sample_Molepig_Resources = "Io6gR4u12UOt_1AU-YYAnw";

		public const string Caldera_Sample_Plant_Gold = "0C_6xdmp3028aRkeJODyaw";

		public const string Caldera_Sample_Plant_Resourses = "urx-WeJqCUSHFIEJYnLASQ";

		public const string Caldera_Sample_Plant_Special = "opZkFIgdDkeF4gNFKUSJyw";

		public const string Caldera_SamplesA = "-xsJSVlq1E6d2iCPhVUPnQ";

		public const string Caldera_SamplesB = "251cC4-pyUOpOPubaCc_WA";

		public const string Caldera_SamplesC = "YFlgiSiT10WG-yxiD03GVA";

		public const string Caldera_SamplesD = "jqcbBqDfBE2Ocu2ef6aanw";

		public const string Caldera_SampleTimer = "PiV00ww0S0CZek5a5Kvf3g";

		public const string Caldera_SkillBuilding_BlueChamber = "KNna2_gD9EeqQxvqeON0ZA";

		public const string Caldera_SkillBuilding_HolyMission = "CID4eitd7kWkmWxw7bN-6Q";

		public const string Caldera_SkillBuilding_Levant = "U31Qth6dMkeKUVEOlnpGNg";

		public const string Caldera_SkillBuilding_Sorobor = "yVdmcZE11U2S54cVTA9c2g";

		public const string Caldera_SmallDungeonReset = "-rF_Ai5TFkS2eTbLxwU6bQ";

		public const string Caldera_WindAltar_Activated = "UvPIa_UeqUSzPoCfVklYKQ";

		public const string Caldera_Wine_Dispenser_A = "TublU0cUJ0eAFMsQbH63rQ";

		public const string Caldera_Wine_Dispenser_B = "YM3CajlDL0iYMEEV19SC4w";

		public const string Caldera_Wine_Dispenser_C = "3jRmPDAD9kKnfHfyxlESdA";

		public const string CallToAdventure_Completed = "ZYzrMi1skUiJ4BgXXQ3sfw";

		public const string CallToAdventure_DeptNotPaid = "sAc2Dj-T_kysKXFV48Hp0A";

		public const string CallToAdventure_DeptPaid = "8GvHUbDz90OOJWurd-RZlg";

		public const string CallToAdventure_EtoTalk = "DzHlbpuXZUy40JbdBiRTCg";

		public const string CallToAdventure_Expired = "zoKR1_bqiUiAetJ3uxw-Ug";

		public const string CallToAdventure_LostHouse = "qPEx275DTUSPbnv-PnFn7w";

		public const string CallToAdventure_QuestEndedA = "g3EX5w1mwUaYW1o0cpj0SQ";

		public const string CallToAdventure_QuestEndedB = "8iAJYhhqj02ODuwZ9VvXMw";

		public const string CallToAdventure_Rissa_BegExtension = "nt9KhXoJtkOalZ-wtfueDA";

		public const string CallToAdventure_RissaTalk = "n_3w-BcFfEW52Ht4Q3ZCjw";

		public const string CalltoAdventureFail = "lkVRyz-re0OVEu5nF6kyjA";

		public const string Chersonese_Pilgrimage = "wYKKJGQgqkuL9Q0uPRPXMg";

		public const string ChersoneseNightmares = "u_NSqLkthEeMluCBwDWm3Q";

		public const string ChromaticElementalDeath = "PGOMfMQ_UU20Yu7YM8TXfQ";

		public const string Cierzo_1 = "QQayLh9qVEWMmwck-lkxSA";

		public const string Cierzo_WindAltar_Activated = "WBC6bMdYfU-Thg0SFDsESA";

		public const string CierzoDrowniesEnd = "PHlvjQInuk2aFyDXYHHqzA";

		public const string CierzoDrowniesFail = "zH4O2Zfc_0aWyXysUoOmLw";

		public const string CierzoDrowniesFound = "9tCXnEd80kuRvroNsQY1ug";

		public const string CierzoDrowniesQuest = "LDWRiG72MUCP2XT1cnjFiQ";

		public const string CierzoDrowniesSuccess = "TVX05_qF6keePq60y0YCQA";

		public const string CierzoFavor = "PuytBKGYSkmiRWlwz2Tm5A";

		public const string CierzoHeartStoneSold = "O97O3tkyaUSR5J7zqdDJUw";

		public const string CierzoTradeChestFound = "1gBBWThrcU62UzPtVGX44Q";

		public const string CierzoTradeChestHeartstones = "DQUnWiJeZkylziHEps1-ew";

		public const string CierzoTradeChestOpened = "jOZhwc2Fm0CpU7ttzSb2AQ";

		public const string CierzoTradeChestPure = "C9O9mM8btk6sNhJm0JYHFQ";

		public const string CierzoTradeChestRogue = "DJKqGZ3ZYkG36IBBngDifg";

		public const string CierzoTradeChestSpoiled = "NGUkX8ZDMUuHykZfvNuY1Q";

		public const string ConfluxEnd = "tQkEOjc_dkWifjK8lQDV8g";

		public const string ConvinceGaron = "-7qA6V5Vak-8xHlBagxFgg";

		public const string ConvinceKarmock = "lIjj4DFwHke8kHTZXb2qlQ";

		public const string CrackedGargoyleDeath = "ptaqlce3I0qmBLRigMBNFQ";

		public const string Crafting_BergBlacksmithItemA = "dYCGdL4gsEWT5IM2yInZXQ";

		public const string Crafting_BergBlacksmithItemB = "NUEERKznfkCk16uL1d7k7Q";

		public const string Crafting_BergBlacksmithItemC = "Vt8ay8nLy0C3YmUZnulLuQ";

		public const string Crafting_BergBlacksmithItemD = "sin8_eosakeEmVSzNq8D6w";

		public const string Crafting_BergBlacksmithItemE = "wqk2hcuGk0KoPktoVouHZA";

		public const string Crafting_BergBlacksmithItemF = "IPWiQRvgvE-yGBZQcXb3UQ";

		public const string Crafting_BergBlacksmithTimer = "L7Jlkq3OgUC9mO_U99I_DQ";

		public const string Crafting_CierzoBlacksmithItemA = "crC3JdI7Q0-aOEefR6Q6bA";

		public const string Crafting_CierzoBlacksmithItemB = "jLC5w_qNuU6nXCCW-4K78g";

		public const string Crafting_CierzoBlacksmithItemC = "EIWLYu7jo0SQ_gWNSt9UZg";

		public const string Crafting_CierzoBlacksmithTimer = "zFBSWcCLrUWrz8HX8aEk9Q";

		public const string Crafting_HarmattanBlacksmithItemA = "s8YHTQ6KoECHz02ewRtEng";

		public const string Crafting_HarmattanBlacksmithItemB = "ANx20VscekuiTcWNJZnWyA";

		public const string Crafting_HarmattanBlacksmithItemC = "8VjAvkl1NUWC0Yzz-qt5Nw";

		public const string Crafting_HarmattanBlacksmithTimer = "KhdoHX6qZUKTZo1PkHmuSA";

		public const string Crafting_LevantBlacksmithItemA = "HTmq76wVn0-rYkfsLTPeIA";

		public const string Crafting_LevantBlacksmithItemB = "BRbqLZaxN0asYm9ZiDmVQQ";

		public const string Crafting_LevantBlacksmithItemC = "MZn0wqt9kUyhq_KnE4EyvQ";

		public const string Crafting_LevantBlacksmithItemD = "ZmyAsK40z0GjEq4KAx9TrQ";

		public const string Crafting_LevantBlacksmithItemE = "lnK8VHgu_kupIGmMJ45hbw";

		public const string Crafting_LevantBlacksmithItemF = "A1CdrwlaKUilo3ZCUfIvjA";

		public const string Crafting_LevantBlacksmithTimer = "K8G1Y3-wRUKe6paT6WTWXw";

		public const string Crafting_MonsoonBlacksmithItemA = "1zqOEzowKkOIjDQMITyMYA";

		public const string Crafting_MonsoonBlacksmithItemB = "0_fek7oasEWVY_3Y98JE1Q";

		public const string Crafting_MonsoonBlacksmithItemC = "p0_GDoCo30WVQKUC-EeWLg";

		public const string Crafting_MonsoonBlacksmithTimer = "MKE65alIjkOr9IZrVPPGsw";

		public const string DebtRelief = "J9FDs5aL8EWPMNid3-zlOA";

		public const string DefeatGaron = "AR7LO2dMN02R4jZNWYQHUA";

		public const string DesertCrusherDeath = "n3a7t7tbqEqmFaiu8zTivg";

		public const string DLC2_D7OilA = "JfC4GQnPnkO1Y6SjsvzjSw";

		public const string DLC2_D7OilB = "sJDSXcteHUOmjtm0-5hr7A";

		public const string DLC2_D7OilC = "eimpJLcayUmjqG7r8HIhaQ";

		public const string DLC2_D7OilD = "0Q-NAtJLcUafNFIetWtSsQ";

		public const string DLC2_D7OilE = "eJnwwkFrzkuSopSwGJd53A";

		public const string DLC2Artifacts_AnglerShield = "CtIvYGt0A0OmZLfJfvu8aA";

		public const string DLC2Artifacts_AnglerShieldWoke = "GlSw9W7USEW8XIr9emp12Q";

		public const string DLC2Artifacts_DistortCounter = "OprJj7LRoEmsbaFhJVpCfA";

		public const string DLC2Artifacts_DistortExperiment = "jcnc6g31IEmne1W4ByLVfw";

		public const string DLC2Artifacts_DistortExperimentWoke = "A1cuMh0qtUeRb0SUJnLgDw";

		public const string DLC2Artifacts_Duty = "cb-FdW4PXU6ELWP6O7qvfg";

		public const string DLC2Artifacts_DutyWoke = "gMrUU_SfgEKqNFLMtCHQjQ";

		public const string DLC2Artifacts_GepBlade = "R_K27KJnckyh8E-nOOMPHQ";

		public const string DLC2Artifacts_GepBladePosA = "SqnUgSl7pkCByqIW5xGFfg";

		public const string DLC2Artifacts_GepBladePosB = "Kah4Aubolk-2ISnvqQQBfQ";

		public const string DLC2Artifacts_GepBladePosC = "wVi9MVuX50ms137YABa_uQ";

		public const string DLC2Artifacts_GepBladePosD = "NCxewKu9nUexpkgWj6s8dg";

		public const string DLC2Artifacts_GepBladePosE = "rvQ2dpmZJU6_FSLtYQg2dA";

		public const string DLC2Artifacts_GepBladePotA = "0lJPInBmt0SORkfyVqUkpg";

		public const string DLC2Artifacts_GepBladePotB = "7mP1PeohfEOBCjSXWFsVGw";

		public const string DLC2Artifacts_GepBladePotC = "GnF9AWJY_keFMyYeF-jvnw";

		public const string DLC2Artifacts_GepBladeTimer = "7YhAYR7NFEyEP9ZzcE4SDA";

		public const string DLC2Artifacts_GhostParallel = "rF1vxEOAo0-PRKcWCvdf_g";

		public const string DLC2Artifacts_GildedShiver = "j89kBXAqH0uSQoXlRbnsPA";

		public const string DLC2Artifacts_Grind = "Xq-Tv4rm0UOlR3BZ1domkw";

		public const string DLC2Artifacts_GrindKill = "2r2HboU4eEexYbx5bSoPYg";

		public const string DLC2Artifacts_GrindWoke = "7DZG4h8lR0epM7Q3nzmdRg";

		public const string DLC2Artifacts_MumureActive = "Y17fyqLdhkimSQ_Lzz1V0A";

		public const string DLC2Artifacts_Murmure = "C9gxspf1rUKVzTWaKfbI9A";

		public const string DLC2Artifacts_MurmureWoke = "wtzMCb0gTky3D_s1sQ1T7g";

		public const string DLC2Artifacts_Sandrose = "UWr0d60M7Uyo2wCmqsmkpQ";

		public const string DLC2Artifacts_SandroseKill = "PTrd2F7kjkOhZbZX4KcXxQ";

		public const string DLC2Artifacts_SandroseWoke = "8WM070Y6C02sB96dmgvMuw";

		public const string DLC2Artifacts_ScarletGem = "GLyHEmOj3EOx_-p2ISS2qQ";

		public const string DLC2Artifacts_Scepter = "lLTX55xAZEaSiBUxiNJO_g";

		public const string DLC2Artifacts_ScepterBathGiantAppear = "LJKC3MsN5Uy377wVr-R2SQ";

		public const string DLC2Artifacts_ScepterBox = "P0IDjGgs8EOgOJLB91uzEQ";

		public const string DLC2Artifacts_ScepterWoke = "i6_HyiylXU2tII_9LZkjYg";

		public const string DLC2Artifacts_Shriek = "XYygUKZwE06BuRzvPvbR0w";

		public const string DLC2Artifacts_ShriekSwitch1 = "JnTfkyWNy0G-MfZ7OTSBYw";

		public const string DLC2Artifacts_ShriekSwitch2 = "CYMuYZSw40C3gILSl7K4Mg";

		public const string DLC2Artifacts_ShriekSwitch3 = "smeIdg4JVkmWQOrt0J4ykQ";

		public const string DLC2Artifacts_ShriekSwitch4 = "gk78PNxSv0q62fBei0-aaA";

		public const string DLC2Artifacts_ShriekSwitch5 = "KWqkp9skHE-0TmMWGp4u-Q";

		public const string DLC2Artifacts_ShriekWoke = "abbWLra_Rk-C1kaIeL2s1Q";

		public const string DLC2Artifacts_Tokebakicit = "NaaL4PTD2UqE1t3dkuHNPw";

		public const string DLC2Artifacts_TokebakicitLever = "wHyAlhIO8U-xAEV7Ycborg";

		public const string DLC2Questline_DoneQ0 = "uEg8NE3nckWyTs_Y7jSTrQ";

		public const string DLC2Questline_DoneQ1 = "kXbeBrICkEWs8GS6YTfKRA";

		public const string DLC2Questline_DoneQ2 = "QVkuDH0_nkKwVNaCEy5Zww";

		public const string DLC2Questline_DoneQ3 = "hedPnIOK20iOKSVgWk8cFw";

		public const string DLC2Questline_DoneQ4 = "gSCCl5ZSXkC-2awJWrCAFw";

		public const string Doubts_AwesomeFreedom = "882yJZ14PkuRYLe3EFVOSw";

		public const string Doubts_CyrillGaveScroll = "jKNnLcnR1Um3iOPMLLJ7uA";

		public const string Doubts_DamianMoney = "HuY4UwdaNkqOsNYydRAXrg";

		public const string Doubts_ElattTalked = "JZOctEVWfk2BKj9TCWpIuw";

		public const string Doubts_EllinaraQuestEnd = "sm0qIRnfKkWuUxam1qpsZg";

		public const string Doubts_EllinaraSentBC = "pBUpwOif4kmiMl6ViWv2hw";

		public const string Doubts_EncourageOliele = "2QTmJnmOV0C_qDMkAFtsvg";

		public const string Doubts_FirstOlieleCapture = "rT6niyddnk6oHhnLX7sBBg";

		public const string Doubts_FreedOliele = "_ZCKuiuYGU2CXC7DMnAtPQ";

		public const string Doubts_LockwellBribed = "Ir1jk1yO_EmrMwN7feux6Q";

		public const string Doubts_LockwellFavor = "5TPoNAUJxEiwF-ilAGj7Pw";

		public const string Doubts_MayorGuard = "vze6xrUNDUe7Hc2I3f5_zA";

		public const string Doubts_MercenariesBatch2 = "1x-rDj4TikCX6B-vHhvThw";

		public const string Doubts_MercenariesHunt = "lSbfy7MiNki-GPlyw-vKvw";

		public const string Doubts_MercenariesKill = "_4uDef24g0qVAwZvgWOIaA";

		public const string Doubts_MofatShowedBullet = "CvPsc6ZJ60eseLAsLk7P9w";

		public const string Doubts_OlieleHurt = "SBj7nTwmkkWyRMrDSHov-Q";

		public const string Doubts_OlieleLate = "wma9GmuGTUi_x3q7ZNGROQ";

		public const string Doubts_OlielePositionLearned = "8ETKLYB2-0qUk5whDuQRYA";

		public const string Doubts_OlielePrison = "aSs9JgEuSEahJjTC3S4BoQ";

		public const string Doubts_OlieleReassuredOrNot = "S3Vx8YfrVEKjr7hK2ov9bA";

		public const string Doubts_OlieleTalk = "TDPgYx5qnEW1cqyIj1_cnA";

		public const string Doubts_OlileBCTalked = "SubkyEW5KEmtIISdAwzDwg";

		public const string Doubts_PrisonEntered = "FSvfb9lc5kuawy2wV7JDmg";

		public const string Doubts_SoldBullet = "4trFe5urCkKJmTKvdjy3Rg";

		public const string Doubts_TalkedEllinara = "dBPZlXMHpUqfoaSucZh22w";

		public const string Doubts_ThreatenFail = "AiJ2zSuKsUi5vfKqwzMuqg";

		public const string Doubts_ThreatenSuccess = "46HJdl8DBkOWAX-OSxMf8w";

		public const string Doubts_Timer = "KLbV0k6idU-JeYtY-oKj_g";

		public const string Doubts_UnlockOliele = "0jSIn_tL80GA2F5aeHmZxA";

		public const string Doubts_ZephyDeath = "O9bIYUkc7Uy2fCCboFZ-zA";

		public const string Doubts_ZephyFound = "4DDkYju_PESLYPAzUSzQpg";

		public const string Doubts_ZephyLocation = "qa6BJAVNGkmtdtUYfU9Dcw";

		public const string Doubts_ZephyrBullet = "ABmWCEcESkqmmJ_geH0ecw";

		public const string dsfsdfsdf = "9KMXp1a7fkmXf3I_om-gYQ";

		public const string Dynamic_LichTimer_update = "h1vJqBSQqEmfymjJ0MADaw";

		public const string Easter_ChsersoDone = "mrL36rEuTkOXFzgm8-fANg";

		public const string Easter_Complete = "uxbdwj0AmEeezmuxrU1eSQ";

		public const string Easter_DesertDone = "ALxXhYxRDU-n2JgLkm0-uQ";

		public const string Easter_ForestDone = "mgq7H_8ZoUyFHCDrjDk2ew";

		public const string Easter_MarshDone = "PJHQ5hO4FUyoBiIYmwlT_g";

		public const string Easter_TreasureRoom = "ja0Woh8qb0KUeOPEYo1MzA";

		public const string ElattFinalBlessing = "dAJqh54ciE2xgqqRNFNWTw";

		public const string ElattFirstBlessing = "gSV9MvPH1kKG3_jbpdhGkQ";

		public const string ElattMet = "bHz1IEw8YUaKyFlutuDtEg";

		public const string ElattSecondBlessing = "2Hv71saoZUS0T5nMpfkuOA";

		public const string ElattThirdBlessing = "4oS5kcmGDUyf9FJF-wUw1Q";

		public const string Elite_Boss_Bird = "0X_EloEDIkyMnX809pC6UA";

		public const string Elite_Boss_Boozu = "_wmwxXRCJkqgmpSnlc-J6A";

		public const string Elite_Boss_Supreme = "lmEYT2X5XECRbeXh9ofPIQ";

		public const string EmercarCOW_KillHorror = "IPtZv6BkdEaWn1vCdB983w";

		public const string EndMapChersonese = "iQSXAOjKT0aOFa89DMeyKg";

		public const string Enmerkar_WindAltar_Activated = "qjv74cVfy0GiHM-dT3arvw";

		public const string ExecutionerBugDeath = "vm6ZbiLoYkyRn6lhIxpOwA";

		public const string Exiles_Slave = "I371blSaCUGQhrG1jDlzog";

		public const string ExtortKarmock = "qoatS4hoF0KWUheCFB6hkQ";

		public const string Faction_BlueChamber = "nllwi4FnR0qN7968EsJ07A";

		public const string Faction_Chosen = "bjVloYMQxk6KXx0gph2A1Q";

		public const string Faction_Fix = "si6pm-3H7ki0qeybo1nOdQ";

		public const string Faction_HeroicKingdom = "SV3XUncnQU60ozhj9xTRpg";

		public const string Faction_HolyMission = "1tkTEWMPbEGKmWItwxy4kQ";

		public const string Faction_Sorobore = "TSqqSaAA-kekbG6ml8yQ6Q";

		public const string FindMonsoonAlchemist = "HcP5OoqVUE2cUrekuP095w";

		public const string Fraticide_BaronArrested = "qJXEm-fAkU6O7h_D9K_AFg";

		public const string Fraticide_BaronBodyGuardKilled = "gmf6uYkOaUKgLFgVGeD2rQ";

		public const string Fraticide_BaronFight = "27L4G_KTM0WkNHQa4j4tTw";

		public const string Fraticide_BaronKilled = "JWVoR5dHPEaz3k4tK80r4Q";

		public const string Fraticide_BaronWarp = "nNGaKwHpj0SLEBF0w0vkTw";

		public const string Fraticide_ClueA = "4tAmP8-oUE-iHQoJC1_gsg";

		public const string Fraticide_ClueB = "t5i95hSczEOPFdr_NwpJPw";

		public const string Fraticide_ClueC = "d89DxQGcF0O-F5vD7VGRIQ";

		public const string Fraticide_ClueD = "wqkrwhSo0UCzBTrHyo418A";

		public const string Fraticide_ClueE = "98-ap_HQCUasc1biR2EmDw";

		public const string Fraticide_Clues = "0H-81cGJ_0SwXDCG2f2dDg";

		public const string Fraticide_CyreneDownstairs = "DxAXH3V5MEqcpl2Hmewekw";

		public const string Fraticide_CyreneReport = "lP_FmwjhqkCgnkq5wwK0sQ";

		public const string Fraticide_CyreneReward = "aAckSkdWiU6UJA3f_UjRIw";

		public const string Fraticide_DefeatedInManor = "CVoPyIcWGU69vwEHWj48Fg";

		public const string Fraticide_ElectricPillarsActive = "0JX_PZ0QaESLqdnoNXpbXg";

		public const string Fraticide_EndReward = "dFHmqMB8fEuUB0qRW";

		public const string Fraticide_FakePriestInfo = "K_r6fEJXbkesFJXQybAP1Q";

		public const string Fraticide_FoundDeadPriest = "UGIm66nQXkyjOX23JFjk-Q";

		public const string Fraticide_GotHouse = "mGMVjwDUbEKQHXe45Z2EXQ";

		public const string Fraticide_HeardFailure = "qOHi1x3zA0mcY-kptF8LpA";

		public const string Fraticide_LeftManor = "3bIpugk4HkCxWLgF5GTRvQ";

		public const string Fraticide_ManorAssault = "P6RQa4OcwkqjdeRqtE5SQw";

		public const string Fraticide_PriestDead = "bHuqG-GFf0u-tw7oIgvGsg";

		public const string Fraticide_PrinceKilled = "2WceKae4PEaCyh_s5sjuBQ";

		public const string Fraticide_ReadyForAssault = "fW6jMpdasEW1_tM0-qAGnw";

		public const string Fraticide_Reminder = "p9-fznNDZkKu4UOBY8yMhg";

		public const string Fraticide_SlumsGaveMoney = "FVym6FbQp0SCJA4jtY9Ldw";

		public const string Fraticide_TimeExpired = "iFeEM5BrwUm0sL3cltAECQ";

		public const string Fraticide_Timer = "kosJVi3DhU-qUk2s3_6C2Q";

		public const string Fraticide_TsarGolemA_Killed = "s14zxnfjt0a1Plxn7uK3lg";

		public const string Fraticide_TsarGolemB_Killed = "Srhso0RBs0iOeaRYiNJfBA";

		public const string Fraticide_TsarGolemC_Killed = "szYTarupzUekxcQRZVEJTw";

		public const string Gabriella_NotTownBerg = "uKt6piKIsUCOle_AD9PNtg";

		public const string General_AutoSad = "c5TJ5rHrAEW13dX1R91mMA";

		public const string General_BalthyDeath = "TkxklKPIWEyE_hFMeF-hFw";

		public const string General_BCExplosion = "89Xhg9ij1kGrkwnZ5uk9Jg";

		public const string General_BCLevantBlock = "ZWaDMjNg30Waa2sFEKx04g";

		public const string General_BCMeeting = "AA0VyQO--kqZFB2KLzx71Q";

		public const string General_BuracGaveKey = "oqYWLflr_0W8ppkJaIFTxg";

		public const string General_BuracGaveSkill = "lwFR3kEkyEWqlMH8swTnxQ";

		public const string General_ChersoneseD6Exit = "XuHoQ6GBXU6iWGm_r3xfUQ";

		public const string General_CommonPath = "30si4Pk-30K2pu4gl3Dfmg";

		public const string General_ConfluxChoice = "vb0SHHmpI0aZzpcnLdwzRw";

		public const string General_ConfluxHMDoor = "YjcftuijuESE0f7j2AJrBw";

		public const string General_ConfluxHMLev1 = "y45GsH6hx0aEdRe_HE6qIw";

		public const string General_ConfluxHMLev2 = "4XtJSI71RECDbWLAVSkCjg";

		public const string General_ConfluxHMLev3 = "l0LeUZqeXkC4FAOsr3bGSQ";

		public const string General_CouncilReunion = "Oi8AiwiyfUaMe2eSwtrO_w";

		public const string General_CyrenePalace = "AuleLkAw4Ui2okUyVZt8zw";

		public const string General_D8LegacyOpen = "7s4zzKktSEycuOIyg9U7pQ";

		public const string General_DefeatedInBurntOutpost = "OMytggGS1EqHvBiJOVLf6w";

		public const string General_DoneQuest0 = "P2rqNERqN0O1RhkD1ff7_w";

		public const string General_DoneQuest1 = "HbTd6ustoU-VhQeidJcAEw";

		public const string General_DoneQuest2 = "Wl08NWMJokemPVfTEyT3UA";

		public const string General_DoneQuest3 = "Og71f8G5a0eVmLxZB0yOKg";

		public const string General_DoneQuest4 = "1nGk1TyMbUi3VmSdn32zCg";

		public const string General_ElattAppear = "s7O5bH74xU2jxlzhks9g-A";

		public const string General_Elixir = "jnG2CxfoeEq3wCMkYmmHUA";

		public const string General_EnnemiDisablerMonsoon = "DySznSs03kyrIGbYerBb0g";

		public const string General_GuardJustWarned = "3KMtKt0yLkyV8Z2URqrsUg";

		public const string General_ImmaculateDeath = "SGSXBQ_adky4tca1dN7v9Q";

		public const string General_IntroPlayerHouse = "z23QoIdtkU6cUPoUOfDn6w";

		public const string General_LevantinBurntOutpost = "rjdU6p3XtE22Zz2RKt8VkA";

		public const string General_LevantinKilled = "DIfJa3xHXU6GaMfQhEginA";

		public const string General_LevantManorMonologue = "ceqTN8ejOE6bs4JNGPS_YA";

		public const string General_LeverGhostPass = "_1k9gG1n9kKrtmPLIUVU-g";

		public const string General_LeverSlideA = "BMW6znH5u0qIHrcTHyVadw";

		public const string General_LichSwitchA = "MNruGs-OY0awU5-4CsZPEw";

		public const string General_LichSwitchB = "qDhSkWg6DU-yGKiZYva1fA";

		public const string General_LichSwitchC = "dRssha1lyEqnK_yQRc718Q";

		public const string General_LichSwitchD = "4jlR5yoZtEKBEEwQ6cpbSA";

		public const string General_MachineRepair = "NlbpHnJgIEmiCKUjS0RQAw";

		public const string General_ManaCommit = "5Tb9zfkQekiK5tzhknX_3A";

		public const string General_MarshDun5LeverA = "8OzFv84T4EaXiWyZeq9wRg";

		public const string General_MarshDun6LeverA = "v_rGLppOi0GG30xiGB1nYQ";

		public const string General_MarshDun6LeverB = "t680odf4qU-nThErPwc8Dw";

		public const string General_MarshDun6LeverC = "lO5_X3pkAUiUsGJ5Ztyv9w";

		public const string General_MarshDun6LeverD = "XnE3kphozECsmj9UoHDssg";

		public const string General_MonsoonFire = "eeoKjInjEEGIhMTNHbTrBQ";

		public const string General_MonsoonPeace = "grSVcJ1mFkOqghOAleUm7g";

		public const string General_NegociationPower = "NXog2vvi8Ey1z1ewkw7vjA";

		public const string General_NotLighthouseOwner = "-Ku9dHjTl0KeUPxWk0ZWWQ";

		public const string General_OldBerg = "vTucl5eIm0ad1rannMYrvg";

		public const string General_OldLevantMainGate = "PX-QXP1O50eoKRKS3GU2qA";

		public const string General_PalaceD1Opened = "fFwX0d0pBk2ZYIOhmZLoKw";

		public const string General_PathEnemerkarD5D6Open = "bUCPtMJfwEeO6rc3khS3Gw";

		public const string General_PeacemakerRewardTime = "JJf7nf1SIESg5fbHH-6VjA";

		public const string General_PlayerGameTimer = "ht5HlA1m9Uif9DskmRGBVg";

		public const string General_PlayerInBerg = "UGBKCzoCA0-3u2oxeaFMDg";

		public const string General_PlayerInCierzo = "sm812Cio9ki5ssbsiPr3Fw";

		public const string General_PlayerInHarmattan = "NEX4WlJq6kGhEC3KsM1d0A";

		public const string General_PlayerInHMPath = "7n_VUF-qY0yPSPphS5Sjrg";

		public const string General_PlayerInLevant = "fJSdc0sL90GdXz39AHFl5A";

		public const string General_PlayerInMonsoon = "ruklyyxmpUGcDYj1xyJSMQ";

		public const string General_Q1ReadyTold = "8Q_5jRx1PEeHIGQNXgBzjA";

		public const string General_Q2ReadyTold = "wwspSqQ1w0-rDcwNV7_xRA";

		public const string General_Q3ReadyTold = "MpmeySgWN0-xmWLtjtUb2g";

		public const string General_Q4ReadyTold = "0OliSGOegUu4zYGQdv5IfQ";

		public const string General_Q4ResetScene = "RZEXd6WCrEOYIqOf9gJvWA";

		public const string General_Q4Rewarded = "Co6_gSNbJUKbY03KMoY-fg";

		public const string General_Quest4Reward = "a7hmQpj07kygkwyMmIX5vA";

		public const string General_ReadyQ1 = "6ghZqSwPzU-ewQhngVT_1Q";

		public const string General_ReadyQ2 = "M6nFmGRDV0GkjfmS8ohRcQ";

		public const string General_ReadyQ3 = "M9jv0FFhbEmAEham4pMO3Q";

		public const string General_ReadyQ4 = "_PaN89YluUSonCS3LQmPbQ";

		public const string General_ReadyToBeTrained = "k550tHkv5UWvMVhLCABppQ";

		public const string General_ReadyToDefend = "fmUYhmt-n0eceni5tG2LVQ";

		public const string General_RedDagger = "j1MISObn9kO2pTkg5qIHTg";

		public const string General_RedStone = "4tDXaFWD5UiO7vkYY_oEtw";

		public const string General_RolandFailSafe = "4yWaHK3Bt0KKLx951CLXzw";

		public const string General_RolandGift1 = "PmNvyd9QWEaK7m8Zur1vMg";

		public const string General_RolandGift2 = "UtAMLtS7aEOJHreBwtyazg";

		public const string General_RolandGift3 = "T8rJOQ5Ra0qfV2vyBCXffw";

		public const string General_RoyalDisapear = "YRXtMmD6BEWQ43gWY2GHOg";

		public const string General_RoyalHunter = "b9WP9IVA3UyVxj6GlVpPJA";

		public const string General_RuneSageQuest = "l237r5lo5U21PTGuyDZvcg";

		public const string General_SlumsHighIssues = "KyRpMtHLV0ydb9tiaic9MQ";

		public const string General_SlumsLowIssues = "HBzhv0KtRE2q3wcrzF0UAg";

		public const string General_SlumsMediumIssues = "jvLwkxorekOkODE0r3FxvA";

		public const string General_SlumsPerFect = "_ZSpnrr9j0ivSF3Zdqa3mA";

		public const string General_SortieCierzo = "_zOO3Vi6eEG8pIE2lZpYJw";

		public const string General_Tablet = "p4QwvD4fu0assSiCTy1TFg";

		public const string General_ThirstDeadTuto = "lCMD66G4mEm44jhrALoX6w";

		public const string General_TribalFavor = "N33pPyy-kkeMawFk2ERwfw";

		public const string General_TrogAntidote = "fmpZ6qLCfECThs_Ycon-zg";

		public const string General_TsarAbraDock = "cNuW0_EDDEy4LFraUQKQuQ";

		public const string General_TsarElectricLab = "awSSujcoqUWqbbzX1ZjJXQ";

		public const string General_TsarJadeDoor = "-19pimv-pUmUlZGIYmHizw";

		public const string General_TsarJadeLichLair = "3KTfqD0yTE2AfRdPutWKqA";

		public const string General_TsarStone = "1TKPVmfRqEqIieSI6NeyXg";

		public const string General_WarpPalace = "iiFVMI7UbUiC_SxHCGmsDA";

		public const string General_YzanDefeatedPalace = "5idEJcNyoEG7W8LLpQGZqA";

		public const string General_YzanFriendship = "nr9KDCbQzUae1Gwf-6yOIQ";

		public const string General_YzanPalace = "-FzRkEkRjEW_TVLcDZClWQ";

		public const string General_ZagisFreed = "3I2RDY3LdkCq5SzUCIQfng";

		public const string General_ZagisKey = "NHMcMqhFkUaDd-CyUIkBLg";

		public const string General_ZagisSoldier = "BD8XSVvbsUGo5N5uI0FFrw";

		public const string General_ZephyGaveRecipe = "QUViJO3YH0OJXst7VvO5fA";

		public const string General_ZephyHMPathDefeat = "r6n_WicBI0ePr-NLM9Jlcg";

		public const string General_ZephyHMPathHelp = "eoBB-7QFmk2B8WYP33ZlPA";

		public const string Giant_PsychicTorture = "n0eMgjp6ckShNvFkx61X4g";

		public const string GiveLibrarianFireflyPowder = "VyTq5XW7gkOzip2DyoCSTw";

		public const string GiveUpMonsoonWaterQuest = "mLbnfK8Gy0C3kjmdzBCBuw";

		public const string GlacialTuanosaurDeath = "kh-VRFGeOEeKLyYV3olUFQ";

		public const string GlimpseofthePast = "oF2ZWwnV5UC49isATwB-ow";

		public const string GoFiveyes = "dDmtL3yyXEKkbEPP_YsE7w";

		public const string GoldenMatriarchDeath = "dXxQzVPtxUiyg5UxdV4hvg";

		public const string GoTellCardinalAboutLockwell = "LtqIrGNOoEy1HCtDl6hR5Q";

		public const string Grandmother = "YQD53MKgwke6juWiSWI7jQ";

		public const string GrandmotherMedyseDeath = "_a9RjUNu7karSmOeKR5Izw";

		public const string GreasyFernPilgrimChersonese = "MtrDAQI0lEuWtaFGzHhemA";

		public const string GreaterGrotesqueDeath = "JtHvr78K_U-hL56m18OU_A";

		public const string HallowPeace_AfterSagardBattle = "aGpU9b0DNESsTev6y5csqg";

		public const string HallowPeace_AgentRescue = "qR0paBqh6Umh_Q4kzMpOTQ";

		public const string HallowPeace_AskedGuard = "PGqnYsqmrkaia7kH8jIdog";

		public const string HallowPeace_BattlebornInnStand = "fULRGs8pwUenoRzEyymQiA";

		public const string HallowPeace_BCPeace = "DVoYgq9Na0us_2e42XofJA";

		public const string HallowPeace_CiviliansBlock = "wdgaZfYRFUyGWKVqszVxnA";

		public const string HallowPeace_CouncilCheck = "Sg0V0U9-fEqL8XdMNwoeOQ";

		public const string HallowPeace_CyreneAgressive = "rFwrK5u9gEa46_FzMg11ow";

		public const string HallowPeace_CyreneDefeated = "jUhYgsccO066mAfg1aQ0Gg";

		public const string HallowPeace_DialogueStartBlock = "BmiwaIESW06JXmyxN3aZZw";

		public const string HallowPeace_DoneDreamWorld = "l9WT1OZO3UOCyADg3qyEAQ";

		public const string HallowPeace_DreamTrigger = "mvedq0bRPEORCE0UsukpZQ";

		public const string HallowPeace_DreamWaves = "1f2WTw3Uqka0crBTGt8p-Q";

		public const string HallowPeace_ElattApparitionLevant = "cVdrRZnp5UuBiTUw2G25Yw";

		public const string HallowPeace_ElattInnBerg = "qrCtuk55v0e-8AOVRT6ZRw";

		public const string HallowPeace_EnterLevant = "omvg2I-lYkG-NAeEHuUUWA";

		public const string HallowPeace_EnterPalace = "9fBEx8Q2F0iSJ4jxklwzaw";

		public const string HallowPeace_FailedReward = "_RxFihLMGkKP0kBtWsN3Kw";

		public const string HallowPeace_FightOver = "UO70G2zXjU6DiHAKq-xieQ";

		public const string HallowPeace_FinalReward = "ComRxGVNLEK4lox9S21mNg";

		public const string HallowPeace_FoundAgents = "xhIchIXXhkWJsZq8qG0OVg";

		public const string HallowPeace_GabPeace = "06JSjPGJ6Eu-cGNAIcP-qw";

		public const string HallowPeace_GuardBlock = "cNj1jzKg50KbK8FztE-HLA";

		public const string HallowPeace_HKPeace = "Bsp9QbG_GEKj1JflhTu1eQ";

		public const string HallowPeace_Horror = "3XTEqjJ9hkCuJYN3zFCj8w";

		public const string HallowPeace_HorrorNotToFight = "xaJOsYV7ckyXJJ68NbEkMA";

		public const string HallowPeace_NegociationPower = "v4egLwNAvUGhtV1rYxwznA";

		public const string HallowPeace_PalaceKey = "UvU1GpknekWHAJCUGmlmNQ";

		public const string HallowPeace_QestionCount = "jCrvk4xS50OP4DbYZdc7Wg";

		public const string HallowPeace_RissaPeace = "SwFRKikVwU-R97E9VBFPnQ";

		public const string HallowPeace_Sacrifice = "m5NbKim2NUK-OLQcjm7fDg";

		public const string HallowPeace_SacrificeChoice = "gqTbNUg45k6ESUZdh4dXIw";

		public const string HallowPeace_SacrificeNot = "3xDlSNkiK0yWYtlJ7egF6w";

		public const string HallowPeace_SagardFail = "8gAxRjQT-0a2UWa4hwNQLA";

		public const string HallowPeace_SagardOwned = "p6LZhC-ufkWrMRxVm6Dazw";

		public const string HallowPeace_SagardPeace = "iBABfYLhb06SBB0k-_2m1A";

		public const string HallowPeace_SagardSuccess = "agNMO8se3U6-flO9HiI4hg";

		public const string HallowPeace_SagarDuel = "bUwxG9ctV0SmTEE2PxgzhA";

		public const string HallowPeace_SagarKickingAss = "XpDG0YdYZUaQk8LaGv0pHQ";

		public const string HallowPeace_ShellIllusionDeath = "J22zwr5h-kmw330dIax8-A";

		public const string HallowPeace_ThreatenGuard = "eDfukyL-3ECa8MNmdNSUbQ";

		public const string HallowPeace_ThugsDefeated = "bPr3bpgQeEuxzPzP9VlvSA";

		public const string HallowPeace_ThugsHunt = "II9VSZJNZk--Z0bOrH5F9w";

		public const string HallowPeace_ThugsReport = "0go87L2r50eo1PqlTf3EUA";

		public const string HallowPeace_ThugsWon = "hJTyNFquEEqZXp-32b8vzw";

		public const string HallowPeace_TimerA = "5ZVhOFKFN0mWU_3iJo0b0g";

		public const string HallowPeace_TimerAYzanInTime = "m5afueLBV0GeaRe6qwpHpA";

		public const string HallowPeace_TimerB = "QTAby206b0-hzKvu3XlhPg";

		public const string HallowPeace_WarpInPalace = "E_0O3h2XIESHzc0TKPc0hg";

		public const string HallowPeace_WaveCound = "vtFzQSeY1EWqICirh5pBgw";

		public const string HallowPeace_WaveNumber = "Hdq0qthyuk-XOBVAH3xTGg";

		public const string HallowPeace_YzanAgressive = "8zx95bbHYE6OBWv0SATS8A";

		public const string HallowPeace_YzanAlly = "KDM8FIvcJkSarO7j93SVYw";

		public const string HallowPeace_YzanDefeated = "_K80VinO0U2xOEFuKt6ZhA";

		public const string HallowPeace_YzanDialogueFail = "EW1N9QnaiU2xhzPPCRj73w";

		public const string HallowPeace_YzanDialogueSuccess = "2X9rzOhTN0OV4zt8XKDV1g";

		public const string Harmadung_BigGateKeyA = "axYyoBOC7E6JLraOFkx5tA";

		public const string Harmadung_BigGateKeyB = "PPtV0M2ZKUyHCdOgZKhTaA";

		public const string Harmadung_BigGateKeyC = "0UP4vZLOWk2tJGGwPJetxQ";

		public const string Harmadung_BigGateKeyCount = "Ud0MZGGdVUmpF2WcRRBK8g";

		public const string Harmadung_BigGateKeyD = "xBG_0d3dvESTUwwitvLqqw";

		public const string Harmadung_BigGateOpen = "JWLxXeOa-0a7GGYyb7sIVA";

		public const string Harmadung_D1_A_GateA = "2G2X0B0Sp0OCrNUb-LwyqA";

		public const string Harmadung_D1_B_GateB = "VYrjA9kYskyKQRRJ3ht2nQ";

		public const string Harmadung_D1_C_KeyF = "0QcEHe6hTE6gkizWEBBWnA";

		public const string Harmadung_D2_A_Secret1 = "usDVMK1TjUOUCbW-C3f2ZA";

		public const string Harmadung_D2_B_Secret2 = "KUTtpM-on0GCevmQyciJAw";

		public const string Harmadung_D2_C_Secret3 = "YuFAvDTVL0-f2bSzNMVZbA";

		public const string Harmadung_D2_D_Secret4 = "qtpiGm-5Mkyl9QGYLr9iUA";

		public const string Harmadung_D2_E_Secret5 = "UKJD0F7oN0GEcyTBxUNI0w";

		public const string Harmadung_D2_F_Secret6 = "1m8xbJWR70KWDQtMVkjb9w";

		public const string Harmadung_D2_G_GateB2 = "-DrWQWrXx0qyJFuWCMY0MA";

		public const string Harmadung_D2_H_GateB3 = "Kg5uh5WmUUa41ppqOyJ9og";

		public const string Harmadung_D2_I_GateB4 = "W8Tcz-Uakkq_NWatog2LkQ";

		public const string Harmadung_D2_J_RustLich = "qdB7OLm36Uu67pP7uu-mgg";

		public const string Harmadung_D2_K_RLReward = "-9vbCUgk3Eu2QCH5lPZDwg";

		public const string Harmadung_D2_LichBattle = "Ou450pomeEu8XK2s8yZspw";

		public const string Harmadung_D2_RustLichSoul = "SFLSYid5WkerHNSezJqOWw";

		public const string Harmadung_D3_A_GateA = "Z41fE8seMkiG4Glku3ZEhw";

		public const string Harmadung_D3_B_GateB = "h7Y-8H0dkEO3UinATaTobQ";

		public const string Harmadung_D3_C_GateC = "lc10FJ6AeEyqW_sQWmlD_w";

		public const string Harmadung_D3_KeyD = "etc7nF8olUSaD0mQc9hLmA";

		public const string Harmadung_D4_A_GateA = "xPvl2OhUa06sKdE4WGALQw";

		public const string Harmadung_D4_B_GateB = "4fDAd8Bn40yIS706BCKBJA";

		public const string Harmadung_D4_F_GiantKilled = "bQCMxXlz3E-liUBZ2oz2lw";

		public const string Harmadung_D4_G_TrainActive = "EhVaYT3jxE-EPEK1gcUtVg";

		public const string Harmadung_D4_H_GolemFight = "djwyWt8sdkm4sAMfdxAx4w";

		public const string Harmadung_D4_I_TitanCorrupt = "tejeZLxHQ0yJR6ZkWS07cg";

		public const string Harmadung_D4_J_TitanHammer = "wXxpcV2cd0uT4Q7o3oJKMQ";

		public const string Harmadung_D4_K_TitanHalberd = "hvpYEDWLWUWsvZ5HKcXkkA";

		public const string Harmadung_D4_TitanEtheFireMoreHP = "i8DVDetNt0Wrl8Of2xrojQ";

		public const string Harmadung_D4_TitanHeat = "PycC0Q4mYUeu59apQcahSQ";

		public const string Harmadung_D4_TitanIceLightRegen = "XLxydth12EqHCUEtkYRyBw";

		public const string Harmadung_D4_TitanSetup = "OdBs0kQ1m0-nNvNirWqXiA";

		public const string Harmadung_D5_A_GateA = "YaD6ASp330mA4fWuzJ6Otg";

		public const string Harmadung_D6_A_PowerElevator = "ESTQbb2NAUiWe9W1mytDxA";

		public const string Harmadung_D6_B_Unused = "R5FTjLvmlEGvii0h6CntvQ";

		public const string Harmadung_D6_C_GateB = "3778sUxE0UichN_bWjqCAw";

		public const string Harmadung_D6_D_BossFight = "ZEH8Lrgj8Ua2wtAI25mMRg";

		public const string Harmadung_D6_E_GiantHorrorKill = "ADCFPdbT9E-yI0TCsc_CYg";

		public const string Harmadung_D6_E_ParasiteKill = "HwI8QQ3jDkaebdBNyhYadg";

		public const string Harmadung_D6_exit = "ZOb1LWSfrEGfmSPNHyJd_g";

		public const string Harmadung_D7_A_GateA = "D6L_yr43vU2w-GQJ8PSOlA";

		public const string Harmadung_D7_B_GateB = "oZfZJ-FuSUSB5iC1Qa7KAw";

		public const string Harmadung_D7_C_GateC = "F3Ag8MnEyE2qSpF5i4UNOA";

		public const string Harmadung_D8_A_GateA = "So1Lm33K-kKPRmoIYPjNcQ";

		public const string Harmadung_D8_B_ElevatorG = "-eXv0OBruEiEKa-iP9vkGw";

		public const string Harmadung_Ds3_TrogPrison = "dPK7aJlbsEqi3h_QIUPoGw";

		public const string Harmadung_Ds4_BanditPrison = "4cm-fVCq8USdGgNMWTjHPQ";

		public const string Harmadung_GiantReward = "uoWzlHsvu0euxjdnh6p9Ow";

		public const string Harmadung_TitanDialogueSafety = "M7HnPnG1Ok6zQVpBaoBQPQ";

		public const string Harmadung_TitanReward = "Czxahi3mvka7Nqah1T1drA";

		public const string Harmadung_WentAntiquePlateau = "aJKcAf-07ECnN-BaDuamUQ";

		public const string Harmattan_WindAltar_Activated = "T17R0nEH3UuskT-7OXPhtw";

		public const string Heart_AshGiant = "bJR5-uuHX0OjOBfZA_F-kg";

		public const string Heart_Sold = "Ss6xx5ZACE2AB6EDqGjYmA";

		public const string Helen_Trailblazer = "kqSuV-mQQU-8z40Iuv6uwg";

		public const string HelenPartnership = "B2zOQKQgrEGNW3k8peGQYg";

		public const string HeloiseBanished = "Sh-msCmGxkmpBZUYMIqrig";

		public const string HeloiseBlessing = "xgNZwn2fO0yUjE5K0ZAcpw";

		public const string HeloiseCurse = "MKiYkEoK6UOXGxA7d2MJ7g";

		public const string HeloiseExplain = "ETpB99q9E0SpUPsyUFiYnw";

		public const string HeloiseMet = "e3szelyB_EGwi64le-Xk1Q";

		public const string HeroPeace_BackToPalace = "C7CzIM_xqkie9ZjWQwWWKg";

		public const string HeroPeace_BCHideoutCleared = "w_7mviMtzkOhcHYq_SgtBg";

		public const string HeroPeace_CalixaStart = "oCIusrhya0CNGRR-tLY-Sg";

		public const string HeroPeace_CyreneExpired = "nJhN9W-chUeqmbH87BzNVA";

		public const string HeroPeace_CyreneTimer = "k0ASFQgkVkChs7qUzG_W2A";

		public const string HeroPeace_DawneAgressive = "pXtvX0y_5U6IFZ-OJ5ajNQ";

		public const string HeroPeace_DawneDefeat = "vaMMrEVQF06jsrEgNE-T3A";

		public const string HeroPeace_DawneDesact = "lrIugafP0kadXs8sAvuAnQ";

		public const string HeroPeace_DawneSecretFailsafe = "hQm-Y-vJr0u9mSHiWm8QBw";

		public const string HeroPeace_DawneSolved = "SGkPJpF1vkmszP03q2C6Wg";

		public const string HeroPeace_DawneTask = "Q0K3MQlrMk6I0hUp3hY-ug";

		public const string HeroPeace_DefeatedByHorror = "seq_1ZtyKEqlcuzU7ZgLEg";

		public const string HeroPeace_DefeatedInDock = "mocGh3ujqEONaWzg0cSdLg";

		public const string HeroPeace_DockBattle = "cCzzaJ9AV0u1ObZ_nU_9KQ";

		public const string HeroPeace_DockFight = "HC5UYxl75UanXFWIwo2KIA";

		public const string HeroPeace_DockInfo = "Ec3rzMnmxkKGFuPC1bkr7Q";

		public const string HeroPeace_FightADefeated = "MWEpTUh9QUmZFQicNFX80g";

		public const string HeroPeace_FightBDefeated = "E97icLpAikyufVG_hY3zlQ";

		public const string HeroPeace_FoundNote = "OsvHGv233UmLb6BBHH9EVg";

		public const string HeroPeace_GuardThirsty = "LlTRVynvjU2XEE_bGqcATQ";

		public const string HeroPeace_HorrorEleminated = "WwyVip7wSEqL4fSbhgbC2w";

		public const string HeroPeace_LevantLocked = "WC-SZXbh60Oj6uaBz2GBpg";

		public const string HeroPeace_LevantSoldiers = "Fu8-jLjn1kaPxBz4W-Vpmw";

		public const string HeroPeace_MarcusBossDefeated = "nFAhvOTJPEC38NGAujNOyg";

		public const string HeroPeace_MarcusLock = "LW7TqmYOXUCru7G2ZF5X5w";

		public const string HeroPeace_MarcusSolved = "I2wAkRhkrUKbcWemrglsfQ";

		public const string HeroPeace_PalaceLocked = "TgbtOSbqu0S5H8xHMkXLGg";

		public const string HeroPeace_PalaceSolved = "pyJN8wjxIkGpUz66ZhY8Xg";

		public const string HeroPeace_PeacefullPalace = "wwfkTyWcbUqQJsNRGzVzbA";

		public const string HeroPeace_PigeonSolved = "vkyZAvJrK0Orj9igk4P2cw";

		public const string HeroPeace_PigeonTask = "A-JDrdlPs0qU70bHUpHEsA";

		public const string HeroPeace_ReportSimeon = "_09SDFdFUEagKmuiUO21gQ";

		public const string HeroPeace_SpawnBoss = "FWq5fhDOo0W-ZjDc0I8FGQ";

		public const string HeroPeace_ThirstAutoDialogue = "mJJkxxUoGUauVs_fiPiqjQ";

		public const string HeroPeace_TimerA = "pmstAGccfEy1_LMDa1QgOw";

		public const string HeroPeace_TimerAExpired = "4hAo6aoM0kOz_vecxfdLXA";

		public const string HeroPeace_TimerAInTime = "46x2nssBx0mxZWpEvDaQoQ";

		public const string HeroPeace_TimerB = "Ms7EFdanpkSMYvTHsIlGuQ";

		public const string HeroPeace_TimerCyreneCheck = "dtrEpDK8cEmon9eWPMaUeg";

		public const string HeroPeace_TunnelEnteredHK4 = "0lfROZbkZkOR1Pz8kIZBFA";

		public const string HeroPeace_WarpYzanDock = "-nqQzPZQYUqr4y8PnmcBaw";

		public const string HeroPeace_YzanDialoguePoint = "Uy-GTqjsHE2DuHxnsvyEAQ";

		public const string HeroPeace_YzanDockFound = "ofNwC26K1kCjJrooiQ7kOg";

		public const string HistorianBlueSand = "jt1sDkdgDEC29cEcrbCaow";

		public const string HistorianParty = "7gmvxn52E0icGBsw9eI1XQ";

		public const string HistorianStalker = "tzCCMrGqWkOsEvugdfGoZA";

		public const string HistorianStep2 = "Oe0ayAYhEUmkLOcaHTRAng";

		public const string HistorianStep3 = "64zwsSLxvUWIyVKA9vdWpA";

		public const string HM_Oliele_Reborn = "-tZ-SvXCGkqMl07HrH-Yiw";

		public const string HM_Peacemaker_Battleborn = "1WLQFvagZ0OCn7AJX_9xSA";

		public const string HM_Peacemaker_BlueChamber = "e_UelS63ikG7-a8FQshhrg";

		public const string HM_Peacemaker_Delivery = "6KmL-HunQ0y5_jATtVnvRg";

		public const string HM_Peacemaker_DeliveryFail = "9Oys_83PDEq4tTtB4KwayA";

		public const string HM_Peacemaker_Innmouth = "Ykq8cgAaQEmEXrxtczOTfg";

		public const string HM_Peacemaker_Levant = "XVR0AIxUbEmB7H89eVer3A";

		public const string HM_Peacemaker_LevantSituation = "npRtgKs7FU2FvqiAqbn5vw";

		public const string HM_Peacemaker_Lockwell = "pPVsSt9qNki38cPP0fyx1g";

		public const string HM_Peacemaker_Mathias = "8x6kJjWCJkaQPDwGi9x_2w";

		public const string HM_Peacemaker_Palace = "IKti_rCghka9md0aXbr16Q";

		public const string HM_Peacemaker_Prisoners = "-JqRkszBDUmvIi-yEYf2bQ";

		public const string HM_Peacemaker_Report = "0RUpfBN0tU6jk273uvdvtQ";

		public const string HM_Peacemaker_Rissa = "ZgY8053uzkewSb3qaO0lqA";

		public const string HM_Peacemaker_Sacrifice = "yCsGZKDrUEe2lH_GyjxVbg";

		public const string HM_Peacemaker_SagardAlive = "svbrZieiTkupWb-4AyGVdw";

		public const string HM_Peacemaker_SagardDead = "uABh8RcTDkG1-Gs2zB9grg";

		public const string HM_Peacemaker_Savior = "OEMxUDLLM0q5DdVsMJCFiA";

		public const string HM_Peacemaker_YzanArgensonDone = "u9X3M9c_vEyFI3h5dwaeCw";

		public const string HM_Pilgrim_AncientCave = "MHz2BGuu-kuN5Y7uJ6QyIA";

		public const string HM_Pilgrim_AnyState1 = "XEpR8eNWoUK0YUZ8PT4qPQ";

		public const string HM_Pilgrim_AnyState2 = "ooBS20zT9EKCFp4sRZcXIw";

		public const string HM_Pilgrim_AnyState3 = "gSu2jcylXEG0rqFEUeNECg";

		public const string HM_Pilgrim_AnyState4 = "LIDzQFrjz0qwSXYgsFvE-w";

		public const string HM_Pilgrim_Bourlamaque = "E61ae_svVE2dmazlXuTk5g";

		public const string HM_Pilgrim_Chamberlord = "tPLhqxeGK0yfC4aFAWx7fg";

		public const string HM_Pilgrim_ChersoneseOliele = "SSJKO_Wn-kyFUi_HsSmhug";

		public const string HM_Pilgrim_ChersoneseStart = "JrmSF_F5aUKPhhA4BpW7Iw";

		public const string HM_Pilgrim_ChersoneseVigil = "rbXsC3x-F0e-ZzX3_s0I5A";

		public const string HM_Pilgrim_Discipline = "hW6WeMiX6EOJKtlODHGb2g";

		public const string HM_Pilgrim_Elatt = "Fn3tVm7twEuX9BH4ByjZDA";

		public const string HM_Pilgrim_Fade = "YTWrNsp3rU2YB5IMNRrT9w";

		public const string HM_Pilgrim_Failed = "xJsBpWLgR0eVK1N7v2i7fw";

		public const string HM_Pilgrim_FailureFood = "0LBybc98SEeMr0KXFQTX4A";

		public const string HM_Pilgrim_Food = "DVZ09OvMyUqbk62Pb6OPxw";

		public const string HM_Pilgrim_Historian = "Wk5jz9VOJ0mV2FSn1PhU3Q";

		public const string HM_Pilgrim_Left = "S8FMCLMUkUGoOmm872I9pw";

		public const string HM_Pilgrim_Love = "b8NgUdE_TUiek38bmKwvJw";

		public const string HM_Pilgrim_Mofat = "oIUREifPhEKCuIoAs4bTMQ";

		public const string HM_Pilgrim_Mofat_Fail = "mstCFOAxJEmoaixe7emyIA";

		public const string HM_Pilgrim_Money = "67c72QdRyECdktDchvTHCg";

		public const string HM_Pilgrim_Myriad_Deal = "7DDn_43H_EuTf1tsPRKw8w";

		public const string HM_Pilgrim_Myriad_Fall = "i-VEpB-u6UeMrBRl6tvMxw";

		public const string HM_Pilgrim_Myriad_Nodeal = "EqyZsMXWtkarfacfw0IGHA";

		public const string HM_Pilgrim_Myriad_Success = "jfu6224ehkGs0bQpdb9mYA";

		public const string HM_Pilgrim_MyriadMet = "Y70fcz2-cUaSRIsYyv0L5g";

		public const string HM_Pilgrim_NoZephyrien = "IVFBxnk0EkWb1tA5uabbQg";

		public const string HM_Pilgrim_Oath = "vzQLQtBoXEeNgyejHqjFEQ";

		public const string HM_Pilgrim_Oliele = "bTlEaWb17kiO07N3tlO7WQ";

		public const string HM_Pilgrim_Pardon = "Xs7yruOiqkW-C8k3Yj0DlQ";

		public const string HM_Pilgrim_Peace = "qKYYmI9CtESKWw8DpFUk6A";

		public const string HM_Pilgrim_Perfection = "WHVm58j1dUia1oxg_ycrqg";

		public const string HM_Pilgrim_Plants = "16abERgrtkyw778yiypt2g";

		public const string HM_Pilgrim_Priest = "zkcbVbu0h0K3NT3PRa5AXQ";

		public const string HM_Pilgrim_Priesthood = "dG485DKAtU2MGhNtzNVXBQ";

		public const string HM_Pilgrim_Purged = "80eLAFtsQkKCgUX4EmdN4g";

		public const string HM_Pilgrim_Shrine = "k45ZfboPfUmwO3csxaSpuw";

		public const string HM_Pilgrim_Zephyrien = "nWjuwj8hyECDuL8R1WCV_w";

		public const string HM_Pilgrim_Zephyrien_Purge = "WwtrDWD-TEuyFPB9c6Oo9A";

		public const string HM_Truth_Abrassar = "4fQnHcNbuUOsQe2r3mx37g";

		public const string HM_Truth_AbrassarSupplies = "LY_GaD5F6kWOgI3b6QCcoQ";

		public const string HM_Truth_AnyState1 = "3Rw0UNTjQk6NM3zm1TIjCg";

		public const string HM_Truth_AnyState2 = "HWn-4pkMwEa7hxFiL6Kh6g";

		public const string HM_Truth_AnyState3 = "W0uEL5S8p0SJHUuCtVQsHg";

		public const string HM_Truth_AnyState4 = "JRSi_nYG10qFZOCE-dWJow";

		public const string HM_Truth_AnyState5 = "_zZ5OZCJUUe_0PWwDtz8Kw";

		public const string HM_Truth_BergArchive = "SYeIMVacAkG-1EN5s4tmWA";

		public const string HM_Truth_BergLevant = "t2nLOJZ1nEKQPEO1wxzyTQ";

		public const string HM_Truth_BergLevantDone = "uf-rtbzKPUeBlHK0iCsKuA";

		public const string HM_Truth_BergLostThief = "_dtMpe87cEmt27in41o3Rw";

		public const string HM_Truth_DamianFail = "ACZisjy6zUK36XO26puGhA";

		public const string HM_Truth_Duel = "bjVf4x8hFkOyq6GBvjwy8w";

		public const string HM_Truth_Fail = "r1iwNY6EP0aMpYHI8Hv1eA";

		public const string HM_Truth_Guardian = "pL4goitgkEeq7aX4mYnocg";

		public const string HM_Truth_LevantineOliele = "s-TtUo_8DEqqA7E0lIgUFg";

		public const string HM_Truth_LevantOliele = "UxYrNQo2p0yFXhme94Ym-g";

		public const string HM_Truth_LevantWelcome = "jvkS3YGW90-n6SgCg0JO1A";

		public const string HM_Truth_Oliele = "caIgmNlqEUq2MWjyf7aAJQ";

		public const string HM_Truth_OlieleExile = "AxysCBR7Z0SA4_pfrhq-xw";

		public const string HM_Truth_OlieleSurvivor = "1fiyhQ8iZUatKO0e9LiOpQ";

		public const string HM_Truth_ScrollTranslated = "65cBeEZn802c4mNW_yC1yg";

		public const string HM_Truth_SetUp = "fFnVoG--8USsV6a5CK9HrA";

		public const string HM_Truth_Situation = "BouRHPM-Z0mmWbDokkrvuA";

		public const string HM_Truth_SplinterReport = "Ml4cN7OCtEaB_U1xRW4kLQ";

		public const string HM_Truth_SplinterTroubles = "DMCjtZTJmEyNe4Iki8RjYw";

		public const string HM_Truth_StoneTitanScroll = "i17lxs6mpEqP3mGgjpAX5Q";

		public const string HM_TruthBergLevantCoop = "r2ISOB5pKESOLCb3nkWKYQ";

		public const string HouseStartingItems_Berg = "ypT9_eYB6UK2gnAaqJVA3g";

		public const string HouseStartingItems_Cierzo = "dlMPJtXDWU6R1YEfsezlSA";

		public const string HouseStartingItems_Harmattan = "Q-U-VKV68Uezx3jM4ZB8Jg";

		public const string HouseStartingItems_Levant = "EEdVb-dL10qjF70lw0UZKw";

		public const string HouseStartingItems_Monsoon = "1iyLYN6eXUCQY9ZjD0kd1w";

		public const string HouseStartingItems_NewSirocco = "_P9lL0G5RUOfVC4ydwa1kQ";

		public const string Inn_Berg_RoomAvailable = "klxo5f5B1kSLie07umtopw";

		public const string Inn_Caldera_RoomAvailable = "TD3INfzB7UaUtrJRou00ig";

		public const string Inn_Cierzo_RoomAvailable = "yIodGB0Erkyny0mtzhVrfw";

		public const string Inn_Harmatan_RoomPoorAvailable = "vFyEJACDuUinN-Go6f2lnQ";

		public const string Inn_Harmatan_RoomRichAvailable = "MPDpYTTdKkKtHkRzQE12KQ";

		public const string Inn_Levant_RoomAvailable = "HH4bWup4TkORnQGwGKFwDA";

		public const string Inn_Monsoon_RoomAvailable = "EiTTfHmko0-hOi4CnzGMgQ";

		public const string JadeIdol = "xTjb7MmwtUq5gmF6tFZ6uQ";

		public const string KaziteCaptainDeath = "zHYX4vqmhUWWIde8s2n_Sw";

		public const string KillBandits = "DrZNPHnz3EeiThocqzH2Ug";

		public const string KillDeer = "3z-tSyd8LUeN6VbBHA80oQ";

		public const string KillHounds = "HG59c06eU0eHd9aV8xjlNA";

		public const string KillKarmock = "0_wqHPzMU02YLh37wPq_bw";

		public const string KillMerchants = "PDN9mngGNEOy7okKWkYV_g";

		public const string KillMercs = "kAAv1C1K3E-u_GgPDruJIQ";

		public const string KillPlayer = "K3Xv55PiYUGEVbPJ1fVjKw";

		public const string KillTuanosaur = "UR2-DO2D5EmUvUT33ivY5w";

		public const string KillTuanosaurs = "tUCccgVjo0uBHoWltQs1WQ";

		public const string LearnAboutKarmok = "3J6IsNQCWka2eI-tMKQbRw";

		public const string LearnAboutLiches = "cy8ddjypVU2bh583Fara-Q";

		public const string Levant_WindAltar_Activated = "XeAaNghBlE-RjQhbc2obKA";

		public const string Lich_GoldAutoDialogue = "Gk0Q82pynUSG8AA5sZHBkA";

		public const string Lich_GoldChoice = "6-JZRVaap0ife9PpGOc45A";

		public const string Lich_GoldDefeated = "Y5SZ7n2rWUe-XfOr6TGjgA";

		public const string Lich_GoldName = "bSBl8yk14kiLqrk-Koq2jg";

		public const string Lich_GoldStack = "UUNYRZV7lECdwx6Wz42W4A";

		public const string Lich_GoldTeleport = "YBVbIICRFU-Iup-ecc01HA";

		public const string Lich_GoldTimer = "Bgs-ZpNzNUCFQz30pIjqAQ";

		public const string Lich_JadeAutoDialogue = "QBJvNhojS02If2uexkaV7A";

		public const string Lich_JadeDefeated = "c69wPmIwFEmHoEa8OqCvbg";

		public const string Lich_JadeName = "wcT3a5KkQ0KVmNaB8m_u0Q";

		public const string Lich_JadeTeleport = "huRVmI255UWo_Hm4bnAo7Q";

		public const string Lich_JadeTimer = "IKx3MlkeYUux7-nXbDzKYA";

		public const string Lich_JadeWaitDone = "vdGAbOxI40WxxXzup1PCWg";

		public const string Lich_JadeWeaponPresentation = "zMPgGgG7fEaKMleVLshowQ";

		public const string Lich_Roland1 = "Km9osRS2CE2AYGplTuW1qA";

		public const string Lich_Roland2 = "el7VKawZNkOzi7zYpnMuTQ";

		public const string Lich_Roland3 = "c_zXuXRgpUCKgn1-qcD7jg";

		public const string Lich_UnoptanableQuestEvent = "OX_VTfcJkECMqVTGotfdBQ";

		public const string LightningBladeDancerDeath = "FVU4ZsnCA0GgVr2DIYO5fA";

		public const string LiquidCooledGolemDeath = "Aj3DmHz1ckmR76ISoWDWpg";

		public const string LoseToG