Decompiled source of KeybindManager v1.0.0

KeybindManager.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using HarmonyLib;
using KeybindManager;
using KeybindManager.Integrations;
using KeybindManager.UI;
using KeybindManager.Utils;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using S1API.Console;
using S1API.Input;
using S1API.Logging;
using S1API.PhoneApp;
using S1API.UI;
using S1API.Utils;
using UnityEngine;
using UnityEngine.EventSystems;
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: MelonInfo(typeof(Core), "Keybind Manager", "1.0.0", "Riccaforte", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: MelonAuthorColor(1, 68, 2, 152)]
[assembly: MelonColor(1, 68, 2, 152)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("KeybindManager")]
[assembly: AssemblyConfiguration("CrossCompat")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+9830294891316ac2d0eedcfda957e5ec2350af54")]
[assembly: AssemblyProduct("KeybindManager")]
[assembly: AssemblyTitle("KeybindManager")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[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;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace KeybindManager
{
	public class Core : MelonMod
	{
		public readonly Log _logger = new Log("KeybindManager");

		public static Core? Instance { get; private set; }

		public override void OnInitializeMelon()
		{
			Instance = this;
			HarmonyPatches.SetModInstance(this);
			KeybindRuntimeService.Shared.InitializePreferences();
			_logger.Msg("Mod initialized and config loaded.");
		}

		public override void OnSceneWasInitialized(int buildIndex, string sceneName)
		{
			KeybindRuntimeService.Shared.HandleSceneInitialized(sceneName);
		}

		public override void OnUpdate()
		{
			HarmonyPatches.TryApplyPatches();
			KeybindManagerPhoneApp.TickActiveInstance();
			KeybindRuntimeService.Shared.TickPendingSavedKeybindRestore(_logger);
		}

		public override void OnLateUpdate()
		{
			KeybindManagerPhoneApp.TickActiveInstanceLate();
		}

		public override void OnApplicationQuit()
		{
			Instance = null;
			KeybindRuntimeService.Shared.ResetRuntimeState();
		}
	}
}
namespace KeybindManager.Utils
{
	internal sealed class ConsoleCommandCatalog
	{
		private static readonly string[] ConsoleAssemblyNames = new string[2] { "Assembly-CSharp", "Il2CppAssembly-CSharp" };

		private static readonly string[] ConsoleTypeNames = new string[2] { "ScheduleOne.Console", "Il2CppScheduleOne.Console" };

		internal ConsoleCommandCatalogResult LoadEntries()
		{
			List<ConsoleCommandReferenceEntry> entries = new List<ConsoleCommandReferenceEntry>();
			string statusMessage = "Commands are loaded from the game's console registry.";
			try
			{
				Type type = FindConsoleType();
				if ((object)type == null)
				{
					return new ConsoleCommandCatalogResult(entries, "The game's console registry isn't available in this runtime.");
				}
				object obj = ReadStaticMember(type, "Commands") ?? ReadStaticMember(type, "commands");
				if (obj == null)
				{
					return new ConsoleCommandCatalogResult(entries, "The game's command list couldn't be read.");
				}
				if (!TryEnumerateCommandObjects(obj, delegate(object command)
				{
					AddCommandReferenceEntry(entries, command);
				}))
				{
					return new ConsoleCommandCatalogResult(entries, "The game's command list couldn't be enumerated in this runtime.");
				}
				if (entries.Count == 0)
				{
					statusMessage = "No console commands are currently registered.";
				}
			}
			catch (Exception ex)
			{
				statusMessage = "Couldn't load command data: " + ex.Message;
			}
			return new ConsoleCommandCatalogResult(entries, statusMessage);
		}

		private static Type? FindConsoleType()
		{
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly assembly in assemblies)
			{
				string name = assembly.GetName().Name;
				if (string.IsNullOrWhiteSpace(name) || !MatchesKnownAssemblyName(name))
				{
					continue;
				}
				string[] consoleTypeNames = ConsoleTypeNames;
				foreach (string name2 in consoleTypeNames)
				{
					Type type = assembly.GetType(name2, throwOnError: false);
					if ((object)type != null)
					{
						return type;
					}
				}
			}
			return null;
		}

		private static bool MatchesKnownAssemblyName(string assemblyName)
		{
			string[] consoleAssemblyNames = ConsoleAssemblyNames;
			foreach (string b in consoleAssemblyNames)
			{
				if (string.Equals(assemblyName, b, StringComparison.Ordinal))
				{
					return true;
				}
			}
			return false;
		}

		private static bool TryEnumerateCommandObjects(object commandsValue, Action<object> onCommand)
		{
			if (commandsValue is IEnumerable enumerable)
			{
				foreach (object item in enumerable)
				{
					if (item != null)
					{
						onCommand(item);
					}
				}
				return true;
			}
			object obj = commandsValue.GetType().GetMethod("GetEnumerator", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null)?.Invoke(commandsValue, null);
			if (obj == null)
			{
				return false;
			}
			Type type = obj.GetType();
			MethodInfo method = type.GetMethod("MoveNext", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
			PropertyInfo property = type.GetProperty("Current", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if ((object)method == null || (object)property == null)
			{
				return false;
			}
			bool flag = default(bool);
			while (true)
			{
				object obj2 = method.Invoke(obj, null);
				int num;
				if (obj2 is bool)
				{
					flag = (bool)obj2;
					num = 1;
				}
				else
				{
					num = 0;
				}
				if (((uint)num & (flag ? 1u : 0u)) == 0)
				{
					break;
				}
				object value = property.GetValue(obj, null);
				if (value != null)
				{
					onCommand(value);
				}
			}
			return true;
		}

		private static void AddCommandReferenceEntry(ICollection<ConsoleCommandReferenceEntry> entries, object command)
		{
			string text = ReadStringMember(command, "CommandWord");
			if (!string.IsNullOrWhiteSpace(text))
			{
				entries.Add(new ConsoleCommandReferenceEntry(text, ReadStringMember(command, "CommandDescription"), ReadStringMember(command, "ExampleUsage")));
			}
		}

		private static string ReadStringMember(object instance, string memberName)
		{
			Type type = instance.GetType();
			if (type.GetProperty(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(instance, null) is string result)
			{
				return result;
			}
			if (type.GetField(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(instance) is string result2)
			{
				return result2;
			}
			return string.Empty;
		}

		private static object? ReadStaticMember(Type type, string memberName)
		{
			PropertyInfo property = type.GetProperty(memberName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			if ((object)property != null)
			{
				return property.GetValue(null, null);
			}
			return type.GetField(memberName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(null);
		}
	}
	internal sealed class ConsoleCommandCatalogResult
	{
		internal IReadOnlyList<ConsoleCommandReferenceEntry> Entries { get; }

		internal string StatusMessage { get; }

		internal ConsoleCommandCatalogResult(IReadOnlyList<ConsoleCommandReferenceEntry> entries, string statusMessage)
		{
			Entries = entries;
			StatusMessage = statusMessage;
		}
	}
	internal sealed class ConsoleCommandReferenceEntry
	{
		internal string Command { get; }

		internal string Description { get; }

		internal string Example { get; }

		internal ConsoleCommandReferenceEntry(string command, string description, string example)
		{
			Command = command;
			Description = description;
			Example = example;
		}
	}
	internal static class KeybindInputUtility
	{
		internal static bool TryParseKeyCode(string? rawValue, out KeyCode keyCode)
		{
			keyCode = (KeyCode)0;
			if (string.IsNullOrWhiteSpace(rawValue))
			{
				return false;
			}
			string text = rawValue.Trim();
			if (int.TryParse(text, out var _))
			{
				return false;
			}
			if (Enum.TryParse<KeyCode>(text, ignoreCase: true, out keyCode) && IsSupportedKeyboardKey(keyCode))
			{
				return true;
			}
			if (text.Length == 1)
			{
				char c = char.ToUpperInvariant(text[0]);
				if (char.IsLetter(c) && Enum.TryParse<KeyCode>(c.ToString(), out keyCode))
				{
					return true;
				}
				if (char.IsDigit(c) && Enum.TryParse<KeyCode>($"Alpha{c}", out keyCode))
				{
					return true;
				}
			}
			return false;
		}

		internal static string FormatKeyCode(KeyCode keyCode)
		{
			return ((object)(KeyCode)(ref keyCode)).ToString();
		}

		internal static bool IsSupportedKeyboardKey(KeyCode keyCode)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			if ((int)keyCode == 0)
			{
				return false;
			}
			string text = ((object)(KeyCode)(ref keyCode)).ToString();
			return !text.StartsWith("Mouse", StringComparison.Ordinal) && !text.StartsWith("Joystick", StringComparison.Ordinal);
		}
	}
	internal sealed class KeybindRuntimeService
	{
		private MelonPreferences_Category? _keybindManagerCategory;

		private MelonPreferences_Entry<bool>? _modEnabled;

		private MelonPreferences_Entry<string>? _savedKeybinds;

		private int _pendingSavedKeybindApplyFrames = -1;

		internal static KeybindRuntimeService Shared { get; } = new KeybindRuntimeService();


		internal void InitializePreferences()
		{
			_keybindManagerCategory = MelonPreferences.CreateCategory("Keybind Manager");
			_modEnabled = _keybindManagerCategory.CreateEntry<bool>("Enabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
			_savedKeybinds = _keybindManagerCategory.CreateEntry<string>("SavedKeybinds", "[]", (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		}

		internal IReadOnlyList<SavedKeybind> LoadSavedKeybinds()
		{
			return KeybindPreferences.Deserialize(_savedKeybinds?.Value);
		}

		internal void SaveKeybinds(IEnumerable<SavedKeybind> keybinds)
		{
			if (_savedKeybinds != null && _keybindManagerCategory != null)
			{
				_savedKeybinds.Value = KeybindPreferences.Serialize(keybinds);
				_keybindManagerCategory.SaveToFile(false);
			}
		}

		internal void ApplySavedKeybinds()
		{
			foreach (SavedKeybind item in LoadSavedKeybinds())
			{
				ApplyBind(item);
			}
		}

		internal void ApplyBind(SavedKeybind keybind)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (keybind != null && !string.IsNullOrWhiteSpace(keybind.Command))
			{
				string bindKeyToken = GetBindKeyToken(keybind.Key);
				if (!string.IsNullOrWhiteSpace(bindKeyToken))
				{
					ConsoleHelper.Submit("bind " + bindKeyToken + " " + keybind.Command.Trim());
				}
			}
		}

		internal void RemoveBind(KeyCode keyCode)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			string bindKeyToken = GetBindKeyToken(keyCode);
			if (!string.IsNullOrWhiteSpace(bindKeyToken))
			{
				ConsoleHelper.Submit("unbind " + bindKeyToken);
			}
		}

		internal void HandleSceneInitialized(string sceneName)
		{
			MelonPreferences_Entry<bool>? modEnabled = _modEnabled;
			if (modEnabled != null && modEnabled.Value && string.Equals(sceneName, "Main", StringComparison.Ordinal) && LoadSavedKeybinds().Count != 0)
			{
				_pendingSavedKeybindApplyFrames = 120;
			}
		}

		internal void TickPendingSavedKeybindRestore(Log logger)
		{
			if (_pendingSavedKeybindApplyFrames < 0)
			{
				return;
			}
			if (_pendingSavedKeybindApplyFrames > 0)
			{
				_pendingSavedKeybindApplyFrames--;
				return;
			}
			_pendingSavedKeybindApplyFrames = -1;
			int count = LoadSavedKeybinds().Count;
			MelonPreferences_Entry<bool>? modEnabled = _modEnabled;
			if (modEnabled != null && modEnabled.Value && count != 0)
			{
				ApplySavedKeybinds();
				logger.Msg(string.Format("Loaded {0} saved keybind(s) in scene '{1}'.", count, "Main"));
			}
		}

		internal void ResetRuntimeState()
		{
			_pendingSavedKeybindApplyFrames = -1;
		}

		private static string? GetBindKeyToken(KeyCode keyCode)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			if ((int)keyCode == 0)
			{
				return null;
			}
			string text = ((object)(KeyCode)(ref keyCode)).ToString();
			if (text.StartsWith("Alpha", StringComparison.Ordinal) && text.Length == 6)
			{
				return text.Substring(5, 1).ToLowerInvariant();
			}
			if (text.Length == 1)
			{
				return text.ToLowerInvariant();
			}
			return text;
		}
	}
	public sealed class SavedKeybind
	{
		public string Command { get; set; } = string.Empty;


		public KeyCode Key { get; set; } = (KeyCode)0;

	}
	public static class KeybindPreferences
	{
		public static IReadOnlyList<SavedKeybind> Deserialize(string? rawValue)
		{
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrWhiteSpace(rawValue))
			{
				return Array.Empty<SavedKeybind>();
			}
			try
			{
				List<SavedKeybind> list = JsonConvert.DeserializeObject<List<SavedKeybind>>(rawValue);
				if (list == null)
				{
					return Array.Empty<SavedKeybind>();
				}
				list.RemoveAll((SavedKeybind keybind) => keybind == null || string.IsNullOrWhiteSpace(keybind.Command) || (int)keybind.Key == 0);
				if (list.Count <= 1)
				{
					return list;
				}
				List<SavedKeybind> list2 = new List<SavedKeybind>(list.Count);
				HashSet<KeyCode> hashSet = new HashSet<KeyCode>();
				for (int num = list.Count - 1; num >= 0; num--)
				{
					SavedKeybind savedKeybind = list[num];
					if (hashSet.Add(savedKeybind.Key))
					{
						list2.Add(new SavedKeybind
						{
							Command = savedKeybind.Command,
							Key = savedKeybind.Key
						});
					}
				}
				list2.Reverse();
				return list2;
			}
			catch
			{
				return Array.Empty<SavedKeybind>();
			}
		}

		public static string Serialize(IEnumerable<SavedKeybind> keybinds)
		{
			return JsonConvert.SerializeObject((object)keybinds, (Formatting)0);
		}
	}
	public static class Constants
	{
		public static class Game
		{
			public const string GAME_STUDIO = "TVGS";

			public const string GAME_NAME = "Schedule I";

			public const string MAIN_SCENE = "Main";

			public const int MAIN_SCENE_BIND_DELAY_FRAMES = 120;
		}

		public const string MOD_NAME = "Keybind Manager";

		public const string MOD_VERSION = "1.0.0";

		public const string MOD_AUTHOR = "Riccaforte";

		public const string PREFERENCES_CATEGORY = "Keybind Manager";

		public const string KEYBINDS_PREFERENCE = "SavedKeybinds";
	}
}
namespace KeybindManager.Integrations
{
	public static class HarmonyPatches
	{
		private static readonly string[] ConsoleAssemblyNames = new string[2] { "Assembly-CSharp", "Il2CppAssembly-CSharp" };

		private static readonly string[] ConsoleTypeNames = new string[2] { "ScheduleOne.Console", "Il2CppScheduleOne.Console" };

		private static Core? _modInstance;

		private static bool _patchesApplied;

		public static void SetModInstance(Core modInstance)
		{
			_modInstance = modInstance;
			TryApplyPatches();
		}

		public static void TryApplyPatches()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Expected O, but got Unknown
			if (_patchesApplied || _modInstance == null)
			{
				return;
			}
			MethodBase methodBase = FindConsoleUpdateMethod();
			if (!(methodBase == null))
			{
				MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(HarmonyPatches), "BeforeConsoleUpdate", (Type[])null, (Type[])null);
				if (!(methodInfo == null))
				{
					((MelonBase)_modInstance).HarmonyInstance.Patch(methodBase, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
					_patchesApplied = true;
				}
			}
		}

		private static MethodBase? FindConsoleUpdateMethod()
		{
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly assembly in assemblies)
			{
				string name = assembly.GetName().Name;
				if (string.IsNullOrWhiteSpace(name) || !MatchesKnownAssemblyName(name))
				{
					continue;
				}
				string[] consoleTypeNames = ConsoleTypeNames;
				foreach (string name2 in consoleTypeNames)
				{
					Type type = assembly.GetType(name2, throwOnError: false);
					if (!(type == null))
					{
						MethodInfo methodInfo = AccessTools.DeclaredMethod(type, "Update", (Type[])null, (Type[])null);
						if (methodInfo != null)
						{
							return methodInfo;
						}
					}
				}
			}
			return null;
		}

		private static bool MatchesKnownAssemblyName(string assemblyName)
		{
			string[] consoleAssemblyNames = ConsoleAssemblyNames;
			foreach (string b in consoleAssemblyNames)
			{
				if (string.Equals(assemblyName, b, StringComparison.Ordinal))
				{
					return true;
				}
			}
			return false;
		}

		private static bool BeforeConsoleUpdate()
		{
			KeybindManagerPhoneApp.SyncTypingState();
			return !KeybindManagerPhoneApp.ShouldSuppressConsoleBinds();
		}
	}
}
namespace KeybindManager.UI
{
	public class KeybindManagerPhoneApp : PhoneApp
	{
		private static KeybindManagerPhoneApp? _instance;

		private readonly ConsoleCommandCatalog _commandCatalog = new ConsoleCommandCatalog();

		private readonly KeybindManagerPhoneAppCoordinator _keybindCoordinator;

		private readonly KeybindManagerPhoneAppView _view;

		protected override string AppName => "KeybindManager";

		protected override string AppTitle => "Keybind Manager";

		protected override string IconLabel => "Keybinds";

		protected override string IconFileName => string.Empty;

		public KeybindManagerPhoneApp()
			: this(KeybindRuntimeService.Shared)
		{
		}

		internal KeybindManagerPhoneApp(KeybindRuntimeService keybindRuntime)
		{
			_keybindCoordinator = new KeybindManagerPhoneAppCoordinator(keybindRuntime);
			_view = new KeybindManagerPhoneAppView(BeginEditKeybind, RequestDeleteKeybind, SubmitKeybind, CancelEditMode, OpenCommandReference);
		}

		protected override void OnCreated()
		{
			_instance = this;
			Sprite val = LoadEmbeddedAppIcon();
			if ((Object)(object)val != (Object)null)
			{
				((PhoneApp)this).SetIconSprite(val);
			}
			((PhoneApp)this).OnCreated();
		}

		protected override void OnCreatedUI(GameObject container)
		{
			_keybindCoordinator.LoadSavedKeybinds();
			_view.Build(container, ((PhoneApp)this).AppTitle);
			RefreshKeybindList();
		}

		protected override void OnPhoneClosed()
		{
			((PhoneApp)this).OnPhoneClosed();
			_view.HandlePhoneClosed();
			Controls.IsTyping = false;
		}

		internal static void SyncTypingState()
		{
			_instance?.UpdateTypingState();
		}

		internal static bool ShouldSuppressConsoleBinds()
		{
			return _instance?._view.IsKeyCaptureDialogActive() ?? false;
		}

		internal static void TickActiveInstance()
		{
			_instance?.Tick();
		}

		internal static void TickActiveInstanceLate()
		{
			_instance?.TickLate();
		}

		internal void Tick()
		{
			UpdateTypingState();
			_view.Tick();
			UpdateTypingState();
		}

		internal void TickLate()
		{
			UpdateTypingState();
		}

		private void RefreshKeybindList()
		{
			_view.RefreshKeybindList(_keybindCoordinator.SavedKeybinds);
		}

		private void RequestDeleteKeybind(int index)
		{
			if (_keybindCoordinator.ContainsIndex(index))
			{
				_view.RequestConfirmation("Delete keybind?", "Are you sure you want to delete this saved keybind?", "Delete", delegate
				{
					DeleteKeybind(index);
				});
			}
		}

		private void SubmitKeybind()
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			if (_view.ValidateForm(showErrors: true))
			{
				string command = _view.CommandText.Trim();
				KeybindInputUtility.TryParseKeyCode(_view.KeyText, out var keyCode);
				SavedKeybind newKeybind = new SavedKeybind
				{
					Command = command,
					Key = keyCode
				};
				SaveKeybind(newKeybind, allowOverwrite: false);
			}
		}

		private void BeginEditKeybind(int index)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			if (_keybindCoordinator.TryBeginEdit(index, out SavedKeybind keybind))
			{
				_view.CloseTransientUi();
				_view.PopulateComposer(keybind.Command, KeybindInputUtility.FormatKeyCode(keybind.Key));
				UpdateComposerActions();
			}
		}

		private void SaveKeybind(SavedKeybind newKeybind, bool allowOverwrite)
		{
			SavedKeybind newKeybind2 = newKeybind;
			KeybindCoordinatorSaveResult keybindCoordinatorSaveResult = _keybindCoordinator.Save(newKeybind2, allowOverwrite);
			if (keybindCoordinatorSaveResult.Outcome == KeybindCoordinatorSaveOutcome.DuplicateConflict && keybindCoordinatorSaveResult.ConflictingKeybind != null)
			{
				int? originalEditIndex = _keybindCoordinator.EditingKeybindIndex;
				RequestDuplicateOverwriteConfirmation(newKeybind2, keybindCoordinatorSaveResult.ConflictingKeybind, delegate
				{
					ConfirmDuplicateOverwrite(newKeybind2, originalEditIndex);
				});
			}
			else if (keybindCoordinatorSaveResult.Outcome == KeybindCoordinatorSaveOutcome.InvalidEditTarget)
			{
				ClearComposer();
			}
			else
			{
				RefreshKeybindList();
				ClearComposer();
			}
		}

		private void ConfirmDuplicateOverwrite(SavedKeybind newKeybind, int? originalEditIndex)
		{
			KeybindCoordinatorSaveResult keybindCoordinatorSaveResult = (originalEditIndex.HasValue ? _keybindCoordinator.OverwriteEditedKeybind(originalEditIndex.Value, newKeybind) : _keybindCoordinator.Save(newKeybind, allowOverwrite: true));
			if (keybindCoordinatorSaveResult.Outcome == KeybindCoordinatorSaveOutcome.InvalidEditTarget)
			{
				ClearComposer();
				return;
			}
			RefreshKeybindList();
			ClearComposer();
		}

		private void CancelEditMode()
		{
			ClearComposer();
		}

		private void DeleteKeybind(int index)
		{
			KeybindCoordinatorDeleteResult keybindCoordinatorDeleteResult = _keybindCoordinator.Delete(index);
			if (keybindCoordinatorDeleteResult.Deleted)
			{
				if (keybindCoordinatorDeleteResult.ClearedCurrentEdit)
				{
					_view.ClearComposer();
					UpdateComposerActions();
				}
				RefreshKeybindList();
			}
		}

		private void ClearComposer()
		{
			_keybindCoordinator.CancelEdit();
			_view.ClearComposer();
			UpdateComposerActions();
		}

		private void UpdateComposerActions()
		{
			_view.UpdateComposerActions(_keybindCoordinator.IsEditing);
		}

		private void OpenCommandReference()
		{
			ConsoleCommandCatalogResult consoleCommandCatalogResult = _commandCatalog.LoadEntries();
			_view.SetCommandReferenceStatus(consoleCommandCatalogResult.StatusMessage);
			_view.OpenCommandReference(consoleCommandCatalogResult.Entries);
			UpdateTypingState();
		}

		private void RequestDuplicateOverwriteConfirmation(SavedKeybind pendingKeybind, SavedKeybind existingKeybind, Action confirmAction)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			string text = KeybindInputUtility.FormatKeyCode(pendingKeybind.Key);
			string text2 = (string.IsNullOrWhiteSpace(existingKeybind.Command) ? "the existing keybind" : existingKeybind.Command);
			string message = (_keybindCoordinator.IsEditing ? ("A saved keybind already uses " + text + " for \"" + text2 + "\". Confirming will replace that saved keybind and remove the keybind you are currently editing.") : ("A saved keybind already uses " + text + " for \"" + text2 + "\". Confirming will overwrite that keybind with your new command."));
			_view.RequestConfirmation("Overwrite keybind?", message, "Overwrite", confirmAction);
		}

		private void CloseCommandReference()
		{
			_view.CloseCommandReference();
			UpdateTypingState();
		}

		private void UpdateTypingState()
		{
			Controls.IsTyping = _view.ShouldMarkTyping(((PhoneApp)this).IsOpen());
		}

		private Sprite? LoadEmbeddedAppIcon()
		{
			try
			{
				Assembly executingAssembly = Assembly.GetExecutingAssembly();
				string[] array = new string[3] { "KeybindManager.icon.png", "KeybindManagerPhoneApp.icon.png", "icon.png" };
				string[] array2 = array;
				foreach (string name in array2)
				{
					using Stream stream = executingAssembly.GetManifestResourceStream(name);
					if (stream == null)
					{
						continue;
					}
					byte[] array3 = new byte[stream.Length];
					stream.Read(array3, 0, array3.Length);
					return ImageUtils.LoadImageRaw(array3);
				}
			}
			catch (Exception ex)
			{
				Core? instance = Core.Instance;
				if (instance != null)
				{
					instance._logger.Msg("Failed to load embedded app icon: " + ex.Message);
				}
			}
			return null;
		}
	}
	internal sealed class KeybindManagerPhoneAppCoordinator
	{
		private readonly KeybindRuntimeService _keybindRuntime;

		private readonly List<SavedKeybind> _savedKeybinds = new List<SavedKeybind>();

		internal IReadOnlyList<SavedKeybind> SavedKeybinds => _savedKeybinds;

		internal bool IsEditing => EditingKeybindIndex.HasValue;

		internal int? EditingKeybindIndex { get; private set; }

		internal KeybindManagerPhoneAppCoordinator(KeybindRuntimeService keybindRuntime)
		{
			_keybindRuntime = keybindRuntime;
		}

		internal void LoadSavedKeybinds()
		{
			_savedKeybinds.Clear();
			_savedKeybinds.AddRange(_keybindRuntime.LoadSavedKeybinds());
			EditingKeybindIndex = null;
		}

		internal bool ContainsIndex(int index)
		{
			return index >= 0 && index < _savedKeybinds.Count;
		}

		internal bool TryBeginEdit(int index, out SavedKeybind keybind)
		{
			if (!ContainsIndex(index))
			{
				keybind = new SavedKeybind();
				return false;
			}
			EditingKeybindIndex = index;
			keybind = _savedKeybinds[index];
			return true;
		}

		internal KeybindCoordinatorSaveResult Save(SavedKeybind keybind, bool allowOverwrite)
		{
			return EditingKeybindIndex.HasValue ? SaveEditedKeybind(EditingKeybindIndex.Value, keybind, allowOverwrite) : AddNewKeybind(keybind, allowOverwrite);
		}

		internal KeybindCoordinatorSaveResult OverwriteEditedKeybind(int originalEditIndex, SavedKeybind keybind)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			if (!ContainsIndex(originalEditIndex))
			{
				EditingKeybindIndex = null;
				return KeybindCoordinatorSaveResult.InvalidEditTarget();
			}
			int num = FindDuplicateKeybindIndex(keybind.Key, originalEditIndex);
			if (num < 0)
			{
				return SaveEditedKeybind(originalEditIndex, keybind, allowOverwrite: true);
			}
			SavedKeybind savedKeybind = _savedKeybinds[originalEditIndex];
			_savedKeybinds[num] = keybind;
			_savedKeybinds.RemoveAt(originalEditIndex);
			if (savedKeybind.Key != keybind.Key)
			{
				_keybindRuntime.RemoveBind(savedKeybind.Key);
			}
			_keybindRuntime.SaveKeybinds(_savedKeybinds);
			_keybindRuntime.ApplyBind(keybind);
			EditingKeybindIndex = null;
			return KeybindCoordinatorSaveResult.Saved();
		}

		internal KeybindCoordinatorDeleteResult Delete(int index)
		{
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			if (!ContainsIndex(index))
			{
				return new KeybindCoordinatorDeleteResult(deleted: false, clearedCurrentEdit: false);
			}
			SavedKeybind savedKeybind = _savedKeybinds[index];
			_savedKeybinds.RemoveAt(index);
			bool clearedCurrentEdit = false;
			if (EditingKeybindIndex == index)
			{
				EditingKeybindIndex = null;
				clearedCurrentEdit = true;
			}
			else if (EditingKeybindIndex.HasValue && EditingKeybindIndex.Value > index)
			{
				EditingKeybindIndex = EditingKeybindIndex.Value - 1;
			}
			_keybindRuntime.SaveKeybinds(_savedKeybinds);
			_keybindRuntime.RemoveBind(savedKeybind.Key);
			return new KeybindCoordinatorDeleteResult(deleted: true, clearedCurrentEdit);
		}

		internal void CancelEdit()
		{
			EditingKeybindIndex = null;
		}

		private KeybindCoordinatorSaveResult AddNewKeybind(SavedKeybind newKeybind, bool allowOverwrite)
		{
			SavedKeybind newKeybind2 = newKeybind;
			int num = _savedKeybinds.FindIndex((SavedKeybind existing) => existing.Key == newKeybind2.Key);
			if (num >= 0 && !allowOverwrite)
			{
				return KeybindCoordinatorSaveResult.DuplicateConflict(_savedKeybinds[num]);
			}
			if (num >= 0)
			{
				_savedKeybinds[num] = newKeybind2;
			}
			else
			{
				_savedKeybinds.Add(newKeybind2);
			}
			_keybindRuntime.SaveKeybinds(_savedKeybinds);
			_keybindRuntime.ApplyBind(newKeybind2);
			EditingKeybindIndex = null;
			return KeybindCoordinatorSaveResult.Saved();
		}

		private KeybindCoordinatorSaveResult SaveEditedKeybind(int index, SavedKeybind updatedKeybind, bool allowOverwrite)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			if (!ContainsIndex(index))
			{
				EditingKeybindIndex = null;
				return KeybindCoordinatorSaveResult.InvalidEditTarget();
			}
			SavedKeybind savedKeybind = _savedKeybinds[index];
			int num = FindDuplicateKeybindIndex(updatedKeybind.Key, index);
			if (num >= 0 && !allowOverwrite)
			{
				return KeybindCoordinatorSaveResult.DuplicateConflict(_savedKeybinds[num]);
			}
			if (num >= 0)
			{
				_savedKeybinds.RemoveAt(num);
				if (num < index)
				{
					index--;
				}
			}
			_savedKeybinds[index] = updatedKeybind;
			if (savedKeybind.Key != updatedKeybind.Key)
			{
				_keybindRuntime.RemoveBind(savedKeybind.Key);
			}
			_keybindRuntime.SaveKeybinds(_savedKeybinds);
			_keybindRuntime.ApplyBind(updatedKeybind);
			EditingKeybindIndex = null;
			return KeybindCoordinatorSaveResult.Saved();
		}

		private int FindDuplicateKeybindIndex(KeyCode keyCode, int excludedIndex)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < _savedKeybinds.Count; i++)
			{
				if (i != excludedIndex && _savedKeybinds[i].Key == keyCode)
				{
					return i;
				}
			}
			return -1;
		}
	}
	internal sealed class KeybindCoordinatorSaveResult
	{
		internal KeybindCoordinatorSaveOutcome Outcome { get; }

		internal SavedKeybind? ConflictingKeybind { get; }

		private KeybindCoordinatorSaveResult(KeybindCoordinatorSaveOutcome outcome, SavedKeybind? conflictingKeybind)
		{
			Outcome = outcome;
			ConflictingKeybind = conflictingKeybind;
		}

		internal static KeybindCoordinatorSaveResult Saved()
		{
			return new KeybindCoordinatorSaveResult(KeybindCoordinatorSaveOutcome.Saved, null);
		}

		internal static KeybindCoordinatorSaveResult InvalidEditTarget()
		{
			return new KeybindCoordinatorSaveResult(KeybindCoordinatorSaveOutcome.InvalidEditTarget, null);
		}

		internal static KeybindCoordinatorSaveResult DuplicateConflict(SavedKeybind conflictingKeybind)
		{
			return new KeybindCoordinatorSaveResult(KeybindCoordinatorSaveOutcome.DuplicateConflict, conflictingKeybind);
		}
	}
	internal enum KeybindCoordinatorSaveOutcome
	{
		Saved,
		DuplicateConflict,
		InvalidEditTarget
	}
	internal readonly struct KeybindCoordinatorDeleteResult
	{
		internal bool Deleted { get; }

		internal bool ClearedCurrentEdit { get; }

		internal KeybindCoordinatorDeleteResult(bool deleted, bool clearedCurrentEdit)
		{
			Deleted = deleted;
			ClearedCurrentEdit = clearedCurrentEdit;
		}
	}
	internal sealed class KeybindManagerPhoneAppView
	{
		private readonly Action<int> _beginEditKeybind;

		private readonly Action<int> _requestDeleteKeybind;

		private readonly Action _submitKeybind;

		private readonly Action _cancelEditMode;

		private readonly Action _openCommandReference;

		private RectTransform? _keybindListContent;

		private RectTransform? _commandReferenceListContent;

		private InputField? _commandInput;

		private InputField? _keyInput;

		private Text? _commandErrorText;

		private Text? _keyErrorText;

		private GameObject? _deleteConfirmationOverlay;

		private RectTransform? _deleteConfirmationDialogRect;

		private Text? _deleteConfirmationTitleText;

		private Text? _deleteConfirmationText;

		private Text? _deleteConfirmationConfirmButtonText;

		private GameObject? _keyCaptureOverlay;

		private KeyCaptureListener? _keyCaptureListener;

		private Text? _keyCaptureValueText;

		private Button? _saveCapturedKeyButton;

		private GameObject? _commandReferenceOverlay;

		private Text? _commandReferenceStatusText;

		private GameObject? _cancelEditButtonRow;

		private Text? _composerHeadingText;

		private Text? _submitKeybindButtonText;

		private bool _isAwaitingKeyCapture;

		private KeyCode? _capturedKey;

		private Action? _pendingConfirmationAction;

		private bool _commandInputWasFocused;

		private bool _keyInputWasFocused;

		private string _lastCommandInputText = string.Empty;

		private string _lastKeyInputText = string.Empty;

		internal string CommandText
		{
			get
			{
				InputField? commandInput = _commandInput;
				return ((commandInput != null) ? commandInput.text : null) ?? string.Empty;
			}
		}

		internal string KeyText
		{
			get
			{
				InputField? keyInput = _keyInput;
				return ((keyInput != null) ? keyInput.text : null) ?? string.Empty;
			}
		}

		public KeybindManagerPhoneAppView(Action<int> beginEditKeybind, Action<int> requestDeleteKeybind, Action submitKeybind, Action cancelEditMode, Action openCommandReference)
		{
			_beginEditKeybind = beginEditKeybind;
			_requestDeleteKeybind = requestDeleteKeybind;
			_submitKeybind = submitKeybind;
			_cancelEditMode = cancelEditMode;
			_openCommandReference = openCommandReference;
		}

		internal void Build(GameObject container, string appTitle)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.Panel("MainPanel", container.transform, new Color(0.08f, 0.09f, 0.12f, 0.96f), (Vector2?)null, (Vector2?)null, true);
			StretchToFill(val.GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
			GameObject val2 = UIFactory.TopBar("TitleBar", val.transform, appTitle, 0.13f, 18, 18, 10, 10);
			ConfigureTitleBarRect(val2.GetComponent<RectTransform>());
			ConfigureTitleBar(val2);
			GameObject val3 = UIFactory.Panel("ContentPanel", val.transform, new Color(0.12f, 0.14f, 0.18f, 0.94f), (Vector2?)new Vector2(0.03f, 0.04f), (Vector2?)new Vector2(0.97f, 0.88f), false);
			StretchToFill(val3.GetComponent<RectTransform>(), 0f, 0f, 0f, 52f);
			UIFactory.HorizontalLayoutOnGO(val3, 18, 20, 20, 20, 20, (TextAnchor)0);
			ConfigureContentColumns(val3);
			CreateSavedKeybindsSection(val3.transform);
			CreateAddKeybindSection(val3.transform);
			CreateDeleteConfirmationDialog(val.transform);
			CreateKeyCaptureDialog(val.transform);
			CreateCommandReferenceDialog(val.transform);
			UpdateComposerActions(isEditing: false);
		}

		internal void HandlePhoneClosed()
		{
			CloseTransientUi();
		}

		internal void Tick()
		{
			PollInputField(_commandInput, ref _commandInputWasFocused, ref _lastCommandInputText, HandleCommandInputChanged, HandleCommandInputEndEdit);
			PollInputField(_keyInput, ref _keyInputWasFocused, ref _lastKeyInputText, HandleKeyInputChanged, HandleKeyInputEndEdit);
			PollKeyCapture();
		}

		internal void RefreshKeybindList(IReadOnlyList<SavedKeybind> savedKeybinds)
		{
			if ((Object)(object)_keybindListContent == (Object)null)
			{
				return;
			}
			UIFactory.ClearChildren((Transform)(object)_keybindListContent);
			if (savedKeybinds.Count == 0)
			{
				CreateEmptyKeybindState();
				UIFactory.FitContentHeight(_keybindListContent);
				return;
			}
			for (int i = 0; i < savedKeybinds.Count; i++)
			{
				CreateSavedKeybindRow(i, savedKeybinds[i]);
			}
			UIFactory.FitContentHeight(_keybindListContent);
		}

		internal void OpenCommandReference(IReadOnlyList<ConsoleCommandReferenceEntry> entries)
		{
			if (!((Object)(object)_commandReferenceOverlay == (Object)null))
			{
				CancelCapture();
				CloseDeleteConfirmation();
				InputField? commandInput = _commandInput;
				if (commandInput != null)
				{
					commandInput.DeactivateInputField();
				}
				InputField? keyInput = _keyInput;
				if (keyInput != null)
				{
					keyInput.DeactivateInputField();
				}
				EventSystem current = EventSystem.current;
				if (current != null)
				{
					current.SetSelectedGameObject((GameObject)null);
				}
				RefreshCommandReferenceList(entries);
				_commandReferenceOverlay.SetActive(true);
				_commandReferenceOverlay.transform.SetAsLastSibling();
			}
		}

		internal void CloseCommandReference()
		{
			if ((Object)(object)_commandReferenceOverlay != (Object)null)
			{
				_commandReferenceOverlay.SetActive(false);
			}
		}

		internal void RequestConfirmation(string title, string message, string confirmLabel, Action confirmAction)
		{
			if (!((Object)(object)_deleteConfirmationOverlay == (Object)null))
			{
				_pendingConfirmationAction = confirmAction;
				InputField? commandInput = _commandInput;
				if (commandInput != null)
				{
					commandInput.DeactivateInputField();
				}
				InputField? keyInput = _keyInput;
				if (keyInput != null)
				{
					keyInput.DeactivateInputField();
				}
				EventSystem current = EventSystem.current;
				if (current != null)
				{
					current.SetSelectedGameObject((GameObject)null);
				}
				if ((Object)(object)_deleteConfirmationTitleText != (Object)null)
				{
					_deleteConfirmationTitleText.text = title;
				}
				if ((Object)(object)_deleteConfirmationText != (Object)null)
				{
					_deleteConfirmationText.text = message;
				}
				if ((Object)(object)_deleteConfirmationConfirmButtonText != (Object)null)
				{
					_deleteConfirmationConfirmButtonText.text = confirmLabel;
				}
				_deleteConfirmationOverlay.SetActive(true);
				_deleteConfirmationOverlay.transform.SetAsLastSibling();
			}
		}

		internal void CloseDeleteConfirmation()
		{
			_pendingConfirmationAction = null;
			if ((Object)(object)_deleteConfirmationOverlay != (Object)null)
			{
				_deleteConfirmationOverlay.SetActive(false);
			}
		}

		internal void CloseTransientUi()
		{
			CancelCapture();
			CloseCommandReference();
			CloseDeleteConfirmation();
		}

		internal void PopulateComposer(string command, string keyText)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_commandInput != (Object)null)
			{
				_commandInput.text = command;
			}
			if ((Object)(object)_keyInput != (Object)null)
			{
				_keyInput.text = keyText;
			}
			_capturedKey = (KeybindInputUtility.TryParseKeyCode(keyText, out var keyCode) ? new KeyCode?(keyCode) : null);
			SetFieldError(_commandErrorText, null);
			SetFieldError(_keyErrorText, null);
		}

		internal void ClearComposer()
		{
			CancelCapture();
			if ((Object)(object)_commandInput != (Object)null)
			{
				_commandInput.text = string.Empty;
			}
			if ((Object)(object)_keyInput != (Object)null)
			{
				_keyInput.text = string.Empty;
			}
			SetFieldError(_commandErrorText, null);
			SetFieldError(_keyErrorText, null);
		}

		internal void UpdateComposerActions(bool isEditing)
		{
			if ((Object)(object)_cancelEditButtonRow != (Object)null)
			{
				_cancelEditButtonRow.SetActive(isEditing);
			}
			if ((Object)(object)_composerHeadingText != (Object)null)
			{
				_composerHeadingText.text = (isEditing ? "Edit Keybind" : "Add Keybind");
			}
			if ((Object)(object)_submitKeybindButtonText != (Object)null)
			{
				_submitKeybindButtonText.text = (isEditing ? "Save Changes" : "Add Keybind");
			}
		}

		internal void SetCommandReferenceStatus(string message)
		{
			if (!((Object)(object)_commandReferenceStatusText == (Object)null))
			{
				_commandReferenceStatusText.text = message;
			}
		}

		internal bool ShouldMarkTyping(bool isPhoneOpen)
		{
			return isPhoneOpen && !IsKeyCaptureDialogActive() && !IsConfirmationDialogActive() && !IsCommandReferenceDialogActive() && (IsInputFieldActive(_commandInput) || IsInputFieldActive(_keyInput));
		}

		internal bool IsKeyCaptureDialogActive()
		{
			return (Object)(object)_keyCaptureOverlay != (Object)null && _keyCaptureOverlay.activeSelf;
		}

		private void CreateSavedKeybindsSection(Transform parent)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Expected O, but got Unknown
			GameObject val = UIFactory.Panel("SavedKeybindsSection", parent, new Color(0.15f, 0.17f, 0.22f, 0.94f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val2 = val.AddComponent<LayoutElement>();
			val2.preferredWidth = 330f;
			val2.minWidth = 300f;
			val2.flexibleWidth = 1.1f;
			val2.flexibleHeight = 1f;
			val2.minHeight = 220f;
			UIFactory.VerticalLayoutOnGO(val, 12, new RectOffset(16, 16, 16, 16));
			ConfigureSectionStack(val, (TextAnchor)0);
			Text val3 = UIFactory.Text("SavedKeybindsHeading", "Saved Keybinds", val.transform, 18, (TextAnchor)3, (FontStyle)1);
			((Graphic)val3).color = Color.white;
			LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
			val4.preferredHeight = 24f;
			val4.flexibleHeight = 0f;
			ScrollRect val5 = default(ScrollRect);
			_keybindListContent = UIFactory.ScrollableVerticalList("SavedKeybindsList", val.transform, ref val5);
			LayoutElement val6 = ((Component)val5).gameObject.AddComponent<LayoutElement>();
			val6.flexibleHeight = 1f;
			val6.minHeight = 140f;
			ConfigureScrollRect(val5);
			ConfigureScrollContent(_keybindListContent);
			if ((Object)(object)((Component)_keybindListContent).GetComponent<VerticalLayoutGroup>() == (Object)null)
			{
				UIFactory.VerticalLayoutOnGO(((Component)_keybindListContent).gameObject, 10, new RectOffset(8, 8, 8, 8));
			}
			UIFactory.FitContentHeight(_keybindListContent);
		}

		private void CreateAddKeybindSection(Transform parent)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Expected O, but got Unknown
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: Unknown result type (might be due to invalid IL or missing references)
			//IL_0328: Unknown result type (might be due to invalid IL or missing references)
			//IL_0455: Unknown result type (might be due to invalid IL or missing references)
			//IL_0466: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0513: Unknown result type (might be due to invalid IL or missing references)
			//IL_0562: Unknown result type (might be due to invalid IL or missing references)
			//IL_056c: Expected O, but got Unknown
			//IL_0594: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_039d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0666: Unknown result type (might be due to invalid IL or missing references)
			//IL_0691: Unknown result type (might be due to invalid IL or missing references)
			//IL_075a: Unknown result type (might be due to invalid IL or missing references)
			//IL_076b: Unknown result type (might be due to invalid IL or missing references)
			//IL_079b: Unknown result type (might be due to invalid IL or missing references)
			//IL_086f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0880: Unknown result type (might be due to invalid IL or missing references)
			//IL_08f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_090a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.Panel("AddKeybindSection", parent, new Color(0.15f, 0.17f, 0.22f, 0.94f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val2 = val.AddComponent<LayoutElement>();
			val2.preferredWidth = 300f;
			val2.minWidth = 280f;
			val2.flexibleWidth = 0.9f;
			val2.flexibleHeight = 1f;
			val2.minHeight = 220f;
			UIFactory.VerticalLayoutOnGO(val, 12, new RectOffset(16, 16, 16, 16));
			ConfigureSectionStack(val, (TextAnchor)0);
			_composerHeadingText = UIFactory.Text("AddKeybindHeading", "Add Keybind", val.transform, 18, (TextAnchor)3, (FontStyle)1);
			((Graphic)_composerHeadingText).color = Color.white;
			LayoutElement val3 = ((Component)_composerHeadingText).gameObject.AddComponent<LayoutElement>();
			val3.preferredHeight = 24f;
			val3.flexibleHeight = 0f;
			_commandInput = CreateLabeledInputField(val.transform, "Command", "Example: teleport motel", out _commandErrorText);
			GameObject val4 = UIFactory.Panel("KeyFieldRoot", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val5 = val4.AddComponent<LayoutElement>();
			val5.preferredHeight = 74f;
			val5.flexibleHeight = 0f;
			UIFactory.VerticalLayoutOnGO(val4, 4, new RectOffset(0, 0, 0, 0));
			ConfigureSectionStack(val4, (TextAnchor)0);
			Text val6 = UIFactory.Text("KeyLabel", "Key", val4.transform, 14, (TextAnchor)3, (FontStyle)1);
			((Graphic)val6).color = Color.white;
			LayoutElement val7 = ((Component)val6).gameObject.AddComponent<LayoutElement>();
			val7.preferredHeight = 18f;
			val7.flexibleHeight = 0f;
			GameObject val8 = UIFactory.Panel("KeyCaptureRow", val4.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val9 = val8.AddComponent<LayoutElement>();
			val9.preferredHeight = 34f;
			val9.flexibleHeight = 0f;
			val9.flexibleWidth = 1f;
			GameObject val10 = UIFactory.Panel("KeyInputBackground", val8.transform, new Color(0.1f, 0.11f, 0.14f, 0.96f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val11 = val10.AddComponent<LayoutElement>();
			val11.preferredHeight = 34f;
			val11.flexibleHeight = 0f;
			val11.flexibleWidth = 1f;
			val11.minWidth = 0f;
			StretchToFill(val10.GetComponent<RectTransform>(), 0f, 166f, 0f, 0f);
			_keyInput = CreateStyledInputField(val10, "Key", "Examples: Q, Alpha4, F2, or Keypad0");
			GameObject val12 = UIFactory.Panel("CaptureKeyButtonHost", val8.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val13 = val12.AddComponent<LayoutElement>();
			val13.preferredWidth = 148f;
			val13.minWidth = 148f;
			val13.preferredHeight = 34f;
			RectTransform component = val12.GetComponent<RectTransform>();
			if ((Object)(object)component != (Object)null)
			{
				component.anchorMin = new Vector2(1f, 0.5f);
				component.anchorMax = new Vector2(1f, 0.5f);
				component.pivot = new Vector2(1f, 0.5f);
				component.sizeDelta = new Vector2(148f, 34f);
				component.anchoredPosition = Vector2.zero;
			}
			GameObject val14 = UIFactory.ButtonRow("CaptureKeyButtonRow", val12.transform, 0f, (TextAnchor)4);
			StretchToFill(val14.GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
			Button item = UIFactory.RoundedButtonWithLabel("CaptureKeyButton", "Capture Key...", val14.transform, new Color(0.19f, 0.42f, 0.74f), 148f, 38f, 15, Color.white).Item2;
			_keyErrorText = UIFactory.Text("KeyErrorText", string.Empty, val4.transform, 12, (TextAnchor)3, (FontStyle)0);
			((Graphic)_keyErrorText).color = new Color(0.93f, 0.52f, 0.52f);
			((Component)_keyErrorText).gameObject.SetActive(false);
			LayoutElement val15 = ((Component)_keyErrorText).gameObject.AddComponent<LayoutElement>();
			val15.preferredHeight = 14f;
			val15.flexibleHeight = 0f;
			GameObject val16 = UIFactory.Panel("CommandHelpPanel", val.transform, new Color(0.18f, 0.2f, 0.27f, 0.9f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val17 = val16.AddComponent<LayoutElement>();
			val17.preferredHeight = 96f;
			val17.flexibleHeight = 0f;
			UIFactory.VerticalLayoutOnGO(val16, 8, new RectOffset(14, 14, 14, 14));
			ConfigureSectionStack(val16, (TextAnchor)4);
			Text val18 = UIFactory.Text("CommandHelpTitle", "Need help with a command?", val16.transform, 15, (TextAnchor)4, (FontStyle)1);
			((Graphic)val18).color = Color.white;
			GameObject val19 = UIFactory.Panel("CommandHelpTextSpacer", val16.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			Image component2 = val19.GetComponent<Image>();
			if ((Object)(object)component2 != (Object)null)
			{
				((Behaviour)component2).enabled = false;
				((Graphic)component2).raycastTarget = false;
			}
			LayoutElement val20 = val19.GetComponent<LayoutElement>() ?? val19.AddComponent<LayoutElement>();
			val20.preferredHeight = 4f;
			val20.flexibleHeight = 0f;
			Text val21 = UIFactory.Text("CommandHelpBody", "Open the in-game command reference to browse available console commands.", val16.transform, 12, (TextAnchor)4, (FontStyle)0);
			((Graphic)val21).color = new Color(0.82f, 0.86f, 0.92f);
			GameObject val22 = UIFactory.Panel("CommandHelpButtonSpacer", val16.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			Image component3 = val22.GetComponent<Image>();
			if ((Object)(object)component3 != (Object)null)
			{
				((Behaviour)component3).enabled = false;
				((Graphic)component3).raycastTarget = false;
			}
			LayoutElement val23 = val22.GetComponent<LayoutElement>() ?? val22.AddComponent<LayoutElement>();
			val23.preferredHeight = 6f;
			val23.flexibleHeight = 0f;
			GameObject val24 = UIFactory.ButtonRow("CommandHelpButtons", val16.transform, 0f, (TextAnchor)4);
			LayoutElement val25 = val24.AddComponent<LayoutElement>();
			val25.preferredHeight = 58f;
			Button item2 = UIFactory.RoundedButtonWithLabel("CommandReferenceButton", "Command Reference", val24.transform, new Color(0.31f, 0.46f, 0.71f), 172f, 38f, 14, Color.white).Item2;
			GameObject val26 = UIFactory.Panel("AddKeybindButtonSpacer", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			Image component4 = val26.GetComponent<Image>();
			if ((Object)(object)component4 != (Object)null)
			{
				((Behaviour)component4).enabled = false;
				((Graphic)component4).raycastTarget = false;
			}
			LayoutElement val27 = val26.GetComponent<LayoutElement>() ?? val26.AddComponent<LayoutElement>();
			val27.flexibleHeight = 1f;
			_cancelEditButtonRow = UIFactory.ButtonRow("CancelEditButtons", val.transform, 10f, (TextAnchor)4);
			LayoutElement val28 = _cancelEditButtonRow.AddComponent<LayoutElement>();
			val28.preferredHeight = 44f;
			val28.flexibleHeight = 0f;
			Button item3 = UIFactory.RoundedButtonWithLabel("CancelEditButton", "Cancel", _cancelEditButtonRow.transform, new Color(0.42f, 0.45f, 0.5f), 176f, 38f, 15, Color.white).Item2;
			_cancelEditButtonRow.SetActive(false);
			GameObject val29 = UIFactory.ButtonRow("AddKeybindButtons", val.transform, 10f, (TextAnchor)4);
			LayoutElement val30 = val29.AddComponent<LayoutElement>();
			val30.preferredHeight = 44f;
			val30.flexibleHeight = 0f;
			ValueTuple<GameObject, Button, Text> valueTuple = UIFactory.RoundedButtonWithLabel("AddKeybindButton", "Add Keybind", val29.transform, new Color(0.24f, 0.56f, 0.33f), 176f, 38f, 15, Color.white);
			Button item4 = valueTuple.Item2;
			Text item5 = valueTuple.Item3;
			_submitKeybindButtonText = item5;
			ButtonUtils.AddListener(item, (Action)BeginKeyCapture);
			ButtonUtils.AddListener(item2, _openCommandReference);
			ButtonUtils.AddListener(item3, _cancelEditMode);
			ButtonUtils.AddListener(item4, _submitKeybind);
			UpdateComposerActions(isEditing: false);
		}

		private InputField CreateLabeledInputField(Transform parent, string labelText, string placeholderText, out Text errorText)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Expected O, but got Unknown
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.Panel(labelText + "FieldRoot", parent, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val2 = val.AddComponent<LayoutElement>();
			val2.preferredHeight = 74f;
			UIFactory.VerticalLayoutOnGO(val, 4, new RectOffset(0, 0, 0, 0));
			ConfigureSectionStack(val, (TextAnchor)0);
			Text val3 = UIFactory.Text(labelText + "Label", labelText, val.transform, 14, (TextAnchor)3, (FontStyle)1);
			((Graphic)val3).color = Color.white;
			LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
			val4.preferredHeight = 18f;
			val4.flexibleHeight = 0f;
			GameObject val5 = UIFactory.Panel(labelText + "InputBackground", val.transform, new Color(0.1f, 0.11f, 0.14f, 0.96f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val6 = val5.AddComponent<LayoutElement>();
			val6.preferredHeight = 34f;
			val6.flexibleHeight = 0f;
			InputField result = CreateStyledInputField(val5, labelText, placeholderText);
			errorText = UIFactory.Text(labelText + "ErrorText", string.Empty, val.transform, 12, (TextAnchor)3, (FontStyle)0);
			((Graphic)errorText).color = new Color(0.93f, 0.52f, 0.52f);
			((Component)errorText).gameObject.SetActive(false);
			LayoutElement val7 = ((Component)errorText).gameObject.AddComponent<LayoutElement>();
			val7.preferredHeight = 14f;
			val7.flexibleHeight = 0f;
			return result;
		}

		private InputField CreateStyledInputField(GameObject inputBackground, string fieldName, string placeholderText)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			InputField val = inputBackground.AddComponent<InputField>();
			((Selectable)val).targetGraphic = (Graphic)(object)inputBackground.GetComponent<Image>();
			val.lineType = (LineType)0;
			val.shouldHideMobileInput = true;
			DisableSelectableNavigation((Selectable)(object)val);
			Text val2 = UIFactory.Text(fieldName + "InputText", string.Empty, inputBackground.transform, 15, (TextAnchor)3, (FontStyle)0);
			((Graphic)val2).color = Color.white;
			val2.supportRichText = false;
			ConfigureInputTextRect(((Graphic)val2).rectTransform);
			Text val3 = UIFactory.Text(fieldName + "Placeholder", placeholderText, inputBackground.transform, 15, (TextAnchor)3, (FontStyle)2);
			((Graphic)val3).color = new Color(1f, 1f, 1f, 0.38f);
			((Graphic)val3).raycastTarget = false;
			ConfigureInputTextRect(((Graphic)val3).rectTransform);
			val.textComponent = val2;
			val.placeholder = (Graphic)(object)val3;
			return val;
		}

		private void HandleCommandInputChanged()
		{
			if ((Object)(object)_commandInput != (Object)null)
			{
				ValidateFieldLive(_commandInput);
			}
		}

		private void HandleCommandInputEndEdit()
		{
			if ((Object)(object)_commandInput != (Object)null)
			{
				ValidateFieldOnBlur(_commandInput);
			}
		}

		private void HandleKeyInputChanged()
		{
			if ((Object)(object)_keyInput != (Object)null)
			{
				ValidateFieldLive(_keyInput);
			}
		}

		private void HandleKeyInputEndEdit()
		{
			NormalizeKeyInputText();
			if ((Object)(object)_keyInput != (Object)null)
			{
				ValidateFieldOnBlur(_keyInput);
			}
		}

		private static void ConfigureInputTextRect(RectTransform rectTransform)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: 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)
			rectTransform.anchorMin = Vector2.zero;
			rectTransform.anchorMax = Vector2.one;
			rectTransform.offsetMin = new Vector2(12f, 5f);
			rectTransform.offsetMax = new Vector2(-12f, -5f);
		}

		private static void DisableSelectableNavigation(Selectable selectable)
		{
			PropertyInfo property = typeof(Selectable).GetProperty("navigation");
			if (property == null)
			{
				return;
			}
			object value = property.GetValue(selectable, null);
			if (value == null)
			{
				return;
			}
			Type type = value.GetType();
			MemberInfo memberInfo = (MemberInfo)(((object)type.GetProperty("mode")) ?? ((object)type.GetField("mode")));
			if (!(memberInfo == null))
			{
				Type enumType = ((memberInfo is PropertyInfo propertyInfo) ? propertyInfo.PropertyType : ((FieldInfo)memberInfo).FieldType);
				object value2 = Enum.ToObject(enumType, 0);
				if (memberInfo is PropertyInfo propertyInfo2)
				{
					propertyInfo2.SetValue(value, value2, null);
				}
				else
				{
					((FieldInfo)memberInfo).SetValue(value, value2);
				}
				property.SetValue(selectable, value, null);
			}
		}

		private void BeginKeyCapture()
		{
			if (!((Object)(object)_keyInput == (Object)null) && !((Object)(object)_keyCaptureOverlay == (Object)null))
			{
				_isAwaitingKeyCapture = true;
				_capturedKey = null;
				_keyInput.DeactivateInputField();
				_keyCaptureListener?.BeginCapture();
				_keyCaptureOverlay.SetActive(true);
				_keyCaptureOverlay.transform.SetAsLastSibling();
				EventSystem current = EventSystem.current;
				if (current != null)
				{
					current.SetSelectedGameObject((GameObject)null);
				}
				if ((Object)(object)_keyCaptureValueText != (Object)null)
				{
					_keyCaptureValueText.text = "Waiting for input...";
				}
				if ((Object)(object)_saveCapturedKeyButton != (Object)null)
				{
					((Selectable)_saveCapturedKeyButton).interactable = false;
				}
			}
		}

		private void OnKeyCaptured(KeyCode keyCode)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			if (_isAwaitingKeyCapture)
			{
				_capturedKey = keyCode;
				EventSystem current = EventSystem.current;
				if (current != null)
				{
					current.SetSelectedGameObject((GameObject)null);
				}
				if ((Object)(object)_keyCaptureValueText != (Object)null)
				{
					_keyCaptureValueText.text = KeybindInputUtility.FormatKeyCode(keyCode);
				}
				if ((Object)(object)_saveCapturedKeyButton != (Object)null)
				{
					((Selectable)_saveCapturedKeyButton).interactable = true;
				}
			}
		}

		private void CancelCapture()
		{
			_isAwaitingKeyCapture = false;
			_capturedKey = null;
			_keyCaptureListener?.CancelCapture();
			if ((Object)(object)_keyCaptureOverlay != (Object)null)
			{
				_keyCaptureOverlay.SetActive(false);
			}
			if ((Object)(object)_keyCaptureValueText != (Object)null)
			{
				_keyCaptureValueText.text = "Waiting for input...";
			}
			if ((Object)(object)_saveCapturedKeyButton != (Object)null)
			{
				((Selectable)_saveCapturedKeyButton).interactable = false;
			}
		}

		private void SaveCapturedKey()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_keyInput == (Object)null) && _capturedKey.HasValue)
			{
				_keyInput.text = KeybindInputUtility.FormatKeyCode(_capturedKey.Value);
				SetFieldError(_keyErrorText, null);
				ValidateKeyField(showErrors: false);
				CancelCapture();
			}
		}

		private void NormalizeKeyInputText()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_keyInput == (Object)null))
			{
				if (KeybindInputUtility.TryParseKeyCode(_keyInput.text, out var keyCode))
				{
					_isAwaitingKeyCapture = false;
					_capturedKey = keyCode;
					_keyInput.text = KeybindInputUtility.FormatKeyCode(keyCode);
					SetFieldError(_keyErrorText, null);
				}
				else
				{
					_capturedKey = null;
				}
			}
		}

		private void PollKeyCapture()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			if (!_isAwaitingKeyCapture)
			{
				return;
			}
			KeyCaptureListener? keyCaptureListener = _keyCaptureListener;
			if (keyCaptureListener != null && keyCaptureListener.TryConsumeCapturedKey(out var keyCode))
			{
				OnKeyCaptured(keyCode);
				return;
			}
			foreach (KeyCode value in Enum.GetValues(typeof(KeyCode)))
			{
				if (!KeybindInputUtility.IsSupportedKeyboardKey(value) || !Input.GetKeyDown(value))
				{
					continue;
				}
				OnKeyCaptured(value);
				break;
			}
		}

		private void PollInputField(InputField? inputField, ref bool wasFocused, ref string lastText, Action onTextChanged, Action onEndEdit)
		{
			if ((Object)(object)inputField == (Object)null)
			{
				wasFocused = false;
				lastText = string.Empty;
				return;
			}
			bool flag = IsInputFieldActive(inputField);
			if (flag != wasFocused)
			{
				wasFocused = flag;
				lastText = inputField.text ?? string.Empty;
				if (!flag)
				{
					onEndEdit();
				}
			}
			if (flag)
			{
				HandleFieldInputUpdate(inputField);
				string text = inputField.text ?? string.Empty;
				if (!string.Equals(text, lastText, StringComparison.Ordinal))
				{
					lastText = text;
					onTextChanged();
				}
			}
		}

		private bool IsConfirmationDialogActive()
		{
			return (Object)(object)_deleteConfirmationOverlay != (Object)null && _deleteConfirmationOverlay.activeSelf;
		}

		private bool IsCommandReferenceDialogActive()
		{
			return (Object)(object)_commandReferenceOverlay != (Object)null && _commandReferenceOverlay.activeSelf;
		}

		private static bool IsInputFieldActive(InputField? inputField)
		{
			if ((Object)(object)inputField == (Object)null)
			{
				return false;
			}
			if (inputField.isFocused)
			{
				return true;
			}
			EventSystem current = EventSystem.current;
			GameObject val = ((current != null) ? current.currentSelectedGameObject : null);
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			return (Object)(object)val == (Object)(object)((Component)inputField).gameObject;
		}

		private void ConfirmPendingConfirmation()
		{
			Action pendingConfirmationAction = _pendingConfirmationAction;
			CloseDeleteConfirmation();
			pendingConfirmationAction?.Invoke();
		}

		private void RefreshCommandReferenceList(IReadOnlyList<ConsoleCommandReferenceEntry> entries)
		{
			if ((Object)(object)_commandReferenceListContent == (Object)null)
			{
				return;
			}
			UIFactory.ClearChildren((Transform)(object)_commandReferenceListContent);
			if (entries.Count == 0)
			{
				CreateCommandReferenceEmptyState();
				UIFactory.FitContentHeight(_commandReferenceListContent);
				return;
			}
			for (int i = 0; i < entries.Count; i++)
			{
				CreateCommandReferenceRow(i, entries[i]);
			}
			UIFactory.FitContentHeight(_commandReferenceListContent);
		}

		private void HandleFieldInputUpdate(InputField sourceField)
		{
			if (Input.GetKeyDown((KeyCode)96))
			{
				sourceField.text = sourceField.text.Replace("`", string.Empty);
				sourceField.caretPosition = sourceField.text.Length;
			}
		}

		private static void ConfigureContentColumns(GameObject contentPanel)
		{
			HorizontalLayoutGroup component = contentPanel.GetComponent<HorizontalLayoutGroup>();
			if (!((Object)(object)component == (Object)null))
			{
				((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).childControlHeight = true;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = true;
				((LayoutGroup)component).childAlignment = (TextAnchor)0;
			}
		}

		private static void ConfigureSectionStack(GameObject section, TextAnchor alignment)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			VerticalLayoutGroup component = section.GetComponent<VerticalLayoutGroup>();
			if (!((Object)(object)component == (Object)null))
			{
				((LayoutGroup)component).childAlignment = alignment;
				((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).childControlHeight = true;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = false;
			}
		}

		private static void ConfigureTitleBarRect(RectTransform? rectTransform)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)rectTransform == (Object)null))
			{
				((Transform)rectTransform).SetAsFirstSibling();
				rectTransform.anchorMin = new Vector2(0f, 1f);
				rectTransform.anchorMax = new Vector2(1f, 1f);
				rectTransform.pivot = new Vector2(0.5f, 1f);
				rectTransform.offsetMin = new Vector2(0f, -52f);
				rectTransform.offsetMax = Vector2.zero;
			}
		}

		private static void StretchToFill(RectTransform? rectTransform, float left, float right, float bottom, float top)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)rectTransform == (Object)null))
			{
				rectTransform.anchorMin = Vector2.zero;
				rectTransform.anchorMax = Vector2.one;
				rectTransform.offsetMin = new Vector2(left, bottom);
				rectTransform.offsetMax = new Vector2(0f - right, 0f - top);
			}
		}

		private static void ConfigureScrollRect(ScrollRect scrollRect)
		{
			RectTransform viewport = scrollRect.viewport;
			StretchToFill(((Component)scrollRect).GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
			if ((Object)(object)viewport != (Object)null)
			{
				StretchToFill(viewport, 0f, 0f, 0f, 0f);
			}
			if ((Object)(object)scrollRect.verticalScrollbar != (Object)null)
			{
				((Component)scrollRect.verticalScrollbar).gameObject.SetActive(false);
				scrollRect.verticalScrollbar = null;
			}
			scrollRect.horizontal = false;
		}

		private static void ConfigureScrollContent(RectTransform content)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			content.anchorMin = new Vector2(0f, 1f);
			content.anchorMax = new Vector2(1f, 1f);
			content.pivot = new Vector2(0.5f, 1f);
			content.anchoredPosition = Vector2.zero;
			content.sizeDelta = new Vector2(0f, content.sizeDelta.y);
			if ((Object)(object)((Component)content).GetComponent<ContentSizeFitter>() == (Object)null)
			{
				ContentSizeFitter val = ((Component)content).gameObject.AddComponent<ContentSizeFitter>();
				val.horizontalFit = (FitMode)0;
				val.verticalFit = (FitMode)2;
			}
			VerticalLayoutGroup component = ((Component)content).GetComponent<VerticalLayoutGroup>();
			if ((Object)(object)component != (Object)null)
			{
				((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true;
			}
		}

		private static Scrollbar EnsureVerticalScrollbar(ScrollRect scrollRect)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			Scrollbar verticalScrollbar = scrollRect.verticalScrollbar;
			if ((Object)(object)verticalScrollbar != (Object)null)
			{
				ConfigureVerticalScrollbarRect(((Component)verticalScrollbar).GetComponent<RectTransform>());
				verticalScrollbar.direction = (Direction)2;
				return verticalScrollbar;
			}
			GameObject val = UIFactory.Panel("SavedKeybindsScrollbar", ((Component)scrollRect).transform, new Color(1f, 1f, 1f, 0.12f), (Vector2?)null, (Vector2?)null, false);
			Scrollbar val2 = val.GetComponent<Scrollbar>() ?? val.AddComponent<Scrollbar>();
			RectTransform component = val.GetComponent<RectTransform>();
			ConfigureVerticalScrollbarRect(component);
			Image component2 = val.GetComponent<Image>();
			((Graphic)component2).color = new Color(1f, 1f, 1f, 0.12f);
			((Graphic)component2).raycastTarget = true;
			GameObject val3 = UIFactory.Panel("SlidingArea", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			Image component3 = val3.GetComponent<Image>();
			if ((Object)(object)component3 != (Object)null)
			{
				((Behaviour)component3).enabled = false;
				((Graphic)component3).raycastTarget = false;
			}
			RectTransform component4 = val3.GetComponent<RectTransform>();
			component4.anchorMin = Vector2.zero;
			component4.anchorMax = Vector2.one;
			component4.offsetMin = new Vector2(2f, 2f);
			component4.offsetMax = new Vector2(-2f, -2f);
			GameObject val4 = UIFactory.Panel("Handle", val3.transform, new Color(0.48f, 0.63f, 0.9f, 0.92f), (Vector2?)null, (Vector2?)null, false);
			RectTransform component5 = val4.GetComponent<RectTransform>();
			component5.anchorMin = Vector2.zero;
			component5.anchorMax = Vector2.one;
			component5.offsetMin = Vector2.zero;
			component5.offsetMax = Vector2.zero;
			Image component6 = val4.GetComponent<Image>();
			((Graphic)component6).color = new Color(0.48f, 0.63f, 0.9f, 0.92f);
			val2.direction = (Direction)2;
			((Selectable)val2).targetGraphic = (Graphic)(object)component6;
			val2.handleRect = component5;
			val2.size = 0.2f;
			return val2;
		}

		private static void ConfigureVerticalScrollbarRect(RectTransform? rectTransform)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)rectTransform == (Object)null))
			{
				rectTransform.anchorMin = new Vector2(1f, 0f);
				rectTransform.anchorMax = new Vector2(1f, 1f);
				rectTransform.pivot = new Vector2(1f, 1f);
				rectTransform.offsetMin = new Vector2(-24f, 2f);
				rectTransform.offsetMax = new Vector2(-2f, -2f);
			}
		}

		private void CreateDeleteConfirmationDialog(Transform parent)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Expected O, but got Unknown
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
			_deleteConfirmationOverlay = UIFactory.Panel("DeleteConfirmOverlay", parent, new Color(0f, 0f, 0f, 0.72f), (Vector2?)null, (Vector2?)null, true);
			StretchToFill(_deleteConfirmationOverlay.GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
			_deleteConfirmationOverlay.transform.SetAsLastSibling();
			Image component = _deleteConfirmationOverlay.GetComponent<Image>();
			if ((Object)(object)component != (Object)null)
			{
				((Graphic)component).raycastTarget = true;
			}
			GameObject val = UIFactory.Panel("DeleteConfirmDialog", _deleteConfirmationOverlay.transform, new Color(0.14f, 0.16f, 0.21f, 0.98f), (Vector2?)null, (Vector2?)null, false);
			RectTransform component2 = val.GetComponent<RectTransform>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.anchorMin = new Vector2(0.5f, 0.5f);
				component2.anchorMax = new Vector2(0.5f, 0.5f);
				component2.pivot = new Vector2(0.5f, 0.5f);
				component2.sizeDelta = new Vector2(380f, 180f);
				component2.anchoredPosition = Vector2.zero;
			}
			_deleteConfirmationDialogRect = component2;
			Image component3 = val.GetComponent<Image>();
			if ((Object)(object)component3 != (Object)null)
			{
				((Graphic)component3).raycastTarget = true;
			}
			UIFactory.VerticalLayoutOnGO(val, 12, new RectOffset(18, 18, 18, 18));
			_deleteConfirmationTitleText = UIFactory.Text("DeleteConfirmTitle", "Delete keybind?", val.transform, 18, (TextAnchor)3, (FontStyle)1);
			((Graphic)_deleteConfirmationTitleText).color = Color.white;
			_deleteConfirmationText = UIFactory.Text("DeleteConfirmText", string.Empty, val.transform, 14, (TextAnchor)0, (FontStyle)0);
			((Graphic)_deleteConfirmationText).color = new Color(0.87f, 0.89f, 0.95f);
			LayoutElement val2 = ((Component)_deleteConfirmationText).gameObject.AddComponent<LayoutElement>();
			val2.flexibleHeight = 1f;
			GameObject val3 = UIFactory.ButtonRow("DeleteConfirmButtons", val.transform, 10f, (TextAnchor)5);
			LayoutElement val4 = val3.AddComponent<LayoutElement>();
			val4.preferredHeight = 42f;
			Button item = UIFactory.RoundedButtonWithLabel("CancelDeleteButton", "Cancel", val3.transform, new Color(0.34f, 0.38f, 0.47f), 112f, 38f, 15, Color.white).Item2;
			ValueTuple<GameObject, Button, Text> valueTuple = UIFactory.RoundedButtonWithLabel("ConfirmDeleteButton", "Delete", val3.transform, new Color(0.71f, 0.2f, 0.22f), 112f, 38f, 15, Color.white);
			Button item2 = valueTuple.Item2;
			Text item3 = valueTuple.Item3;
			_deleteConfirmationConfirmButtonText = item3;
			ButtonUtils.AddListener(item, (Action)CloseDeleteConfirmation);
			ButtonUtils.AddListener(item2, (Action)ConfirmPendingConfirmation);
			_deleteConfirmationOverlay.SetActive(false);
		}

		private void CreateKeyCaptureDialog(Transform parent)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Expected O, but got Unknown
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_040b: Unknown result type (might be due to invalid IL or missing references)
			_keyCaptureOverlay = UIFactory.Panel("KeyCaptureOverlay", parent, new Color(0f, 0f, 0f, 0.72f), (Vector2?)null, (Vector2?)null, true);
			_keyCaptureListener = _keyCaptureOverlay.AddComponent<KeyCaptureListener>();
			StretchToFill(_keyCaptureOverlay.GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
			_keyCaptureOverlay.transform.SetAsLastSibling();
			Image component = _keyCaptureOverlay.GetComponent<Image>();
			if ((Object)(object)component != (Object)null)
			{
				((Graphic)component).raycastTarget = true;
			}
			GameObject val = UIFactory.Panel("KeyCaptureDialog", _keyCaptureOverlay.transform, new Color(0.14f, 0.16f, 0.21f, 0.98f), (Vector2?)null, (Vector2?)null, false);
			RectTransform component2 = val.GetComponent<RectTransform>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.anchorMin = new Vector2(0.5f, 0.5f);
				component2.anchorMax = new Vector2(0.5f, 0.5f);
				component2.pivot = new Vector2(0.5f, 0.5f);
				component2.sizeDelta = new Vector2(400f, 210f);
				component2.anchoredPosition = Vector2.zero;
			}
			Image component3 = val.GetComponent<Image>();
			if ((Object)(object)component3 != (Object)null)
			{
				((Graphic)component3).raycastTarget = true;
			}
			UIFactory.VerticalLayoutOnGO(val, 12, new RectOffset(18, 18, 18, 18));
			ConfigureSectionStack(val, (TextAnchor)0);
			Text val2 = UIFactory.Text("KeyCaptureTitle", "Capture key", val.transform, 18, (TextAnchor)3, (FontStyle)1);
			((Graphic)val2).color = Color.white;
			LayoutElement val3 = ((Component)val2).gameObject.AddComponent<LayoutElement>();
			val3.preferredHeight = 24f;
			val3.flexibleHeight = 0f;
			Text val4 = UIFactory.Text("KeyCapturePrompt", "Press a key to capture it.", val.transform, 14, (TextAnchor)3, (FontStyle)0);
			((Graphic)val4).color = new Color(0.87f, 0.89f, 0.95f);
			GameObject val5 = UIFactory.Panel("KeyCaptureValuePanel", val.transform, new Color(0.1f, 0.11f, 0.14f, 0.96f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val6 = val5.AddComponent<LayoutElement>();
			val6.preferredHeight = 52f;
			val6.flexibleHeight = 0f;
			UIFactory.VerticalLayoutOnGO(val5, 0, new RectOffset(14, 14, 12, 12));
			ConfigureSectionStack(val5, (TextAnchor)3);
			_keyCaptureValueText = UIFactory.Text("KeyCaptureValue", "Waiting for input...", val5.transform, 16, (TextAnchor)3, (FontStyle)1);
			((Graphic)_keyCaptureValueText).color = Color.white;
			GameObject val7 = UIFactory.Panel("KeyCaptureSpacer", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			Image component4 = val7.GetComponent<Image>();
			if ((Object)(object)component4 != (Object)null)
			{
				((Behaviour)component4).enabled = false;
				((Graphic)component4).raycastTarget = false;
			}
			LayoutElement val8 = val7.GetComponent<LayoutElement>() ?? val7.AddComponent<LayoutElement>();
			val8.flexibleHeight = 1f;
			GameObject val9 = UIFactory.ButtonRow("KeyCaptureButtons", val.transform, 10f, (TextAnchor)5);
			LayoutElement val10 = val9.AddComponent<LayoutElement>();
			val10.preferredHeight = 42f;
			Button item = UIFactory.RoundedButtonWithLabel("CancelKeyCaptureButton", "Cancel", val9.transform, new Color(0.34f, 0.38f, 0.47f), 112f, 38f, 15, Color.white).Item2;
			Button item2 = UIFactory.RoundedButtonWithLabel("SaveCapturedKeyButton", "Save", val9.transform, new Color(0.24f, 0.56f, 0.33f), 112f, 38f, 15, Color.white).Item2;
			DisableSelectableNavigation((Selectable)(object)item);
			DisableSelectableNavigation((Selectable)(object)item2);
			ButtonUtils.AddListener(item, (Action)CancelCapture);
			ButtonUtils.AddListener(item2, (Action)SaveCapturedKey);
			_saveCapturedKeyButton = item2;
			((Selectable)_saveCapturedKeyButton).interactable = false;
			_keyCaptureOverlay.SetActive(false);
		}

		private void CreateCommandReferenceDialog(Transform parent)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Expected O, but got Unknown
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_029d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f2: Expected O, but got Unknown
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0390: Unknown result type (might be due to invalid IL or missing references)
			//IL_042b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0473: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0502: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05cd: Expected O, but got Unknown
			_commandReferenceOverlay = UIFactory.Panel("CommandReferenceOverlay", parent, new Color(0f, 0f, 0f, 0.78f), (Vector2?)null, (Vector2?)null, true);
			StretchToFill(_commandReferenceOverlay.GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
			_commandReferenceOverlay.transform.SetAsLastSibling();
			Image component = _commandReferenceOverlay.GetComponent<Image>();
			if ((Object)(object)component != (Object)null)
			{
				((Graphic)component).raycastTarget = true;
			}
			GameObject val = UIFactory.Panel("CommandReferenceDialog", _commandReferenceOverlay.transform, new Color(0.09f, 0.11f, 0.15f, 0.98f), (Vector2?)null, (Vector2?)null, false);
			StretchToFill(val.GetComponent<RectTransform>(), 16f, 16f, 16f, 16f);
			UIFactory.VerticalLayoutOnGO(val, 12, new RectOffset(18, 18, 18, 18));
			ConfigureSectionStack(val, (TextAnchor)0);
			GameObject val2 = UIFactory.Panel("CommandReferenceHeader", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val3 = val2.AddComponent<LayoutElement>();
			val3.preferredHeight = 42f;
			UIFactory.HorizontalLayoutOnGO(val2, 12, 0, 0, 0, 0, (TextAnchor)3);
			Text val4 = UIFactory.Text("CommandReferenceTitle", "Command Reference", val2.transform, 20, (TextAnchor)3, (FontStyle)1);
			((Graphic)val4).color = Color.white;
			LayoutElement val5 = ((Component)val4).gameObject.AddComponent<LayoutElement>();
			val5.flexibleWidth = 1f;
			Button item = UIFactory.RoundedButtonWithLabel("CloseCommandReferenceButton", "Close", val2.transform, new Color(0.34f, 0.38f, 0.47f), 110f, 38f, 15, Color.white).Item2;
			ButtonUtils.AddListener(item, (Action)CloseCommandReference);
			_commandReferenceStatusText = UIFactory.Text("CommandReferenceStatus", string.Empty, val.transform, 13, (TextAnchor)3, (FontStyle)0);
			((Graphic)_commandReferenceStatusText).color = new Color(0.79f, 0.84f, 0.9f);
			LayoutElement val6 = ((Component)_commandReferenceStatusText).gameObject.AddComponent<LayoutElement>();
			val6.preferredHeight = 18f;
			val6.flexibleHeight = 0f;
			GameObject val7 = UIFactory.Panel("CommandReferenceTableSurface", val.transform, new Color(0.16f, 0.18f, 0.24f, 0.98f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val8 = val7.AddComponent<LayoutElement>();
			val8.flexibleHeight = 1f;
			val8.minHeight = 180f;
			UIFactory.VerticalLayoutOnGO(val7, 0, new RectOffset(0, 0, 0, 0));
			ConfigureSectionStack(val7, (TextAnchor)0);
			GameObject val9 = UIFactory.Panel("CommandReferenceTableHeader", val7.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val10 = val9.AddComponent<LayoutElement>();
			val10.preferredHeight = 38f;
			val10.flexibleHeight = 0f;
			UIFactory.HorizontalLayoutOnGO(val9, 12, 4, 46, 8, 8, (TextAnchor)3);
			GameObject val11 = UIFactory.Panel("CommandReferenceHeaderLeftSpacer", val9.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
			Image component2 = val11.GetComponent<Image>();
			if ((Object)(object)component2 != (Object)null)
			{
				((Behaviour)component2).enabled = false;
				((Graphic)component2).raycastTarget = false;
			}
			LayoutElement val12 = val11.GetComponent<LayoutElement>() ?? val11.AddComponent<LayoutElement>();
			val12.preferredWidth = 8f;
			val12.minWidth = 8f;
			val12.flexibleWidth = 0f;
			Text val13 = CreateCommandReferenceTableText("CommandReferenceHeaderCommand", "Command", val9.transform, 14, (FontStyle)1, Color.white);
			LayoutElement val14 = ((Component)val13).gameObject.AddComponent<LayoutElement>();
			val14.preferredWidth = 160f;
			val14.minWidth = 160f;
			Text val15 = CreateCommandReferenceTableText("CommandReferenceHeaderExample", "Example", val9.transform, 14, (FontStyle)1, Color.white);
			LayoutElement val16 = ((Component)val15).gameObject.AddComponent<LayoutElement>();
			val16.preferredWidth = 220f;
			val16.minWidth = 220f;
			Text val17 = CreateCommandReferenceTableText("CommandReferenceHeaderDescription", "Description", val9.transform, 14, (FontStyle)1, Color.white);
			LayoutElement val18 = ((Component)val17).gameObject.AddComponent<LayoutElement>();
			val18.flexibleWidth = 1f;
			GameObject val19 = UIFactory.Panel("CommandReferenceHeaderDivider", val7.transform, new Color(1f, 1f, 1f, 0.1f), (Vector2?)null, (Vector2?)null, false);
			LayoutElement val20 = val19.AddComponent<LayoutElement>();
			val20.preferredHeight = 1f;
			val20.flexibleHeight = 0f;
			ScrollRect val21 = default(ScrollRect);
			_commandReferenceListContent = UIFactory.ScrollableVerticalList("CommandReferenceList", val7.transform, ref val21);
			LayoutElement val22 = ((Component)val21).gameObject.AddComponent<LayoutElement>();
			val22.flexibleHeight = 1f;
			val22.minHeight = 180f;
			ConfigureScrollRect(val21);
			ConfigureScrollContent(_commandReferenceListContent);
			if ((Object)(object)((Component)_commandReferenceListContent).GetComponent<VerticalLayoutGroup>() == (Object)null)
			{
				UIFactory.VerticalLayoutOnGO(((Component)_commandReferenceListContent).gameObject, 0, new RectOffset(0, 0, 0, 0));
			}
			_commandReferenceOverlay.SetActive(false);
		}

		private void ConfigureTitleBar(GameObject titleBar)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			HorizontalLayoutGroup component = titleBar.GetComponent<HorizontalLayoutGroup>();
			if ((Object)(object)component != (Object)null)
			{
				((LayoutGroup)component).childAlignment = (TextAnchor)4;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true;
				((LayoutGroup)component).padding = new RectOffset(16, 16, 10, 10);
			}
			Text componentInChildren = titleBar.GetComponentInChildren<Text>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				componentInChildren.alignment = (TextAnchor)4;
				((Graphic)componentInChildren).color = Color.white;
			}
		}

		private void CreateEmptyKeybindState()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_keybindListContent == (Object)null))
			{
				GameObject val = UIFactory.Panel("EmptyState", (Transform)(object)_keybindListContent, new Color(0.17f, 0.19f, 0.25f, 0.96f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val2 = val.AddComponent<LayoutElement>();
				val2.preferredHeight = 88f;
				val2.flexibleWidth = 1f;
				UIFactory.VerticalLayoutOnGO(val, 4, new RectOffset(14, 14, 14, 14));
				ConfigureSectionStack(val, (TextAnchor)3);
				Text val3 = UIFactory.Text("EmptyStateTitle", "No saved keybinds yet", val.transform, 15, (TextAnchor)3, (FontStyle)1);
				((Graphic)val3).color = Color.white;
				Text val4 = UIFactory.Text("EmptyStateBody", "Add a command and key on the right to create your first keybind.", val.transform, 13, (TextAnchor)3, (FontStyle)0);
				((Graphic)val4).color = new Color(0.8f, 0.84f, 0.9f);
			}
		}

		private void CreateCommandReferenceEmptyState()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_commandReferenceListContent == (Object)null))
			{
				GameObject val = UIFactory.Panel("CommandReferenceEmptyState", (Transform)(object)_commandReferenceListContent, new Color(0.17f, 0.19f, 0.25f, 0.96f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val2 = val.AddComponent<LayoutElement>();
				val2.preferredHeight = 92f;
				val2.flexibleWidth = 1f;
				UIFactory.VerticalLayoutOnGO(val, 4, new RectOffset(14, 14, 14, 14));
				ConfigureSectionStack(val, (TextAnchor)3);
				Text val3 = UIFactory.Text("CommandReferenceEmptyTitle", "No commands available", val.transform, 15, (TextAnchor)3, (FontStyle)1);
				((Graphic)val3).color = Color.white;
				Text val4 = UIFactory.Text("CommandReferenceEmptyBody", "The game's console registry did not return any commands for this session.", val.transform, 13, (TextAnchor)3, (FontStyle)0);
				((Graphic)val4).color = new Color(0.8f, 0.84f, 0.9f);
			}
		}

		private void CreateSavedKeybindRow(int index, SavedKeybind keybind)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Expected O, but got Unknown
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_keybindListContent == (Object)null))
			{
				GameObject val = UIFactory.Panel($"KeybindRow{index}", (Transform)(object)_keybindListContent, new Color(0.19f, 0.21f, 0.27f, 0.95f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val2 = val.AddComponent<LayoutElement>();
				val2.preferredHeight = 64f;
				val2.flexibleWidth = 1f;
				StretchToFill(val.GetComponent<RectTransform>(), 0f, 0f, 0f, 0f);
				UIFactory.HorizontalLayoutOnGO(val, 12, 14, 14, 10, 10, (TextAnchor)3);
				GameObject val3 = UIFactory.Panel($"KeybindTextPanel{index}", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val4 = val3.AddComponent<LayoutElement>();
				val4.flexibleWidth = 1f;
				UIFactory.VerticalLayoutOnGO(val3, 2, new RectOffset(0, 0, 0, 0));
				Text val5 = UIFactory.Text($"KeybindCommand{index}", keybind.Command, val3.transform, 15, (TextAnchor)3, (FontStyle)1);
				((Graphic)val5).color = Color.white;
				Text val6 = UIFactory.Text($"KeybindValue{index}", "Key: " + KeybindInputUtility.FormatKeyCode(keybind.Key), val3.transform, 13, (TextAnchor)3, (FontStyle)0);
				((Graphic)val6).color = new Color(0.82f, 0.86f, 0.92f);
				GameObject val7 = UIFactory.ButtonRow($"KeybindActions{index}", val.transform, 8f, (TextAnchor)4);
				LayoutElement val8 = val7.AddComponent<LayoutElement>();
				val8.preferredWidth = 110f;
				val8.minWidth = 110f;
				Button item = UIFactory.RoundedButtonWithLabel($"EditKeybindButton{index}", "Edit", val7.transform, new Color(0.24f, 0.48f, 0.72f), 68f, 34f, 13, Color.white).Item2;
				ValueTuple<GameObject, Button, Text> valueTuple = UIFactory.RoundedButtonWithLabel($"DeleteKeybindButton{index}", "X", val7.transform, new Color(0.71f, 0.2f, 0.22f), 34f, 34f, 16, Color.white);
				Button item2 = valueTuple.Item2;
				Text item3 = valueTuple.Item3;
				item3.fontStyle = (FontStyle)1;
				int rowIndex = index;
				ButtonUtils.AddListener(item, (Action)delegate
				{
					_beginEditKeybind(rowIndex);
				});
				ButtonUtils.AddListener(item2, (Action)delegate
				{
					_requestDeleteKeybind(rowIndex);
				});
			}
		}

		private void CreateCommandReferenceRow(int index, ConsoleCommandReferenceEntry entry)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0229: Unknown result type (might be due to invalid IL or missing references)
			//IL_027a: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_commandReferenceListContent == (Object)null))
			{
				GameObject val = UIFactory.Panel($"CommandReferenceRow{index}", (Transform)(object)_commandReferenceListContent, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val2 = val.AddComponent<LayoutElement>();
				val2.preferredHeight = 74f;
				val2.flexibleWidth = 1f;
				UIFactory.VerticalLayoutOnGO(val, 0, new RectOffset(0, 0, 0, 0));
				ConfigureSectionStack(val, (TextAnchor)3);
				GameObject val3 = UIFactory.Panel($"CommandReferenceRowContent{index}", val.transform, new Color(0f, 0f, 0f, 0f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val4 = val3.AddComponent<LayoutElement>();
				val4.preferredHeight = 73f;
				val4.flexibleWidth = 1f;
				UIFactory.HorizontalLayoutOnGO(val3, 12, 14, 46, 10, 10, (TextAnchor)3);
				Text val5 = CreateCommandReferenceTableText($"CommandReferenceWord{index}", entry.Command, val3.transform, 15, (FontStyle)1, Color.white);
				LayoutElement val6 = ((Component)val5).gameObject.AddComponent<LayoutElement>();
				val6.preferredWidth = 160f;
				val6.minWidth = 160f;
				string content = (string.IsNullOrWhiteSpace(entry.Description) ? "No description provided." : entry.Description);
				string content2 = (string.IsNullOrWhiteSpace(entry.Example) ? "Unavailable" : entry.Example);
				Text val7 = CreateCommandReferenceTableText($"CommandReferenceExample{index}", content2, val3.transform, 13, (FontStyle)2, new Color(0.69f, 0.77f, 0.88f));
				LayoutElement val8 = ((Component)val7).gameObject.AddComponent<LayoutElement>();
				val8.preferredWidth = 220f;
				val8.minWidth = 220f;
				Text val9 = CreateCommandReferenceTableText($"CommandReferenceDescription{index}", content, val3.transform, 13, (FontStyle)0, new Color(0.84f, 0.88f, 0.94f));
				LayoutElement val10 = ((Component)val9).gameObject.AddComponent<LayoutElement>();
				val10.flexibleWidth = 1f;
				GameObject val11 = UIFactory.Panel($"CommandReferenceDivider{index}", val.transform, new Color(1f, 1f, 1f, 0.08f), (Vector2?)null, (Vector2?)null, false);
				LayoutElement val12 = val11.AddComponent<LayoutElement>();
				val12.preferredHeight = 1f;
				val12.flexibleWidth = 1f;
			}
		}