Decompiled source of UnityExplorer v4.8.2

mcs.dll

Decompiled a year ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.SymbolStore;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using Mono.CSharp.IL2CPP;
using Mono.CSharp.Linq;
using Mono.CSharp.Nullable;
using Mono.CSharp.yyParser;
using Mono.CSharp.yydebug;
using Mono.CompilerServices.SymbolWriter;
using MonoMod.RuntimeDetour;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("mcs")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("mcs")]
[assembly: AssemblyCopyright("Copyright ©  2018")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e4989e4c-0875-4528-9031-08e2c0e70103")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Mono.CompilerServices.SymbolWriter
{
	public class MonoSymbolFileException : Exception
	{
		public MonoSymbolFileException()
		{
		}

		public MonoSymbolFileException(string message, params object[] args)
			: base(string.Format(message, args))
		{
		}

		public MonoSymbolFileException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}
	internal sealed class MyBinaryWriter : BinaryWriter
	{
		public MyBinaryWriter(Stream stream)
			: base(stream)
		{
		}

		public void WriteLeb128(int value)
		{
			Write7BitEncodedInt(value);
		}
	}
	internal class MyBinaryReader : BinaryReader
	{
		public MyBinaryReader(Stream stream)
			: base(stream)
		{
		}

		public int ReadLeb128()
		{
			return Read7BitEncodedInt();
		}

		public string ReadString(int offset)
		{
			long position = BaseStream.Position;
			BaseStream.Position = offset;
			string result = ReadString();
			BaseStream.Position = position;
			return result;
		}
	}
	public interface ISourceFile
	{
		SourceFileEntry Entry { get; }
	}
	public interface ICompileUnit
	{
		CompileUnitEntry Entry { get; }
	}
	public interface IMethodDef
	{
		string Name { get; }

		int Token { get; }
	}
	public class MonoSymbolFile : IDisposable
	{
		private List<MethodEntry> methods = new List<MethodEntry>();

		private List<SourceFileEntry> sources = new List<SourceFileEntry>();

		private List<CompileUnitEntry> comp_units = new List<CompileUnitEntry>();

		private Dictionary<int, AnonymousScopeEntry> anonymous_scopes;

		private OffsetTable ot;

		private int last_type_index;

		private int last_method_index;

		private int last_namespace_index;

		public readonly int MajorVersion = 50;

		public readonly int MinorVersion = 0;

		public int NumLineNumbers;

		private MyBinaryReader reader;

		private Dictionary<int, SourceFileEntry> source_file_hash;

		private Dictionary<int, CompileUnitEntry> compile_unit_hash;

		private List<MethodEntry> method_list;

		private Dictionary<int, MethodEntry> method_token_hash;

		private Dictionary<string, int> source_name_hash;

		private Guid guid;

		internal int LineNumberCount = 0;

		internal int LocalCount = 0;

		internal int StringSize = 0;

		internal int LineNumberSize = 0;

		internal int ExtendedLineNumberSize = 0;

		public int CompileUnitCount => ot.CompileUnitCount;

		public int SourceCount => ot.SourceCount;

		public int MethodCount => ot.MethodCount;

		public int TypeCount => ot.TypeCount;

		public int AnonymousScopeCount => ot.AnonymousScopeCount;

		public int NamespaceCount => last_namespace_index;

		public Guid Guid => guid;

		public OffsetTable OffsetTable => ot;

		public SourceFileEntry[] Sources
		{
			get
			{
				if (reader == null)
				{
					throw new InvalidOperationException();
				}
				SourceFileEntry[] array = new SourceFileEntry[SourceCount];
				for (int i = 0; i < SourceCount; i++)
				{
					array[i] = GetSourceFile(i + 1);
				}
				return array;
			}
		}

		public CompileUnitEntry[] CompileUnits
		{
			get
			{
				if (reader == null)
				{
					throw new InvalidOperationException();
				}
				CompileUnitEntry[] array = new CompileUnitEntry[CompileUnitCount];
				for (int i = 0; i < CompileUnitCount; i++)
				{
					array[i] = GetCompileUnit(i + 1);
				}
				return array;
			}
		}

		public MethodEntry[] Methods
		{
			get
			{
				if (reader == null)
				{
					throw new InvalidOperationException();
				}
				lock (this)
				{
					read_methods();
					MethodEntry[] array = new MethodEntry[MethodCount];
					method_list.CopyTo(array, 0);
					return array;
				}
			}
		}

		internal MyBinaryReader BinaryReader
		{
			get
			{
				if (reader == null)
				{
					throw new InvalidOperationException();
				}
				return reader;
			}
		}

		public MonoSymbolFile()
		{
			ot = new OffsetTable();
		}

		public int AddSource(SourceFileEntry source)
		{
			sources.Add(source);
			return sources.Count;
		}

		public int AddCompileUnit(CompileUnitEntry entry)
		{
			comp_units.Add(entry);
			return comp_units.Count;
		}

		public void AddMethod(MethodEntry entry)
		{
			methods.Add(entry);
		}

		public MethodEntry DefineMethod(CompileUnitEntry comp_unit, int token, ScopeVariable[] scope_vars, LocalVariableEntry[] locals, LineNumberEntry[] lines, CodeBlockEntry[] code_blocks, string real_name, MethodEntry.Flags flags, int namespace_id)
		{
			if (reader != null)
			{
				throw new InvalidOperationException();
			}
			MethodEntry methodEntry = new MethodEntry(this, comp_unit, token, scope_vars, locals, lines, code_blocks, real_name, flags, namespace_id);
			AddMethod(methodEntry);
			return methodEntry;
		}

		internal void DefineAnonymousScope(int id)
		{
			if (reader != null)
			{
				throw new InvalidOperationException();
			}
			if (anonymous_scopes == null)
			{
				anonymous_scopes = new Dictionary<int, AnonymousScopeEntry>();
			}
			anonymous_scopes.Add(id, new AnonymousScopeEntry(id));
		}

		internal void DefineCapturedVariable(int scope_id, string name, string captured_name, CapturedVariable.CapturedKind kind)
		{
			if (reader != null)
			{
				throw new InvalidOperationException();
			}
			AnonymousScopeEntry anonymousScopeEntry = anonymous_scopes[scope_id];
			anonymousScopeEntry.AddCapturedVariable(name, captured_name, kind);
		}

		internal void DefineCapturedScope(int scope_id, int id, string captured_name)
		{
			if (reader != null)
			{
				throw new InvalidOperationException();
			}
			AnonymousScopeEntry anonymousScopeEntry = anonymous_scopes[scope_id];
			anonymousScopeEntry.AddCapturedScope(id, captured_name);
		}

		internal int GetNextTypeIndex()
		{
			return ++last_type_index;
		}

		internal int GetNextMethodIndex()
		{
			return ++last_method_index;
		}

		internal int GetNextNamespaceIndex()
		{
			return ++last_namespace_index;
		}

		private void Write(MyBinaryWriter bw, Guid guid)
		{
			bw.Write(5037318119232611860L);
			bw.Write(MajorVersion);
			bw.Write(MinorVersion);
			bw.Write(guid.ToByteArray());
			long position = bw.BaseStream.Position;
			ot.Write(bw, MajorVersion, MinorVersion);
			methods.Sort();
			for (int i = 0; i < methods.Count; i++)
			{
				methods[i].Index = i + 1;
			}
			ot.DataSectionOffset = (int)bw.BaseStream.Position;
			foreach (SourceFileEntry source in sources)
			{
				source.WriteData(bw);
			}
			foreach (CompileUnitEntry comp_unit in comp_units)
			{
				comp_unit.WriteData(bw);
			}
			foreach (MethodEntry method in methods)
			{
				method.WriteData(this, bw);
			}
			ot.DataSectionSize = (int)bw.BaseStream.Position - ot.DataSectionOffset;
			ot.MethodTableOffset = (int)bw.BaseStream.Position;
			for (int j = 0; j < methods.Count; j++)
			{
				MethodEntry methodEntry = methods[j];
				methodEntry.Write(bw);
			}
			ot.MethodTableSize = (int)bw.BaseStream.Position - ot.MethodTableOffset;
			ot.SourceTableOffset = (int)bw.BaseStream.Position;
			for (int k = 0; k < sources.Count; k++)
			{
				SourceFileEntry sourceFileEntry = sources[k];
				sourceFileEntry.Write(bw);
			}
			ot.SourceTableSize = (int)bw.BaseStream.Position - ot.SourceTableOffset;
			ot.CompileUnitTableOffset = (int)bw.BaseStream.Position;
			for (int l = 0; l < comp_units.Count; l++)
			{
				CompileUnitEntry compileUnitEntry = comp_units[l];
				compileUnitEntry.Write(bw);
			}
			ot.CompileUnitTableSize = (int)bw.BaseStream.Position - ot.CompileUnitTableOffset;
			ot.AnonymousScopeCount = ((anonymous_scopes != null) ? anonymous_scopes.Count : 0);
			ot.AnonymousScopeTableOffset = (int)bw.BaseStream.Position;
			if (anonymous_scopes != null)
			{
				foreach (AnonymousScopeEntry value in anonymous_scopes.Values)
				{
					value.Write(bw);
				}
			}
			ot.AnonymousScopeTableSize = (int)bw.BaseStream.Position - ot.AnonymousScopeTableOffset;
			ot.TypeCount = last_type_index;
			ot.MethodCount = methods.Count;
			ot.SourceCount = sources.Count;
			ot.CompileUnitCount = comp_units.Count;
			ot.TotalFileSize = (int)bw.BaseStream.Position;
			bw.Seek((int)position, SeekOrigin.Begin);
			ot.Write(bw, MajorVersion, MinorVersion);
			bw.Seek(0, SeekOrigin.End);
		}

		public void CreateSymbolFile(Guid guid, FileStream fs)
		{
			if (reader != null)
			{
				throw new InvalidOperationException();
			}
			Write(new MyBinaryWriter(fs), guid);
		}

		private MonoSymbolFile(Stream stream)
		{
			reader = new MyBinaryReader(stream);
			try
			{
				long num = reader.ReadInt64();
				int num2 = reader.ReadInt32();
				int num3 = reader.ReadInt32();
				if (num != 5037318119232611860L)
				{
					throw new MonoSymbolFileException("Symbol file is not a valid");
				}
				if (num2 != 50)
				{
					throw new MonoSymbolFileException("Symbol file has version {0} but expected {1}", num2, 50);
				}
				if (num3 != 0)
				{
					throw new MonoSymbolFileException("Symbol file has version {0}.{1} but expected {2}.{3}", num2, num3, 50, 0);
				}
				MajorVersion = num2;
				MinorVersion = num3;
				guid = new Guid(reader.ReadBytes(16));
				ot = new OffsetTable(reader, num2, num3);
			}
			catch (Exception innerException)
			{
				throw new MonoSymbolFileException("Cannot read symbol file", innerException);
			}
			source_file_hash = new Dictionary<int, SourceFileEntry>();
			compile_unit_hash = new Dictionary<int, CompileUnitEntry>();
		}

		public static MonoSymbolFile ReadSymbolFile(Assembly assembly)
		{
			string location = assembly.Location;
			string mdbFilename = location + ".mdb";
			Module[] modules = assembly.GetModules();
			Guid moduleVersionId = modules[0].ModuleVersionId;
			return ReadSymbolFile(mdbFilename, moduleVersionId);
		}

		public static MonoSymbolFile ReadSymbolFile(string mdbFilename)
		{
			return ReadSymbolFile(new FileStream(mdbFilename, FileMode.Open, FileAccess.Read));
		}

		public static MonoSymbolFile ReadSymbolFile(string mdbFilename, Guid assemblyGuid)
		{
			MonoSymbolFile monoSymbolFile = ReadSymbolFile(mdbFilename);
			if (assemblyGuid != monoSymbolFile.guid)
			{
				throw new MonoSymbolFileException("Symbol file `{0}' does not match assembly", mdbFilename);
			}
			return monoSymbolFile;
		}

		public static MonoSymbolFile ReadSymbolFile(Stream stream)
		{
			return new MonoSymbolFile(stream);
		}

		public SourceFileEntry GetSourceFile(int index)
		{
			if (index < 1 || index > ot.SourceCount)
			{
				throw new ArgumentException();
			}
			if (reader == null)
			{
				throw new InvalidOperationException();
			}
			lock (this)
			{
				if (source_file_hash.TryGetValue(index, out var value))
				{
					return value;
				}
				long position = reader.BaseStream.Position;
				reader.BaseStream.Position = ot.SourceTableOffset + SourceFileEntry.Size * (index - 1);
				value = new SourceFileEntry(this, reader);
				source_file_hash.Add(index, value);
				reader.BaseStream.Position = position;
				return value;
			}
		}

		public CompileUnitEntry GetCompileUnit(int index)
		{
			if (index < 1 || index > ot.CompileUnitCount)
			{
				throw new ArgumentException();
			}
			if (reader == null)
			{
				throw new InvalidOperationException();
			}
			lock (this)
			{
				if (compile_unit_hash.TryGetValue(index, out var value))
				{
					return value;
				}
				long position = reader.BaseStream.Position;
				reader.BaseStream.Position = ot.CompileUnitTableOffset + CompileUnitEntry.Size * (index - 1);
				value = new CompileUnitEntry(this, reader);
				compile_unit_hash.Add(index, value);
				reader.BaseStream.Position = position;
				return value;
			}
		}

		private void read_methods()
		{
			lock (this)
			{
				if (method_token_hash == null)
				{
					method_token_hash = new Dictionary<int, MethodEntry>();
					method_list = new List<MethodEntry>();
					long position = reader.BaseStream.Position;
					reader.BaseStream.Position = ot.MethodTableOffset;
					for (int i = 0; i < MethodCount; i++)
					{
						MethodEntry methodEntry = new MethodEntry(this, reader, i + 1);
						method_token_hash.Add(methodEntry.Token, methodEntry);
						method_list.Add(methodEntry);
					}
					reader.BaseStream.Position = position;
				}
			}
		}

		public MethodEntry GetMethodByToken(int token)
		{
			if (reader == null)
			{
				throw new InvalidOperationException();
			}
			lock (this)
			{
				read_methods();
				method_token_hash.TryGetValue(token, out var value);
				return value;
			}
		}

		public MethodEntry GetMethod(int index)
		{
			if (index < 1 || index > ot.MethodCount)
			{
				throw new ArgumentException();
			}
			if (reader == null)
			{
				throw new InvalidOperationException();
			}
			lock (this)
			{
				read_methods();
				return method_list[index - 1];
			}
		}

		public int FindSource(string file_name)
		{
			if (reader == null)
			{
				throw new InvalidOperationException();
			}
			lock (this)
			{
				if (source_name_hash == null)
				{
					source_name_hash = new Dictionary<string, int>();
					for (int i = 0; i < ot.SourceCount; i++)
					{
						SourceFileEntry sourceFile = GetSourceFile(i + 1);
						source_name_hash.Add(sourceFile.FileName, i);
					}
				}
				if (!source_name_hash.TryGetValue(file_name, out var value))
				{
					return -1;
				}
				return value;
			}
		}

		public AnonymousScopeEntry GetAnonymousScope(int id)
		{
			if (reader == null)
			{
				throw new InvalidOperationException();
			}
			lock (this)
			{
				if (anonymous_scopes != null)
				{
					anonymous_scopes.TryGetValue(id, out var value);
					return value;
				}
				anonymous_scopes = new Dictionary<int, AnonymousScopeEntry>();
				reader.BaseStream.Position = ot.AnonymousScopeTableOffset;
				for (int i = 0; i < ot.AnonymousScopeCount; i++)
				{
					AnonymousScopeEntry value = new AnonymousScopeEntry(reader);
					anonymous_scopes.Add(value.ID, value);
				}
				return anonymous_scopes[id];
			}
		}

		public void Dispose()
		{
			Dispose(disposing: true);
		}

		protected virtual void Dispose(bool disposing)
		{
			if (disposing && reader != null)
			{
				reader.Close();
				reader = null;
			}
		}
	}
	public class OffsetTable
	{
		[Flags]
		public enum Flags
		{
			IsAspxSource = 1,
			WindowsFileNames = 2
		}

		public const int MajorVersion = 50;

		public const int MinorVersion = 0;

		public const long Magic = 5037318119232611860L;

		public int TotalFileSize;

		public int DataSectionOffset;

		public int DataSectionSize;

		public int CompileUnitCount;

		public int CompileUnitTableOffset;

		public int CompileUnitTableSize;

		public int SourceCount;

		public int SourceTableOffset;

		public int SourceTableSize;

		public int MethodCount;

		public int MethodTableOffset;

		public int MethodTableSize;

		public int TypeCount;

		public int AnonymousScopeCount;

		public int AnonymousScopeTableOffset;

		public int AnonymousScopeTableSize;

		public Flags FileFlags;

		public int LineNumberTable_LineBase = -1;

		public int LineNumberTable_LineRange = 8;

		public int LineNumberTable_OpcodeBase = 9;

		internal OffsetTable()
		{
			int platform = (int)Environment.OSVersion.Platform;
			if (platform != 4 && platform != 128)
			{
				FileFlags |= Flags.WindowsFileNames;
			}
		}

		internal OffsetTable(BinaryReader reader, int major_version, int minor_version)
		{
			TotalFileSize = reader.ReadInt32();
			DataSectionOffset = reader.ReadInt32();
			DataSectionSize = reader.ReadInt32();
			CompileUnitCount = reader.ReadInt32();
			CompileUnitTableOffset = reader.ReadInt32();
			CompileUnitTableSize = reader.ReadInt32();
			SourceCount = reader.ReadInt32();
			SourceTableOffset = reader.ReadInt32();
			SourceTableSize = reader.ReadInt32();
			MethodCount = reader.ReadInt32();
			MethodTableOffset = reader.ReadInt32();
			MethodTableSize = reader.ReadInt32();
			TypeCount = reader.ReadInt32();
			AnonymousScopeCount = reader.ReadInt32();
			AnonymousScopeTableOffset = reader.ReadInt32();
			AnonymousScopeTableSize = reader.ReadInt32();
			LineNumberTable_LineBase = reader.ReadInt32();
			LineNumberTable_LineRange = reader.ReadInt32();
			LineNumberTable_OpcodeBase = reader.ReadInt32();
			FileFlags = (Flags)reader.ReadInt32();
		}

		internal void Write(BinaryWriter bw, int major_version, int minor_version)
		{
			bw.Write(TotalFileSize);
			bw.Write(DataSectionOffset);
			bw.Write(DataSectionSize);
			bw.Write(CompileUnitCount);
			bw.Write(CompileUnitTableOffset);
			bw.Write(CompileUnitTableSize);
			bw.Write(SourceCount);
			bw.Write(SourceTableOffset);
			bw.Write(SourceTableSize);
			bw.Write(MethodCount);
			bw.Write(MethodTableOffset);
			bw.Write(MethodTableSize);
			bw.Write(TypeCount);
			bw.Write(AnonymousScopeCount);
			bw.Write(AnonymousScopeTableOffset);
			bw.Write(AnonymousScopeTableSize);
			bw.Write(LineNumberTable_LineBase);
			bw.Write(LineNumberTable_LineRange);
			bw.Write(LineNumberTable_OpcodeBase);
			bw.Write((int)FileFlags);
		}

		public override string ToString()
		{
			return $"OffsetTable [{TotalFileSize} - {DataSectionOffset}:{DataSectionSize} - {SourceCount}:{SourceTableOffset}:{SourceTableSize} - {MethodCount}:{MethodTableOffset}:{MethodTableSize} - {TypeCount}]";
		}
	}
	public class LineNumberEntry
	{
		public sealed class LocationComparer : IComparer<LineNumberEntry>
		{
			public static readonly LocationComparer Default = new LocationComparer();

			public int Compare(LineNumberEntry l1, LineNumberEntry l2)
			{
				int result;
				if (l1.Row != l2.Row)
				{
					int row = l1.Row;
					result = row.CompareTo(l2.Row);
				}
				else
				{
					result = l1.Column.CompareTo(l2.Column);
				}
				return result;
			}
		}

		public readonly int Row;

		public int Column;

		public int EndRow;

		public int EndColumn;

		public readonly int File;

		public readonly int Offset;

		public readonly bool IsHidden;

		public static readonly LineNumberEntry Null = new LineNumberEntry(0, 0, 0, 0);

		public LineNumberEntry(int file, int row, int column, int offset)
			: this(file, row, column, offset, is_hidden: false)
		{
		}

		public LineNumberEntry(int file, int row, int offset)
			: this(file, row, -1, offset, is_hidden: false)
		{
		}

		public LineNumberEntry(int file, int row, int column, int offset, bool is_hidden)
			: this(file, row, column, -1, -1, offset, is_hidden)
		{
		}

		public LineNumberEntry(int file, int row, int column, int end_row, int end_column, int offset, bool is_hidden)
		{
			File = file;
			Row = row;
			Column = column;
			EndRow = end_row;
			EndColumn = end_column;
			Offset = offset;
			IsHidden = is_hidden;
		}

		public override string ToString()
		{
			return string.Format("[Line {0}:{1,2}-{3,4}:{5}]", File, Row, Column, EndRow, EndColumn, Offset);
		}
	}
	public class CodeBlockEntry
	{
		public enum Type
		{
			Lexical = 1,
			CompilerGenerated,
			IteratorBody,
			IteratorDispatcher
		}

		public int Index;

		public int Parent;

		public Type BlockType;

		public int StartOffset;

		public int EndOffset;

		public CodeBlockEntry(int index, int parent, Type type, int start_offset)
		{
			Index = index;
			Parent = parent;
			BlockType = type;
			StartOffset = start_offset;
		}

		internal CodeBlockEntry(int index, MyBinaryReader reader)
		{
			Index = index;
			int num = reader.ReadLeb128();
			BlockType = (Type)(num & 0x3F);
			Parent = reader.ReadLeb128();
			StartOffset = reader.ReadLeb128();
			EndOffset = reader.ReadLeb128();
			if (((uint)num & 0x40u) != 0)
			{
				int num2 = reader.ReadInt16();
				reader.BaseStream.Position += num2;
			}
		}

		public void Close(int end_offset)
		{
			EndOffset = end_offset;
		}

		internal void Write(MyBinaryWriter bw)
		{
			bw.WriteLeb128((int)BlockType);
			bw.WriteLeb128(Parent);
			bw.WriteLeb128(StartOffset);
			bw.WriteLeb128(EndOffset);
		}

		public override string ToString()
		{
			return $"[CodeBlock {Index}:{Parent}:{BlockType}:{StartOffset}:{EndOffset}]";
		}
	}
	public struct LocalVariableEntry
	{
		public readonly int Index;

		public readonly string Name;

		public readonly int BlockIndex;

		public LocalVariableEntry(int index, string name, int block)
		{
			Index = index;
			Name = name;
			BlockIndex = block;
		}

		internal LocalVariableEntry(MonoSymbolFile file, MyBinaryReader reader)
		{
			Index = reader.ReadLeb128();
			Name = reader.ReadString();
			BlockIndex = reader.ReadLeb128();
		}

		internal void Write(MonoSymbolFile file, MyBinaryWriter bw)
		{
			bw.WriteLeb128(Index);
			bw.Write(Name);
			bw.WriteLeb128(BlockIndex);
		}

		public override string ToString()
		{
			return $"[LocalVariable {Name}:{Index}:{BlockIndex - 1}]";
		}
	}
	public struct CapturedVariable
	{
		public enum CapturedKind : byte
		{
			Local,
			Parameter,
			This
		}

		public readonly string Name;

		public readonly string CapturedName;

		public readonly CapturedKind Kind;

		public CapturedVariable(string name, string captured_name, CapturedKind kind)
		{
			Name = name;
			CapturedName = captured_name;
			Kind = kind;
		}

		internal CapturedVariable(MyBinaryReader reader)
		{
			Name = reader.ReadString();
			CapturedName = reader.ReadString();
			Kind = (CapturedKind)reader.ReadByte();
		}

		internal void Write(MyBinaryWriter bw)
		{
			bw.Write(Name);
			bw.Write(CapturedName);
			bw.Write((byte)Kind);
		}

		public override string ToString()
		{
			return $"[CapturedVariable {Name}:{CapturedName}:{Kind}]";
		}
	}
	public struct CapturedScope
	{
		public readonly int Scope;

		public readonly string CapturedName;

		public CapturedScope(int scope, string captured_name)
		{
			Scope = scope;
			CapturedName = captured_name;
		}

		internal CapturedScope(MyBinaryReader reader)
		{
			Scope = reader.ReadLeb128();
			CapturedName = reader.ReadString();
		}

		internal void Write(MyBinaryWriter bw)
		{
			bw.WriteLeb128(Scope);
			bw.Write(CapturedName);
		}

		public override string ToString()
		{
			return $"[CapturedScope {Scope}:{CapturedName}]";
		}
	}
	public struct ScopeVariable
	{
		public readonly int Scope;

		public readonly int Index;

		public ScopeVariable(int scope, int index)
		{
			Scope = scope;
			Index = index;
		}

		internal ScopeVariable(MyBinaryReader reader)
		{
			Scope = reader.ReadLeb128();
			Index = reader.ReadLeb128();
		}

		internal void Write(MyBinaryWriter bw)
		{
			bw.WriteLeb128(Scope);
			bw.WriteLeb128(Index);
		}

		public override string ToString()
		{
			return $"[ScopeVariable {Scope}:{Index}]";
		}
	}
	public class AnonymousScopeEntry
	{
		public readonly int ID;

		private List<CapturedVariable> captured_vars = new List<CapturedVariable>();

		private List<CapturedScope> captured_scopes = new List<CapturedScope>();

		public CapturedVariable[] CapturedVariables
		{
			get
			{
				CapturedVariable[] array = new CapturedVariable[captured_vars.Count];
				captured_vars.CopyTo(array, 0);
				return array;
			}
		}

		public CapturedScope[] CapturedScopes
		{
			get
			{
				CapturedScope[] array = new CapturedScope[captured_scopes.Count];
				captured_scopes.CopyTo(array, 0);
				return array;
			}
		}

		public AnonymousScopeEntry(int id)
		{
			ID = id;
		}

		internal AnonymousScopeEntry(MyBinaryReader reader)
		{
			ID = reader.ReadLeb128();
			int num = reader.ReadLeb128();
			for (int i = 0; i < num; i++)
			{
				captured_vars.Add(new CapturedVariable(reader));
			}
			int num2 = reader.ReadLeb128();
			for (int j = 0; j < num2; j++)
			{
				captured_scopes.Add(new CapturedScope(reader));
			}
		}

		internal void AddCapturedVariable(string name, string captured_name, CapturedVariable.CapturedKind kind)
		{
			captured_vars.Add(new CapturedVariable(name, captured_name, kind));
		}

		internal void AddCapturedScope(int scope, string captured_name)
		{
			captured_scopes.Add(new CapturedScope(scope, captured_name));
		}

		internal void Write(MyBinaryWriter bw)
		{
			bw.WriteLeb128(ID);
			bw.WriteLeb128(captured_vars.Count);
			foreach (CapturedVariable captured_var in captured_vars)
			{
				captured_var.Write(bw);
			}
			bw.WriteLeb128(captured_scopes.Count);
			foreach (CapturedScope captured_scope in captured_scopes)
			{
				captured_scope.Write(bw);
			}
		}

		public override string ToString()
		{
			return $"[AnonymousScope {ID}]";
		}
	}
	public class CompileUnitEntry : ICompileUnit
	{
		public readonly int Index;

		private int DataOffset;

		private MonoSymbolFile file;

		private SourceFileEntry source;

		private List<SourceFileEntry> include_files;

		private List<NamespaceEntry> namespaces;

		private bool creating;

		public static int Size => 8;

		CompileUnitEntry ICompileUnit.Entry => this;

		public SourceFileEntry SourceFile
		{
			get
			{
				if (creating)
				{
					return source;
				}
				ReadData();
				return source;
			}
		}

		public NamespaceEntry[] Namespaces
		{
			get
			{
				ReadData();
				NamespaceEntry[] array = new NamespaceEntry[namespaces.Count];
				namespaces.CopyTo(array, 0);
				return array;
			}
		}

		public SourceFileEntry[] IncludeFiles
		{
			get
			{
				ReadData();
				if (include_files == null)
				{
					return new SourceFileEntry[0];
				}
				SourceFileEntry[] array = new SourceFileEntry[include_files.Count];
				include_files.CopyTo(array, 0);
				return array;
			}
		}

		public CompileUnitEntry(MonoSymbolFile file, SourceFileEntry source)
		{
			this.file = file;
			this.source = source;
			Index = file.AddCompileUnit(this);
			creating = true;
			namespaces = new List<NamespaceEntry>();
		}

		public void AddFile(SourceFileEntry file)
		{
			if (!creating)
			{
				throw new InvalidOperationException();
			}
			if (include_files == null)
			{
				include_files = new List<SourceFileEntry>();
			}
			include_files.Add(file);
		}

		public int DefineNamespace(string name, string[] using_clauses, int parent)
		{
			if (!creating)
			{
				throw new InvalidOperationException();
			}
			int nextNamespaceIndex = file.GetNextNamespaceIndex();
			NamespaceEntry item = new NamespaceEntry(name, nextNamespaceIndex, using_clauses, parent);
			namespaces.Add(item);
			return nextNamespaceIndex;
		}

		internal void WriteData(MyBinaryWriter bw)
		{
			DataOffset = (int)bw.BaseStream.Position;
			bw.WriteLeb128(source.Index);
			int value = ((include_files != null) ? include_files.Count : 0);
			bw.WriteLeb128(value);
			if (include_files != null)
			{
				foreach (SourceFileEntry include_file in include_files)
				{
					bw.WriteLeb128(include_file.Index);
				}
			}
			bw.WriteLeb128(namespaces.Count);
			foreach (NamespaceEntry @namespace in namespaces)
			{
				@namespace.Write(file, bw);
			}
		}

		internal void Write(BinaryWriter bw)
		{
			bw.Write(Index);
			bw.Write(DataOffset);
		}

		internal CompileUnitEntry(MonoSymbolFile file, MyBinaryReader reader)
		{
			this.file = file;
			Index = reader.ReadInt32();
			DataOffset = reader.ReadInt32();
		}

		public void ReadAll()
		{
			ReadData();
		}

		private void ReadData()
		{
			if (creating)
			{
				throw new InvalidOperationException();
			}
			lock (file)
			{
				if (namespaces != null)
				{
					return;
				}
				MyBinaryReader binaryReader = file.BinaryReader;
				int num = (int)binaryReader.BaseStream.Position;
				binaryReader.BaseStream.Position = DataOffset;
				int index = binaryReader.ReadLeb128();
				source = file.GetSourceFile(index);
				int num2 = binaryReader.ReadLeb128();
				if (num2 > 0)
				{
					include_files = new List<SourceFileEntry>();
					for (int i = 0; i < num2; i++)
					{
						include_files.Add(file.GetSourceFile(binaryReader.ReadLeb128()));
					}
				}
				int num3 = binaryReader.ReadLeb128();
				namespaces = new List<NamespaceEntry>();
				for (int j = 0; j < num3; j++)
				{
					namespaces.Add(new NamespaceEntry(file, binaryReader));
				}
				binaryReader.BaseStream.Position = num;
			}
		}
	}
	public class SourceFileEntry
	{
		public readonly int Index;

		private int DataOffset;

		private MonoSymbolFile file;

		private string file_name;

		private byte[] guid;

		private byte[] hash;

		private bool creating;

		private bool auto_generated;

		private readonly string sourceFile;

		public static int Size => 8;

		public byte[] Checksum => hash;

		public string FileName
		{
			get
			{
				return file_name;
			}
			set
			{
				file_name = value;
			}
		}

		public bool AutoGenerated => auto_generated;

		public SourceFileEntry(MonoSymbolFile file, string file_name)
		{
			this.file = file;
			this.file_name = file_name;
			Index = file.AddSource(this);
			creating = true;
		}

		public SourceFileEntry(MonoSymbolFile file, string sourceFile, byte[] guid, byte[] checksum)
			: this(file, sourceFile, sourceFile, guid, checksum)
		{
		}

		public SourceFileEntry(MonoSymbolFile file, string fileName, string sourceFile, byte[] guid, byte[] checksum)
			: this(file, fileName)
		{
			this.guid = guid;
			hash = checksum;
			this.sourceFile = sourceFile;
		}

		internal void WriteData(MyBinaryWriter bw)
		{
			DataOffset = (int)bw.BaseStream.Position;
			bw.Write(file_name);
			if (guid == null)
			{
				guid = new byte[16];
			}
			if (hash == null)
			{
				try
				{
					using FileStream inputStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
					MD5 mD = MD5.Create();
					hash = mD.ComputeHash(inputStream);
				}
				catch
				{
					hash = new byte[16];
				}
			}
			bw.Write(guid);
			bw.Write(hash);
			bw.Write((byte)(auto_generated ? 1u : 0u));
		}

		internal void Write(BinaryWriter bw)
		{
			bw.Write(Index);
			bw.Write(DataOffset);
		}

		internal SourceFileEntry(MonoSymbolFile file, MyBinaryReader reader)
		{
			this.file = file;
			Index = reader.ReadInt32();
			DataOffset = reader.ReadInt32();
			int num = (int)reader.BaseStream.Position;
			reader.BaseStream.Position = DataOffset;
			sourceFile = (file_name = reader.ReadString());
			guid = reader.ReadBytes(16);
			hash = reader.ReadBytes(16);
			auto_generated = reader.ReadByte() == 1;
			reader.BaseStream.Position = num;
		}

		public void SetAutoGenerated()
		{
			if (!creating)
			{
				throw new InvalidOperationException();
			}
			auto_generated = true;
			file.OffsetTable.FileFlags |= OffsetTable.Flags.IsAspxSource;
		}

		public bool CheckChecksum()
		{
			try
			{
				using FileStream inputStream = new FileStream(sourceFile, FileMode.Open);
				MD5 mD = MD5.Create();
				byte[] array = mD.ComputeHash(inputStream);
				for (int i = 0; i < 16; i++)
				{
					if (array[i] != hash[i])
					{
						return false;
					}
				}
				return true;
			}
			catch
			{
				return false;
			}
		}

		public override string ToString()
		{
			return $"SourceFileEntry ({Index}:{DataOffset})";
		}
	}
	public class LineNumberTable
	{
		protected LineNumberEntry[] _line_numbers;

		public readonly int LineBase;

		public readonly int LineRange;

		public readonly byte OpcodeBase;

		public readonly int MaxAddressIncrement;

		public const int Default_LineBase = -1;

		public const int Default_LineRange = 8;

		public const byte Default_OpcodeBase = 9;

		public const byte DW_LNS_copy = 1;

		public const byte DW_LNS_advance_pc = 2;

		public const byte DW_LNS_advance_line = 3;

		public const byte DW_LNS_set_file = 4;

		public const byte DW_LNS_const_add_pc = 8;

		public const byte DW_LNE_end_sequence = 1;

		public const byte DW_LNE_MONO_negate_is_hidden = 64;

		internal const byte DW_LNE_MONO__extensions_start = 64;

		internal const byte DW_LNE_MONO__extensions_end = 127;

		public LineNumberEntry[] LineNumbers => _line_numbers;

		protected LineNumberTable(MonoSymbolFile file)
		{
			LineBase = file.OffsetTable.LineNumberTable_LineBase;
			LineRange = file.OffsetTable.LineNumberTable_LineRange;
			OpcodeBase = (byte)file.OffsetTable.LineNumberTable_OpcodeBase;
			MaxAddressIncrement = (255 - OpcodeBase) / LineRange;
		}

		internal LineNumberTable(MonoSymbolFile file, LineNumberEntry[] lines)
			: this(file)
		{
			_line_numbers = lines;
		}

		internal void Write(MonoSymbolFile file, MyBinaryWriter bw, bool hasColumnsInfo, bool hasEndInfo)
		{
			int num = (int)bw.BaseStream.Position;
			bool flag = false;
			int num2 = 1;
			int num3 = 0;
			int num4 = 1;
			for (int i = 0; i < LineNumbers.Length; i++)
			{
				int num5 = LineNumbers[i].Row - num2;
				int num6 = LineNumbers[i].Offset - num3;
				if (LineNumbers[i].File != num4)
				{
					bw.Write((byte)4);
					bw.WriteLeb128(LineNumbers[i].File);
					num4 = LineNumbers[i].File;
				}
				if (LineNumbers[i].IsHidden != flag)
				{
					bw.Write((byte)0);
					bw.Write((byte)1);
					bw.Write((byte)64);
					flag = LineNumbers[i].IsHidden;
				}
				if (num6 >= MaxAddressIncrement)
				{
					if (num6 < 2 * MaxAddressIncrement)
					{
						bw.Write((byte)8);
						num6 -= MaxAddressIncrement;
					}
					else
					{
						bw.Write((byte)2);
						bw.WriteLeb128(num6);
						num6 = 0;
					}
				}
				if (num5 < LineBase || num5 >= LineBase + LineRange)
				{
					bw.Write((byte)3);
					bw.WriteLeb128(num5);
					if (num6 != 0)
					{
						bw.Write((byte)2);
						bw.WriteLeb128(num6);
					}
					bw.Write((byte)1);
				}
				else
				{
					byte value = (byte)(num5 - LineBase + LineRange * num6 + OpcodeBase);
					bw.Write(value);
				}
				num2 = LineNumbers[i].Row;
				num3 = LineNumbers[i].Offset;
			}
			bw.Write((byte)0);
			bw.Write((byte)1);
			bw.Write((byte)1);
			if (hasColumnsInfo)
			{
				for (int j = 0; j < LineNumbers.Length; j++)
				{
					LineNumberEntry lineNumberEntry = LineNumbers[j];
					if (lineNumberEntry.Row >= 0)
					{
						bw.WriteLeb128(lineNumberEntry.Column);
					}
				}
			}
			if (hasEndInfo)
			{
				for (int k = 0; k < LineNumbers.Length; k++)
				{
					LineNumberEntry lineNumberEntry2 = LineNumbers[k];
					if (lineNumberEntry2.EndRow == -1 || lineNumberEntry2.EndColumn == -1 || lineNumberEntry2.Row > lineNumberEntry2.EndRow)
					{
						bw.WriteLeb128(16777215);
						continue;
					}
					bw.WriteLeb128(lineNumberEntry2.EndRow - lineNumberEntry2.Row);
					bw.WriteLeb128(lineNumberEntry2.EndColumn);
				}
			}
			file.ExtendedLineNumberSize += (int)bw.BaseStream.Position - num;
		}

		internal static LineNumberTable Read(MonoSymbolFile file, MyBinaryReader br, bool readColumnsInfo, bool readEndInfo)
		{
			LineNumberTable lineNumberTable = new LineNumberTable(file);
			lineNumberTable.DoRead(file, br, readColumnsInfo, readEndInfo);
			return lineNumberTable;
		}

		private void DoRead(MonoSymbolFile file, MyBinaryReader br, bool includesColumns, bool includesEnds)
		{
			List<LineNumberEntry> list = new List<LineNumberEntry>();
			bool flag = false;
			bool flag2 = false;
			int num = 1;
			int num2 = 0;
			int file2 = 1;
			while (true)
			{
				byte b = br.ReadByte();
				if (b == 0)
				{
					byte b2 = br.ReadByte();
					long position = br.BaseStream.Position + b2;
					b = br.ReadByte();
					if (b == 1)
					{
						if (flag2)
						{
							list.Add(new LineNumberEntry(file2, num, -1, num2, flag));
						}
						break;
					}
					if (b == 64)
					{
						flag = !flag;
						flag2 = true;
					}
					else if (b < 64 || b > 127)
					{
						throw new MonoSymbolFileException("Unknown extended opcode {0:x}", b);
					}
					br.BaseStream.Position = position;
				}
				else if (b < OpcodeBase)
				{
					switch (b)
					{
					case 1:
						list.Add(new LineNumberEntry(file2, num, -1, num2, flag));
						flag2 = false;
						break;
					case 2:
						num2 += br.ReadLeb128();
						flag2 = true;
						break;
					case 3:
						num += br.ReadLeb128();
						flag2 = true;
						break;
					case 4:
						file2 = br.ReadLeb128();
						flag2 = true;
						break;
					case 8:
						num2 += MaxAddressIncrement;
						flag2 = true;
						break;
					default:
						throw new MonoSymbolFileException("Unknown standard opcode {0:x} in LNT", b);
					}
				}
				else
				{
					b -= OpcodeBase;
					num2 += b / LineRange;
					num += LineBase + b % LineRange;
					list.Add(new LineNumberEntry(file2, num, -1, num2, flag));
					flag2 = false;
				}
			}
			_line_numbers = list.ToArray();
			if (includesColumns)
			{
				for (int i = 0; i < _line_numbers.Length; i++)
				{
					LineNumberEntry lineNumberEntry = _line_numbers[i];
					if (lineNumberEntry.Row >= 0)
					{
						lineNumberEntry.Column = br.ReadLeb128();
					}
				}
			}
			if (!includesEnds)
			{
				return;
			}
			for (int j = 0; j < _line_numbers.Length; j++)
			{
				LineNumberEntry lineNumberEntry2 = _line_numbers[j];
				int num3 = br.ReadLeb128();
				if (num3 == 16777215)
				{
					lineNumberEntry2.EndRow = -1;
					lineNumberEntry2.EndColumn = -1;
				}
				else
				{
					lineNumberEntry2.EndRow = lineNumberEntry2.Row + num3;
					lineNumberEntry2.EndColumn = br.ReadLeb128();
				}
			}
		}

		public bool GetMethodBounds(out LineNumberEntry start, out LineNumberEntry end)
		{
			if (_line_numbers.Length > 1)
			{
				start = _line_numbers[0];
				end = _line_numbers[_line_numbers.Length - 1];
				return true;
			}
			start = LineNumberEntry.Null;
			end = LineNumberEntry.Null;
			return false;
		}
	}
	public class MethodEntry : IComparable
	{
		[Flags]
		public enum Flags
		{
			LocalNamesAmbiguous = 1,
			ColumnsInfoIncluded = 2,
			EndInfoIncluded = 4
		}

		public readonly int CompileUnitIndex;

		public readonly int Token;

		public readonly int NamespaceID;

		private int DataOffset;

		private int LocalVariableTableOffset;

		private int LineNumberTableOffset;

		private int CodeBlockTableOffset;

		private int ScopeVariableTableOffset;

		private int RealNameOffset;

		private Flags flags;

		private int index;

		public readonly CompileUnitEntry CompileUnit;

		private LocalVariableEntry[] locals;

		private CodeBlockEntry[] code_blocks;

		private ScopeVariable[] scope_vars;

		private LineNumberTable lnt;

		private string real_name;

		public readonly MonoSymbolFile SymbolFile;

		public const int Size = 12;

		public Flags MethodFlags => flags;

		public int Index
		{
			get
			{
				return index;
			}
			set
			{
				index = value;
			}
		}

		internal MethodEntry(MonoSymbolFile file, MyBinaryReader reader, int index)
		{
			SymbolFile = file;
			this.index = index;
			Token = reader.ReadInt32();
			DataOffset = reader.ReadInt32();
			LineNumberTableOffset = reader.ReadInt32();
			long position = reader.BaseStream.Position;
			reader.BaseStream.Position = DataOffset;
			CompileUnitIndex = reader.ReadLeb128();
			LocalVariableTableOffset = reader.ReadLeb128();
			NamespaceID = reader.ReadLeb128();
			CodeBlockTableOffset = reader.ReadLeb128();
			ScopeVariableTableOffset = reader.ReadLeb128();
			RealNameOffset = reader.ReadLeb128();
			flags = (Flags)reader.ReadLeb128();
			reader.BaseStream.Position = position;
			CompileUnit = file.GetCompileUnit(CompileUnitIndex);
		}

		internal MethodEntry(MonoSymbolFile file, CompileUnitEntry comp_unit, int token, ScopeVariable[] scope_vars, LocalVariableEntry[] locals, LineNumberEntry[] lines, CodeBlockEntry[] code_blocks, string real_name, Flags flags, int namespace_id)
		{
			SymbolFile = file;
			this.real_name = real_name;
			this.locals = locals;
			this.code_blocks = code_blocks;
			this.scope_vars = scope_vars;
			this.flags = flags;
			index = -1;
			Token = token;
			CompileUnitIndex = comp_unit.Index;
			CompileUnit = comp_unit;
			NamespaceID = namespace_id;
			CheckLineNumberTable(lines);
			lnt = new LineNumberTable(file, lines);
			file.NumLineNumbers += lines.Length;
			int num = ((locals != null) ? locals.Length : 0);
			if (num <= 32)
			{
				for (int i = 0; i < num; i++)
				{
					string name = locals[i].Name;
					for (int j = i + 1; j < num; j++)
					{
						if (locals[j].Name == name)
						{
							flags |= Flags.LocalNamesAmbiguous;
							return;
						}
					}
				}
				return;
			}
			Dictionary<string, LocalVariableEntry> dictionary = new Dictionary<string, LocalVariableEntry>();
			for (int k = 0; k < locals.Length; k++)
			{
				LocalVariableEntry value = locals[k];
				if (dictionary.ContainsKey(value.Name))
				{
					flags |= Flags.LocalNamesAmbiguous;
					break;
				}
				dictionary.Add(value.Name, value);
			}
		}

		private static void CheckLineNumberTable(LineNumberEntry[] line_numbers)
		{
			int num = -1;
			int num2 = -1;
			if (line_numbers == null)
			{
				return;
			}
			foreach (LineNumberEntry lineNumberEntry in line_numbers)
			{
				if (lineNumberEntry.Equals(LineNumberEntry.Null))
				{
					throw new MonoSymbolFileException();
				}
				if (lineNumberEntry.Offset < num)
				{
					throw new MonoSymbolFileException();
				}
				if (lineNumberEntry.Offset > num)
				{
					num2 = lineNumberEntry.Row;
					num = lineNumberEntry.Offset;
				}
				else if (lineNumberEntry.Row > num2)
				{
					num2 = lineNumberEntry.Row;
				}
			}
		}

		internal void Write(MyBinaryWriter bw)
		{
			if (index <= 0 || DataOffset == 0)
			{
				throw new InvalidOperationException();
			}
			bw.Write(Token);
			bw.Write(DataOffset);
			bw.Write(LineNumberTableOffset);
		}

		internal void WriteData(MonoSymbolFile file, MyBinaryWriter bw)
		{
			if (index <= 0)
			{
				throw new InvalidOperationException();
			}
			LocalVariableTableOffset = (int)bw.BaseStream.Position;
			int num = ((locals != null) ? locals.Length : 0);
			bw.WriteLeb128(num);
			for (int i = 0; i < num; i++)
			{
				locals[i].Write(file, bw);
			}
			file.LocalCount += num;
			CodeBlockTableOffset = (int)bw.BaseStream.Position;
			int num2 = ((code_blocks != null) ? code_blocks.Length : 0);
			bw.WriteLeb128(num2);
			for (int j = 0; j < num2; j++)
			{
				code_blocks[j].Write(bw);
			}
			ScopeVariableTableOffset = (int)bw.BaseStream.Position;
			int num3 = ((scope_vars != null) ? scope_vars.Length : 0);
			bw.WriteLeb128(num3);
			for (int k = 0; k < num3; k++)
			{
				scope_vars[k].Write(bw);
			}
			if (real_name != null)
			{
				RealNameOffset = (int)bw.BaseStream.Position;
				bw.Write(real_name);
			}
			LineNumberEntry[] lineNumbers = lnt.LineNumbers;
			foreach (LineNumberEntry lineNumberEntry in lineNumbers)
			{
				if (lineNumberEntry.EndRow != -1 || lineNumberEntry.EndColumn != -1)
				{
					flags |= Flags.EndInfoIncluded;
				}
			}
			LineNumberTableOffset = (int)bw.BaseStream.Position;
			lnt.Write(file, bw, (flags & Flags.ColumnsInfoIncluded) != 0, (flags & Flags.EndInfoIncluded) != 0);
			DataOffset = (int)bw.BaseStream.Position;
			bw.WriteLeb128(CompileUnitIndex);
			bw.WriteLeb128(LocalVariableTableOffset);
			bw.WriteLeb128(NamespaceID);
			bw.WriteLeb128(CodeBlockTableOffset);
			bw.WriteLeb128(ScopeVariableTableOffset);
			bw.WriteLeb128(RealNameOffset);
			bw.WriteLeb128((int)flags);
		}

		public void ReadAll()
		{
			GetLineNumberTable();
			GetLocals();
			GetCodeBlocks();
			GetScopeVariables();
			GetRealName();
		}

		public LineNumberTable GetLineNumberTable()
		{
			lock (SymbolFile)
			{
				if (lnt != null)
				{
					return lnt;
				}
				if (LineNumberTableOffset == 0)
				{
					return null;
				}
				MyBinaryReader binaryReader = SymbolFile.BinaryReader;
				long position = binaryReader.BaseStream.Position;
				binaryReader.BaseStream.Position = LineNumberTableOffset;
				lnt = LineNumberTable.Read(SymbolFile, binaryReader, (flags & Flags.ColumnsInfoIncluded) != 0, (flags & Flags.EndInfoIncluded) != 0);
				binaryReader.BaseStream.Position = position;
				return lnt;
			}
		}

		public LocalVariableEntry[] GetLocals()
		{
			lock (SymbolFile)
			{
				if (locals != null)
				{
					return locals;
				}
				if (LocalVariableTableOffset == 0)
				{
					return null;
				}
				MyBinaryReader binaryReader = SymbolFile.BinaryReader;
				long position = binaryReader.BaseStream.Position;
				binaryReader.BaseStream.Position = LocalVariableTableOffset;
				int num = binaryReader.ReadLeb128();
				locals = new LocalVariableEntry[num];
				for (int i = 0; i < num; i++)
				{
					locals[i] = new LocalVariableEntry(SymbolFile, binaryReader);
				}
				binaryReader.BaseStream.Position = position;
				return locals;
			}
		}

		public CodeBlockEntry[] GetCodeBlocks()
		{
			lock (SymbolFile)
			{
				if (code_blocks != null)
				{
					return code_blocks;
				}
				if (CodeBlockTableOffset == 0)
				{
					return null;
				}
				MyBinaryReader binaryReader = SymbolFile.BinaryReader;
				long position = binaryReader.BaseStream.Position;
				binaryReader.BaseStream.Position = CodeBlockTableOffset;
				int num = binaryReader.ReadLeb128();
				code_blocks = new CodeBlockEntry[num];
				for (int i = 0; i < num; i++)
				{
					code_blocks[i] = new CodeBlockEntry(i, binaryReader);
				}
				binaryReader.BaseStream.Position = position;
				return code_blocks;
			}
		}

		public ScopeVariable[] GetScopeVariables()
		{
			lock (SymbolFile)
			{
				if (scope_vars != null)
				{
					return scope_vars;
				}
				if (ScopeVariableTableOffset == 0)
				{
					return null;
				}
				MyBinaryReader binaryReader = SymbolFile.BinaryReader;
				long position = binaryReader.BaseStream.Position;
				binaryReader.BaseStream.Position = ScopeVariableTableOffset;
				int num = binaryReader.ReadLeb128();
				scope_vars = new ScopeVariable[num];
				for (int i = 0; i < num; i++)
				{
					scope_vars[i] = new ScopeVariable(binaryReader);
				}
				binaryReader.BaseStream.Position = position;
				return scope_vars;
			}
		}

		public string GetRealName()
		{
			lock (SymbolFile)
			{
				if (real_name != null)
				{
					return real_name;
				}
				if (RealNameOffset == 0)
				{
					return null;
				}
				real_name = SymbolFile.BinaryReader.ReadString(RealNameOffset);
				return real_name;
			}
		}

		public int CompareTo(object obj)
		{
			MethodEntry methodEntry = (MethodEntry)obj;
			if (methodEntry.Token < Token)
			{
				return 1;
			}
			if (methodEntry.Token > Token)
			{
				return -1;
			}
			return 0;
		}

		public override string ToString()
		{
			return $"[Method {index}:{Token:x}:{CompileUnitIndex}:{CompileUnit}]";
		}
	}
	public struct NamespaceEntry
	{
		public readonly string Name;

		public readonly int Index;

		public readonly int Parent;

		public readonly string[] UsingClauses;

		public NamespaceEntry(string name, int index, string[] using_clauses, int parent)
		{
			Name = name;
			Index = index;
			Parent = parent;
			UsingClauses = ((using_clauses != null) ? using_clauses : new string[0]);
		}

		internal NamespaceEntry(MonoSymbolFile file, MyBinaryReader reader)
		{
			Name = reader.ReadString();
			Index = reader.ReadLeb128();
			Parent = reader.ReadLeb128();
			int num = reader.ReadLeb128();
			UsingClauses = new string[num];
			for (int i = 0; i < num; i++)
			{
				UsingClauses[i] = reader.ReadString();
			}
		}

		internal void Write(MonoSymbolFile file, MyBinaryWriter bw)
		{
			bw.Write(Name);
			bw.WriteLeb128(Index);
			bw.WriteLeb128(Parent);
			bw.WriteLeb128(UsingClauses.Length);
			string[] usingClauses = UsingClauses;
			foreach (string value in usingClauses)
			{
				bw.Write(value);
			}
		}

		public override string ToString()
		{
			return $"[Namespace {Name}:{Index}:{Parent}]";
		}
	}
	public class MonoSymbolWriter
	{
		private List<SourceMethodBuilder> methods;

		private List<SourceFileEntry> sources;

		private List<CompileUnitEntry> comp_units;

		protected readonly MonoSymbolFile file;

		private string filename;

		private SourceMethodBuilder current_method;

		private Stack<SourceMethodBuilder> current_method_stack = new Stack<SourceMethodBuilder>();

		public MonoSymbolFile SymbolFile => file;

		public MonoSymbolWriter(string filename)
		{
			methods = new List<SourceMethodBuilder>();
			sources = new List<SourceFileEntry>();
			comp_units = new List<CompileUnitEntry>();
			file = new MonoSymbolFile();
			this.filename = filename + ".mdb";
		}

		public void CloseNamespace()
		{
		}

		public void DefineLocalVariable(int index, string name)
		{
			if (current_method != null)
			{
				current_method.AddLocal(index, name);
			}
		}

		public void DefineCapturedLocal(int scope_id, string name, string captured_name)
		{
			file.DefineCapturedVariable(scope_id, name, captured_name, CapturedVariable.CapturedKind.Local);
		}

		public void DefineCapturedParameter(int scope_id, string name, string captured_name)
		{
			file.DefineCapturedVariable(scope_id, name, captured_name, CapturedVariable.CapturedKind.Parameter);
		}

		public void DefineCapturedThis(int scope_id, string captured_name)
		{
			file.DefineCapturedVariable(scope_id, "this", captured_name, CapturedVariable.CapturedKind.This);
		}

		public void DefineCapturedScope(int scope_id, int id, string captured_name)
		{
			file.DefineCapturedScope(scope_id, id, captured_name);
		}

		public void DefineScopeVariable(int scope, int index)
		{
			if (current_method != null)
			{
				current_method.AddScopeVariable(scope, index);
			}
		}

		public void MarkSequencePoint(int offset, SourceFileEntry file, int line, int column, bool is_hidden)
		{
			if (current_method != null)
			{
				current_method.MarkSequencePoint(offset, file, line, column, is_hidden);
			}
		}

		public SourceMethodBuilder OpenMethod(ICompileUnit file, int ns_id, IMethodDef method)
		{
			SourceMethodBuilder result = new SourceMethodBuilder(file, ns_id, method);
			current_method_stack.Push(current_method);
			current_method = result;
			methods.Add(current_method);
			return result;
		}

		public void CloseMethod()
		{
			current_method = current_method_stack.Pop();
		}

		public SourceFileEntry DefineDocument(string url)
		{
			SourceFileEntry sourceFileEntry = new SourceFileEntry(file, url);
			sources.Add(sourceFileEntry);
			return sourceFileEntry;
		}

		public SourceFileEntry DefineDocument(string url, byte[] guid, byte[] checksum)
		{
			SourceFileEntry sourceFileEntry = new SourceFileEntry(file, url, guid, checksum);
			sources.Add(sourceFileEntry);
			return sourceFileEntry;
		}

		public CompileUnitEntry DefineCompilationUnit(SourceFileEntry source)
		{
			CompileUnitEntry compileUnitEntry = new CompileUnitEntry(file, source);
			comp_units.Add(compileUnitEntry);
			return compileUnitEntry;
		}

		public int DefineNamespace(string name, CompileUnitEntry unit, string[] using_clauses, int parent)
		{
			if (unit == null || using_clauses == null)
			{
				throw new NullReferenceException();
			}
			return unit.DefineNamespace(name, using_clauses, parent);
		}

		public int OpenScope(int start_offset)
		{
			if (current_method == null)
			{
				return 0;
			}
			current_method.StartBlock(CodeBlockEntry.Type.Lexical, start_offset);
			return 0;
		}

		public void CloseScope(int end_offset)
		{
			if (current_method != null)
			{
				current_method.EndBlock(end_offset);
			}
		}

		public void OpenCompilerGeneratedBlock(int start_offset)
		{
			if (current_method != null)
			{
				current_method.StartBlock(CodeBlockEntry.Type.CompilerGenerated, start_offset);
			}
		}

		public void CloseCompilerGeneratedBlock(int end_offset)
		{
			if (current_method != null)
			{
				current_method.EndBlock(end_offset);
			}
		}

		public void StartIteratorBody(int start_offset)
		{
			current_method.StartBlock(CodeBlockEntry.Type.IteratorBody, start_offset);
		}

		public void EndIteratorBody(int end_offset)
		{
			current_method.EndBlock(end_offset);
		}

		public void StartIteratorDispatcher(int start_offset)
		{
			current_method.StartBlock(CodeBlockEntry.Type.IteratorDispatcher, start_offset);
		}

		public void EndIteratorDispatcher(int end_offset)
		{
			current_method.EndBlock(end_offset);
		}

		public void DefineAnonymousScope(int id)
		{
			file.DefineAnonymousScope(id);
		}

		public void WriteSymbolFile(Guid guid)
		{
			foreach (SourceMethodBuilder method in methods)
			{
				method.DefineMethod(file);
			}
			try
			{
				File.Delete(filename);
			}
			catch
			{
			}
			using FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
			file.CreateSymbolFile(guid, fs);
		}
	}
	public class SourceMethodBuilder
	{
		private List<LocalVariableEntry> _locals;

		private List<CodeBlockEntry> _blocks;

		private List<ScopeVariable> _scope_vars;

		private Stack<CodeBlockEntry> _block_stack;

		private readonly List<LineNumberEntry> method_lines;

		private readonly ICompileUnit _comp_unit;

		private readonly int ns_id;

		private readonly IMethodDef method;

		public CodeBlockEntry[] Blocks
		{
			get
			{
				if (_blocks == null)
				{
					return new CodeBlockEntry[0];
				}
				CodeBlockEntry[] array = new CodeBlockEntry[_blocks.Count];
				_blocks.CopyTo(array, 0);
				return array;
			}
		}

		public CodeBlockEntry CurrentBlock
		{
			get
			{
				if (_block_stack != null && _block_stack.Count > 0)
				{
					return _block_stack.Peek();
				}
				return null;
			}
		}

		public LocalVariableEntry[] Locals
		{
			get
			{
				if (_locals == null)
				{
					return new LocalVariableEntry[0];
				}
				return _locals.ToArray();
			}
		}

		public ICompileUnit SourceFile => _comp_unit;

		public ScopeVariable[] ScopeVariables
		{
			get
			{
				if (_scope_vars == null)
				{
					return new ScopeVariable[0];
				}
				return _scope_vars.ToArray();
			}
		}

		public SourceMethodBuilder(ICompileUnit comp_unit)
		{
			_comp_unit = comp_unit;
			method_lines = new List<LineNumberEntry>();
		}

		public SourceMethodBuilder(ICompileUnit comp_unit, int ns_id, IMethodDef method)
			: this(comp_unit)
		{
			this.ns_id = ns_id;
			this.method = method;
		}

		public void MarkSequencePoint(int offset, SourceFileEntry file, int line, int column, bool is_hidden)
		{
			MarkSequencePoint(offset, file, line, column, -1, -1, is_hidden);
		}

		public void MarkSequencePoint(int offset, SourceFileEntry file, int line, int column, int end_line, int end_column, bool is_hidden)
		{
			int file2 = file?.Index ?? 0;
			LineNumberEntry lineNumberEntry = new LineNumberEntry(file2, line, column, end_line, end_column, offset, is_hidden);
			if (method_lines.Count > 0)
			{
				LineNumberEntry lineNumberEntry2 = method_lines[method_lines.Count - 1];
				if (lineNumberEntry2.Offset == offset)
				{
					if (LineNumberEntry.LocationComparer.Default.Compare(lineNumberEntry, lineNumberEntry2) > 0)
					{
						method_lines[method_lines.Count - 1] = lineNumberEntry;
					}
					return;
				}
			}
			method_lines.Add(lineNumberEntry);
		}

		public void StartBlock(CodeBlockEntry.Type type, int start_offset)
		{
			StartBlock(type, start_offset, (_blocks == null) ? 1 : (_blocks.Count + 1));
		}

		public void StartBlock(CodeBlockEntry.Type type, int start_offset, int scopeIndex)
		{
			if (_block_stack == null)
			{
				_block_stack = new Stack<CodeBlockEntry>();
			}
			if (_blocks == null)
			{
				_blocks = new List<CodeBlockEntry>();
			}
			int parent = ((CurrentBlock != null) ? CurrentBlock.Index : (-1));
			CodeBlockEntry item = new CodeBlockEntry(scopeIndex, parent, type, start_offset);
			_block_stack.Push(item);
			_blocks.Add(item);
		}

		public void EndBlock(int end_offset)
		{
			CodeBlockEntry codeBlockEntry = _block_stack.Pop();
			codeBlockEntry.Close(end_offset);
		}

		public void AddLocal(int index, string name)
		{
			if (_locals == null)
			{
				_locals = new List<LocalVariableEntry>();
			}
			int block = ((CurrentBlock != null) ? CurrentBlock.Index : 0);
			_locals.Add(new LocalVariableEntry(index, name, block));
		}

		public void AddScopeVariable(int scope, int index)
		{
			if (_scope_vars == null)
			{
				_scope_vars = new List<ScopeVariable>();
			}
			_scope_vars.Add(new ScopeVariable(scope, index));
		}

		public void DefineMethod(MonoSymbolFile file)
		{
			DefineMethod(file, method.Token);
		}

		public void DefineMethod(MonoSymbolFile file, int token)
		{
			CodeBlockEntry[] array = Blocks;
			if (array.Length != 0)
			{
				List<CodeBlockEntry> list = new List<CodeBlockEntry>(array.Length);
				int num = 0;
				for (int i = 0; i < array.Length; i++)
				{
					num = Math.Max(num, array[i].Index);
				}
				for (int j = 0; j < num; j++)
				{
					int num2 = j + 1;
					if (j < array.Length && array[j].Index == num2)
					{
						list.Add(array[j]);
						continue;
					}
					bool flag = false;
					for (int k = 0; k < array.Length; k++)
					{
						if (array[k].Index == num2)
						{
							list.Add(array[k]);
							flag = true;
							break;
						}
					}
					if (!flag)
					{
						list.Add(new CodeBlockEntry(num2, -1, CodeBlockEntry.Type.CompilerGenerated, 0));
					}
				}
				array = list.ToArray();
			}
			MethodEntry entry = new MethodEntry(file, _comp_unit.Entry, token, ScopeVariables, Locals, method_lines.ToArray(), array, null, MethodEntry.Flags.ColumnsInfoIncluded, ns_id);
			file.AddMethod(entry);
		}
	}
	public class SymbolWriterImpl : ISymbolWriter
	{
		private delegate Guid GetGuidFunc(ModuleBuilder mb);

		private MonoSymbolWriter msw;

		private int nextLocalIndex;

		private int currentToken;

		private string methodName;

		private Stack namespaceStack = new Stack();

		private bool methodOpened;

		private Hashtable documents = new Hashtable();

		private ModuleBuilder mb;

		private GetGuidFunc get_guid_func;

		public SymbolWriterImpl(ModuleBuilder mb)
		{
			this.mb = mb;
		}

		public void Close()
		{
			MethodInfo method = typeof(ModuleBuilder).GetMethod("Mono_GetGuid", BindingFlags.Static | BindingFlags.NonPublic);
			if ((object)method != null)
			{
				get_guid_func = (GetGuidFunc)Delegate.CreateDelegate(typeof(GetGuidFunc), method);
				msw.WriteSymbolFile(get_guid_func(mb));
			}
		}

		public void CloseMethod()
		{
			if (methodOpened)
			{
				methodOpened = false;
				nextLocalIndex = 0;
				msw.CloseMethod();
			}
		}

		public void CloseNamespace()
		{
			namespaceStack.Pop();
			msw.CloseNamespace();
		}

		public void CloseScope(int endOffset)
		{
			msw.CloseScope(endOffset);
		}

		public ISymbolDocumentWriter DefineDocument(string url, Guid language, Guid languageVendor, Guid documentType)
		{
			SymbolDocumentWriterImpl symbolDocumentWriterImpl = (SymbolDocumentWriterImpl)documents[url];
			if (symbolDocumentWriterImpl == null)
			{
				SourceFileEntry source = msw.DefineDocument(url);
				CompileUnitEntry comp_unit = msw.DefineCompilationUnit(source);
				symbolDocumentWriterImpl = new SymbolDocumentWriterImpl(comp_unit);
				documents[url] = symbolDocumentWriterImpl;
			}
			return symbolDocumentWriterImpl;
		}

		public void DefineField(SymbolToken parent, string name, FieldAttributes attributes, byte[] signature, SymAddressKind addrKind, int addr1, int addr2, int addr3)
		{
		}

		public void DefineGlobalVariable(string name, FieldAttributes attributes, byte[] signature, SymAddressKind addrKind, int addr1, int addr2, int addr3)
		{
		}

		public void DefineLocalVariable(string name, FieldAttributes attributes, byte[] signature, SymAddressKind addrKind, int addr1, int addr2, int addr3, int startOffset, int endOffset)
		{
			msw.DefineLocalVariable(nextLocalIndex++, name);
		}

		public void DefineParameter(string name, ParameterAttributes attributes, int sequence, SymAddressKind addrKind, int addr1, int addr2, int addr3)
		{
		}

		public void DefineSequencePoints(ISymbolDocumentWriter document, int[] offsets, int[] lines, int[] columns, int[] endLines, int[] endColumns)
		{
			SourceFileEntry file = ((SymbolDocumentWriterImpl)document)?.Entry.SourceFile;
			for (int i = 0; i < offsets.Length; i++)
			{
				if (i <= 0 || offsets[i] != offsets[i - 1] || lines[i] != lines[i - 1] || columns[i] != columns[i - 1])
				{
					msw.MarkSequencePoint(offsets[i], file, lines[i], columns[i], is_hidden: false);
				}
			}
		}

		public void Initialize(IntPtr emitter, string filename, bool fFullBuild)
		{
			msw = new MonoSymbolWriter(filename);
		}

		public void OpenMethod(SymbolToken method)
		{
			currentToken = method.GetToken();
		}

		public void OpenNamespace(string name)
		{
			NamespaceInfo namespaceInfo = new NamespaceInfo();
			namespaceInfo.NamespaceID = -1;
			namespaceInfo.Name = name;
			namespaceStack.Push(namespaceInfo);
		}

		public int OpenScope(int startOffset)
		{
			return msw.OpenScope(startOffset);
		}

		public void SetMethodSourceRange(ISymbolDocumentWriter startDoc, int startLine, int startColumn, ISymbolDocumentWriter endDoc, int endLine, int endColumn)
		{
			int currentNamespace = GetCurrentNamespace(startDoc);
			SourceMethodImpl method = new SourceMethodImpl(methodName, currentToken, currentNamespace);
			msw.OpenMethod(((ICompileUnit)startDoc).Entry, currentNamespace, method);
			methodOpened = true;
		}

		public void SetScopeRange(int scopeID, int startOffset, int endOffset)
		{
		}

		public void SetSymAttribute(SymbolToken parent, string name, byte[] data)
		{
			if (name == "__name")
			{
				methodName = Encoding.UTF8.GetString(data);
			}
		}

		public void SetUnderlyingWriter(IntPtr underlyingWriter)
		{
		}

		public void SetUserEntryPoint(SymbolToken entryMethod)
		{
		}

		public void UsingNamespace(string fullName)
		{
			if (namespaceStack.Count == 0)
			{
				OpenNamespace("");
			}
			NamespaceInfo namespaceInfo = (NamespaceInfo)namespaceStack.Peek();
			if (namespaceInfo.NamespaceID != -1)
			{
				NamespaceInfo namespaceInfo2 = namespaceInfo;
				CloseNamespace();
				OpenNamespace(namespaceInfo2.Name);
				namespaceInfo = (NamespaceInfo)namespaceStack.Peek();
				namespaceInfo.UsingClauses = namespaceInfo2.UsingClauses;
			}
			namespaceInfo.UsingClauses.Add(fullName);
		}

		private int GetCurrentNamespace(ISymbolDocumentWriter doc)
		{
			if (namespaceStack.Count == 0)
			{
				OpenNamespace("");
			}
			NamespaceInfo namespaceInfo = (NamespaceInfo)namespaceStack.Peek();
			if (namespaceInfo.NamespaceID == -1)
			{
				string[] using_clauses = (string[])namespaceInfo.UsingClauses.ToArray(typeof(string));
				int parent = 0;
				if (namespaceStack.Count > 1)
				{
					namespaceStack.Pop();
					parent = ((NamespaceInfo)namespaceStack.Peek()).NamespaceID;
					namespaceStack.Push(namespaceInfo);
				}
				namespaceInfo.NamespaceID = msw.DefineNamespace(namespaceInfo.Name, ((ICompileUnit)doc).Entry, using_clauses, parent);
			}
			return namespaceInfo.NamespaceID;
		}
	}
	internal class SymbolDocumentWriterImpl : ISymbolDocumentWriter, ISourceFile, ICompileUnit
	{
		private CompileUnitEntry comp_unit;

		SourceFileEntry ISourceFile.Entry => comp_unit.SourceFile;

		public CompileUnitEntry Entry => comp_unit;

		public SymbolDocumentWriterImpl(CompileUnitEntry comp_unit)
		{
			this.comp_unit = comp_unit;
		}

		public void SetCheckSum(Guid algorithmId, byte[] checkSum)
		{
		}

		public void SetSource(byte[] source)
		{
		}
	}
	internal class SourceMethodImpl : IMethodDef
	{
		private string name;

		private int token;

		private int namespaceID;

		public string Name => name;

		public int NamespaceID => namespaceID;

		public int Token => token;

		public SourceMethodImpl(string name, int token, int namespaceID)
		{
			this.name = name;
			this.token = token;
			this.namespaceID = namespaceID;
		}
	}
	internal class NamespaceInfo
	{
		public string Name;

		public int NamespaceID;

		public ArrayList UsingClauses = new ArrayList();
	}
}
namespace Mono.CSharp
{
	public abstract class CompilerGeneratedContainer : ClassOrStruct
	{
		protected CompilerGeneratedContainer(TypeContainer parent, MemberName name, Modifiers mod)
			: this(parent, name, mod, MemberKind.Class)
		{
		}

		protected CompilerGeneratedContainer(TypeContainer parent, MemberName name, Modifiers mod, MemberKind kind)
			: base(parent, name, null, kind)
		{
			base.ModFlags = mod | Modifiers.COMPILER_GENERATED | Modifiers.SEALED;
			spec = new TypeSpec(Kind, null, this, null, base.ModFlags);
		}

		protected void CheckMembersDefined()
		{
			if (base.HasMembersDefined)
			{
				throw new InternalErrorException("Helper class already defined!");
			}
		}

		protected override bool DoDefineMembers()
		{
			if (Kind == MemberKind.Class && !base.IsStatic && !base.PartialContainer.HasInstanceConstructor)
			{
				DefineDefaultConstructor(is_static: false);
			}
			return base.DoDefineMembers();
		}

		protected static MemberName MakeMemberName(MemberBase host, string name, int unique_id, TypeParameters tparams, Location loc)
		{
			string host2 = ((host == null) ? null : ((host is InterfaceMemberBase) ? ((InterfaceMemberBase)host).GetFullName(host.MemberName) : host.MemberName.Name));
			string name2 = MakeName(host2, "c", name, unique_id);
			TypeParameters typeParameters = null;
			if (tparams != null)
			{
				typeParameters = new TypeParameters(tparams.Count);
				for (int i = 0; i < tparams.Count; i++)
				{
					typeParameters.Add((TypeParameter)null);
				}
			}
			return new MemberName(name2, typeParameters, loc);
		}

		public static string MakeName(string host, string typePrefix, string name, int id)
		{
			return "<" + host + ">" + typePrefix + "__" + name + id.ToString("X");
		}

		protected override TypeSpec[] ResolveBaseTypes(out FullNamedExpression base_class)
		{
			base_type = Compiler.BuiltinTypes.Object;
			base_class = null;
			return null;
		}
	}
	public class HoistedStoreyClass : CompilerGeneratedContainer
	{
		public sealed class HoistedField : Field
		{
			public HoistedField(HoistedStoreyClass parent, FullNamedExpression type, Modifiers mod, string name, Attributes attrs, Location loc)
				: base(parent, type, mod, new MemberName(name, loc), attrs)
			{
			}

			protected override bool ResolveMemberType()
			{
				if (!base.ResolveMemberType())
				{
					return false;
				}
				HoistedStoreyClass genericStorey = ((HoistedStoreyClass)Parent).GetGenericStorey();
				if (genericStorey != null && genericStorey.Mutator != null)
				{
					member_type = genericStorey.Mutator.Mutate(base.MemberType);
				}
				return true;
			}
		}

		protected TypeParameterMutator mutator;

		public TypeParameterMutator Mutator
		{
			get
			{
				return mutator;
			}
			set
			{
				mutator = value;
			}
		}

		public HoistedStoreyClass(TypeDefinition parent, MemberName name, TypeParameters tparams, Modifiers mods, MemberKind kind)
			: base(parent, name, mods | Modifiers.PRIVATE, kind)
		{
			if (tparams != null)
			{
				TypeParameters typeParameters = name.TypeParameters;
				TypeParameterSpec[] array = new TypeParameterSpec[tparams.Count];
				TypeParameterSpec[] array2 = new TypeParameterSpec[tparams.Count];
				for (int i = 0; i < tparams.Count; i++)
				{
					typeParameters[i] = tparams[i].CreateHoistedCopy(spec);
					array[i] = tparams[i].Type;
					array2[i] = typeParameters[i].Type;
				}
				TypeSpec[] targs = array2;
				TypeParameterInflator inflator = new TypeParameterInflator(this, null, array, targs);
				for (int j = 0; j < tparams.Count; j++)
				{
					array[j].InflateConstraints(inflator, array2[j]);
				}
				mutator = new TypeParameterMutator(tparams, typeParameters);
			}
		}

		public HoistedStoreyClass GetGenericStorey()
		{
			TypeContainer typeContainer = this;
			while (typeContainer != null && typeContainer.CurrentTypeParameters == null)
			{
				typeContainer = typeContainer.Parent;
			}
			return typeContainer as HoistedStoreyClass;
		}
	}
	public class AnonymousMethodStorey : HoistedStoreyClass
	{
		private struct StoreyFieldPair
		{
			public readonly AnonymousMethodStorey Storey;

			public readonly Field Field;

			public StoreyFieldPair(AnonymousMethodStorey storey, Field field)
			{
				Storey = storey;
				Field = field;
			}
		}

		private sealed class ThisInitializer : Statement
		{
			private readonly HoistedThis hoisted_this;

			private readonly AnonymousMethodStorey parent;

			public ThisInitializer(HoistedThis hoisted_this, AnonymousMethodStorey parent)
			{
				this.hoisted_this = hoisted_this;
				this.parent = parent;
			}

			protected override void DoEmit(EmitContext ec)
			{
				Expression source = ((parent != null) ? ((Expression)new FieldExpr(parent.HoistedThis.Field, Location.Null)
				{
					InstanceExpression = new CompilerGeneratedThis(ec.CurrentType, Location.Null)
				}) : ((Expression)new CompilerGeneratedThis(ec.CurrentType, loc)));
				hoisted_this.EmitAssign(ec, source, leave_copy: false, isCompound: false);
			}

			protected override bool DoFlowAnalysis(FlowAnalysisContext fc)
			{
				return false;
			}

			protected override void CloneTo(CloneContext clonectx, Statement target)
			{
			}
		}

		public readonly int ID;

		public readonly ExplicitBlock OriginalSourceBlock;

		private List<StoreyFieldPair> used_parent_storeys;

		private List<ExplicitBlock> children_references;

		protected List<HoistedParameter> hoisted_params;

		private List<HoistedParameter> hoisted_local_params;

		protected List<HoistedVariable> hoisted_locals;

		protected HoistedThis hoisted_this;

		public Expression Instance;

		private bool initialize_hoisted_this;

		private AnonymousMethodStorey hoisted_this_parent;

		public HoistedThis HoistedThis
		{
			get
			{
				return hoisted_this;
			}
			set
			{
				hoisted_this = value;
			}
		}

		public IList<ExplicitBlock> ReferencesFromChildrenBlock => children_references;

		public AnonymousMethodStorey(ExplicitBlock block, TypeDefinition parent, MemberBase host, TypeParameters tparams, string name, MemberKind kind)
			: base(parent, CompilerGeneratedContainer.MakeMemberName(host, name, parent.PartialContainer.CounterAnonymousContainers, tparams, block.StartLocation), tparams, (Modifiers)0, kind)
		{
			OriginalSourceBlock = block;
			ID = parent.PartialContainer.CounterAnonymousContainers++;
		}

		public void AddCapturedThisField(EmitContext ec, AnonymousMethodStorey parent)
		{
			TypeExpr type = new TypeExpression(ec.CurrentType, base.Location);
			Field field = AddCompilerGeneratedField("$this", type);
			hoisted_this = new HoistedThis(this, field);
			initialize_hoisted_this = true;
			hoisted_this_parent = parent;
		}

		public Field AddCapturedVariable(string name, TypeSpec type)
		{
			CheckMembersDefined();
			FullNamedExpression type2 = new TypeExpression(type, base.Location);
			if (!spec.IsGenericOrParentIsGeneric)
			{
				return AddCompilerGeneratedField(name, type2);
			}
			Field field = new HoistedField(this, type2, Modifiers.INTERNAL | Modifiers.COMPILER_GENERATED, name, null, base.Location);
			AddField(field);
			return field;
		}

		protected Field AddCompilerGeneratedField(string name, FullNamedExpression type)
		{
			return AddCompilerGeneratedField(name, type, privateAccess: false);
		}

		protected Field AddCompilerGeneratedField(string name, FullNamedExpression type, bool privateAccess)
		{
			Modifiers mod = Modifiers.COMPILER_GENERATED | (privateAccess ? Modifiers.PRIVATE : Modifiers.INTERNAL);
			Field field = new Field(this, type, mod, new MemberName(name, base.Location), null);
			AddField(field);
			return field;
		}

		public void AddReferenceFromChildrenBlock(ExplicitBlock block)
		{
			if (children_references == null)
			{
				children_references = new List<ExplicitBlock>();
			}
			if (!children_references.Contains(block))
			{
				children_references.Add(block);
			}
		}

		public void AddParentStoreyReference(EmitContext ec, AnonymousMethodStorey storey)
		{
			CheckMembersDefined();
			if (used_parent_storeys == null)
			{
				used_parent_storeys = new List<StoreyFieldPair>();
			}
			else if (used_parent_storeys.Exists((StoreyFieldPair i) => i.Storey == storey))
			{
				return;
			}
			TypeExpr type = storey.CreateStoreyTypeExpression(ec);
			int iD = storey.ID;
			Field field = AddCompilerGeneratedField("<>f__ref$" + iD, type);
			used_parent_storeys.Add(new StoreyFieldPair(storey, field));
		}

		public void CaptureLocalVariable(ResolveContext ec, LocalVariable localVariable)
		{
			if (this is StateMachine)
			{
				if (ec.CurrentBlock.ParametersBlock != localVariable.Block.ParametersBlock)
				{
					ec.CurrentBlock.Explicit.HasCapturedVariable = true;
				}
			}
			else
			{
				ec.CurrentBlock.Explicit.HasCapturedVariable = true;
			}
			HoistedVariable hoistedVariable = localVariable.HoistedVariant;
			if (hoistedVariable != null && hoistedVariable.Storey != this && hoistedVariable.Storey is StateMachine)
			{
				hoistedVariable.Storey.hoisted_locals.Remove(hoistedVariable);
				hoistedVariable.Storey.Members.Remove(hoistedVariable.Field);
				hoistedVariable = null;
			}
			if (hoistedVariable == null)
			{
				hoistedVariable = (localVariable.HoistedVariant = new HoistedLocalVariable(this, localVariable, GetVariableMangledName(ec, localVariable)));
				if (hoisted_locals == null)
				{
					hoisted_locals = new List<HoistedVariable>();
				}
				hoisted_locals.Add(hoistedVariable);
			}
			if (ec.CurrentBlock.Explicit != localVariable.Block.Explicit && !(hoistedVariable.Storey is StateMachine) && hoistedVariable.Storey != null)
			{
				hoistedVariable.Storey.AddReferenceFromChildrenBlock(ec.CurrentBlock.Explicit);
			}
		}

		public void CaptureParameter(ResolveContext ec, ParametersBlock.ParameterInfo parameterInfo, ParameterReference parameterReference)
		{
			if (!(this is StateMachine))
			{
				ec.CurrentBlock.Explicit.HasCapturedVariable = true;
			}
			HoistedParameter hoistedParameter = parameterInfo.Parameter.HoistedVariant;
			if (parameterInfo.Block.StateMachine != null)
			{
				if (hoistedParameter == null && parameterInfo.Block.StateMachine != this)
				{
					StateMachine stateMachine = parameterInfo.Block.StateMachine;
					hoistedParameter = new HoistedParameter(stateMachine, parameterReference);
					parameterInfo.Parameter.HoistedVariant = hoistedParameter;
					if (stateMachine.hoisted_params == null)
					{
						stateMachine.hoisted_params = new List<HoistedParameter>();
					}
					stateMachine.hoisted_params.Add(hoistedParameter);
				}
				if (hoistedParameter != null && hoistedParameter.Storey != this && hoistedParameter.Storey is StateMachine)
				{
					if (hoisted_local_params == null)
					{
						hoisted_local_params = new List<HoistedParameter>();
					}
					hoisted_local_params.Add(hoistedParameter);
					hoistedParameter = null;
				}
			}
			if (hoistedParameter == null)
			{
				hoistedParameter = new HoistedParameter(this, parameterReference);
				parameterInfo.Parameter.HoistedVariant = hoistedParameter;
				if (hoisted_params == null)
				{
					hoisted_params = new List<HoistedParameter>();
				}
				hoisted_params.Add(hoistedParameter);
			}
			if (ec.CurrentBlock.Explicit != parameterInfo.Block)
			{
				hoistedParameter.Storey.AddReferenceFromChildrenBlock(ec.CurrentBlock.Explicit);
			}
		}

		private TypeExpr CreateStoreyTypeExpression(EmitContext ec)
		{
			if (CurrentTypeParameters != null)
			{
				TypeParameters typeParameters = ((ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod.Storey != null) ? ec.CurrentAnonymousMethod.Storey.CurrentTypeParameters : ec.CurrentTypeParameters);
				TypeArguments typeArguments = new TypeArguments();
				for (int i = 0; i < typeParameters.Count; i++)
				{
					typeArguments.Add(new SimpleName(typeParameters[i].Name, base.Location));
				}
				return new GenericTypeExpr(base.Definition, typeArguments, base.Location);
			}
			return new TypeExpression(CurrentType, base.Location);
		}

		public void SetNestedStoryParent(AnonymousMethodStorey parentStorey)
		{
			Parent = parentStorey;
			spec.IsGeneric = false;
			spec.DeclaringType = parentStorey.CurrentType;
			base.MemberName.TypeParameters = null;
		}

		protected override bool DoResolveTypeParameters()
		{
			if (CurrentTypeParameters != null)
			{
				for (int i = 0; i < CurrentTypeParameters.Count; i++)
				{
					TypeParameterSpec type = CurrentTypeParameters[i].Type;
					type.BaseType = mutator.Mutate(type.BaseType);
					if (type.InterfacesDefined != null)
					{
						TypeSpec[] array = new TypeSpec[type.InterfacesDefined.Length];
						for (int j = 0; j < array.Length; j++)
						{
							array[j] = mutator.Mutate(type.InterfacesDefined[j]);
						}
						type.InterfacesDefined = array;
					}
					if (type.TypeArguments != null)
					{
						type.TypeArguments = mutator.Mutate(type.TypeArguments);
					}
				}
			}
			Parent.CurrentType.MemberCache.AddMember(spec);
			return true;
		}

		public void EmitStoreyInstantiation(EmitContext ec, ExplicitBlock block)
		{
			if (Instance != null)
			{
				throw new InternalErrorException();
			}
			ResolveContext resolveContext = new ResolveContext(ec.MemberContext);
			resolveContext.CurrentBlock = block;
			TypeExpr typeExpr = CreateStoreyTypeExpression(ec);
			Expression expression = new New(typeExpr, null, base.Location).Resolve(resolveContext);
			if (ec.CurrentAnonymousMethod is StateMachineInitializer && (block.HasYield || block.HasAwait))
			{
				Field field = ec.CurrentAnonymousMethod.Storey.AddCompilerGeneratedField(LocalVariable.GetCompilerGeneratedName(block), typeExpr, privateAccess: true);
				field.Define();
				field.Emit();
				FieldExpr fieldExpr = new FieldExpr(field, base.Location);
				fieldExpr.InstanceExpression = new CompilerGeneratedThis(ec.CurrentType, base.Location);
				fieldExpr.EmitAssign(ec, expression, leave_copy: false, isCompound: false);
				Instance = fieldExpr;
			}
			else
			{
				TemporaryVariableReference temporaryVariableReference = TemporaryVariableReference.Create(expression.Type, block, base.Location, writeToSymbolFile: true);
				if (expression.Type.IsStruct)
				{
					temporaryVariableReference.LocalInfo.CreateBuilder(ec);
				}
				else
				{
					temporaryVariableReference.EmitAssign(ec, expression);
				}
				Instance = temporaryVariableReference;
			}
			EmitHoistedFieldsInitialization(resolveContext, ec);
		}

		private void EmitHoistedFieldsInitialization(ResolveContext rc, EmitContext ec)
		{
			if (used_parent_storeys != null)
			{
				foreach (StoreyFieldPair used_parent_storey in used_parent_storeys)
				{
					Expression storeyInstanceExpression = GetStoreyInstanceExpression(ec);
					FieldSpec member = used_parent_storey.Field.Spec;
					if (TypeManager.IsGenericType(storeyInstanceExpression.Type))
					{
						member = MemberCache.GetMember(storeyInstanceExpression.Type, member);
					}
					FieldExpr fieldExpr = new FieldExpr(member, base.Location);
					fieldExpr.InstanceExpression = storeyInstanceExpression;
					SimpleAssign simpleAssign = new SimpleAssign(fieldExpr, used_parent_storey.Storey.GetStoreyInstanceExpression(ec));
					if (simpleAssign.Resolve(rc) != null)
					{
						simpleAssign.EmitStatement(ec);
					}
				}
			}
			if (initialize_hoisted_this)
			{
				rc.CurrentBlock.AddScopeStatement(new ThisInitializer(hoisted_this, hoisted_this_parent));
			}
			AnonymousExpression currentAnonymousMethod = ec.CurrentAnonymousMethod;
			ec.CurrentAnonymousMethod = null;
			if (hoisted_params != null)
			{
				EmitHoistedParameters(ec, hoisted_params);
			}
			ec.CurrentAnonymousMethod = currentAnonymousMethod;
		}

		protected virtual void EmitHoistedParameters(EmitContext ec, List<HoistedParameter> hoisted)
		{
			foreach (HoistedParameter hp in hoisted)
			{
				if (hp == null)
				{
					continue;
				}
				if (hoisted_local_params != null)
				{
					HoistedParameter hoistedParameter = hoisted_local_params.Find((HoistedParameter l) => l.Parameter.Parameter == hp.Parameter.Parameter);
					FieldExpr fieldExpr = new FieldExpr(hoistedParameter.Field, base.Location);
					fieldExpr.InstanceExpression = new CompilerGeneratedThis(CurrentType, base.Location);
					hp.EmitAssign(ec, fieldExpr, leave_copy: false, isCompound: false);
				}
				else
				{
					hp.EmitHoistingAssignment(ec);
				}
			}
		}

		private Field GetReferencedStoreyField(AnonymousMethodStorey storey)
		{
			if (used_parent_storeys == null)
			{
				return null;
			}
			foreach (StoreyFieldPair used_parent_storey in used_parent_storeys)
			{
				if (used_parent_storey.Storey == storey)
				{
					return used_parent_storey.Field;
				}
			}
			return null;
		}

		public Expression GetStoreyInstanceExpression(EmitContext ec)
		{
			AnonymousExpression currentAnonymousMethod = ec.CurrentAnonymousMethod;
			if (currentAnonymousMethod == null)
			{
				return Instance;
			}
			if (currentAnonymousMethod.Storey == null)
			{
				return Instance;
			}
			Field referencedStoreyField = currentAnonymousMethod.Storey.GetReferencedStoreyField(this);
			if (referencedStoreyField == null)
			{
				if (currentAnonymousMethod.Storey == this)
				{
					return new CompilerGeneratedThis(CurrentType, base.Location);
				}
				return Instance;
			}
			FieldExpr fieldExpr = new FieldExpr(referencedStoreyField, base.Location);
			fieldExpr.InstanceExpression = new CompilerGeneratedThis(CurrentType, base.Location);
			return fieldExpr;
		}

		protected virtual string GetVariableMangledName(ResolveContext rc, LocalVariable local_info)
		{
			return local_info.Name;
		}
	}
	public abstract class HoistedVariable
	{
		private class ExpressionTreeVariableReference : Expression
		{
			private readonly HoistedVariable hv;

			public ExpressionTreeVariableReference(HoistedVariable hv)
			{
				this.hv = hv;
			}

			public override bool ContainsEmitWithAwait()
			{
				return false;
			}

			public override Expression CreateExpressionTree(ResolveContext ec)
			{
				return hv.CreateExpressionTree();
			}

			protected override Expression DoResolve(ResolveContext ec)
			{
				eclass = ExprClass.Value;
				type = ec.Module.PredefinedTypes.Expression.Resolve();
				return this;
			}

			public override void Emit(EmitContext ec)
			{
				ResolveContext resolveContext = new ResolveContext(ec.MemberContext);
				Expression expression = hv.GetFieldExpression(ec).CreateExpressionTree(resolveContext, convertInstance: false);
				expression.Resolve(resolveContext)?.Emit(ec);
			}
		}

		protected readonly AnonymousMethodStorey storey;

		protected Field field;

		private Dictionary<AnonymousExpression, FieldExpr> cached_inner_access;

		private FieldExpr cached_outer_access;

		public Field Field => field;

		public AnonymousMethodStorey Storey => storey;

		protected HoistedVariable(AnonymousMethodStorey storey, string name, TypeSpec type)
			: this(storey, storey.AddCapturedVariable(name, type))
		{
		}

		protected HoistedVariable(AnonymousMethodStorey storey, Field field)
		{
			this.storey = storey;
			this.field = field;
		}

		public void AddressOf(EmitContext ec, AddressOp mode)
		{
			GetFieldExpression(ec).AddressOf(ec, mode);
		}

		public Expression CreateExpressionTree()
		{
			return new ExpressionTreeVariableReference(this);
		}

		public void Emit(EmitContext ec)
		{
			GetFieldExpression(ec).Emit(ec);
		}

		public Expression EmitToField(EmitContext ec)
		{
			return GetFieldExpression(ec);
		}

		protected virtual FieldExpr GetFieldExpression(EmitContext ec)
		{
			if (ec.CurrentAnonymousMethod == null || ec.CurrentAnonymousMethod.Storey == null)
			{
				if (cached_outer_access != null)
				{
					return cached_outer_access;
				}
				if (storey.Instance.Type.IsGenericOrParentIsGeneric)
				{
					FieldSpec member = MemberCache.GetMember(storey.Instance.Type, field.Spec);
					cached_outer_access = new FieldExpr(member, field.Location);
				}
				else
				{
					cached_outer_access = new FieldExpr(field, field.Location);
				}
				cached_outer_access.InstanceExpression = storey.GetStoreyInstanceExpression(ec);
				return cached_outer_access;
			}
			FieldExpr value;
			if (cached_inner_access != null)
			{
				if (!cached_inner_access.TryGetValue(ec.CurrentAnonymousMethod, out value))
				{
					value = null;
				}
			}
			else
			{
				value = null;
				cached_inner_access = new Dictionary<AnonymousExpression, FieldExpr>(4);
			}
			if (value == null)
			{
				if (field.Parent.IsGenericOrParentIsGeneric)
				{
					FieldSpec member2 = MemberCache.GetMember(field.Parent.CurrentType, field.Spec);
					value = new FieldExpr(member2, field.Location);
				}
				else
				{
					value = new FieldExpr(field, field.Location);
				}
				value.InstanceExpression = storey.GetStoreyInstanceExpression(ec);
				cached_inner_access.Add(ec.CurrentAnonymousMethod, value);
			}
			return value;
		}

		public void Emit(EmitContext ec, bool leave_copy)
		{
			GetFieldExpression(ec).Emit(ec, leave_copy);
		}

		public void EmitAssign(EmitContext ec, Expression source, bool leave_copy, bool isCompound)
		{
			GetFieldExpression(ec).EmitAssign(ec, source, leave_copy, isCompound: false);
		}

		public void EmitAssignFromStack(EmitContext ec)
		{
			GetFieldExpression(ec).EmitAssignFromStack(ec);
		}
	}
	public class HoistedParameter : HoistedVariable
	{
		private sealed class HoistedFieldAssign : CompilerAssign
		{
			public HoistedFieldAssign(Expression target, Expression source)
				: base(target, source, target.Location)
			{
			}

			protected override Expression ResolveConversions(ResolveContext ec)
			{
				return this;
			}
		}

		private readonly ParameterReference parameter;

		public bool IsAssigned { get; set; }

		public ParameterReference Parameter => parameter;

		public HoistedParameter(AnonymousMethodStorey scope, ParameterReference par)
			: base(scope, par.Name, par.Type)
		{
			parameter = par;
		}

		public HoistedParameter(HoistedParameter hp, string name)
			: base(hp.storey, name, hp.parameter.Type)
		{
			parameter = hp.parameter;
		}

		public void EmitHoistingAssignment(EmitContext ec)
		{
			HoistedParameter hoistedVariant = parameter.Parameter.HoistedVariant;
			parameter.Parameter.HoistedVariant = null;
			HoistedFieldAssign hoistedFieldAssign = new HoistedFieldAssign(GetFieldExpression(ec), parameter);
			hoistedFieldAssign.EmitStatement(ec);
			parameter.Parameter.HoistedVariant = hoistedVariant;
		}
	}
	internal class HoistedLocalVariable : HoistedVariable
	{
		public HoistedLocalVariable(AnonymousMethodStorey storey, LocalVariable local, string name)
			: base(storey, name, local.Type)
		{
		}
	}
	public class HoistedThis : HoistedVariable
	{
		public HoistedThis(AnonymousMethodStorey storey, Field field)
			: base(storey, field)
		{
		}
	}
	public class AnonymousMethodExpression : Expression
	{
		private class Quote : ShimExpression
		{
			public Quote(Expression expr)
				: base(expr)
			{
			}

			public override Expression CreateExpressionTree(ResolveContext ec)
			{
				Arguments arguments = new Arguments(1);
				arguments.Add(new Argument(expr.CreateExpressionTree(ec)));
				return CreateExpressionFactoryCall(ec, "Quote", arguments);
			}

			protected override Expression DoResolve(ResolveContext rc)
			{
				expr = expr.Resolve(rc);
				if (expr == null)
				{
					return null;
				}
				eclass = expr.eclass;
				type = expr.Type;
				return this;
			}
		}

		private readonly Dictionary<TypeSpec, Expression> compatibles;

		public ParametersBlock Block;

		public override string ExprClassName => "anonymous method";

		public virtual bool HasExplicitParameters => Parameters != ParametersCompiled.Undefined;

		public override bool IsSideEffectFree => true;

		public ParametersCompiled Parameters => Block.Parameters;

		public ReportPrinter TypeInferenceReportPrinter { get; set; }

		public AnonymousMethodExpression(Location loc)
		{
			base.loc = loc;
			compatibles = new Dictionary<TypeSpec, Expression>();
		}

		public bool ImplicitStandardConversionExists(ResolveContext ec, TypeSpec delegate_type)
		{
			using (ec.With(ResolveContext.Options.InferReturnType, enable: false))
			{
				using (ec.Set(ResolveContext.Options.ProbingMode))
				{
					ReportPrinter printer = ec.Report.SetPrinter(TypeInferenceReportPrinter ?? new NullReportPrinter());
					bool result = Compatible(ec, delegate_type) != null;
					ec.Report.SetPrinter(printer);
					return result;
				}
			}
		}

		private TypeSpec CompatibleChecks(ResolveContext ec, TypeSpec delegate_type)
		{
			if (delegate_type.IsDelegate)
			{
				return delegate_type;
			}
			if (delegate_type.IsExpressionTreeType)
			{
				delegate_type = delegate_type.TypeArguments[0];
				if (delegate_type.IsDelegate)
				{
					return delegate_type;
				}
				ec.Report.Error(835, loc, "Cannot convert `{0}' to an expression tree of non-delegate type `{1}'", GetSignatureForError(), delegate_type.GetSignatureForError());
				return null;
			}
			ec.Report.Error(1660, loc, "Cannot convert `{0}' to non-delegate type `{1}'", GetSignatureForError(), delegate_type.GetSignatureForError());
			return null;
		}

		protected bool VerifyExplicitParameters(ResolveContext ec, TypeInferenceContext tic, TypeSpec delegate_type, AParametersCollection parameters)
		{
			if (VerifyParameterCompatibility(ec, tic, delegate_type, parameters, ec.IsInProbingMode))
			{
				return true;
			}
			if (!ec.IsInProbingMode)
			{
				ec.Report.Error(1661, loc, "Cannot convert `{0}' to delegate type `{1}' since there is a parameter mismatch", GetSignatureForError(), delegate_type.GetSignatureForError());
			}
			return false;
		}

		protected bool VerifyParameterCompatibility(ResolveContext ec, TypeInferenceContext tic, TypeSpec delegate_type, AParametersCollection invoke_pd, bool ignore_errors)
		{
			if (Parameters.Count != invoke_pd.Count)
			{
				if (ignore_errors)
				{
					return false;
				}
				ec.Report.Error(1593, loc, "Delegate `{0}' does not take `{1}' arguments", delegate_type.GetSignatureForError(), Parameters.Count.ToString());
				return false;
			}
			bool flag = !HasExplicitParameters;
			bool flag2 = false;
			for (int i = 0; i < Parameters.Count; i++)
			{
				Parameter.Modifier modFlags = invoke_pd.FixedParameters[i].ModFlags;
				if (Parameters.FixedParameters[i].ModFlags != modFlags && modFlags != Parameter.Modifier.PARAMS)
				{
					if (ignore_errors)
					{
						return false;
					}
					if (modFlags == Parameter.Modifier.NONE)
					{
						ec.Report.Error(1677, Parameters[i].Location, "Parameter `{0}' should not be declared with the `{1}' keyword", (i + 1).ToString(), Parameter.GetModifierSignature(Parameters[i].ModFlags));
					}
					else
					{
						ec.Report.Error(1676, Parameters[i].Location, "Parameter `{0}' must be declared with the `{1}' keyword", (i + 1).ToString(), Parameter.GetModifierSignature(modFlags));
					}
					flag2 = true;
				}
				if (flag)
				{
					continue;
				}
				TypeSpec typeSpec = invoke_pd.Types[i];
				if (tic != null)
				{
					typeSpec = tic.InflateGenericArgument(ec, typeSpec);
				}
				if (!TypeSpecComparer.IsEqual(typeSpec, Parameters.Types[i]))
				{
					if (ignore_errors)
					{
						return false;
					}
					ec.Report.Error(1678, Parameters[i].Location, "Parameter `{0}' is declared as type `{1}' but should be `{2}'", (i + 1).ToString(), Parameters.Types[i].GetSignatureForError(), invoke_pd.Types[i].GetSignatureForError());
					flag2 = true;
				}
			}
			return !flag2;
		}

		public bool ExplicitTypeInference(TypeInferenceContext type_inference, TypeSpec delegate_type)
		{
			if (!HasExplicitParameters)
			{
				return false;
			}
			if (!delegate_type.IsDelegate)
			{
				if (!delegate_type.IsExpressionTreeType)
				{
					return false;
				}
				delegate_type = TypeManager.GetTypeArguments(delegate_type)[0];
				if (!delegate_type.IsDelegate)
				{
					return false;
				}
			}
			AParametersCollection parameters = Delegate.GetParameters(delegate_type);
			if (parameters.Count != Parameters.Count)
			{
				return false;
			}
			TypeSpec[] types = Parameters.Types;
			TypeSpec[] types2 = parameters.Types;
			for (int i = 0; i < Parameters.Count; i++)
			{
				if (type_inference.ExactInference(types[i], types2[i]) == 0 && types[i] != types2[i])
				{
					return false;
				}
			}
			return true;
		}

		public TypeSpec InferReturnType(ResolveContext ec, TypeInferenceContext tic, TypeSpec delegate_type)
		{
			if (compatibles.TryGetValue(delegate_type, out var value))
			{
				return (!(value is AnonymousExpression anonymousExpression)) ? null : anonymousExpression.ReturnType;
			}
			AnonymousExpression anonymousExpression2;
			using (ec.Set(ResolveContext.Options.ProbingMode | ResolveContext.Options.InferReturnType))
			{
				ReportPrinter printer = ((TypeInferenceReportPrinter == null) ? null : ec.Report.SetPrinter(TypeInferenceReportPrinter));
				HashSet<LocalVariable> undeclaredVariables = null;
				AnonymousMethodBody anonymousMethodBody = CompatibleMethodBody(ec, tic, null, delegate_type, ref undeclaredVariables);
				anonymousExpression2 = anonymousMethodBody?.Compatible(ec, anonymousMethodBody);
				if (TypeInferenceReportPrinter != null)
				{
					ec.Report.SetPrinter(printer);
				}
				if (undeclaredVariables != null)
				{
					anonymousMethodBody.Block.TopBlock.SetUndeclaredVariables(undeclaredVariables);
				}
			}
			return anonymousExpression2?.ReturnType;
		}

		public override bool ContainsEmitWithAwait()
		{
			return false;
		}

		public Expression Compatible(ResolveContext ec, TypeSpec type)
		{
			if (compatibles.TryGetValue(type, out var value))
			{
				return value;
			}
			if (type == InternalType.ErrorType)
			{
				return null;
			}
			TypeSpec typeSpec = CompatibleChecks(ec, type);
			if (typeSpec == null)
			{
				return null;
			}
			MethodSpec invokeMethod = Delegate.GetInvokeMethod(typeSpec);
			TypeSpec returnType = invokeMethod.ReturnType;
			HashSet<LocalVariable> undeclaredVariables = null;
			AnonymousMethodBody anonymousMethodBody = CompatibleMethodBody(ec, null, returnType, typeSpec, ref undeclaredVariables);
			if (anonymousMethodBody == null)
			{
				return null;
			}
			bool flag = typeSpec != type;
			try
			{
				if (flag)
				{
					if (ec.HasSet(ResolveContext.Options.ExpressionTreeConversion))
					{
						value = anonymousMethodBody.Compatible(ec, ec.CurrentAnonymousMethod);
						if (value != null)
						{
							value = new Quote(value);
						}
					}
					else
					{
						int errors = ec.Report.Errors;
						if (Block.IsAsync)
						{
							ec.Report.Error(1989, loc, "Async lambda expressions cannot be converted to expression trees");
						}
						using (ec.Set(ResolveContext.Options.ExpressionTreeConversion))
						{
							value = anonymousMethodBody.Compatible(ec);
						}
						if (value != null && errors == ec.Report.Errors)
						{
							value = CreateExpressionTree(ec, typeSpec);
						}
					}
				}
				else
				{
					value = anonymousMethodBody.Compatible(ec);
					if (anonymousMethodBody.DirectMethodGroupConversion != null)
					{
						SessionReportPrinter sessionReportPrinter = new SessionReportPrinter();
						ReportPrinter printer = ec.Report.SetPrinter(sessionReportPrinter);
						Expression expression = new ImplicitDelegateCreation(typeSpec, anonymousMethodBody.DirectMethodGroupConversion, loc)
						{
							AllowSpecialMethodsInvocation = true
						}.Resolve(ec);
						ec.Report.SetPrinter(printer);
						if (expression != null && sessionReportPrinter.ErrorsCount == 0)
						{
							value = expression;
						}
					}
				}
			}
			catch (CompletionResult)
			{
				throw;
			}
			catch (FatalException)
			{
				throw;
			}
			catch (Exception e)
			{
				throw new InternalErrorException(e, loc);
			}
			finally
			{
				if (undeclaredVariables != null)
				{
					anonymousMethodBody.Block.TopBlock.SetUndeclaredVariables(undeclaredVariables);
				}
			}
			if (!ec.IsInProbingMode && !flag)
			{
				compatibles.Add(type, value ?? EmptyExpression.Null);
			}
			return value;
		}

		protected virtual Expression CreateExpressionTree(ResolveContext ec, TypeSpec delegate_type)
		{
			return CreateExpressionTree(ec);
		}

		public override Expression CreateExpressionTree(ResolveContext ec)
		{
			ec.Report.Error(1946, loc, "An anonymous method cannot be converted to an expression tree");
			return null;
		}

		protected virtual ParametersCompiled ResolveParameters(ResolveContext ec, TypeInferenceContext tic, TypeSpec delegate_type)
		{
			AParametersCollection parameters = Delegate.GetParameters(delegate_type);
			if (Parameters == ParametersCompiled.Undefined)
			{
				Parameter[] array = new Parameter[parameters.Count];
				for (int i = 0; i < parameters.Count; i++)
				{
					Parameter.Modifier modFlags = parameters.FixedParameters[i].ModFlags;
					if ((modFlags & Parameter.Modifier.OUT) != 0)
					{
						if (!ec.IsInProbingMode)
						{
							ec.Report.Error(1688, loc, "Cannot convert anonymous method block without a parameter list to delegate type `{0}' because it has one or more `out' parameters", delegate_type.GetSignatureForError());
						}
						return null;
					}
					array[i] = new Parameter(new TypeExpression(parameters.Types[i], loc), null, parameters.FixedParameters[i].ModFlags, null, loc);
				}
				return ParametersCompiled.CreateFullyResolved(array, parameters.Types);
			}
			if (!VerifyExplicitParameters(ec, tic, delegate_type, parameters))
			{
				return null;
			}
			return Parameters;
		}

		protected override Expression DoResolve(ResolveContext rc)
		{
			if (rc.HasSet(ResolveContext.Options.ConstantScope))
			{
				rc.Report.Error(1706, loc, "Anonymous methods and lambda expressions cannot be used in the current context");
				return null;
			}
			if (rc.HasAny(ResolveContext.Options.FieldInitializerScope | ResolveContext.Options.BaseInitializer) && rc.CurrentMemberDefinition.Parent.PartialContainer.PrimaryConstructorParameters != null)
			{
				ToplevelBlock topBlock = rc.ConstructorBlock.ParametersBlock.TopBlock;
				if (Block.TopBlock != topBlock)
				{
					Block block = Block;
					while (block.Parent != Block.TopBlock && block != Block.TopBlock)
					{
						block = block.Parent;
					}
					block.Parent = topBlock;
					topBlock.IncludeBlock(Block, Block.TopBlock);
					block.ParametersBlock.TopBlock = topBlock;
				}
			}
			eclass = ExprClass.Value;
			type = InternalType.AnonymousMethod;
			if (!DoResolveParameters(rc))
			{
				return null;
			}
			return this;
		}

		protected virtual bool DoResolveParameters(ResolveContext rc)
		{
			return Parameters.Resolve(rc);
		}

		public override void Emit(EmitContext ec)
		{
		}

		public static void Error_AddressOfCapturedVar(ResolveContext rc, IVariableReference var, Location loc)
		{
			if (!(rc.CurrentAnonymousMethod is AsyncInitializer))
			{
				rc.Report.Error(1686, loc, "Local variable or parameter `{0}' cannot have their address taken and be used inside an anonymous method, lambda expression or query expression", var.Name);
			}
		}

		public override string GetSignatureForError()
		{
			return ExprClassName;
		}

		private AnonymousMethodBody CompatibleMethodBody(ResolveContext ec, TypeInferenceContext tic, TypeSpec return_type, TypeSpec delegate_type, ref HashSet<LocalVariable> undeclaredVariables)
		{
			ParametersCompiled parametersCompiled = ResolveParameters(ec, tic, delegate_type);
			if (parametersCompiled == null)
			{
				return null;
			}
			ParametersBlock parametersBlock = (ec.IsInProbingMode ? ((ParametersBlock)Block.PerformClone(ref undeclaredVariables)) : Block);
			if (parametersBlock.IsAsync)
			{
				if (return_type != null && return_type.Kind != MemberKind.Void && return_type != ec.Module.PredefinedTypes.Task.TypeSpec && !return_type.IsGenericTask)
				{
					ec.Report.Error(4010, loc, "Cannot convert async {0} to delegate type `{1}'", GetSignatureForError(), delegate_type.GetSignatureForError());
					return null;
				}
				parametersBlock = parametersBlock.ConvertToAsyncTask(ec, ec.CurrentMemberDefinition.Parent.PartialContainer, parametersCompiled, return_type, delegate_type, loc);
			}
			return CompatibleMethodFactory(return_type ?? InternalType.ErrorType, delegate_type, parametersCompiled, parametersBlock);
		}

		protected virtual AnonymousMethodBody CompatibleMethodFactory(TypeSpec return_type, TypeSpec delegate_type, ParametersCompiled p, ParametersBlock b)
		{
			return new AnonymousMethodBody(p, b, return_type, delegate_type, loc);
		}

		protected override void CloneTo(CloneContext clonectx, Expression t)
		{
			AnonymousMethodExpression anonymousMethodExpression = (AnonymousMethodExpression)t;
			anonymousMethodExpression.Block = (ParametersBlock)clonectx.LookupBlock(Block);
		}

		public override object Accept(StructuralVisitor visitor)
		{
			return visitor.Visit(this);
		}
	}
	public abstract class AnonymousExpression : ExpressionStatement
	{
		protected class AnonymousMethodMethod : Method
		{
			public readonly AnonymousExpression AnonymousMethod;

			public readonly AnonymousMethodStorey Storey;

			public AnonymousMethodMethod(TypeDefinition parent, AnonymousExpression am, AnonymousMethodStorey storey, TypeExpr return_type, Modifiers mod, MemberName name, ParametersCompiled parameters)
				: base(parent, return_type, mod | Modifiers.COMPILER_GENERATED, name, parameters, null)
			{
				AnonymousMethod = am;
				Storey = storey;
				Parent.PartialContainer.Members.Add(this);
				base.Block = new ToplevelBlock(am.block, parameters);
			}

			public override EmitContext CreateEmitContext(ILGenerator ig, SourceMethodBuilder sourceMethod)
			{
				EmitContext emitContext = new EmitContext(this, ig, base.ReturnType, sourceMethod);
				emitContext.CurrentAnonymousMethod = AnonymousMethod;
				return emitContext;
			}

			protected override void DefineTypeParameters()
			{
			}

			protect

Tomlet.dll

Decompiled a year ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using Microsoft.CodeAnalysis;
using Tomlet.Attributes;
using Tomlet.Exceptions;
using Tomlet.Models;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("N/A")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("\r\n            Tomlet allows consumption and creation of TOML files (often used as configuration files) in .NET applications.\r\n            It supports serialization and deserialization of objects to and from TOML, and is compliant with version 1.0.0 of the TOML specification.\r\n        ")]
[assembly: AssemblyFileVersion("3.1.3.0")]
[assembly: AssemblyInformationalVersion("3.1.3+6bcdfd748b91bd7d6637ec1756500323348fbce8")]
[assembly: AssemblyProduct("Tomlet")]
[assembly: AssemblyTitle("Tomlet")]
[assembly: AssemblyVersion("3.1.3.0")]
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;
		}
	}
}
namespace Tomlet
{
	internal static class Extensions
	{
		private static readonly HashSet<int> IllegalChars = new HashSet<int>
		{
			0, 1, 2, 3, 4, 5, 6, 7, 8, 11,
			14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
			24, 25, 26, 27, 28, 29, 30, 31, 127
		};

		internal static bool IsWhitespace(this int val)
		{
			if (!val.IsNewline())
			{
				return char.IsWhiteSpace((char)val);
			}
			return false;
		}

		internal static bool IsEquals(this int val)
		{
			return val == 61;
		}

		internal static bool IsSingleQuote(this int val)
		{
			return val == 39;
		}

		internal static bool IsDoubleQuote(this int val)
		{
			return val == 34;
		}

		internal static bool IsHashSign(this int val)
		{
			return val == 35;
		}

		internal static bool IsNewline(this int val)
		{
			if (val != 13)
			{
				return val == 10;
			}
			return true;
		}

		internal static bool IsDigit(this int val)
		{
			return char.IsDigit((char)val);
		}

		internal static bool IsComma(this int val)
		{
			return val == 44;
		}

		internal static bool IsPeriod(this int val)
		{
			return val == 46;
		}

		internal static bool IsEndOfArrayChar(this int val)
		{
			return val == 93;
		}

		internal static bool IsEndOfInlineObjectChar(this int val)
		{
			return val == 125;
		}

		internal static bool IsHexDigit(this char c)
		{
			if (IsDigit(c))
			{
				return true;
			}
			char c2 = char.ToUpperInvariant(c);
			if (c2 >= 'A')
			{
				return c2 <= 'F';
			}
			return false;
		}

		internal static bool TryPeek(this TomletStringReader reader, out int nextChar)
		{
			nextChar = reader.Peek();
			return nextChar != -1;
		}

		internal static int SkipWhitespace(this TomletStringReader reader)
		{
			return reader.ReadWhile((int c) => c.IsWhitespace()).Length;
		}

		internal static void SkipPotentialCarriageReturn(this TomletStringReader reader)
		{
			if (reader.TryPeek(out var nextChar) && nextChar == 13)
			{
				reader.Read();
			}
		}

		internal static void SkipAnyComment(this TomletStringReader reader)
		{
			if (reader.TryPeek(out var nextChar) && nextChar.IsHashSign())
			{
				reader.ReadWhile((int commentChar) => !commentChar.IsNewline());
			}
		}

		internal static int SkipAnyNewlineOrWhitespace(this TomletStringReader reader)
		{
			return reader.ReadWhile((int c) => c.IsNewline() || c.IsWhitespace()).Count((char c) => c == '\n');
		}

		internal static int SkipAnyCommentNewlineWhitespaceEtc(this TomletStringReader reader)
		{
			int num = 0;
			int nextChar;
			while (reader.TryPeek(out nextChar) && (nextChar.IsHashSign() || nextChar.IsNewline() || nextChar.IsWhitespace()))
			{
				if (nextChar.IsHashSign())
				{
					reader.SkipAnyComment();
				}
				num += reader.SkipAnyNewlineOrWhitespace();
			}
			return num;
		}

		internal static int SkipAnyNewline(this TomletStringReader reader)
		{
			return reader.ReadWhile((int c) => c.IsNewline()).Count((char c) => c == '\n');
		}

		internal static char[] ReadChars(this TomletStringReader reader, int count)
		{
			char[] array = new char[count];
			reader.ReadBlock(array, 0, count);
			return array;
		}

		internal static string ReadWhile(this TomletStringReader reader, Predicate<int> predicate)
		{
			StringBuilder stringBuilder = new StringBuilder();
			int nextChar;
			while (reader.TryPeek(out nextChar) && predicate(nextChar))
			{
				stringBuilder.Append((char)reader.Read());
			}
			return stringBuilder.ToString();
		}

		internal static bool ExpectAndConsume(this TomletStringReader reader, char expectWhat)
		{
			if (!reader.TryPeek(out var nextChar))
			{
				return false;
			}
			if (nextChar == expectWhat)
			{
				reader.Read();
				return true;
			}
			return false;
		}

		public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> pair, out TKey one, out TValue two)
		{
			one = pair.Key;
			two = pair.Value;
		}

		public static bool IsNullOrWhiteSpace(this string s)
		{
			if (!string.IsNullOrEmpty(s))
			{
				return string.IsNullOrEmpty(s.Trim());
			}
			return true;
		}

		internal static T? GetCustomAttribute<T>(this MemberInfo info) where T : Attribute
		{
			return (from a in info.GetCustomAttributes(inherit: false)
				where a is T
				select a).Cast<T>().FirstOrDefault();
		}

		internal static void EnsureLegalChar(this int c, int currentLineNum)
		{
			if (IllegalChars.Contains(c))
			{
				throw new TomlUnescapedUnicodeControlCharException(currentLineNum, c);
			}
		}
	}
	internal static class TomlCompositeDeserializer
	{
		public static TomlSerializationMethods.Deserialize<object> For(Type type)
		{
			Type type2 = type;
			TomlSerializationMethods.Deserialize<object> deserialize;
			if (type2.IsEnum)
			{
				TomlSerializationMethods.Deserialize<object> stringDeserializer = TomlSerializationMethods.GetDeserializer(typeof(string));
				deserialize = delegate(TomlValue value)
				{
					string text2 = (string)stringDeserializer(value);
					try
					{
						return Enum.Parse(type2, text2, ignoreCase: true);
					}
					catch (Exception)
					{
						throw new TomlEnumParseException(text2, type2);
					}
				};
			}
			else
			{
				FieldInfo[] fields = type2.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				fields = fields.Where((FieldInfo f) => !f.IsNotSerialized).ToArray();
				if (fields.Length == 0)
				{
					return delegate
					{
						try
						{
							return Activator.CreateInstance(type2);
						}
						catch (MissingMethodException)
						{
							throw new TomlInstantiationException(type2);
						}
					};
				}
				deserialize = delegate(TomlValue value)
				{
					if (!(value is TomlTable tomlTable))
					{
						throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), type2);
					}
					object obj;
					try
					{
						obj = Activator.CreateInstance(type2);
					}
					catch (MissingMethodException)
					{
						throw new TomlInstantiationException(type2);
					}
					FieldInfo[] array = fields;
					foreach (FieldInfo fieldInfo in array)
					{
						try
						{
							string text = fieldInfo.Name;
							Match match = Regex.Match(fieldInfo.Name, "<(.*)>k__BackingField");
							if (match.Success)
							{
								text = match.Groups[1].Value;
							}
							string name1 = text;
							PropertyInfo? propertyInfo = type2.GetProperties().FirstOrDefault((PropertyInfo p) => p.Name == name1);
							text = (((object)propertyInfo == null) ? null : propertyInfo.GetCustomAttribute<TomlPropertyAttribute>()?.GetMappedString()) ?? text;
							if (tomlTable.ContainsKey(text))
							{
								TomlValue value2 = tomlTable.GetValue(text);
								object value3 = TomlSerializationMethods.GetDeserializer(fieldInfo.FieldType)(value2);
								fieldInfo.SetValue(obj, value3);
							}
						}
						catch (TomlTypeMismatchException cause)
						{
							throw new TomlFieldTypeMismatchException(type2, fieldInfo, cause);
						}
					}
					return obj;
				};
			}
			TomlSerializationMethods.Register(type2, null, deserialize);
			return deserialize;
		}
	}
	internal static class TomlCompositeSerializer
	{
		public static TomlSerializationMethods.Serialize<object> For(Type type)
		{
			Type type2 = type;
			TomlSerializationMethods.Serialize<object> serialize;
			if (type2.IsEnum)
			{
				TomlSerializationMethods.Serialize<object> stringSerializer = TomlSerializationMethods.GetSerializer(typeof(string));
				serialize = (object? o) => stringSerializer(Enum.GetName(type2, o) ?? throw new ArgumentException($"Tomlet: Cannot serialize {o} as an enum of type {type2} because the enum type does not declare a name for that value"));
			}
			else
			{
				FieldInfo[] fields = type2.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				var fieldAttribs = fields.ToDictionary((FieldInfo f) => f, (FieldInfo f) => new
				{
					inline = f.GetCustomAttribute<TomlInlineCommentAttribute>(),
					preceding = f.GetCustomAttribute<TomlPrecedingCommentAttribute>()
				});
				PropertyInfo[] props = type2.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				var propAttribs = props.ToDictionary((PropertyInfo p) => p, (PropertyInfo p) => new
				{
					inline = p.GetCustomAttribute<TomlInlineCommentAttribute>(),
					preceding = p.GetCustomAttribute<TomlPrecedingCommentAttribute>()
				});
				bool isForcedNoInline = type2.GetCustomAttribute<TomlDoNotInlineObjectAttribute>() != null;
				fields = fields.Where((FieldInfo f) => !f.IsNotSerialized).ToArray();
				if (fields.Length == 0)
				{
					return (object? _) => new TomlTable();
				}
				serialize = delegate(object? instance)
				{
					if (instance == null)
					{
						throw new ArgumentNullException("instance", "Object being serialized is null. TOML does not support null values.");
					}
					TomlTable tomlTable = new TomlTable
					{
						ForceNoInline = isForcedNoInline
					};
					FieldInfo[] array = fields;
					foreach (FieldInfo fieldInfo in array)
					{
						object value = fieldInfo.GetValue(instance);
						if (value != null)
						{
							TomlValue tomlValue = TomlSerializationMethods.GetSerializer(fieldInfo.FieldType)(value);
							string name = fieldInfo.Name;
							var anon = fieldAttribs[fieldInfo];
							Match match = Regex.Match(fieldInfo.Name, "<(.*)>k__BackingField");
							if (match.Success)
							{
								name = match.Groups[1].Value;
								PropertyInfo key = props.First((PropertyInfo p) => p.Name == name);
								anon = propAttribs[key];
							}
							string name2 = name;
							PropertyInfo? propertyInfo = type2.GetProperties().FirstOrDefault((PropertyInfo p) => p.Name == name2);
							name = (((object)propertyInfo == null) ? null : propertyInfo.GetCustomAttribute<TomlPropertyAttribute>()?.GetMappedString()) ?? name;
							if (!tomlTable.ContainsKey(name))
							{
								tomlValue.Comments.InlineComment = anon.inline?.Comment;
								tomlValue.Comments.PrecedingComment = anon.preceding?.Comment;
								tomlTable.PutValue(name, tomlValue);
							}
						}
					}
					return tomlTable;
				};
			}
			TomlSerializationMethods.Register(type2, serialize, null);
			return serialize;
		}
	}
	internal static class TomlDateTimeUtils
	{
		private static readonly Regex DateTimeRegex = new Regex("^(?:(\\d+)-(0[1-9]|1[012])-(0[1-9]|[12]\\d|3[01]))?([\\sTt])?(?:([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d|60)(\\.\\d+)?((?:[Zz])|(?:[\\+|\\-](?:[01]\\d|2[0-3])(?::[0-6][0-9])?(?::[0-6][0-9])?))?)?$", RegexOptions.Compiled);

		internal static TomlValue? ParseDateString(string input, int lineNumber)
		{
			Match match = DateTimeRegex.Match(input);
			bool flag = !match.Groups[1].Value.IsNullOrWhiteSpace();
			bool flag2 = !string.IsNullOrEmpty(match.Groups[4].Value);
			bool flag3 = !match.Groups[5].Value.IsNullOrWhiteSpace();
			bool flag4 = !match.Groups[9].Value.IsNullOrWhiteSpace();
			if (flag && flag3 && !flag2)
			{
				throw new TomlDateTimeMissingSeparatorException(lineNumber);
			}
			if (flag2 && (!flag3 || !flag))
			{
				throw new TomlDateTimeUnnecessarySeparatorException(lineNumber);
			}
			if (flag4 && (!flag3 || !flag))
			{
				throw new TimeOffsetOnTomlDateOrTimeException(lineNumber, match.Groups[9].Value);
			}
			if (!flag)
			{
				return TomlLocalTime.Parse(input);
			}
			if (!flag3)
			{
				return TomlLocalDate.Parse(input);
			}
			if (!flag4)
			{
				return TomlLocalDateTime.Parse(input);
			}
			return TomlOffsetDateTime.Parse(input);
		}
	}
	public static class TomletMain
	{
		[NoCoverage]
		public static void RegisterMapper<T>(TomlSerializationMethods.Serialize<T>? serializer, TomlSerializationMethods.Deserialize<T>? deserializer)
		{
			TomlSerializationMethods.Register(serializer, deserializer);
		}

		public static T To<T>(string tomlString)
		{
			return To<T>(new TomlParser().Parse(tomlString));
		}

		public static T To<T>(TomlValue value)
		{
			return (T)To(typeof(T), value);
		}

		public static object To(Type what, TomlValue value)
		{
			return TomlSerializationMethods.GetDeserializer(what)(value);
		}

		public static TomlValue ValueFrom<T>(T t)
		{
			if (t == null)
			{
				throw new ArgumentNullException("t");
			}
			return ValueFrom(t.GetType(), t);
		}

		public static TomlValue ValueFrom(Type type, object t)
		{
			return TomlSerializationMethods.GetSerializer(type)(t);
		}

		public static TomlDocument DocumentFrom<T>(T t)
		{
			if (t == null)
			{
				throw new ArgumentNullException("t");
			}
			return DocumentFrom(t.GetType(), t);
		}

		public static TomlDocument DocumentFrom(Type type, object t)
		{
			TomlValue tomlValue = ValueFrom(type, t);
			if (!(tomlValue is TomlDocument result))
			{
				if (tomlValue is TomlTable from)
				{
					return new TomlDocument(from);
				}
				throw new TomlPrimitiveToDocumentException(type);
			}
			return result;
		}

		public static string TomlStringFrom<T>(T t)
		{
			return DocumentFrom(t).SerializedValue;
		}

		public static string TomlStringFrom(Type type, object t)
		{
			return DocumentFrom(type, t).SerializedValue;
		}
	}
	public class TomletStringReader : IDisposable
	{
		private string? _s;

		private int _pos;

		private int _length;

		public TomletStringReader(string s)
		{
			_s = s;
			_length = s.Length;
		}

		public void Backtrack(int amount)
		{
			if (_pos < amount)
			{
				throw new Exception("Cannot backtrack past the beginning of the string");
			}
			_pos -= amount;
		}

		public void Dispose()
		{
			_s = null;
			_pos = 0;
			_length = 0;
		}

		public int Peek()
		{
			if (_pos != _length)
			{
				return _s[_pos];
			}
			return -1;
		}

		public int Read()
		{
			if (_pos != _length)
			{
				return _s[_pos++];
			}
			return -1;
		}

		public int Read(char[] buffer, int index, int count)
		{
			int num = _length - _pos;
			if (num <= 0)
			{
				return num;
			}
			if (num > count)
			{
				num = count;
			}
			_s.CopyTo(_pos, buffer, index, num);
			_pos += num;
			return num;
		}

		public int ReadBlock(char[] buffer, int index, int count)
		{
			int num = 0;
			int num2;
			do
			{
				num += (num2 = Read(buffer, index + num, count - num));
			}
			while (num2 > 0 && num < count);
			return num;
		}
	}
	internal static class TomlKeyUtils
	{
		internal static void GetTopLevelAndSubKeys(string key, out string ourKeyName, out string restOfKey)
		{
			bool flag = (key.StartsWith("\"") && key.EndsWith("\"")) || (key.StartsWith("'") && key.EndsWith("'"));
			bool flag2 = !flag && (key.StartsWith("\"") || key.StartsWith("'"));
			if (!key.Contains(".") || flag)
			{
				ourKeyName = key;
				restOfKey = "";
				return;
			}
			if (!flag2)
			{
				string[] array = key.Split(new char[1] { '.' });
				ourKeyName = array[0];
			}
			else
			{
				ourKeyName = key;
				string text = ourKeyName.Substring(1);
				if (ourKeyName.Contains("\""))
				{
					ourKeyName = ourKeyName.Substring(0, 2 + text.IndexOf("\"", StringComparison.Ordinal));
				}
				else
				{
					ourKeyName = ourKeyName.Substring(0, 2 + text.IndexOf("'", StringComparison.Ordinal));
				}
			}
			restOfKey = key.Substring(ourKeyName.Length + 1);
			ourKeyName = ourKeyName.Trim();
		}
	}
	internal static class TomlNumberStyle
	{
		internal static NumberStyles FloatingPoint = NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowExponent;

		internal static NumberStyles Integer = NumberStyles.AllowLeadingSign | NumberStyles.AllowThousands;
	}
	public static class TomlNumberUtils
	{
		public static long? GetLongValue(string input)
		{
			bool flag = input.StartsWith("0o");
			bool flag2 = input.StartsWith("0x");
			bool flag3 = input.StartsWith("0b");
			if (flag3 || flag2 || flag)
			{
				input = input.Substring(2);
			}
			if (input.Contains("__") || input.Any((char c) => c != '_' && c != '-' && c != '+' && !char.IsDigit(c) && (c < 'a' || c > 'f')))
			{
				return null;
			}
			if (input.First() == '_')
			{
				return null;
			}
			if (input.Last() == '_')
			{
				return null;
			}
			input = input.Replace("_", "");
			try
			{
				if (flag3)
				{
					return Convert.ToInt64(input, 2);
				}
				if (flag)
				{
					return Convert.ToInt64(input, 8);
				}
				if (flag2)
				{
					return Convert.ToInt64(input, 16);
				}
				return Convert.ToInt64(input, 10);
			}
			catch (Exception)
			{
				return null;
			}
		}

		public static double? GetDoubleValue(string input)
		{
			string text = input.Substring(1);
			if (input == "nan" || input == "inf" || text == "nan" || text == "inf")
			{
				if (input == "nan" || text == "nan")
				{
					return double.NaN;
				}
				if (input == "inf")
				{
					return double.PositiveInfinity;
				}
				if (text == "inf")
				{
					return input.StartsWith("-") ? double.NegativeInfinity : double.PositiveInfinity;
				}
			}
			if (input.Contains("__") || input.Any((char c) => c != '_' && c != '-' && c != '+' && c != 'e' && c != '.' && !char.IsDigit(c)))
			{
				return null;
			}
			if (input.First() == '_')
			{
				return null;
			}
			if (input.Last() == '_')
			{
				return null;
			}
			input = input.Replace("_", "");
			if (input.Contains("e"))
			{
				string[] array = input.Split(new char[1] { 'e' });
				if (array.Length != 2)
				{
					return null;
				}
				if (array[0].EndsWith("."))
				{
					return null;
				}
			}
			if (double.TryParse(input, TomlNumberStyle.FloatingPoint, CultureInfo.InvariantCulture, out var result))
			{
				return result;
			}
			return null;
		}
	}
	public class TomlParser
	{
		private static readonly char[] TrueChars = new char[4] { 't', 'r', 'u', 'e' };

		private static readonly char[] FalseChars = new char[5] { 'f', 'a', 'l', 's', 'e' };

		private int _lineNumber = 1;

		private string[] _tableNames = new string[0];

		private TomlTable? _currentTable;

		[NoCoverage]
		public static TomlDocument ParseFile(string filePath)
		{
			string input = File.ReadAllText(filePath);
			return new TomlParser().Parse(input);
		}

		public TomlDocument Parse(string input)
		{
			try
			{
				TomlDocument tomlDocument = new TomlDocument();
				using TomletStringReader tomletStringReader = new TomletStringReader(input);
				string text = null;
				int nextChar;
				while (tomletStringReader.TryPeek(out nextChar))
				{
					_lineNumber += tomletStringReader.SkipAnyNewlineOrWhitespace();
					text = ReadAnyPotentialMultilineComment(tomletStringReader);
					if (!tomletStringReader.TryPeek(out var nextChar2))
					{
						break;
					}
					if (nextChar2 == 91)
					{
						tomletStringReader.Read();
						if (!tomletStringReader.TryPeek(out var nextChar3))
						{
							throw new TomlEndOfFileException(_lineNumber);
						}
						TomlValue tomlValue = ((nextChar3 == 91) ? ((TomlValue)ReadTableArrayStatement(tomletStringReader, tomlDocument)) : ((TomlValue)ReadTableStatement(tomletStringReader, tomlDocument)));
						tomlValue.Comments.PrecedingComment = text;
						continue;
					}
					ReadKeyValuePair(tomletStringReader, out string key, out TomlValue value);
					value.Comments.PrecedingComment = text;
					text = null;
					if (_currentTable != null)
					{
						_currentTable.ParserPutValue(key, value, _lineNumber);
					}
					else
					{
						tomlDocument.ParserPutValue(key, value, _lineNumber);
					}
					tomletStringReader.SkipWhitespace();
					tomletStringReader.SkipPotentialCarriageReturn();
					if (!tomletStringReader.ExpectAndConsume('\n') && tomletStringReader.TryPeek(out var nextChar4))
					{
						throw new TomlMissingNewlineException(_lineNumber, (char)nextChar4);
					}
					_lineNumber++;
				}
				tomlDocument.TrailingComment = text;
				return tomlDocument;
			}
			catch (Exception ex) when (!(ex is TomlException))
			{
				throw new TomlInternalException(_lineNumber, ex);
			}
		}

		private void ReadKeyValuePair(TomletStringReader reader, out string key, out TomlValue value)
		{
			key = ReadKey(reader);
			reader.SkipWhitespace();
			if (!reader.ExpectAndConsume('='))
			{
				if (reader.TryPeek(out var nextChar))
				{
					throw new TomlMissingEqualsException(_lineNumber, (char)nextChar);
				}
				throw new TomlEndOfFileException(_lineNumber);
			}
			reader.SkipWhitespace();
			value = ReadValue(reader);
		}

		private string ReadKey(TomletStringReader reader)
		{
			reader.SkipWhitespace();
			if (!reader.TryPeek(out var nextChar))
			{
				return "";
			}
			if (nextChar.IsEquals())
			{
				throw new NoTomlKeyException(_lineNumber);
			}
			reader.SkipWhitespace();
			string text;
			if (nextChar.IsDoubleQuote())
			{
				reader.Read();
				if (reader.TryPeek(out var nextChar2) && nextChar2.IsDoubleQuote())
				{
					reader.Read();
					if (reader.TryPeek(out var nextChar3) && nextChar3.IsDoubleQuote())
					{
						throw new TomlTripleQuotedKeyException(_lineNumber);
					}
					return string.Empty;
				}
				text = "\"" + ReadSingleLineBasicString(reader, consumeClosingQuote: false).StringValue + "\"";
				if (!reader.ExpectAndConsume('"'))
				{
					throw new UnterminatedTomlKeyException(_lineNumber);
				}
			}
			else if (nextChar.IsSingleQuote())
			{
				reader.Read();
				text = "'" + ReadSingleLineLiteralString(reader, consumeClosingQuote: false).StringValue + "'";
				if (!reader.ExpectAndConsume('\''))
				{
					throw new UnterminatedTomlKeyException(_lineNumber);
				}
			}
			else
			{
				text = ReadKeyInternal(reader, (int keyChar) => keyChar.IsEquals() || keyChar.IsHashSign());
			}
			return text.Replace("\\n", "\n").Replace("\\t", "\t");
		}

		private string ReadKeyInternal(TomletStringReader reader, Func<int, bool> charSignalsEndOfKey)
		{
			List<string> list = new List<string>();
			int nextChar;
			while (reader.TryPeek(out nextChar))
			{
				if (charSignalsEndOfKey(nextChar))
				{
					return string.Join(".", list.ToArray());
				}
				if (nextChar.IsPeriod())
				{
					throw new TomlDoubleDottedKeyException(_lineNumber);
				}
				StringBuilder stringBuilder = new StringBuilder();
				while (reader.TryPeek(out nextChar))
				{
					nextChar.EnsureLegalChar(_lineNumber);
					int num = reader.SkipWhitespace();
					reader.TryPeek(out var nextChar2);
					if (nextChar2.IsPeriod())
					{
						list.Add(stringBuilder.ToString());
						reader.ExpectAndConsume('.');
						reader.SkipWhitespace();
						break;
					}
					if (num > 0 && charSignalsEndOfKey(nextChar2))
					{
						list.Add(stringBuilder.ToString());
						break;
					}
					reader.Backtrack(num);
					if (charSignalsEndOfKey(nextChar))
					{
						list.Add(stringBuilder.ToString());
						break;
					}
					if (num > 0)
					{
						throw new TomlWhitespaceInKeyException(_lineNumber);
					}
					stringBuilder.Append((char)reader.Read());
				}
			}
			throw new TomlEndOfFileException(_lineNumber);
		}

		private TomlValue ReadValue(TomletStringReader reader)
		{
			if (!reader.TryPeek(out var nextChar))
			{
				throw new TomlEndOfFileException(_lineNumber);
			}
			TomlValue tomlValue;
			switch (nextChar)
			{
			case 91:
				tomlValue = ReadArray(reader);
				break;
			case 123:
				tomlValue = ReadInlineTable(reader);
				break;
			case 34:
			case 39:
			{
				int num = reader.Read();
				if (reader.Peek() != num)
				{
					tomlValue = (num.IsSingleQuote() ? ReadSingleLineLiteralString(reader) : ReadSingleLineBasicString(reader));
					break;
				}
				reader.Read();
				int num2 = reader.Peek();
				if (num2 == num)
				{
					reader.Read();
					tomlValue = (num.IsSingleQuote() ? ReadMultiLineLiteralString(reader) : ReadMultiLineBasicString(reader));
					break;
				}
				if (num2.IsWhitespace() || num2.IsNewline() || num2.IsHashSign() || num2.IsComma() || num2.IsEndOfArrayChar() || num2 == -1)
				{
					tomlValue = TomlString.Empty;
					break;
				}
				throw new TomlStringException(_lineNumber);
			}
			case 43:
			case 45:
			case 48:
			case 49:
			case 50:
			case 51:
			case 52:
			case 53:
			case 54:
			case 55:
			case 56:
			case 57:
			case 105:
			case 110:
			{
				string text = reader.ReadWhile((int valueChar) => !valueChar.IsEquals() && !valueChar.IsNewline() && !valueChar.IsHashSign() && !valueChar.IsComma() && !valueChar.IsEndOfArrayChar() && !valueChar.IsEndOfInlineObjectChar()).ToLowerInvariant().Trim();
				tomlValue = ((!Enumerable.Contains(text, ':') && !Enumerable.Contains(text, 't') && !Enumerable.Contains(text, ' ') && !Enumerable.Contains(text, 'z')) ? ((!Enumerable.Contains(text, '.') && (!Enumerable.Contains(text, 'e') || text.StartsWith("0x")) && !Enumerable.Contains(text, 'n') && !Enumerable.Contains(text, 'i')) ? (TomlLong.Parse(text) ?? TomlDateTimeUtils.ParseDateString(text, _lineNumber) ?? throw new InvalidTomlNumberException(_lineNumber, text)) : (TomlDouble.Parse(text) ?? TomlDateTimeUtils.ParseDateString(text, _lineNumber) ?? throw new InvalidTomlNumberException(_lineNumber, text))) : (TomlDateTimeUtils.ParseDateString(text, _lineNumber) ?? throw new InvalidTomlDateTimeException(_lineNumber, text)));
				break;
			}
			case 116:
			{
				char[] second2 = reader.ReadChars(4);
				if (!TrueChars.SequenceEqual(second2))
				{
					throw new TomlInvalidValueException(_lineNumber, (char)nextChar);
				}
				tomlValue = TomlBoolean.True;
				break;
			}
			case 102:
			{
				char[] second = reader.ReadChars(5);
				if (!FalseChars.SequenceEqual(second))
				{
					throw new TomlInvalidValueException(_lineNumber, (char)nextChar);
				}
				tomlValue = TomlBoolean.False;
				break;
			}
			default:
				throw new TomlInvalidValueException(_lineNumber, (char)nextChar);
			}
			reader.SkipWhitespace();
			tomlValue.Comments.InlineComment = ReadAnyPotentialInlineComment(reader);
			return tomlValue;
		}

		private TomlValue ReadSingleLineBasicString(TomletStringReader reader, bool consumeClosingQuote = true)
		{
			StringBuilder stringBuilder = new StringBuilder();
			bool flag = false;
			bool fourDigitUnicodeMode = false;
			bool eightDigitUnicodeMode = false;
			StringBuilder stringBuilder2 = new StringBuilder();
			int nextChar;
			while (reader.TryPeek(out nextChar))
			{
				nextChar.EnsureLegalChar(_lineNumber);
				if (nextChar == 34 && !flag)
				{
					break;
				}
				reader.Read();
				if (nextChar == 92 && !flag)
				{
					flag = true;
				}
				else if (flag)
				{
					flag = false;
					char? c = HandleEscapedChar(nextChar, out fourDigitUnicodeMode, out eightDigitUnicodeMode);
					if (c.HasValue)
					{
						stringBuilder.Append(c.Value);
					}
				}
				else if (fourDigitUnicodeMode || eightDigitUnicodeMode)
				{
					stringBuilder2.Append((char)nextChar);
					if ((fourDigitUnicodeMode && stringBuilder2.Length == 4) || (eightDigitUnicodeMode && stringBuilder2.Length == 8))
					{
						string unicodeString = stringBuilder2.ToString();
						stringBuilder.Append(DecipherUnicodeEscapeSequence(unicodeString, fourDigitUnicodeMode));
						fourDigitUnicodeMode = false;
						eightDigitUnicodeMode = false;
						stringBuilder2 = new StringBuilder();
					}
				}
				else
				{
					if (nextChar.IsNewline())
					{
						throw new UnterminatedTomlStringException(_lineNumber);
					}
					stringBuilder.Append((char)nextChar);
				}
			}
			if (consumeClosingQuote && !reader.ExpectAndConsume('"'))
			{
				throw new UnterminatedTomlStringException(_lineNumber);
			}
			return new TomlString(stringBuilder.ToString());
		}

		private string DecipherUnicodeEscapeSequence(string unicodeString, bool fourDigitMode)
		{
			if (unicodeString.Any((char c) => !c.IsHexDigit()))
			{
				throw new InvalidTomlEscapeException(_lineNumber, $"\\{(fourDigitMode ? 'u' : 'U')}{unicodeString}");
			}
			if (fourDigitMode)
			{
				return ((char)short.Parse(unicodeString, NumberStyles.HexNumber)).ToString();
			}
			return char.ConvertFromUtf32(int.Parse(unicodeString, NumberStyles.HexNumber));
		}

		private char? HandleEscapedChar(int escapedChar, out bool fourDigitUnicodeMode, out bool eightDigitUnicodeMode, bool allowNewline = false)
		{
			eightDigitUnicodeMode = false;
			fourDigitUnicodeMode = false;
			char value;
			switch (escapedChar)
			{
			case 98:
				value = '\b';
				break;
			case 116:
				value = '\t';
				break;
			case 110:
				value = '\n';
				break;
			case 102:
				value = '\f';
				break;
			case 114:
				value = '\r';
				break;
			case 34:
				value = '"';
				break;
			case 92:
				value = '\\';
				break;
			case 117:
				fourDigitUnicodeMode = true;
				return null;
			case 85:
				eightDigitUnicodeMode = true;
				return null;
			default:
				if (allowNewline && escapedChar.IsNewline())
				{
					return null;
				}
				throw new InvalidTomlEscapeException(_lineNumber, $"\\{escapedChar}");
			}
			return value;
		}

		private TomlValue ReadSingleLineLiteralString(TomletStringReader reader, bool consumeClosingQuote = true)
		{
			string text = reader.ReadWhile((int valueChar) => !valueChar.IsSingleQuote() && !valueChar.IsNewline());
			foreach (int item in ((IEnumerable<char>)text).Select((Func<char, int>)((char c) => c)))
			{
				item.EnsureLegalChar(_lineNumber);
			}
			if (!reader.TryPeek(out var nextChar))
			{
				throw new TomlEndOfFileException(_lineNumber);
			}
			if (!nextChar.IsSingleQuote())
			{
				throw new UnterminatedTomlStringException(_lineNumber);
			}
			if (consumeClosingQuote)
			{
				reader.Read();
			}
			return new TomlString(text);
		}

		private TomlValue ReadMultiLineLiteralString(TomletStringReader reader)
		{
			StringBuilder stringBuilder = new StringBuilder();
			_lineNumber += reader.SkipAnyNewline();
			int nextChar;
			while (reader.TryPeek(out nextChar))
			{
				int num = reader.Read();
				num.EnsureLegalChar(_lineNumber);
				if (!num.IsSingleQuote())
				{
					stringBuilder.Append((char)num);
					if (num == 10)
					{
						_lineNumber++;
					}
					continue;
				}
				if (!reader.TryPeek(out var nextChar2) || !nextChar2.IsSingleQuote())
				{
					stringBuilder.Append('\'');
					continue;
				}
				reader.Read();
				if (!reader.TryPeek(out var nextChar3) || !nextChar3.IsSingleQuote())
				{
					stringBuilder.Append('\'');
					stringBuilder.Append('\'');
					continue;
				}
				reader.Read();
				if (!reader.TryPeek(out var nextChar4) || !nextChar4.IsSingleQuote())
				{
					break;
				}
				reader.Read();
				stringBuilder.Append('\'');
				if (!reader.TryPeek(out var nextChar5) || !nextChar5.IsSingleQuote())
				{
					break;
				}
				reader.Read();
				stringBuilder.Append('\'');
				if (!reader.TryPeek(out var nextChar6) || !nextChar6.IsSingleQuote())
				{
					break;
				}
				throw new TripleQuoteInTomlMultilineLiteralException(_lineNumber);
			}
			return new TomlString(stringBuilder.ToString());
		}

		private TomlValue ReadMultiLineBasicString(TomletStringReader reader)
		{
			StringBuilder stringBuilder = new StringBuilder();
			bool flag = false;
			bool fourDigitUnicodeMode = false;
			bool eightDigitUnicodeMode = false;
			StringBuilder stringBuilder2 = new StringBuilder();
			_lineNumber += reader.SkipAnyNewline();
			int nextChar;
			while (reader.TryPeek(out nextChar))
			{
				int num = reader.Read();
				num.EnsureLegalChar(_lineNumber);
				if (num == 92 && !flag)
				{
					flag = true;
					continue;
				}
				if (flag)
				{
					flag = false;
					char? c = HandleEscapedChar(num, out fourDigitUnicodeMode, out eightDigitUnicodeMode, allowNewline: true);
					if (c.HasValue)
					{
						stringBuilder.Append(c.Value);
					}
					else if (num.IsNewline())
					{
						if (num == 13 && !reader.ExpectAndConsume('\n'))
						{
							throw new Exception($"Found a CR without an LF on line {_lineNumber}");
						}
						_lineNumber++;
						reader.SkipAnyNewlineOrWhitespace();
					}
					continue;
				}
				if (fourDigitUnicodeMode || eightDigitUnicodeMode)
				{
					stringBuilder2.Append((char)num);
					if ((fourDigitUnicodeMode && stringBuilder2.Length == 4) || (eightDigitUnicodeMode && stringBuilder2.Length == 8))
					{
						string unicodeString = stringBuilder2.ToString();
						stringBuilder.Append(DecipherUnicodeEscapeSequence(unicodeString, fourDigitUnicodeMode));
						fourDigitUnicodeMode = false;
						eightDigitUnicodeMode = false;
						stringBuilder2 = new StringBuilder();
					}
					continue;
				}
				if (!num.IsDoubleQuote())
				{
					if (num == 10)
					{
						_lineNumber++;
					}
					stringBuilder.Append((char)num);
					continue;
				}
				if (!reader.TryPeek(out var nextChar2) || !nextChar2.IsDoubleQuote())
				{
					stringBuilder.Append('"');
					continue;
				}
				reader.Read();
				if (!reader.TryPeek(out var nextChar3) || !nextChar3.IsDoubleQuote())
				{
					stringBuilder.Append('"');
					stringBuilder.Append('"');
					continue;
				}
				reader.Read();
				if (!reader.TryPeek(out var nextChar4) || !nextChar4.IsDoubleQuote())
				{
					break;
				}
				reader.Read();
				stringBuilder.Append('"');
				if (!reader.TryPeek(out var nextChar5) || !nextChar5.IsDoubleQuote())
				{
					break;
				}
				reader.Read();
				stringBuilder.Append('"');
				if (!reader.TryPeek(out var nextChar6) || !nextChar6.IsDoubleQuote())
				{
					break;
				}
				throw new TripleQuoteInTomlMultilineSimpleStringException(_lineNumber);
			}
			return new TomlString(stringBuilder.ToString());
		}

		private TomlArray ReadArray(TomletStringReader reader)
		{
			if (!reader.ExpectAndConsume('['))
			{
				throw new ArgumentException("Internal Tomlet Bug: ReadArray called and first char is not a [");
			}
			_lineNumber += reader.SkipAnyCommentNewlineWhitespaceEtc();
			TomlArray tomlArray = new TomlArray();
			int nextChar;
			while (reader.TryPeek(out nextChar))
			{
				_lineNumber += reader.SkipAnyCommentNewlineWhitespaceEtc();
				if (!reader.TryPeek(out var nextChar2))
				{
					throw new TomlEndOfFileException(_lineNumber);
				}
				if (nextChar2.IsEndOfArrayChar())
				{
					break;
				}
				tomlArray.ArrayValues.Add(ReadValue(reader));
				_lineNumber += reader.SkipAnyNewlineOrWhitespace();
				if (!reader.TryPeek(out var nextChar3))
				{
					throw new TomlEndOfFileException(_lineNumber);
				}
				if (nextChar3.IsEndOfArrayChar())
				{
					break;
				}
				if (!nextChar3.IsComma())
				{
					throw new TomlArraySyntaxException(_lineNumber, (char)nextChar3);
				}
				reader.ExpectAndConsume(',');
			}
			reader.ExpectAndConsume(']');
			return tomlArray;
		}

		private TomlTable ReadInlineTable(TomletStringReader reader)
		{
			if (!reader.ExpectAndConsume('{'))
			{
				throw new ArgumentException("Internal Tomlet Bug: ReadInlineTable called and first char is not a {");
			}
			_lineNumber += reader.SkipAnyCommentNewlineWhitespaceEtc();
			TomlTable tomlTable = new TomlTable
			{
				Defined = true
			};
			int nextChar;
			while (reader.TryPeek(out nextChar))
			{
				reader.SkipWhitespace();
				if (!reader.TryPeek(out var nextChar2))
				{
					throw new TomlEndOfFileException(_lineNumber);
				}
				if (nextChar2.IsEndOfInlineObjectChar())
				{
					break;
				}
				if (nextChar2.IsNewline())
				{
					throw new NewLineInTomlInlineTableException(_lineNumber);
				}
				try
				{
					ReadKeyValuePair(reader, out string key, out TomlValue value);
					tomlTable.ParserPutValue(key, value, _lineNumber);
				}
				catch (TomlException ex) when (ex is TomlMissingEqualsException || ex is NoTomlKeyException || ex is TomlWhitespaceInKeyException)
				{
					throw new InvalidTomlInlineTableException(_lineNumber, ex);
				}
				if (!reader.TryPeek(out var nextChar3))
				{
					throw new TomlEndOfFileException(_lineNumber);
				}
				if (!reader.ExpectAndConsume(','))
				{
					reader.SkipWhitespace();
					if (!reader.TryPeek(out nextChar3))
					{
						throw new TomlEndOfFileException(_lineNumber);
					}
					if (nextChar3.IsEndOfInlineObjectChar())
					{
						break;
					}
					throw new TomlInlineTableSeparatorException(_lineNumber, (char)nextChar3);
				}
			}
			reader.ExpectAndConsume('}');
			tomlTable.Locked = true;
			return tomlTable;
		}

		private TomlTable ReadTableStatement(TomletStringReader reader, TomlDocument document)
		{
			string text = reader.ReadWhile((int c) => !c.IsEndOfArrayChar() && !c.IsNewline());
			TomlTable parent = document;
			string relativeName = text;
			FindParentAndRelativeKey(ref parent, ref relativeName);
			TomlTable tomlTable;
			try
			{
				if (parent.ContainsKey(relativeName))
				{
					try
					{
						tomlTable = (TomlTable)parent.GetValue(relativeName);
						if (tomlTable.Defined)
						{
							throw new TomlTableRedefinitionException(_lineNumber, text);
						}
					}
					catch (InvalidCastException)
					{
						throw new TomlKeyRedefinitionException(_lineNumber, text);
					}
				}
				else
				{
					tomlTable = new TomlTable
					{
						Defined = true
					};
					parent.ParserPutValue(relativeName, tomlTable, _lineNumber);
				}
			}
			catch (TomlContainsDottedKeyNonTableException ex2)
			{
				throw new TomlDottedKeyParserException(_lineNumber, ex2.Key);
			}
			if (!reader.TryPeek(out var _))
			{
				throw new TomlEndOfFileException(_lineNumber);
			}
			if (!reader.ExpectAndConsume(']'))
			{
				throw new UnterminatedTomlTableNameException(_lineNumber);
			}
			reader.SkipWhitespace();
			tomlTable.Comments.InlineComment = ReadAnyPotentialInlineComment(reader);
			reader.SkipPotentialCarriageReturn();
			if (!reader.TryPeek(out var nextChar2))
			{
				throw new TomlEndOfFileException(_lineNumber);
			}
			if (!nextChar2.IsNewline())
			{
				throw new TomlMissingNewlineException(_lineNumber, (char)nextChar2);
			}
			_currentTable = tomlTable;
			_tableNames = text.Split(new char[1] { '.' });
			return tomlTable;
		}

		private TomlArray ReadTableArrayStatement(TomletStringReader reader, TomlDocument document)
		{
			if (!reader.ExpectAndConsume('['))
			{
				throw new ArgumentException("Internal Tomlet Bug: ReadTableArrayStatement called and first char is not a [");
			}
			string text = reader.ReadWhile((int c) => !c.IsEndOfArrayChar() && !c.IsNewline());
			if (!reader.ExpectAndConsume(']') || !reader.ExpectAndConsume(']'))
			{
				throw new UnterminatedTomlTableArrayException(_lineNumber);
			}
			TomlTable parent = document;
			string relativeName = text;
			FindParentAndRelativeKey(ref parent, ref relativeName);
			if (parent == document && Enumerable.Contains(relativeName, '.'))
			{
				throw new MissingIntermediateInTomlTableArraySpecException(_lineNumber, relativeName);
			}
			TomlArray tomlArray2;
			if (parent.ContainsKey(relativeName))
			{
				if (!(parent.GetValue(relativeName) is TomlArray tomlArray))
				{
					throw new TomlTableArrayAlreadyExistsAsNonArrayException(_lineNumber, text);
				}
				tomlArray2 = tomlArray;
				if (!tomlArray2.IsLockedToBeTableArray)
				{
					throw new TomlNonTableArrayUsedAsTableArrayException(_lineNumber, text);
				}
			}
			else
			{
				tomlArray2 = new TomlArray
				{
					IsLockedToBeTableArray = true
				};
				parent.ParserPutValue(relativeName, tomlArray2, _lineNumber);
			}
			_currentTable = new TomlTable
			{
				Defined = true
			};
			tomlArray2.ArrayValues.Add(_currentTable);
			_tableNames = text.Split(new char[1] { '.' });
			return tomlArray2;
		}

		private void FindParentAndRelativeKey(ref TomlTable parent, ref string relativeName)
		{
			for (int i = 0; i < _tableNames.Length; i++)
			{
				string text = _tableNames[i];
				if (!relativeName.StartsWith(text + "."))
				{
					break;
				}
				TomlValue value = parent.GetValue(text);
				if (value is TomlTable tomlTable)
				{
					parent = tomlTable;
				}
				else
				{
					if (!(value is TomlArray source))
					{
						throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), typeof(TomlArray));
					}
					parent = (TomlTable)source.Last();
				}
				relativeName = relativeName.Substring(text.Length + 1);
			}
		}

		private string? ReadAnyPotentialInlineComment(TomletStringReader reader)
		{
			if (!reader.ExpectAndConsume('#'))
			{
				return null;
			}
			string text = reader.ReadWhile((int c) => !c.IsNewline()).Trim();
			if (text.Length < 1)
			{
				return null;
			}
			if (text[0] == ' ')
			{
				text = text.Substring(1);
			}
			foreach (int item in ((IEnumerable<char>)text).Select((Func<char, int>)((char c) => c)))
			{
				item.EnsureLegalChar(_lineNumber);
			}
			return text;
		}

		private string? ReadAnyPotentialMultilineComment(TomletStringReader reader)
		{
			StringBuilder stringBuilder = new StringBuilder();
			while (reader.ExpectAndConsume('#'))
			{
				string text = reader.ReadWhile((int c) => !c.IsNewline());
				if (text[0] == ' ')
				{
					text = text.Substring(1);
				}
				foreach (int item in ((IEnumerable<char>)text).Select((Func<char, int>)((char c) => c)))
				{
					item.EnsureLegalChar(_lineNumber);
				}
				stringBuilder.Append(text);
				_lineNumber += reader.SkipAnyNewlineOrWhitespace();
			}
			if (stringBuilder.Length == 0)
			{
				return null;
			}
			return stringBuilder.ToString();
		}
	}
	public static class TomlSerializationMethods
	{
		public delegate T Deserialize<out T>(TomlValue value);

		public delegate TomlValue Serialize<in T>(T? t);

		private static readonly Dictionary<Type, Delegate> Deserializers;

		private static readonly Dictionary<Type, Delegate> Serializers;

		[NoCoverage]
		static TomlSerializationMethods()
		{
			Deserializers = new Dictionary<Type, Delegate>();
			Serializers = new Dictionary<Type, Delegate>();
			Register((string? s) => new TomlString(s), (TomlValue value) => (value as TomlString)?.Value ?? value.StringValue);
			Register(TomlBoolean.ValueOf, (TomlValue value) => ((value as TomlBoolean) ?? throw new TomlTypeMismatchException(typeof(TomlBoolean), value.GetType(), typeof(bool))).Value);
			Register((byte i) => new TomlLong(i), (TomlValue value) => (byte)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(byte))).Value);
			Register((sbyte i) => new TomlLong(i), (TomlValue value) => (sbyte)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(sbyte))).Value);
			Register((ushort i) => new TomlLong(i), (TomlValue value) => (ushort)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(ushort))).Value);
			Register((short i) => new TomlLong(i), (TomlValue value) => (short)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(short))).Value);
			Register((uint i) => new TomlLong(i), (TomlValue value) => (uint)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(uint))).Value);
			Register((int i) => new TomlLong(i), (TomlValue value) => (int)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(int))).Value);
			Register((ulong l) => new TomlLong((long)l), (TomlValue value) => (ulong)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(ulong))).Value);
			Register((long l) => new TomlLong(l), (TomlValue value) => ((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(long))).Value);
			Register((double d) => new TomlDouble(d), (TomlValue value) => (value as TomlDouble)?.Value ?? ((double)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlDouble), value.GetType(), typeof(double))).Value));
			Register((float f) => new TomlDouble(f), (TomlValue value) => (float)((value as TomlDouble)?.Value ?? ((double)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlDouble), value.GetType(), typeof(float))).Value)));
			Register((DateTime dt) => (!(dt.TimeOfDay == TimeSpan.Zero)) ? ((TomlValue)new TomlLocalDateTime(dt)) : ((TomlValue)new TomlLocalDate(dt)), (TomlValue value) => ((value as ITomlValueWithDateTime) ?? throw new TomlTypeMismatchException(typeof(ITomlValueWithDateTime), value.GetType(), typeof(DateTime))).Value);
			Register((DateTimeOffset odt) => new TomlOffsetDateTime(odt), (TomlValue value) => ((value as TomlOffsetDateTime) ?? throw new TomlTypeMismatchException(typeof(TomlOffsetDateTime), value.GetType(), typeof(DateTimeOffset))).Value);
			Register((TimeSpan lt) => new TomlLocalTime(lt), (TomlValue value) => ((value as TomlLocalTime) ?? throw new TomlTypeMismatchException(typeof(TomlLocalTime), value.GetType(), typeof(TimeSpan))).Value);
		}

		internal static Serialize<object> GetSerializer(Type t)
		{
			if (Serializers.TryGetValue(t, out Delegate value))
			{
				return (Serialize<object>)value;
			}
			if (t.IsArray || (t.Namespace == "System.Collections.Generic" && t.Name == "List`1"))
			{
				Serialize<object> serialize = GenericEnumerableSerializer();
				Serializers[t] = serialize;
				return serialize;
			}
			return TomlCompositeSerializer.For(t);
		}

		internal static Deserialize<object> GetDeserializer(Type t)
		{
			if (Deserializers.TryGetValue(t, out Delegate value))
			{
				return (Deserialize<object>)value;
			}
			if (t.IsArray)
			{
				Deserialize<object> deserialize = ArrayDeserializerFor(t.GetElementType());
				Deserializers[t] = deserialize;
				return deserialize;
			}
			if (t.Namespace == "System.Collections.Generic" && t.Name == "List`1")
			{
				Deserialize<object> deserialize2 = ListDeserializerFor(t.GetGenericArguments()[0]);
				Deserializers[t] = deserialize2;
				return deserialize2;
			}
			return TomlCompositeDeserializer.For(t);
		}

		private static Serialize<object> GenericEnumerableSerializer()
		{
			return delegate(object? o)
			{
				IEnumerable obj = (o as IEnumerable) ?? throw new Exception("How did ArraySerializer end up getting a non-array?");
				TomlArray tomlArray = new TomlArray();
				foreach (object item in obj)
				{
					tomlArray.Add(item);
				}
				return tomlArray;
			};
		}

		private static Deserialize<object> ArrayDeserializerFor(Type elementType)
		{
			Type elementType2 = elementType;
			return delegate(TomlValue value)
			{
				if (!(value is TomlArray tomlArray))
				{
					throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), elementType2.MakeArrayType());
				}
				Array array = Array.CreateInstance(elementType2, tomlArray.Count);
				Deserialize<object> deserializer = GetDeserializer(elementType2);
				for (int i = 0; i < tomlArray.ArrayValues.Count; i++)
				{
					TomlValue value2 = tomlArray.ArrayValues[i];
					array.SetValue(deserializer(value2), i);
				}
				return array;
			};
		}

		private static Deserialize<object> ListDeserializerFor(Type elementType)
		{
			Type elementType2 = elementType;
			Type listType = typeof(List<>).MakeGenericType(elementType2);
			MethodInfo relevantAddMethod = listType.GetMethod("Add");
			return delegate(TomlValue value)
			{
				TomlArray obj = (value as TomlArray) ?? throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), listType);
				object obj2 = Activator.CreateInstance(listType);
				Deserialize<object> deserializer = GetDeserializer(elementType2);
				foreach (TomlValue arrayValue in obj.ArrayValues)
				{
					relevantAddMethod.Invoke(obj2, new object[1] { deserializer(arrayValue) });
				}
				return obj2;
			};
		}

		internal static void Register<T>(Serialize<T>? serializer, Deserialize<T>? deserializer)
		{
			if (serializer != null)
			{
				RegisterSerializer(serializer);
				RegisterDictionarySerializer(serializer);
			}
			if (deserializer != null)
			{
				RegisterDeserializer(deserializer);
				RegisterDictionaryDeserializer(deserializer);
			}
		}

		internal static void Register(Type t, Serialize<object>? serializer, Deserialize<object>? deserializer)
		{
			if (serializer != null)
			{
				RegisterSerializer(serializer);
			}
			if (deserializer != null)
			{
				RegisterDeserializer(deserializer);
			}
		}

		private static void RegisterDeserializer<T>(Deserialize<T> deserializer)
		{
			Deserialize<T> deserializer2 = deserializer;
			Deserializers[typeof(T)] = new Deserialize<object>(BoxedDeserializer);
			object BoxedDeserializer(TomlValue value)
			{
				T val = deserializer2(value);
				if (val == null)
				{
					throw new Exception("TOML Deserializer returned null for type T");
				}
				return val;
			}
		}

		private static void RegisterSerializer<T>(Serialize<T> serializer)
		{
			Serialize<T> serializer2 = serializer;
			Serializers[typeof(T)] = new Serialize<object>(ObjectAcceptingSerializer);
			TomlValue ObjectAcceptingSerializer(object value)
			{
				return serializer2((T)value);
			}
		}

		private static void RegisterDictionarySerializer<T>(Serialize<T> serializer)
		{
			Serialize<T> serializer2 = serializer;
			RegisterSerializer(delegate(Dictionary<string, T>? dict)
			{
				TomlTable tomlTable = new TomlTable();
				if (dict == null)
				{
					return tomlTable;
				}
				List<string> list = dict.Keys.ToList();
				List<TomlValue> list2 = dict.Values.Select(serializer2.Invoke).ToList();
				for (int i = 0; i < list.Count; i++)
				{
					tomlTable.PutValue(list[i], list2[i], quote: true);
				}
				return tomlTable;
			});
		}

		private static void RegisterDictionaryDeserializer<T>(Deserialize<T> deserializer)
		{
			Deserialize<T> deserializer2 = deserializer;
			RegisterDeserializer((TomlValue value) => ((value as TomlTable) ?? throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), typeof(Dictionary<string, T>))).Entries.Select<KeyValuePair<string, TomlValue>, KeyValuePair<string, T>>((KeyValuePair<string, TomlValue> kvp) => new KeyValuePair<string, T>(kvp.Key, deserializer2(kvp.Value))).ToDictionary((KeyValuePair<string, T> kvp) => kvp.Key, (KeyValuePair<string, T> kvp) => kvp.Value));
		}
	}
	internal static class TomlUtils
	{
		public static string EscapeStringValue(string key)
		{
			return key.Replace("\\", "\\\\").Replace("\n", "\\n").Replace("\r", "");
		}

		public static string AddCorrectQuotes(string key)
		{
			if (key.Contains("'") && key.Contains("\""))
			{
				throw new InvalidTomlKeyException(key);
			}
			if (key.Contains("\""))
			{
				return "'" + key + "'";
			}
			return "\"" + key + "\"";
		}
	}
}
namespace Tomlet.Models
{
	public class TomlArray : TomlValue, IEnumerable<TomlValue>, IEnumerable
	{
		public readonly List<TomlValue> ArrayValues = new List<TomlValue>();

		internal bool IsLockedToBeTableArray;

		public override string StringValue => $"Toml Array ({ArrayValues.Count} values)";

		public bool IsTableArray
		{
			get
			{
				if (!IsLockedToBeTableArray)
				{
					return ArrayValues.All((TomlValue t) => t is TomlTable);
				}
				return true;
			}
		}

		public bool CanBeSerializedInline
		{
			get
			{
				if (IsTableArray)
				{
					if (ArrayValues.All((TomlValue o) => o is TomlTable tomlTable && tomlTable.ShouldBeSerializedInline))
					{
						return ArrayValues.Count <= 5;
					}
					return false;
				}
				return true;
			}
		}

		public bool IsSimpleArray
		{
			get
			{
				if (!IsLockedToBeTableArray)
				{
					return !ArrayValues.Any((TomlValue o) => o is TomlArray || o is TomlTable || !o.Comments.ThereAreNoComments);
				}
				return false;
			}
		}

		public TomlValue this[int index] => ArrayValues[index];

		public int Count => ArrayValues.Count;

		public override string SerializedValue => SerializeInline(!IsSimpleArray);

		public void Add<T>(T t) where T : new()
		{
			TomlValue item = (((object)t is TomlValue tomlValue) ? tomlValue : TomletMain.ValueFrom(t));
			ArrayValues.Add(item);
		}

		public string SerializeInline(bool multiline)
		{
			if (!CanBeSerializedInline)
			{
				throw new Exception("Complex Toml Tables cannot be serialized into a TomlArray if the TomlArray is not a Table Array. This means that the TOML array cannot contain anything other than tables. If you are manually accessing SerializedValue on the TomlArray, you should probably be calling SerializeTableArray here. (Check the CanBeSerializedInline property and call that method if it is false)");
			}
			StringBuilder stringBuilder = new StringBuilder("[");
			char value = (multiline ? '\n' : ' ');
			using (IEnumerator<TomlValue> enumerator = GetEnumerator())
			{
				while (enumerator.MoveNext())
				{
					TomlValue current = enumerator.Current;
					stringBuilder.Append(value);
					if (current.Comments.PrecedingComment != null)
					{
						stringBuilder.Append(current.Comments.FormatPrecedingComment(1)).Append('\n');
					}
					if (multiline)
					{
						stringBuilder.Append('\t');
					}
					stringBuilder.Append(current.SerializedValue);
					stringBuilder.Append(',');
					if (current.Comments.InlineComment != null)
					{
						stringBuilder.Append(" # ").Append(current.Comments.InlineComment);
					}
				}
			}
			stringBuilder.Append(value);
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}

		public string SerializeTableArray(string key)
		{
			if (!IsTableArray)
			{
				throw new Exception("Cannot serialize normal arrays using this method. Use the normal TomlValue.SerializedValue property.");
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (base.Comments.InlineComment != null)
			{
				throw new Exception("Sorry, but inline comments aren't supported on table-arrays themselves. See https://github.com/SamboyCoding/Tomlet/blob/master/docs/InlineCommentsOnTableArrays.md for my rationale on this.");
			}
			bool flag = true;
			using (IEnumerator<TomlValue> enumerator = GetEnumerator())
			{
				while (enumerator.MoveNext())
				{
					TomlValue current = enumerator.Current;
					if (!(current is TomlTable tomlTable))
					{
						throw new Exception($"Toml Table-Array contains non-table entry? Value is {current}");
					}
					if (current.Comments.PrecedingComment != null)
					{
						if (flag && base.Comments.PrecedingComment != null)
						{
							stringBuilder.Append('\n');
						}
						stringBuilder.Append(current.Comments.FormatPrecedingComment()).Append('\n');
					}
					flag = false;
					stringBuilder.Append("[[").Append(key).Append("]]");
					if (current.Comments.InlineComment != null)
					{
						stringBuilder.Append(" # ").Append(current.Comments.InlineComment);
					}
					stringBuilder.Append('\n');
					stringBuilder.Append(tomlTable.SerializeNonInlineTable(key, includeHeader: false)).Append('\n');
				}
			}
			return stringBuilder.ToString();
		}

		public IEnumerator<TomlValue> GetEnumerator()
		{
			return ArrayValues.GetEnumerator();
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return ArrayValues.GetEnumerator();
		}
	}
	public class TomlBoolean : TomlValue
	{
		private bool _value;

		public static TomlBoolean True => new TomlBoolean(value: true);

		public static TomlBoolean False => new TomlBoolean(value: false);

		public bool Value => _value;

		public override string StringValue
		{
			get
			{
				if (!Value)
				{
					return bool.FalseString.ToLowerInvariant();
				}
				return bool.TrueString.ToLowerInvariant();
			}
		}

		public override string SerializedValue => StringValue;

		private TomlBoolean(bool value)
		{
			_value = value;
		}

		public static TomlBoolean ValueOf(bool b)
		{
			if (!b)
			{
				return False;
			}
			return True;
		}
	}
	public class TomlCommentData
	{
		private string? _inlineComment;

		public string? PrecedingComment { get; set; }

		public string? InlineComment
		{
			get
			{
				return _inlineComment;
			}
			set
			{
				if (value == null)
				{
					_inlineComment = null;
					return;
				}
				if (value.Contains("\n") || value.Contains("\r"))
				{
					throw new TomlNewlineInInlineCommentException();
				}
				_inlineComment = value;
			}
		}

		public bool ThereAreNoComments
		{
			get
			{
				if (InlineComment == null)
				{
					return PrecedingComment == null;
				}
				return false;
			}
		}

		internal string FormatPrecedingComment(int indentCount = 0)
		{
			if (PrecedingComment == null)
			{
				throw new Exception("Preceding comment is null");
			}
			StringBuilder stringBuilder = new StringBuilder();
			string[] array = PrecedingComment.Split(new char[1] { '\n' });
			bool flag = true;
			string[] array2 = array;
			foreach (string value in array2)
			{
				if (!flag)
				{
					stringBuilder.Append('\n');
				}
				flag = false;
				string value2 = new string('\t', indentCount);
				stringBuilder.Append(value2).Append("# ").Append(value);
			}
			return stringBuilder.ToString();
		}
	}
	public class TomlDocument : TomlTable
	{
		public string? TrailingComment { get; set; }

		public override string SerializedValue => SerializeDocument();

		public override string StringValue => $"Toml root document ({Entries.Count} entries)";

		public static TomlDocument CreateEmpty()
		{
			return new TomlDocument();
		}

		internal TomlDocument()
		{
		}

		internal TomlDocument(TomlTable from)
		{
			foreach (string key in from.Keys)
			{
				PutValue(key, from.GetValue(key));
			}
		}

		private string SerializeDocument()
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(SerializeNonInlineTable(null, includeHeader: false));
			if (TrailingComment != null)
			{
				TomlCommentData tomlCommentData = new TomlCommentData
				{
					PrecedingComment = TrailingComment
				};
				stringBuilder.Append('\n');
				stringBuilder.Append(tomlCommentData.FormatPrecedingComment());
			}
			return stringBuilder.ToString();
		}
	}
	public class TomlDouble : TomlValue
	{
		private double _value;

		public bool HasDecimal => Value != (double)(int)Value;

		public double Value => _value;

		public bool IsNaN => double.IsNaN(Value);

		public bool IsInfinity => double.IsInfinity(Value);

		public override string StringValue
		{
			get
			{
				if (this != null)
				{
					if (IsInfinity)
					{
						return double.IsPositiveInfinity(Value) ? "inf" : "-inf";
					}
					if (IsNaN)
					{
						return "nan";
					}
					if (HasDecimal)
					{
						return Value.ToString(CultureInfo.InvariantCulture);
					}
				}
				return $"{Value:F1}";
			}
		}

		public override string SerializedValue => StringValue;

		public TomlDouble(double value)
		{
			_value = value;
		}

		internal static TomlDouble? Parse(string valueInToml)
		{
			double? doubleValue = TomlNumberUtils.GetDoubleValue(valueInToml);
			if (!doubleValue.HasValue)
			{
				return null;
			}
			return new TomlDouble(doubleValue.Value);
		}
	}
	public class TomlLocalDate : TomlValue, ITomlValueWithDateTime
	{
		private readonly DateTime _value;

		public DateTime Value => _value;

		public override string StringValue => XmlConvert.ToString(Value, XmlDateTimeSerializationMode.Unspecified);

		public override string SerializedValue => StringValue;

		public TomlLocalDate(DateTime value)
		{
			_value = value;
		}

		public static TomlLocalDate? Parse(string input)
		{
			if (!DateTime.TryParse(input, out var result))
			{
				return null;
			}
			return new TomlLocalDate(result);
		}
	}
	public class TomlLocalDateTime : TomlValue, ITomlValueWithDateTime
	{
		private readonly DateTime _value;

		public DateTime Value => _value;

		public override string StringValue => XmlConvert.ToString(Value, XmlDateTimeSerializationMode.Unspecified);

		public override string SerializedValue => StringValue;

		public TomlLocalDateTime(DateTime value)
		{
			_value = value;
		}

		public static TomlLocalDateTime? Parse(string input)
		{
			if (!DateTime.TryParse(input, out var result))
			{
				return null;
			}
			return new TomlLocalDateTime(result);
		}
	}
	public class TomlLocalTime : TomlValue
	{
		private readonly TimeSpan _value;

		public TimeSpan Value => _value;

		public override string StringValue => Value.ToString();

		public override string SerializedValue => StringValue;

		public TomlLocalTime(TimeSpan value)
		{
			_value = value;
		}

		public static TomlLocalTime? Parse(string input)
		{
			if (!TimeSpan.TryParse(input, out var result))
			{
				return null;
			}
			return new TomlLocalTime(result);
		}
	}
	public class TomlLong : TomlValue
	{
		private long _value;

		public long Value => _value;

		public override string StringValue => Value.ToString();

		public override string SerializedValue => StringValue;

		public TomlLong(long value)
		{
			_value = value;
		}

		internal static TomlLong? Parse(string valueInToml)
		{
			long? longValue = TomlNumberUtils.GetLongValue(valueInToml);
			if (!longValue.HasValue)
			{
				return null;
			}
			return new TomlLong(longValue.Value);
		}
	}
	public class TomlOffsetDateTime : TomlValue
	{
		private readonly DateTimeOffset _value;

		public DateTimeOffset Value => _value;

		public override string StringValue => Value.ToString("O");

		public override string SerializedValue => StringValue;

		public TomlOffsetDateTime(DateTimeOffset value)
		{
			_value = value;
		}

		public static TomlOffsetDateTime? Parse(string input)
		{
			if (!DateTimeOffset.TryParse(input, out var result))
			{
				return null;
			}
			return new TomlOffsetDateTime(result);
		}
	}
	public class TomlString : TomlValue
	{
		private readonly string _value;

		public static TomlString Empty => new TomlString("");

		public string Value => _value;

		public override string StringValue => Value;

		public override string SerializedValue
		{
			get
			{
				if (Value.Contains("'") && !Value.Contains("\""))
				{
					return "\"" + TomlUtils.EscapeStringValue(Value) + "\"";
				}
				if (Value.Contains("\"") && !Value.Contains("'") && !Value.Contains("\n"))
				{
					return "'" + Value + "'";
				}
				if (Value.Contains("\"") && !Value.Contains("'"))
				{
					return "'''\n" + Value + "'''";
				}
				return "\"" + TomlUtils.EscapeStringValue(Value) + "\"";
			}
		}

		public TomlString(string? value)
		{
			_value = value ?? throw new ArgumentNullException("value", "TomlString's value cannot be null");
		}
	}
	public class TomlTable : TomlValue
	{
		public readonly Dictionary<string, TomlValue> Entries = new Dictionary<string, TomlValue>();

		internal bool Locked;

		internal bool Defined;

		public bool ForceNoInline { get; set; }

		public override string StringValue => $"Table ({Entries.Count} entries)";

		public HashSet<string> Keys => new HashSet<string>(Entries.Keys);

		public bool ShouldBeSerializedInline
		{
			get
			{
				if (!ForceNoInline && Entries.Count < 4)
				{
					return Entries.All<KeyValuePair<string, TomlValue>>((KeyValuePair<string, TomlValue> e) => !e.Key.Contains(" ") && e.Value.Comments.ThereAreNoComments && ((!(e.Value is TomlArray tomlArray)) ? (!(e.Value is TomlTable)) : tomlArray.IsSimpleArray));
				}
				return false;
			}
		}

		public override string SerializedValue
		{
			get
			{
				if (!ShouldBeSerializedInline)
				{
					throw new Exception("Cannot use SerializeValue to serialize non-inline tables. Use SerializeNonInlineTable(keyName).");
				}
				StringBuilder stringBuilder = new StringBuilder("{ ");
				stringBuilder.Append(string.Join(", ", Entries.Select<KeyValuePair<string, TomlValue>, string>((KeyValuePair<string, TomlValue> o) => o.Key + " = " + o.Value.SerializedValue).ToArray()));
				stringBuilder.Append(" }");
				return stringBuilder.ToString();
			}
		}

		public string SerializeNonInlineTable(string? keyName, bool includeHeader = true)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (includeHeader)
			{
				stringBuilder.Append('[').Append(keyName).Append("]");
				if (base.Comments.InlineComment != null)
				{
					stringBuilder.Append(" # ").Append(base.Comments.InlineComment);
				}
				stringBuilder.Append('\n');
			}
			string one;
			TomlValue two;
			foreach (KeyValuePair<string, TomlValue> entry in Entries)
			{
				Extensions.Deconstruct(entry, out one, out two);
				string subKey = one;
				TomlValue tomlValue = two;
				if (tomlValue is TomlTable tomlTable)
				{
					if (!tomlTable.ShouldBeSerializedInline)
					{
						goto IL_00a4;
					}
				}
				else if (tomlValue is TomlArray tomlArray && !tomlArray.CanBeSerializedInline)
				{
					goto IL_00a4;
				}
				bool flag = false;
				goto IL_00ac;
				IL_00a4:
				flag = true;
				goto IL_00ac;
				IL_00ac:
				if (!flag)
				{
					WriteValueToStringBuilder(keyName, subKey, stringBuilder);
				}
			}
			foreach (KeyValuePair<string, TomlValue> entry2 in Entries)
			{
				Extensions.Deconstruct(entry2, out one, out two);
				string subKey2 = one;
				if (two is TomlTable tomlTable2 && !tomlTable2.ShouldBeSerializedInline)
				{
					WriteValueToStringBuilder(keyName, subKey2, stringBuilder);
				}
			}
			foreach (KeyValuePair<string, TomlValue> entry3 in Entries)
			{
				Extensions.Deconstruct(entry3, out one, out two);
				string subKey3 = one;
				if (two is TomlArray tomlArray2 && !tomlArray2.CanBeSerializedInline)
				{
					WriteValueToStringBuilder(keyName, subKey3, stringBuilder);
				}
			}
			return stringBuilder.ToString();
		}

		private void WriteValueToStringBuilder(string? keyName, string subKey, StringBuilder builder)
		{
			TomlValue value = GetValue(subKey);
			subKey = EscapeKeyIfNeeded(subKey);
			if (keyName != null)
			{
				keyName = EscapeKeyIfNeeded(keyName);
			}
			string text = ((keyName == null) ? subKey : (keyName + "." + subKey));
			if (value.Comments.PrecedingComment != null)
			{
				builder.Append(value.Comments.FormatPrecedingComment()).Append('\n');
			}
			if (value is TomlArray tomlArray)
			{
				if (!tomlArray.CanBeSerializedInline)
				{
					builder.Append(tomlArray.SerializeTableArray(text));
					return;
				}
				TomlArray tomlArray2 = tomlArray;
				builder.Append(subKey).Append(" = ").Append(tomlArray2.SerializedValue);
			}
			else if (value is TomlTable tomlTable)
			{
				if (!tomlTable.ShouldBeSerializedInline)
				{
					TomlTable tomlTable2 = tomlTable;
					builder.Append(tomlTable2.SerializeNonInlineTable(text)).Append('\n');
					return;
				}
				builder.Append(subKey).Append(" = ").Append(tomlTable.SerializedValue);
			}
			else
			{
				builder.Append(subKey).Append(" = ").Append(value.SerializedValue);
			}
			if (value.Comments.InlineComment != null)
			{
				builder.Append(" # ").Append(value.Comments.InlineComment);
			}
			builder.Append('\n');
		}

		private string EscapeKeyIfNeeded(string key)
		{
			bool flag = false;
			if (key.StartsWith("\"") && key.EndsWith("\"") && key.Count((char c) => c == '"') == 2)
			{
				return key;
			}
			if (key.StartsWith("'") && key.EndsWith("'") && key.Count((char c) => c == '\'') == 2)
			{
				return key;
			}
			if (key.Contains("\"") || key.Contains("'"))
			{
				key = TomlUtils.AddCorrectQuotes(key);
				flag = true;
			}
			string text = TomlUtils.EscapeStringValue(key);
			if (text.Contains(" ") || (text.Contains("\\") && !flag))
			{
				text = TomlUtils.AddCorrectQuotes(text);
			}
			return text;
		}

		internal void ParserPutValue(string key, TomlValue value, int lineNumber)
		{
			if (Locked)
			{
				throw new TomlTableLockedException(lineNumber, key);
			}
			InternalPutValue(key, value, lineNumber, callParserForm: true);
		}

		public void PutValue(string key, TomlValue value, bool quote = false)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			if (value == null)
			{
				throw new ArgumentNullException("value");
			}
			if (quote)
			{
				key = TomlUtils.AddCorrectQuotes(key);
			}
			InternalPutValue(key, value, null, callParserForm: false);
		}

		public void Put<T>(string key, T t, bool quote = false)
		{
			if ((object)t is TomlValue value)
			{
				PutValue(key, value, quote);
			}
			else
			{
				PutValue(key, TomletMain.ValueFrom(t), quote);
			}
		}

		public string DeQuoteKey(string key)
		{
			if ((key.StartsWith("\"") && key.EndsWith("\"")) || (key.StartsWith("'") && key.EndsWith("'")))
			{
				return key.Substring(1, key.Length - 2);
			}
			return key;
		}

		private void InternalPutValue(string key, TomlValue value, int? lineNumber, bool callParserForm)
		{
			key = key.Trim();
			TomlKeyUtils.GetTopLevelAndSubKeys(key, out string ourKeyName, out string restOfKey);
			if (!string.IsNullOrEmpty(restOfKey))
			{
				if (!Entries.TryGetValue(DeQuoteKey(ourKeyName), out TomlValue value2))
				{
					TomlTable tomlTable = new TomlTable();
					if (callParserForm)
					{
						ParserPutValue(ourKeyName, tomlTable, lineNumber.Value);
					}
					else
					{
						PutValue(ourKeyName, tomlTable);
					}
					if (callParserForm)
					{
						tomlTable.ParserPutValue(restOfKey, value, lineNumber.Value);
					}
					else
					{
						tomlTable.PutValue(restOfKey, value);
					}
					return;
				}
				if (!(value2 is TomlTable tomlTable2))
				{
					if (lineNumber.HasValue)
					{
						throw new TomlDottedKeyParserException(lineNumber.Value, ourKeyName);
					}
					throw new TomlDottedKeyException(ourKeyName);
				}
				if (callParserForm)
				{
					tomlTable2.ParserPutValue(restOfKey, value, lineNumber.Value);
				}
				else
				{
					tomlTable2.PutValue(restOfKey, value);
				}
			}
			else
			{
				key = DeQuoteKey(key);
				if (Entries.ContainsKey(key) && lineNumber.HasValue)
				{
					throw new TomlKeyRedefinitionException(lineNumber.Value, key);
				}
				Entries[key] = value;
			}
		}

		public bool ContainsKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlKeyUtils.GetTopLevelAndSubKeys(key, out string ourKeyName, out string restOfKey);
			if (string.IsNullOrEmpty(restOfKey))
			{
				return Entries.ContainsKey(DeQuoteKey(key));
			}
			if (!Entries.TryGetValue(ourKeyName, out TomlValue value))
			{
				return false;
			}
			if (value is TomlTable tomlTable)
			{
				return tomlTable.ContainsKey(restOfKey);
			}
			throw new TomlContainsDottedKeyNonTableException(key);
		}

		public TomlValue GetValue(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			if (!ContainsKey(key))
			{
				throw new TomlNoSuchValueException(key);
			}
			TomlKeyUtils.GetTopLevelAndSubKeys(key, out string ourKeyName, out string restOfKey);
			if (string.IsNullOrEmpty(restOfKey))
			{
				return Entries[DeQuoteKey(key)];
			}
			if (!Entries.TryGetValue(ourKeyName, out TomlValue value))
			{
				throw new TomlNoSuchValueException(key);
			}
			if (value is TomlTable tomlTable)
			{
				return tomlTable.GetValue(restOfKey);
			}
			throw new Exception("Tomlet Internal bug - existing key is not a table in TomlTable GetValue, but we didn't throw in ContainsKey?");
		}

		public string GetString(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return ((value as TomlString) ?? throw new TomlTypeMismatchException(typeof(TomlString), value.GetType(), typeof(string))).Value;
		}

		public int GetInteger(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return (int)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(int))).Value;
		}

		public long GetLong(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return ((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(int))).Value;
		}

		public float GetFloat(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return (float)((value as TomlDouble) ?? throw new TomlTypeMismatchException(typeof(TomlDouble), value.GetType(), typeof(float))).Value;
		}

		public bool GetBoolean(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return ((value as TomlBoolean) ?? throw new TomlTypeMismatchException(typeof(TomlBoolean), value.GetType(), typeof(bool))).Value;
		}

		public TomlArray GetArray(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return (value as TomlArray) ?? throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), typeof(TomlArray));
		}

		public TomlTable GetSubTable(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key));
			return (value as TomlTable) ?? throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), typeof(TomlTable));
		}
	}
	public abstract class TomlValue
	{
		public TomlCommentData Comments { get; } = new TomlCommentData();


		public abstract string StringValue { get; }

		public abstract string SerializedValue { get; }
	}
	public interface ITomlValueWithDateTime
	{
		DateTime Value { get; }
	}
}
namespace Tomlet.Exceptions
{
	public class InvalidTomlDateTimeException : TomlExceptionWithLine
	{
		private readonly string _inputString;

		public override string Message => $"Found an invalid TOML date/time string '{_inputString}' on line {LineNumber}";

		public InvalidTomlDateTimeException(int lineNumber, string inputString)
			: base(lineNumber)
		{
			_inputString = inputString;
		}
	}
	public class InvalidTomlEscapeException : TomlExceptionWithLine
	{
		private readonly string _escapeSequence;

		public override string Message => $"Found an invalid escape sequence '\\{_escapeSequence}' on line {LineNumber}";

		public InvalidTomlEscapeException(int lineNumber, string escapeSequence)
			: base(lineNumber)
		{
			_escapeSequence = escapeSequence;
		}
	}
	public class InvalidTomlInlineTableException : TomlExceptionWithLine
	{
		public override string Message => $"Found an invalid inline TOML table on line {LineNumber}. See further down for cause.";

		public InvalidTomlInlineTableException(int lineNumber, TomlException cause)
			: base(lineNumber, cause)
		{
		}
	}
	public class InvalidTomlKeyException : TomlException
	{
		private readonly string _key;

		public override string Message => "The string |" + _key + "| (between the two bars) contains at least one of both a double quote and a single quote, so it cannot be used for a TOML key.";

		public InvalidTomlKeyException(string key)
		{
			_key = key;
		}
	}
	public class InvalidTomlNumberException : TomlExceptionWithLine
	{
		private readonly string _input;

		public override string Message => $"While reading input line {LineNumber}, found an invalid number literal '{_input}'";

		public InvalidTomlNumberException(int lineNumber, string input)
			: base(lineNumber)
		{
			_input = input;
		}
	}
	public class MissingIntermediateInTomlTableArraySpecException : TomlExceptionWithLine
	{
		private readonly string _missing;

		public override string Message => $"Missing intermediate definition for {_missing} in table-array specification on line {LineNumber}. This is undefined behavior, and I chose to define it as an error.";

		public MissingIntermediateInTomlTableArraySpecException(int lineNumber, string missing)
			: base(lineNumber)
		{
			_missing = missing;
		}
	}
	public class NewLineInTomlInlineTableException : TomlExceptionWithLine
	{
		public override string Message => "Found a new-line character within a TOML inline table. This is not allowed.";

		public NewLineInTomlInlineTableException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class NoTomlKeyException : TomlExceptionWithLine
	{
		public override string Message => $"Expected a TOML key on line {LineNumber}, but found an equals sign ('=').";

		public NoTomlKeyException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TimeOffsetOnTomlDateOrTimeException : TomlExceptionWithLine
	{
		private readonly string _tzString;

		public override string Message => $"Found a time offset string {_tzString} in a partial datetime on line {LineNumber}. This is not allowed - either specify both the date and the time, or remove the offset specifier.";

		public TimeOffsetOnTomlDateOrTimeException(int lineNumber, string tzString)
			: base(lineNumber)
		{
			_tzString = tzString;
		}
	}
	public class TomlArraySyntaxException : TomlExceptionWithLine
	{
		private readonly char _charFound;

		public override string Message => $"Expecting ',' or ']' after value in array on line {LineNumber}, found '{_charFound}'";

		public TomlArraySyntaxException(int lineNumber, char charFound)
			: base(lineNumber)
		{
			_charFound = charFound;
		}
	}
	public class TomlContainsDottedKeyNonTableException : TomlException
	{
		internal readonly string Key;

		public override string Message => "A call was made on a TOML table which attempted to access a sub-key of " + Key + ", but the value it refers to is not a table";

		public TomlContainsDottedKeyNonTableException(string key)
		{
			Key = key;
		}
	}
	public class TomlDateTimeMissingSeparatorException : TomlExceptionWithLine
	{
		public override string Message => $"Found a date-time on line {LineNumber} which is missing a separator (T, t, or a space) between the date and time.";

		public TomlDateTimeMissingSeparatorException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TomlDateTimeUnnecessarySeparatorException : TomlExceptionWithLine
	{
		public override string Message => $"Found an unnecessary date-time separator (T, t, or a space) in a date or time on line {LineNumber}";

		public TomlDateTimeUnnecessarySeparatorException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TomlDottedKeyException : TomlException
	{
		private readonly string _key;

		public override string Message => "Tried to redefine key " + _key + " as a table (by way of a dotted key) when it's already defined as not being a table.";

		public TomlDottedKeyException(string key)
		{
			_key = key;
		}
	}
	public class TomlDottedKeyParserException : TomlExceptionWithLine
	{
		private readonly string _key;

		public override string Message => $"Tried to redefine key {_key} as a table (by way of a dotted key on line {LineNumber}) when it's already defined as not being a table.";

		public TomlDottedKeyParserException(int lineNumber, string key)
			: base(lineNumber)
		{
			_key = key;
		}
	}
	public class TomlDoubleDottedKeyException : TomlExceptionWithLine
	{
		public override string Message => "Found two consecutive dots, or a leading dot, in a key on line " + LineNumber;

		public TomlDoubleDottedKeyException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TomlEndOfFileException : TomlExceptionWithLine
	{
		public override string Message => $"Found unexpected EOF on line {LineNumber} when parsing TOML file";

		public TomlEndOfFileException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TomlEnumParseException : TomlException
	{
		private string _valueName;

		private Type _enumType;

		public override string Message => $"Could not find enum value by name \"{_valueName}\" in enum class {_enumType} while deserializing.";

		public TomlEnumParseException(string valueName, Type enumType)
		{
			_valueName = valueName;
			_enumType = enumType;
		}
	}
	public abstract class TomlException : Exception
	{
		protected TomlException()
		{
		}

		protected TomlException(Exception cause)
			: base("", cause)
		{
		}
	}
	public abstract class TomlExceptionWithLine : TomlException
	{
		protected int LineNumber;

		protected TomlExceptionWithLine(int lineNumber)
		{
			LineNumber = lineNumber;
		}

		protected TomlExceptionWithLine(int lineNumber, Exception cause)
			: base(cause)
		{
			LineNumber = lineNumber;
		}
	}
	public class TomlFieldTypeMismatchException : TomlTypeMismatchException
	{
		private readonly Type _typeBeingInstantiated;

		private readonly FieldInfo _fieldBeingDeserialized;

		public override string Message => $"While deserializing an object of type {_typeBeingInstantiated}, found field {_fieldBeingDeserialized.Name} expecting a type of {ExpectedTypeName}, but value in TOML was of type {ActualTypeName}";

		public TomlFieldTypeMismatchException(Type typeBeingInstantiated, FieldInfo fieldBeingDeserialized, TomlTypeMismatchException cause)
			: base(cause.ExpectedType, cause.ActualType, fieldBeingDeserialized.FieldType)
		{
			_typeBeingInstantiated = typeBeingInstantiated;
			_fieldBeingDeserialized = fieldBeingDeserialized;
		}
	}
	public class TomlInlineTableSeparatorException : TomlExceptionWithLine
	{
		private readonly char _found;

		public override string Message => $"Expected '}}' or ',' after key-value pair in TOML inline table, found '{_found}'";

		public TomlInlineTableSeparatorException(int lineNumber, char found)
			: base(lineNumber)
		{
			_found = found;
		}
	}
	public class TomlInstantiationException : TomlException
	{
		private readonly Type _type;

		public override string Message => "Could not find a no-argument constructor for type " + _type.FullName;

		public TomlInstantiationException(Type type)
		{
			_type = type;
		}
	}
	public class TomlInternalException : TomlExceptionWithLine
	{
		public override string Message => $"An internal exception occured while parsing line {LineNumber} of the TOML document";

		public TomlInternalException(int lineNumber, Exception cause)
			: base(lineNumber, cause)
		{
		}
	}
	public class TomlInvalidValueException : TomlExceptionWithLine
	{
		private readonly char _found;

		public override string Message => $"Expected the start of a number, string literal, boolean, array, or table on line {LineNumber}, found '{_found}'";

		public TomlInvalidValueException(int lineNumber, char found)
			: base(lineNumber)
		{
			_found = found;
		}
	}
	public class TomlKeyRedefinitionException : TomlExceptionWithLine
	{
		private readonly string _key;

		public override string Message => $"TOML document attempts to re-define key '{_key}' on line {LineNumber}";

		public TomlKeyRedefinitionException(int lineNumber, string key)
			: base(lineNumber)
		{
			_key = key;
		}
	}
	public class TomlMissingEqualsException : TomlExceptionWithLine
	{
		private readonly char _found;

		public override string Message => $"Expecting an equals sign ('=') on line {LineNumber}, but found '{_found}'";

		public TomlMissingEqualsException(int lineNumber, char found)
			: base(lineNumber)
		{
			_found = found;
		}
	}
	public class TomlMissingNewlineException : TomlExceptionWithLine
	{
		private readonly char _found;

		public override string Message => $"Expecting a newline character at the end of a statement on line {LineNumber}, but found an unexpected '{_found}'";

		public TomlMissingNewlineException(int lineNumber, char found)
			: base(lineNumber)
		{
			_found = found;
		}
	}
	public class TomlNewlineInInlineCommentException : TomlException
	{
		public override string Message => "An attempt was made to set an inline comment which contains a newline. This obviously cannot be done, as inline comments must fit on one line.";
	}
	public class TomlNonTableArrayUsedAsTableArrayException : TomlExceptionWithLine
	{
		private readonly string _arrayName;

		public override string Message => $"{_arrayName} is used as a table-array on line {LineNumber} when it has previously been defined as a static array. This is not allowed.";

		public TomlNonTableArrayUsedAsTableArrayException(int lineNumber, string arrayName)
			: base(lineNumber)
		{
			_arrayName = arrayName;
		}
	}
	public class TomlNoSuchValueException : TomlException
	{
		private readonly string _key;

		public override string Message => "Attempted to get the value for key " + _key + " but no value is associated with that key";

		public TomlNoSuchValueException(string key)
		{
			_key = key;
		}
	}
	public class TomlPrimitiveToDocumentException : TomlException
	{
		private Type primitiveType;

		public override string Message => "Tried to create a TOML document from a primitive value of type " + primitiveType.Name + ". Documents can only be created from objects.";

		public TomlPrimitiveToDocumentException(Type primitiveType)
		{
			this.primitiveType = primitiveType;
		}
	}
	public class TomlStringException : TomlExceptionWithLine
	{
		public override string Message => $"Found an invalid TOML string on line {LineNumber}";

		public TomlStringException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TomlTableArrayAlreadyExistsAsNonArrayException : TomlExceptionWithLine
	{
		private readonly string _arrayName;

		public override string Message => $"{_arrayName} is defined as a table-array (double-bracketed section) on line {LineNumber} but it has previously been used as a non-array type.";

		public TomlTableArrayAlreadyExistsAsNonArrayException(int lineNumber, string arrayName)
			: base(lineNumber)
		{
			_arrayName = arrayName;
		}
	}
	public class TomlTableLockedException : TomlExceptionWithLine
	{
		private readonly string _key;

		public override string Message => $"TOML table is locked (e.g. defined inline), cannot add or update key {_key} to it on line {LineNumber}";

		public TomlTableLockedException(int lineNumber, string key)
			: base(lineNumber)
		{
			_key = key;
		}
	}
	public class TomlTableRedefinitionException : TomlExceptionWithLine
	{
		private readonly string _key;

		public override string Message => $"TOML document attempts to re-define table '{_key}' on line {LineNumber}";

		public TomlTableRedefinitionException(int lineNumber, string key)
			: base(lineNumber)
		{
			_key = key;
		}
	}
	public class TomlTripleQuotedKeyException : TomlExceptionWithLine
	{
		public override string Message => $"Found a triple-quoted key on line {LineNumber}. This is not allowed.";

		public TomlTripleQuotedKeyException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TomlTypeMismatchException : TomlException
	{
		protected readonly string ExpectedTypeName;

		protected readonly string ActualTypeName;

		protected internal readonly Type ExpectedType;

		protected internal readonly Type ActualType;

		private readonly Type _context;

		public override string Message => $"While trying to convert to type {_context}, a TOML value of type {ExpectedTypeName} was required but a value of type {ActualTypeName} was found";

		public TomlTypeMismatchException(Type expected, Type actual, Type context)
		{
			ExpectedTypeName = (typeof(TomlValue).IsAssignableFrom(expected) ? expected.Name.Replace("Toml", "") : expected.Name);
			ActualTypeName = (typeof(TomlValue).IsAssignableFrom(actual) ? actual.Name.Replace("Toml", "") : actual.Name);
			ExpectedType = expected;
			ActualType = actual;
			_context = context;
		}
	}
	public class TomlUnescapedUnicodeControlCharException : TomlExceptionWithLine
	{
		private readonly int _theChar;

		public override string Message => $"Found an unescaped unicode control character U+{_theChar:0000} on line {LineNumber}. Control character other than tab (U+0009) are not allowed in TOML unless they are escaped.";

		public TomlUnescapedUnicodeControlCharException(int lineNumber, int theChar)
			: base(lineNumber)
		{
			_theChar = theChar;
		}
	}
	public class TomlWhitespaceInKeyException : TomlExceptionWithLine
	{
		public override string Message => "Found whitespace in an unquoted TOML key at line " + LineNumber;

		public TomlWhitespaceInKeyException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TripleQuoteInTomlMultilineLiteralException : TomlExceptionWithLine
	{
		public override string Message => $"Found a triple-single-quote (''') inside a multiline string literal on line {LineNumber}. This is not allowed.";

		public TripleQuoteInTomlMultilineLiteralException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class TripleQuoteInTomlMultilineSimpleStringException : TomlExceptionWithLine
	{
		public override string Message => $"Found a triple-double-quote (\"\"\") inside a multiline simple string on line {LineNumber}. This is not allowed.";

		public TripleQuoteInTomlMultilineSimpleStringException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class UnterminatedTomlKeyException : TomlExceptionWithLine
	{
		public override string Message => $"Found an unterminated quoted key on line {LineNumber}";

		public UnterminatedTomlKeyException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class UnterminatedTomlStringException : TomlExceptionWithLine
	{
		public override string Message => $"Found an unterminated TOML string on line {LineNumber}";

		public UnterminatedTomlStringException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class UnterminatedTomlTableArrayException : TomlExceptionWithLine
	{
		public override string Message => $"Found an unterminated table-array (expecting two ]s to close it) on line {LineNumber}";

		public UnterminatedTomlTableArrayException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
	public class UnterminatedTomlTableNameException : TomlExceptionWithLine
	{
		public override string Message => $"Found an unterminated table name on line {LineNumber}";

		public UnterminatedTomlTableNameException(int lineNumber)
			: base(lineNumber)
		{
		}
	}
}
namespace Tomlet.Attributes
{
	internal class NoCoverageAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Class)]
	public class TomlDoNotInlineObjectAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
	public class TomlInlineCommentAttribute : Attribute
	{
		internal string Comment { get; }

		public TomlInlineCommentAttribute(string comment)
		{
			Comment = comment;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
	public class TomlPrecedingCommentAttribute : Attribute
	{
		internal string Comment { get; }

		public TomlPrecedingCommentAttribute(string comment)
		{
			Comment = comment;
		}
	}
	[AttributeUsage(AttributeTargets.Property)]
	public class TomlPropertyAttribute : Attribute
	{
		private readonly string _mapFrom;

		public TomlPropertyAttribute(string mapFrom)
		{
			_mapFrom = mapFrom;
		}

		public string GetMappedString()
		{
			return _mapFrom;
		}
	}
}

UnityExplorer.BIE5.Mono.dll

Decompiled a year ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.SymbolStore;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Xml;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Mono.CSharp;
using Mono.CSharp.IL2CPP;
using Mono.CSharp.Linq;
using Mono.CSharp.Nullable;
using Mono.CSharp.yyParser;
using Mono.CSharp.yydebug;
using Mono.CompilerServices.SymbolWriter;
using MonoMod.RuntimeDetour;
using Tomlet;
using Tomlet.Attributes;
using Tomlet.Exceptions;
using Tomlet.Models;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityExplorer.CSConsole;
using UnityExplorer.CSConsole.Lexers;
using UnityExplorer.CacheObject;
using UnityExplorer.CacheObject.IValues;
using UnityExplorer.CacheObject.Views;
using UnityExplorer.Config;
using UnityExplorer.Hooks;
using UnityExplorer.Inspectors;
using UnityExplorer.Inspectors.MouseInspectors;
using UnityExplorer.Loader.BIE;
using UnityExplorer.ObjectExplorer;
using UnityExplorer.Runtime;
using UnityExplorer.UI;
using UnityExplorer.UI.Panels;
using UnityExplorer.UI.Widgets;
using UnityExplorer.UI.Widgets.AutoComplete;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ButtonList;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: AssemblyCopyright("")]
[assembly: AssemblyProduct("UnityExplorer")]
[assembly: AssemblyCompany("Sinai")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyFileVersion("4.8.2")]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: ComVisible(false)]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyTitle("UnityExplorer")]
[assembly: AssemblyDescription("")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: CompilationRelaxations(8)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("4.8.2.0")]
[module: UnverifiableCode]
namespace UnityExplorer
{
	public class ExplorerBehaviour : MonoBehaviour
	{
		internal bool quitting;

		internal static ExplorerBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			GameObject val = new GameObject("ExplorerBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)61;
			Instance = val.AddComponent<ExplorerBehaviour>();
		}

		internal void Update()
		{
			ExplorerCore.Update();
		}

		internal void OnDestroy()
		{
			OnApplicationQuit();
		}

		internal void OnApplicationQuit()
		{
			if (!quitting)
			{
				quitting = true;
				GameObject uIRoot = UIManager.UIRoot;
				TryDestroy((uIRoot != null) ? ((Component)uIRoot.transform.root).gameObject : null);
				object? value = typeof(Universe).Assembly.GetType("UniverseLib.UniversalBehaviour").GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null);
				TryDestroy(((Component)((value is Component) ? value : null)).gameObject);
				TryDestroy(((Component)this).gameObject);
			}
		}

		internal void TryDestroy(GameObject obj)
		{
			try
			{
				if (Object.op_Implicit((Object)(object)obj))
				{
					Object.Destroy((Object)(object)obj);
				}
			}
			catch
			{
			}
		}
	}
	public static class ExplorerCore
	{
		public const string NAME = "UnityExplorer";

		public const string VERSION = "4.8.2";

		public const string AUTHOR = "Sinai";

		public const string GUID = "com.sinai.unityexplorer";

		public const string DEFAULT_EXPLORER_FOLDER_NAME = "sinai-dev-UnityExplorer";

		public static IExplorerLoader Loader { get; private set; }

		public static string ExplorerFolder => Path.Combine(Loader.ExplorerFolderDestination, Loader.ExplorerFolderName);

		public static Harmony Harmony { get; } = new Harmony("com.sinai.unityexplorer");


		public static void Init(IExplorerLoader loader)
		{
			//IL_006f: 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)
			if (Loader != null)
			{
				throw new Exception("UnityExplorer is already loaded.");
			}
			Loader = loader;
			Log("UnityExplorer 4.8.2 initializing...");
			CheckLegacyExplorerFolder();
			Directory.CreateDirectory(ExplorerFolder);
			ConfigManager.Init(Loader.ConfigHandler);
			Universe.Init(ConfigManager.Startup_Delay_Time.Value, (Action)LateInit, (Action<string, LogType>)Log, new UniverseLibConfig
			{
				Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value,
				Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value,
				Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder
			});
			UERuntimeHelper.Init();
			ExplorerBehaviour.Setup();
			UnityCrashPrevention.Init();
		}

		private static void LateInit()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			SceneHandler.Init();
			Log("Creating UI...");
			UIManager.InitUI();
			Log(string.Format("{0} {1} ({2}) initialized.", "UnityExplorer", "4.8.2", Universe.Context));
		}

		internal static void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (InputManager.GetKeyDown(ConfigManager.Master_Toggle.Value))
			{
				UIManager.ShowMenu = !UIManager.ShowMenu;
			}
		}

		public static void Log(object message)
		{
			Log(message, (LogType)3);
		}

		public static void LogWarning(object message)
		{
			Log(message, (LogType)2);
		}

		public static void LogError(object message)
		{
			Log(message, (LogType)0);
		}

		public static void LogUnity(object message, LogType logType)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (ConfigManager.Log_Unity_Debug.Value)
			{
				Log($"[Unity] {message}", logType);
			}
		}

		private static void Log(object message, LogType logType)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected I4, but got Unknown
			string text = message?.ToString() ?? "";
			LogPanel.Log(text, logType);
			switch ((int)logType)
			{
			case 1:
			case 3:
				Loader.OnLogMessage(text);
				break;
			case 2:
				Loader.OnLogWarning(text);
				break;
			case 0:
			case 4:
				Loader.OnLogError(text);
				break;
			}
		}

		private static void CheckLegacyExplorerFolder()
		{
			string text = Path.Combine(Loader.ExplorerFolderDestination, "UnityExplorer");
			if (!Directory.Exists(text))
			{
				return;
			}
			LogWarning("Attempting to migrate old 'UnityExplorer/' folder to 'sinai-dev-UnityExplorer/'...");
			if (!Directory.Exists(ExplorerFolder))
			{
				try
				{
					Directory.Move(text, ExplorerFolder);
					Log("Migrated successfully.");
					return;
				}
				catch (Exception arg)
				{
					LogWarning($"Exception migrating folder: {arg}");
					return;
				}
			}
			try
			{
				CopyAll(new DirectoryInfo(text), new DirectoryInfo(ExplorerFolder));
				Directory.Delete(text, recursive: true);
				Log("Migrated successfully.");
			}
			catch (Exception arg2)
			{
				LogWarning($"Exception migrating folder: {arg2}");
			}
		}

		public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
		{
			Directory.CreateDirectory(target.FullName);
			FileInfo[] files = source.GetFiles();
			foreach (FileInfo fileInfo in files)
			{
				fileInfo.MoveTo(Path.Combine(target.ToString(), fileInfo.Name));
			}
			DirectoryInfo[] directories = source.GetDirectories();
			foreach (DirectoryInfo directoryInfo in directories)
			{
				DirectoryInfo target2 = target.CreateSubdirectory(directoryInfo.Name);
				CopyAll(directoryInfo, target2);
			}
		}
	}
	public static class InspectorManager
	{
		public static readonly List<InspectorBase> Inspectors = new List<InspectorBase>();

		private static InspectorBase lastActiveInspector;

		public static float PanelWidth;

		public static InspectorBase ActiveInspector { get; private set; }

		public static event Action OnInspectedTabsChanged;

		public static void Inspect(object obj, CacheObjectBase parent = null)
		{
			if (UnityHelpers.IsNullOrDestroyed(obj, true))
			{
				return;
			}
			obj = ReflectionExtensions.TryCast(obj);
			if (!TryFocusActiveInspector(obj))
			{
				if (obj is GameObject)
				{
					CreateInspector<GameObjectInspector>(obj);
				}
				else
				{
					CreateInspector<ReflectionInspector>(obj, staticReflection: false, parent);
				}
			}
		}

		public static void Inspect(Type type)
		{
			if (!TryFocusActiveInspector(type))
			{
				CreateInspector<ReflectionInspector>(type, staticReflection: true);
			}
		}

		private static bool TryFocusActiveInspector(object target)
		{
			foreach (InspectorBase inspector in Inspectors)
			{
				bool flag = false;
				if (target is Type type)
				{
					if (inspector.TargetType.FullName == type.FullName)
					{
						flag = true;
					}
				}
				else if (ReflectionExtensions.ReferenceEqual(inspector.Target, target))
				{
					flag = true;
				}
				if (flag)
				{
					UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true);
					SetInspectorActive(inspector);
					return true;
				}
			}
			return false;
		}

		public static void SetInspectorActive(InspectorBase inspector)
		{
			UnsetActiveInspector();
			ActiveInspector = inspector;
			inspector.OnSetActive();
		}

		public static void UnsetActiveInspector()
		{
			if (ActiveInspector != null)
			{
				lastActiveInspector = ActiveInspector;
				ActiveInspector.OnSetInactive();
				ActiveInspector = null;
			}
		}

		public static void CloseAllTabs()
		{
			if (Inspectors.Any())
			{
				for (int num = Inspectors.Count - 1; num >= 0; num--)
				{
					Inspectors[num].CloseInspector();
				}
				Inspectors.Clear();
			}
			UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false);
		}

		private static void CreateInspector<T>(object target, bool staticReflection = false, CacheObjectBase parent = null) where T : InspectorBase
		{
			T val = Pool<T>.Borrow();
			Inspectors.Add(val);
			val.Target = target;
			if (parent != null && parent.CanWrite && target.GetType().IsValueType && val is ReflectionInspector reflectionInspector)
			{
				reflectionInspector.ParentCacheObject = parent;
			}
			UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true);
			val.UIRoot.transform.SetParent(InspectorPanel.Instance.ContentHolder.transform, false);
			if (val is ReflectionInspector reflectionInspector2)
			{
				reflectionInspector2.StaticOnly = staticReflection;
			}
			val.OnBorrowedFromPool(target);
			SetInspectorActive(val);
			InspectorManager.OnInspectedTabsChanged?.Invoke();
		}

		public static void ReleaseInspector<T>(T inspector) where T : InspectorBase
		{
			if (lastActiveInspector == inspector)
			{
				lastActiveInspector = null;
			}
			bool flag = ActiveInspector == inspector;
			int num = Inspectors.IndexOf(inspector);
			Inspectors.Remove(inspector);
			inspector.OnReturnToPool();
			Pool<T>.Return(inspector);
			if (flag)
			{
				ActiveInspector = null;
				if (lastActiveInspector != null)
				{
					SetInspectorActive(lastActiveInspector);
					lastActiveInspector = null;
				}
				else if (Inspectors.Any())
				{
					int index = Math.Min(Inspectors.Count - 1, Math.Max(0, num - 1));
					SetInspectorActive(Inspectors[index]);
				}
				else
				{
					UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false);
				}
			}
			InspectorManager.OnInspectedTabsChanged?.Invoke();
		}

		internal static void Update()
		{
			for (int num = Inspectors.Count - 1; num >= 0; num--)
			{
				Inspectors[num].Update();
			}
		}

		internal static void OnPanelResized(float width)
		{
			PanelWidth = width;
			foreach (InspectorBase inspector in Inspectors)
			{
				if (inspector is ReflectionInspector reflectionInspector)
				{
					reflectionInspector.SetLayouts();
				}
			}
		}
	}
	[BepInPlugin("com.sinai.unityexplorer", "UnityExplorer", "4.8.2")]
	public class ExplorerBepInPlugin : BaseUnityPlugin, IExplorerLoader
	{
		public static ExplorerBepInPlugin Instance;

		private BepInExConfigHandler _configHandler;

		private static readonly Harmony s_harmony = new Harmony("com.sinai.unityexplorer");

		public ManualLogSource LogSource => ((BaseUnityPlugin)this).Logger;

		public string UnhollowedModulesFolder => Path.Combine(Paths.BepInExRootPath, "unhollowed");

		public ConfigHandler ConfigHandler => _configHandler;

		public Harmony HarmonyInstance => s_harmony;

		public string ExplorerFolderName => "sinai-dev-UnityExplorer";

		public string ExplorerFolderDestination => Paths.PluginPath;

		public Action<object> OnLogMessage => LogSource.LogMessage;

		public Action<object> OnLogWarning => LogSource.LogWarning;

		public Action<object> OnLogError => LogSource.LogError;

		private void Init()
		{
			Instance = this;
			_configHandler = new BepInExConfigHandler();
			ExplorerCore.Init(this);
		}

		internal void Awake()
		{
			Init();
		}
	}
	public interface IExplorerLoader
	{
		string ExplorerFolderDestination { get; }

		string ExplorerFolderName { get; }

		string UnhollowedModulesFolder { get; }

		ConfigHandler ConfigHandler { get; }

		Action<object> OnLogMessage { get; }

		Action<object> OnLogWarning { get; }

		Action<object> OnLogError { get; }
	}
}
namespace UnityExplorer.UI
{
	public static class DisplayManager
	{
		private static Camera canvasCamera;

		public static int ActiveDisplayIndex { get; private set; }

		public static Display ActiveDisplay => Display.displays[ActiveDisplayIndex];

		public static int Width => ActiveDisplay.renderingWidth;

		public static int Height => ActiveDisplay.renderingHeight;

		public static Vector3 MousePosition => Application.isEditor ? InputManager.MousePosition : Display.RelativeMouseAt(InputManager.MousePosition);

		public static bool MouseInTargetDisplay => MousePosition.z == (float)ActiveDisplayIndex;

		internal static void Init()
		{
			SetDisplay(ConfigManager.Target_Display.Value);
			ConfigElement<int> target_Display = ConfigManager.Target_Display;
			target_Display.OnValueChanged = (Action<int>)System.Delegate.Combine(target_Display.OnValueChanged, new Action<int>(SetDisplay));
		}

		public static void SetDisplay(int display)
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			if (ActiveDisplayIndex == display)
			{
				return;
			}
			if (Display.displays.Length <= display)
			{
				ExplorerCore.LogWarning($"Cannot set display index to {display} as there are not enough monitors connected!");
				if (ConfigManager.Target_Display.Value == display)
				{
					ConfigManager.Target_Display.Value = 0;
				}
				return;
			}
			ActiveDisplayIndex = display;
			ActiveDisplay.Activate();
			UIManager.UICanvas.targetDisplay = display;
			if (!Object.op_Implicit((Object)(object)Camera.main) || Camera.main.targetDisplay != display)
			{
				if (!Object.op_Implicit((Object)(object)canvasCamera))
				{
					canvasCamera = new GameObject("UnityExplorer_CanvasCamera").AddComponent<Camera>();
					Object.DontDestroyOnLoad((Object)(object)((Component)canvasCamera).gameObject);
					((Object)canvasCamera).hideFlags = (HideFlags)61;
				}
				canvasCamera.targetDisplay = display;
			}
			RuntimeHelper.StartCoroutine(FixPanels());
		}

		private static IEnumerator FixPanels()
		{
			yield return null;
			yield return null;
			foreach (UEPanel panel in UIManager.UIPanels.Values)
			{
				((PanelBase)panel).EnsureValidSize();
				((PanelBase)panel).EnsureValidPosition();
				((PanelBase)panel).Dragger.OnEndResize();
			}
		}
	}
	internal class ExplorerUIBase : UIBase
	{
		public ExplorerUIBase(string id, Action updateMethod)
			: base(id, updateMethod)
		{
		}

		protected override PanelManager CreatePanelManager()
		{
			return (PanelManager)(object)new UEPanelManager((UIBase)(object)this);
		}
	}
	public static class Notification
	{
		private static Text popupLabel;

		private static string _currentNotification;

		private static float _timeOfLastNotification;

		public static void Init()
		{
			ConstructUI();
		}

		public static void ShowMessage(string message)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			popupLabel.text = message;
			_currentNotification = message;
			_timeOfLastNotification = Time.realtimeSinceStartup;
			((Component)popupLabel).transform.localPosition = ((Transform)UIManager.UIRootRect).InverseTransformPoint(DisplayManager.MousePosition) + Vector3.up * 25f;
		}

		public static void Update()
		{
			if (_currentNotification != null && Time.realtimeSinceStartup - _timeOfLastNotification > 2f)
			{
				_currentNotification = null;
				popupLabel.text = "";
			}
		}

		private static void ConstructUI()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: 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)
			popupLabel = UIFactory.CreateLabel(UIManager.UIRoot, "ClipboardNotification", "", (TextAnchor)4, default(Color), true, 14);
			((Graphic)popupLabel).rectTransform.sizeDelta = new Vector2(500f, 100f);
			((Component)popupLabel).gameObject.AddComponent<Outline>();
			CanvasGroup val = ((Component)popupLabel).gameObject.AddComponent<CanvasGroup>();
			val.blocksRaycasts = false;
		}
	}
	public class UEPanelManager : PanelManager
	{
		protected override Vector3 MousePosition => DisplayManager.MousePosition;

		protected override Vector2 ScreenDimensions => new Vector2((float)DisplayManager.Width, (float)DisplayManager.Height);

		protected override bool MouseInTargetDisplay => DisplayManager.MouseInTargetDisplay;

		public UEPanelManager(UIBase owner)
			: base(owner)
		{
		}

		internal void DoInvokeOnPanelsReordered()
		{
			((PanelManager)this).InvokeOnPanelsReordered();
		}

		protected override void SortDraggerHeirarchy()
		{
			((PanelManager)this).SortDraggerHeirarchy();
			if (!UIManager.Initializing && AutoCompleteModal.Instance != null)
			{
				base.draggerInstances.Remove(((PanelBase)AutoCompleteModal.Instance).Dragger);
				base.draggerInstances.Insert(0, ((PanelBase)AutoCompleteModal.Instance).Dragger);
			}
		}
	}
	public static class UIManager
	{
		public enum Panels
		{
			ObjectExplorer,
			Inspector,
			CSConsole,
			Options,
			ConsoleLog,
			AutoCompleter,
			UIInspectorResults,
			HookManager,
			Clipboard,
			Freecam
		}

		public enum VerticalAnchor
		{
			Top,
			Bottom
		}

		public static VerticalAnchor NavbarAnchor = VerticalAnchor.Top;

		internal static readonly Dictionary<Panels, UEPanel> UIPanels = new Dictionary<Panels, UEPanel>();

		public static RectTransform NavBarRect;

		public static GameObject NavbarTabButtonHolder;

		private static readonly Vector2 NAVBAR_DIMENSIONS = new Vector2(1020f, 35f);

		private static ButtonRef closeBtn;

		private static TimeScaleWidget timeScaleWidget;

		private static int lastScreenWidth;

		private static int lastScreenHeight;

		public static bool Initializing { get; internal set; } = true;


		internal static UIBase UiBase { get; private set; }

		public static GameObject UIRoot
		{
			get
			{
				UIBase uiBase = UiBase;
				return (uiBase != null) ? uiBase.RootObject : null;
			}
		}

		public static RectTransform UIRootRect { get; private set; }

		public static Canvas UICanvas { get; private set; }

		public static bool ShowMenu
		{
			get
			{
				return UiBase != null && UiBase.Enabled;
			}
			set
			{
				if (UiBase != null && Object.op_Implicit((Object)(object)UIRoot) && UiBase.Enabled != value)
				{
					UniversalUI.SetUIActive("com.sinai.unityexplorer", value);
					UniversalUI.SetUIActive(MouseInspector.UIBaseGUID, value);
				}
			}
		}

		internal static void InitUI()
		{
			UiBase = (UIBase)(object)UniversalUI.RegisterUI<ExplorerUIBase>("com.sinai.unityexplorer", (Action)Update);
			UIRootRect = UIRoot.GetComponent<RectTransform>();
			UICanvas = UIRoot.GetComponent<Canvas>();
			DisplayManager.Init();
			Display activeDisplay = DisplayManager.ActiveDisplay;
			lastScreenWidth = activeDisplay.renderingWidth;
			lastScreenHeight = activeDisplay.renderingHeight;
			CreateTopNavBar();
			UIPanels.Add(Panels.AutoCompleter, new AutoCompleteModal(UiBase));
			UIPanels.Add(Panels.ObjectExplorer, new ObjectExplorerPanel(UiBase));
			UIPanels.Add(Panels.Inspector, new InspectorPanel(UiBase));
			UIPanels.Add(Panels.CSConsole, new CSConsolePanel(UiBase));
			UIPanels.Add(Panels.HookManager, new HookManagerPanel(UiBase));
			UIPanels.Add(Panels.Freecam, new FreeCamPanel(UiBase));
			UIPanels.Add(Panels.Clipboard, new ClipboardPanel(UiBase));
			UIPanels.Add(Panels.ConsoleLog, new LogPanel(UiBase));
			UIPanels.Add(Panels.Options, new OptionsPanel(UiBase));
			UIPanels.Add(Panels.UIInspectorResults, new MouseInspectorResultsPanel(UiBase));
			MouseInspector.inspectorUIBase = UniversalUI.RegisterUI(MouseInspector.UIBaseGUID, (Action)null);
			new MouseInspector(MouseInspector.inspectorUIBase);
			Notification.Init();
			ConsoleController.Init();
			Dropdown[] componentsInChildren = UIRoot.GetComponentsInChildren<Dropdown>(true);
			foreach (Dropdown val in componentsInChildren)
			{
				val.RefreshShownValue();
			}
			Initializing = false;
			if (ConfigManager.Hide_On_Startup.Value)
			{
				ShowMenu = false;
			}
		}

		public static void Update()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)UIRoot) && !MouseInspector.Instance.TryUpdate())
			{
				Notification.Update();
				if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
				{
					ConfigManager.Force_Unlock_Mouse = !ConfigManager.Force_Unlock_Mouse;
				}
				timeScaleWidget.Update();
				Display activeDisplay = DisplayManager.ActiveDisplay;
				if (activeDisplay.renderingWidth != lastScreenWidth || activeDisplay.renderingHeight != lastScreenHeight)
				{
					OnScreenDimensionsChanged();
				}
			}
		}

		public static UEPanel GetPanel(Panels panel)
		{
			return UIPanels[panel];
		}

		public static T GetPanel<T>(Panels panel) where T : UEPanel
		{
			return (T)UIPanels[panel];
		}

		public static void TogglePanel(Panels panel)
		{
			UEPanel panel2 = GetPanel(panel);
			SetPanelActive(panel, !((UIModel)panel2).Enabled);
		}

		public static void SetPanelActive(Panels panelType, bool active)
		{
			((UIModel)GetPanel(panelType)).SetActive(active);
		}

		public static void SetPanelActive(UEPanel panel, bool active)
		{
			((UIModel)panel).SetActive(active);
		}

		public static void SetNavBarAnchor()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: 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_00ce: 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)
			switch (NavbarAnchor)
			{
			case VerticalAnchor.Top:
				NavBarRect.anchorMin = new Vector2(0.5f, 1f);
				NavBarRect.anchorMax = new Vector2(0.5f, 1f);
				NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0f);
				NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
				break;
			case VerticalAnchor.Bottom:
				NavBarRect.anchorMin = new Vector2(0.5f, 0f);
				NavBarRect.anchorMax = new Vector2(0.5f, 0f);
				NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35f);
				NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
				break;
			}
		}

		private static void OnScreenDimensionsChanged()
		{
			Display activeDisplay = DisplayManager.ActiveDisplay;
			lastScreenWidth = activeDisplay.renderingWidth;
			lastScreenHeight = activeDisplay.renderingHeight;
			foreach (KeyValuePair<Panels, UEPanel> uIPanel in UIPanels)
			{
				((PanelBase)uIPanel.Value).EnsureValidSize();
				((PanelBase)uIPanel.Value).EnsureValidPosition();
				((PanelBase)uIPanel.Value).Dragger.OnEndResize();
			}
		}

		private static void OnCloseButtonClicked()
		{
			ShowMenu = false;
		}

		private static void Master_Toggle_OnValueChanged(KeyCode val)
		{
			closeBtn.ButtonText.text = ((object)(KeyCode)(ref val)).ToString();
		}

		private static void CreateTopNavBar()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: 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_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_029b: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: Unknown result type (might be due to invalid IL or missing references)
			//IL_035e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val2 = UIFactory.CreateUIObject("MainNavbar", UIRoot, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)4, (int?)4, (int?)4, (int?)4, (TextAnchor?)(TextAnchor)4);
			((Graphic)val2.AddComponent<Image>()).color = new Color(0.1f, 0.1f, 0.1f);
			NavBarRect = val2.GetComponent<RectTransform>();
			NavBarRect.pivot = new Vector2(0.5f, 1f);
			NavbarAnchor = ConfigManager.Main_Navbar_Anchor.Value;
			SetNavBarAnchor();
			ConfigElement<VerticalAnchor> main_Navbar_Anchor = ConfigManager.Main_Navbar_Anchor;
			main_Navbar_Anchor.OnValueChanged = (Action<VerticalAnchor>)System.Delegate.Combine(main_Navbar_Anchor.OnValueChanged, (Action<VerticalAnchor>)delegate(VerticalAnchor val)
			{
				NavbarAnchor = val;
				SetNavBarAnchor();
			});
			string text = "UE <i><color=grey>4.8.2</color></i>";
			Text val3 = UIFactory.CreateLabel(val2, "Title", text, (TextAnchor)4, default(Color), true, 14);
			GameObject gameObject = ((Component)val3).gameObject;
			int? num = 75;
			int? num2 = 0;
			UIFactory.SetLayoutElement(gameObject, num, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			NavbarTabButtonHolder = UIFactory.CreateUIObject("NavTabButtonHolder", val2, default(Vector2));
			GameObject navbarTabButtonHolder = NavbarTabButtonHolder;
			num2 = 25;
			int? num3 = 999;
			int? num4 = 999;
			UIFactory.SetLayoutElement(navbarTabButtonHolder, (int?)null, num2, num4, num3, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(NavbarTabButtonHolder, (bool?)false, (bool?)true, (bool?)true, (bool?)true, (int?)4, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null);
			timeScaleWidget = new TimeScaleWidget(val2);
			GameObject val4 = UIFactory.CreateUIObject("Spacer", val2, default(Vector2));
			UIFactory.SetLayoutElement(val4, (int?)15, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			KeyCode value = ConfigManager.Master_Toggle.Value;
			closeBtn = UIFactory.CreateButton(val2, "CloseButton", ((object)(KeyCode)(ref value)).ToString(), (Color?)null);
			GameObject gameObject2 = ((Component)closeBtn.Component).gameObject;
			num4 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)60, num4, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			RuntimeHelper.SetColorBlock((Selectable)(object)closeBtn.Component, (Color?)new Color(0.63f, 0.32f, 0.31f), (Color?)new Color(0.81f, 0.25f, 0.2f), (Color?)new Color(0.6f, 0.18f, 0.16f), (Color?)null);
			ConfigElement<KeyCode> master_Toggle = ConfigManager.Master_Toggle;
			master_Toggle.OnValueChanged = (Action<KeyCode>)System.Delegate.Combine(master_Toggle.OnValueChanged, new Action<KeyCode>(Master_Toggle_OnValueChanged));
			ButtonRef obj = closeBtn;
			obj.OnClick = (Action)System.Delegate.Combine(obj.OnClick, new Action(OnCloseButtonClicked));
		}
	}
}
namespace UnityExplorer.UI.Widgets
{
	public abstract class BaseArgumentHandler : IPooledObject
	{
		internal Text argNameLabel;

		internal InputFieldRef inputField;

		internal TypeCompleter typeCompleter;

		public float DefaultHeight => 25f;

		public GameObject UIRoot { get; set; }

		public abstract void CreateSpecialContent();

		public GameObject CreateContent(GameObject parent)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			UIRoot = UIFactory.CreateUIObject("ArgRow", parent, default(Vector2));
			GameObject uIRoot = UIRoot;
			int? num = 25;
			int? num2 = 50;
			UIFactory.SetLayoutElement(uIRoot, (int?)50, num, (int?)9999, num2, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(UIRoot, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			UIRoot.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			argNameLabel = UIFactory.CreateLabel(UIRoot, "ArgLabel", "not set", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject = ((Component)argNameLabel).gameObject;
			int? num3 = 40;
			num2 = 90;
			UIFactory.SetLayoutElement(gameObject, num3, (int?)25, num2, (int?)50, (int?)null, (int?)null, (bool?)null);
			argNameLabel.horizontalOverflow = (HorizontalWrapMode)0;
			inputField = UIFactory.CreateInputField(UIRoot, "InputField", "...");
			GameObject uIRoot2 = ((UIModel)inputField).UIRoot;
			num2 = 25;
			num = 50;
			UIFactory.SetLayoutElement(uIRoot2, (int?)100, num2, (int?)1000, num, (int?)null, (int?)null, (bool?)null);
			inputField.Component.lineType = (LineType)2;
			((UIModel)inputField).UIRoot.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			typeCompleter = new TypeCompleter(typeof(object), inputField)
			{
				Enabled = false
			};
			CreateSpecialContent();
			return UIRoot;
		}
	}
	public class EvaluateWidget : IPooledObject
	{
		private ParameterInfo[] parameters;

		internal GameObject parametersHolder;

		private ParameterHandler[] paramHandlers;

		private Type[] genericArguments;

		internal GameObject genericArgumentsHolder;

		private GenericArgumentHandler[] genericHandlers;

		public CacheMember Owner { get; set; }

		public GameObject UIRoot { get; set; }

		public float DefaultHeight => -1f;

		public void OnBorrowedFromPool(CacheMember owner)
		{
			Owner = owner;
			parameters = owner.Arguments;
			paramHandlers = new ParameterHandler[parameters.Length];
			genericArguments = owner.GenericArguments;
			genericHandlers = new GenericArgumentHandler[genericArguments.Length];
			SetArgRows();
			UIRoot.SetActive(true);
		}

		public void OnReturnToPool()
		{
			ParameterHandler[] array = paramHandlers;
			foreach (ParameterHandler parameterHandler in array)
			{
				parameterHandler.OnReturned();
				Pool<ParameterHandler>.Return(parameterHandler);
			}
			paramHandlers = null;
			GenericArgumentHandler[] array2 = genericHandlers;
			foreach (GenericArgumentHandler genericArgumentHandler in array2)
			{
				genericArgumentHandler.OnReturned();
				Pool<GenericArgumentHandler>.Return(genericArgumentHandler);
			}
			genericHandlers = null;
			Owner = null;
		}

		public Type[] TryParseGenericArguments()
		{
			Type[] array = new Type[genericArguments.Length];
			for (int i = 0; i < genericArguments.Length; i++)
			{
				array[i] = genericHandlers[i].Evaluate();
			}
			return array;
		}

		public object[] TryParseArguments()
		{
			if (!parameters.Any())
			{
				return ArgumentUtility.EmptyArgs;
			}
			object[] array = new object[parameters.Length];
			for (int i = 0; i < parameters.Length; i++)
			{
				array[i] = paramHandlers[i].Evaluate();
			}
			return array;
		}

		private void SetArgRows()
		{
			if (genericArguments.Any())
			{
				genericArgumentsHolder.SetActive(true);
				SetGenericRows();
			}
			else
			{
				genericArgumentsHolder.SetActive(false);
			}
			if (parameters.Any())
			{
				parametersHolder.SetActive(true);
				SetNormalArgRows();
			}
			else
			{
				parametersHolder.SetActive(false);
			}
		}

		private void SetGenericRows()
		{
			for (int i = 0; i < genericArguments.Length; i++)
			{
				Type genericArgument = genericArguments[i];
				GenericArgumentHandler genericArgumentHandler = (genericHandlers[i] = Pool<GenericArgumentHandler>.Borrow());
				genericArgumentHandler.UIRoot.transform.SetParent(genericArgumentsHolder.transform, false);
				genericArgumentHandler.OnBorrowed(genericArgument);
			}
		}

		private void SetNormalArgRows()
		{
			for (int i = 0; i < parameters.Length; i++)
			{
				ParameterInfo paramInfo = parameters[i];
				ParameterHandler parameterHandler = (paramHandlers[i] = Pool<ParameterHandler>.Borrow());
				parameterHandler.UIRoot.transform.SetParent(parametersHolder.transform, false);
				parameterHandler.OnBorrowed(paramInfo);
			}
		}

		public GameObject CreateContent(GameObject parent)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fd: Unknown result type (might be due to invalid IL or missing references)
			UIRoot = UIFactory.CreateVerticalGroup(parent, "EvaluateWidget", false, false, true, true, 3, new Vector4(2f, 2f, 2f, 2f), new Color(0.15f, 0.15f, 0.15f), (TextAnchor?)null);
			GameObject uIRoot = UIRoot;
			int? num = 50;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(uIRoot, num, (int?)50, num2, (int?)800, (int?)null, (int?)null, (bool?)null);
			genericArgumentsHolder = UIFactory.CreateUIObject("GenericHolder", UIRoot, default(Vector2));
			GameObject obj = genericArgumentsHolder;
			num2 = 1000;
			UIFactory.SetLayoutElement(obj, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			Text val = UIFactory.CreateLabel(genericArgumentsHolder, "GenericsTitle", "Generic Arguments", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject = ((Component)val).gameObject;
			num2 = 25;
			int? num3 = 1000;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num3, (int?)null, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(genericArgumentsHolder, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)3, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			GameObject obj2 = genericArgumentsHolder;
			num3 = 25;
			num2 = 750;
			UIFactory.SetLayoutElement(obj2, (int?)50, num3, (int?)9999, num2, (int?)null, (int?)null, (bool?)null);
			parametersHolder = UIFactory.CreateUIObject("ArgHolder", UIRoot, default(Vector2));
			GameObject obj3 = parametersHolder;
			num2 = 1000;
			UIFactory.SetLayoutElement(obj3, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			Text val2 = UIFactory.CreateLabel(parametersHolder, "ArgsTitle", "Arguments", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject2 = ((Component)val2).gameObject;
			num2 = 25;
			num3 = 1000;
			UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num3, (int?)null, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(parametersHolder, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)3, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			GameObject obj4 = parametersHolder;
			num3 = 25;
			num2 = 750;
			UIFactory.SetLayoutElement(obj4, (int?)50, num3, (int?)9999, num2, (int?)null, (int?)null, (bool?)null);
			ButtonRef val3 = UIFactory.CreateButton(UIRoot, "EvaluateButton", "Evaluate", (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject3 = ((Component)val3.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject3, (int?)150, num2, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			val3.OnClick = (Action)System.Delegate.Combine(val3.OnClick, (Action)delegate
			{
				Owner.EvaluateAndSetCell();
			});
			return UIRoot;
		}
	}
	public class GenericArgumentHandler : BaseArgumentHandler
	{
		private Type genericArgument;

		public void OnBorrowed(Type genericArgument)
		{
			this.genericArgument = genericArgument;
			typeCompleter.Enabled = true;
			typeCompleter.BaseType = this.genericArgument;
			typeCompleter.CacheTypes();
			Type[] genericParameterConstraints = this.genericArgument.GetGenericParameterConstraints();
			StringBuilder stringBuilder = new StringBuilder("<color=#92c470>" + this.genericArgument.Name + "</color>");
			for (int i = 0; i < genericParameterConstraints.Length; i++)
			{
				if (i == 0)
				{
					stringBuilder.Append(' ').Append('(');
				}
				else
				{
					stringBuilder.Append(',').Append(' ');
				}
				stringBuilder.Append(SignatureHighlighter.Parse(genericParameterConstraints[i], false, (MemberInfo)null));
				if (i + 1 == genericParameterConstraints.Length)
				{
					stringBuilder.Append(')');
				}
			}
			argNameLabel.text = stringBuilder.ToString();
		}

		public void OnReturned()
		{
			genericArgument = null;
			typeCompleter.Enabled = false;
			inputField.Text = "";
		}

		public Type Evaluate()
		{
			return ReflectionUtility.GetTypeByName(inputField.Text) ?? throw new Exception("Could not find any type by name '" + inputField.Text + "'!");
		}

		public override void CreateSpecialContent()
		{
		}
	}
	public class GenericConstructorWidget
	{
		private GenericArgumentHandler[] handlers;

		private Type[] currentGenericParameters;

		private Action<Type[]> currentOnSubmit;

		private Action currentOnCancel;

		public GameObject UIRoot;

		private Text Title;

		private GameObject ArgsHolder;

		public void Show(Action<Type[]> onSubmit, Action onCancel, Type genericTypeDefinition)
		{
			Title.text = "Setting generic arguments for " + SignatureHighlighter.Parse(genericTypeDefinition, false, (MemberInfo)null) + "...";
			OnShow(onSubmit, onCancel, genericTypeDefinition.GetGenericArguments());
		}

		public void Show(Action<Type[]> onSubmit, Action onCancel, MethodInfo genericMethodDefinition)
		{
			Title.text = "Setting generic arguments for " + SignatureHighlighter.ParseMethod(genericMethodDefinition) + "...";
			OnShow(onSubmit, onCancel, genericMethodDefinition.GetGenericArguments());
		}

		private void OnShow(Action<Type[]> onSubmit, Action onCancel, Type[] genericParameters)
		{
			currentOnSubmit = onSubmit;
			currentOnCancel = onCancel;
			SetGenericParameters(genericParameters);
		}

		private void SetGenericParameters(Type[] genericParameters)
		{
			currentGenericParameters = genericParameters;
			handlers = new GenericArgumentHandler[genericParameters.Length];
			for (int i = 0; i < genericParameters.Length; i++)
			{
				Type genericArgument = genericParameters[i];
				GenericArgumentHandler genericArgumentHandler = (handlers[i] = Pool<GenericArgumentHandler>.Borrow());
				genericArgumentHandler.UIRoot.transform.SetParent(ArgsHolder.transform, false);
				genericArgumentHandler.OnBorrowed(genericArgument);
			}
		}

		public void TrySubmit()
		{
			Type[] array = new Type[currentGenericParameters.Length];
			for (int i = 0; i < array.Length; i++)
			{
				GenericArgumentHandler genericArgumentHandler = handlers[i];
				Type type;
				try
				{
					type = genericArgumentHandler.Evaluate();
					if ((object)type == null)
					{
						throw new Exception();
					}
				}
				catch
				{
					ExplorerCore.LogWarning("Generic argument '" + genericArgumentHandler.inputField.Text + "' is not a valid type.");
					return;
				}
				array[i] = type;
			}
			OnClose();
			currentOnSubmit(array);
		}

		public void Cancel()
		{
			OnClose();
			currentOnCancel?.Invoke();
		}

		private void OnClose()
		{
			if (handlers != null)
			{
				GenericArgumentHandler[] array = handlers;
				foreach (GenericArgumentHandler genericArgumentHandler in array)
				{
					genericArgumentHandler.OnReturned();
					Pool<GenericArgumentHandler>.Return(genericArgumentHandler);
				}
				handlers = null;
			}
		}

		internal void ConstructUI(GameObject parent)
		{
			//IL_0021: 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_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			Vector4 val = new Vector4(5f, 5f, 5f, 5f);
			TextAnchor? val2 = (TextAnchor)4;
			UIRoot = UIFactory.CreateVerticalGroup(parent, "GenericArgsHandler", false, false, true, true, 5, val, default(Color), val2);
			GameObject uIRoot = UIRoot;
			int? num = 9999;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(uIRoot, (int?)null, (int?)null, num, num2, (int?)null, (int?)null, (bool?)null);
			ButtonRef val3 = UIFactory.CreateButton(UIRoot, "SubmitButton", "Submit", (Color?)new Color(0.2f, 0.3f, 0.2f));
			GameObject gameObject = val3.GameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)200, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val3.OnClick = (Action)System.Delegate.Combine(val3.OnClick, new Action(TrySubmit));
			ButtonRef val4 = UIFactory.CreateButton(UIRoot, "CancelButton", "Cancel", (Color?)new Color(0.3f, 0.2f, 0.2f));
			GameObject gameObject2 = val4.GameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)200, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val4.OnClick = (Action)System.Delegate.Combine(val4.OnClick, new Action(Cancel));
			Title = UIFactory.CreateLabel(UIRoot, "Title", "Generic Arguments", (TextAnchor)4, default(Color), true, 14);
			GameObject gameObject3 = ((Component)Title).gameObject;
			num2 = 25;
			num = 9999;
			UIFactory.SetLayoutElement(gameObject3, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			AutoSliderScrollbar val5 = default(AutoSliderScrollbar);
			GameObject val6 = UIFactory.CreateScrollView(UIRoot, "GenericArgsScrollView", ref ArgsHolder, ref val5, new Color(0.1f, 0.1f, 0.1f));
			num = 9999;
			num2 = 9999;
			UIFactory.SetLayoutElement(val6, (int?)null, (int?)null, num, num2, (int?)null, (int?)null, (bool?)null);
			GameObject argsHolder = ArgsHolder;
			num2 = 5;
			num = 5;
			int? num3 = 5;
			int? num4 = 5;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(argsHolder, (bool?)null, (bool?)null, (bool?)null, (bool?)null, (int?)null, num2, num3, num, num4, (TextAnchor?)null);
		}
	}
	public class ParameterHandler : BaseArgumentHandler
	{
		private ParameterInfo paramInfo;

		private Type paramType;

		internal EnumCompleter enumCompleter;

		private ButtonRef enumHelperButton;

		private bool usingBasicLabel;

		private object basicValue;

		private GameObject basicLabelHolder;

		private Text basicLabel;

		private ButtonRef pasteButton;

		public void OnBorrowed(ParameterInfo paramInfo)
		{
			this.paramInfo = paramInfo;
			paramType = paramInfo.ParameterType;
			if (paramType.IsByRef)
			{
				paramType = paramType.GetElementType();
			}
			argNameLabel.text = SignatureHighlighter.Parse(paramType, false, (MemberInfo)null) + " <color=#a6e9e9>" + paramInfo.Name + "</color>";
			if (ParseUtility.CanParse(paramType) || typeof(Type).IsAssignableFrom(paramType))
			{
				usingBasicLabel = false;
				((Component)inputField.Component).gameObject.SetActive(true);
				basicLabelHolder.SetActive(false);
				typeCompleter.Enabled = typeof(Type).IsAssignableFrom(paramType);
				enumCompleter.Enabled = paramType.IsEnum;
				((Component)enumHelperButton.Component).gameObject.SetActive(paramType.IsEnum);
				if (!typeCompleter.Enabled)
				{
					if ((object)paramType == typeof(string))
					{
						inputField.PlaceholderText.text = "...";
					}
					else
					{
						inputField.PlaceholderText.text = "eg. " + ParseUtility.GetExampleInput(paramType);
					}
				}
				else
				{
					inputField.PlaceholderText.text = "Enter a Type name...";
					typeCompleter.BaseType = typeof(object);
					typeCompleter.CacheTypes();
				}
				if (enumCompleter.Enabled)
				{
					enumCompleter.EnumType = paramType;
					enumCompleter.CacheEnumValues();
				}
			}
			else
			{
				usingBasicLabel = true;
				((Component)inputField.Component).gameObject.SetActive(false);
				basicLabelHolder.SetActive(true);
				typeCompleter.Enabled = false;
				enumCompleter.Enabled = false;
				((Component)enumHelperButton.Component).gameObject.SetActive(false);
				SetDisplayedValueFromPaste();
			}
		}

		public void OnReturned()
		{
			paramInfo = null;
			enumCompleter.Enabled = false;
			typeCompleter.Enabled = false;
			inputField.Text = "";
			usingBasicLabel = false;
			basicValue = null;
		}

		public object Evaluate()
		{
			if (usingBasicLabel)
			{
				return basicValue;
			}
			string text = inputField.Text;
			if (typeof(Type).IsAssignableFrom(paramType))
			{
				return ReflectionUtility.GetTypeByName(text);
			}
			if ((object)paramType == typeof(string))
			{
				return text;
			}
			if (string.IsNullOrEmpty(text))
			{
				if (paramInfo.IsOptional)
				{
					return paramInfo.DefaultValue;
				}
				return null;
			}
			object result = default(object);
			Exception ex = default(Exception);
			if (!ParseUtility.TryParse(text, paramType, ref result, ref ex))
			{
				ExplorerCore.LogWarning("Cannot parse argument '" + paramInfo.Name + "' (" + paramInfo.ParameterType.Name + ")" + ((ex == null) ? "" : (", " + ex.GetType().Name + ": " + ex.Message)));
				return null;
			}
			return result;
		}

		private void OnPasteClicked()
		{
			if (ClipboardPanel.TryPaste(paramType, out var paste))
			{
				basicValue = paste;
				SetDisplayedValueFromPaste();
			}
		}

		private void SetDisplayedValueFromPaste()
		{
			if (usingBasicLabel)
			{
				basicLabel.text = ToStringUtility.ToStringWithType(basicValue, paramType, false);
			}
			else if (typeof(Type).IsAssignableFrom(paramType))
			{
				inputField.Text = GeneralExtensions.FullDescription(basicValue as Type);
			}
			else
			{
				inputField.Text = ParseUtility.ToStringForInput(basicValue, paramType);
			}
		}

		public override void CreateSpecialContent()
		{
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			enumCompleter = new EnumCompleter(paramType, inputField)
			{
				Enabled = false
			};
			enumHelperButton = UIFactory.CreateButton(base.UIRoot, "EnumHelper", "▼", (Color?)null);
			UIFactory.SetLayoutElement(((Component)enumHelperButton.Component).gameObject, (int?)25, (int?)25, (int?)0, (int?)0, (int?)null, (int?)null, (bool?)null);
			ButtonRef obj = enumHelperButton;
			obj.OnClick = (Action)System.Delegate.Combine(obj.OnClick, new Action(enumCompleter.HelperButtonClicked));
			GameObject uIRoot = base.UIRoot;
			Color val = default(Color);
			((Color)(ref val))..ctor(0.1f, 0.1f, 0.1f);
			basicLabelHolder = UIFactory.CreateHorizontalGroup(uIRoot, "BasicLabelHolder", true, true, true, true, 0, default(Vector4), val, (TextAnchor?)null);
			GameObject obj2 = basicLabelHolder;
			int? num = 25;
			int? num2 = 50;
			UIFactory.SetLayoutElement(obj2, (int?)100, num, (int?)1000, num2, (int?)null, (int?)null, (bool?)null);
			GameObject obj3 = basicLabelHolder;
			val = default(Color);
			basicLabel = UIFactory.CreateLabel(obj3, "BasicLabel", "null", (TextAnchor)3, val, true, 14);
			((Component)basicLabel).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			pasteButton = UIFactory.CreateButton(base.UIRoot, "PasteButton", "Paste", (Color?)new Color(0.13f, 0.13f, 0.13f, 1f));
			GameObject gameObject = ((Component)pasteButton.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)28, num2, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)pasteButton.ButtonText).color = Color.green;
			pasteButton.ButtonText.fontSize = 10;
			ButtonRef obj4 = pasteButton;
			obj4.OnClick = (Action)System.Delegate.Combine(obj4.OnClick, new Action(OnPasteClicked));
		}
	}
	public class AxisControl
	{
		public readonly Vector3Control parent;

		public readonly int axis;

		public readonly Slider slider;

		public AxisControl(int axis, Slider slider, Vector3Control parentControl)
		{
			parent = parentControl;
			this.axis = axis;
			this.slider = slider;
		}

		private void OnVectorSliderChanged(float value)
		{
			parent.Owner.CurrentSlidingAxisControl = ((value == 0f) ? null : this);
		}

		private void OnVectorMinusClicked()
		{
			parent.Owner.AxisControlOperation(0f - parent.Increment, parent, axis);
		}

		private void OnVectorPlusClicked()
		{
			parent.Owner.AxisControlOperation(parent.Increment, parent, axis);
		}

		public static AxisControl Create(GameObject parent, string title, int axis, Vector3Control owner)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			Text val = UIFactory.CreateLabel(parent, "Label_" + title, title + ":", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject = ((Component)val).gameObject;
			int? num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)30, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			Slider val2 = default(Slider);
			GameObject val3 = UIFactory.CreateSlider(parent, "Slider_" + title, ref val2);
			num = 25;
			UIFactory.SetLayoutElement(val3, (int?)75, num, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)val2.m_FillImage).color = Color.clear;
			val2.minValue = -0.1f;
			val2.maxValue = 0.1f;
			AxisControl axisControl = new AxisControl(axis, val2, owner);
			((UnityEvent<float>)(object)val2.onValueChanged).AddListener((UnityAction<float>)axisControl.OnVectorSliderChanged);
			ButtonRef val4 = UIFactory.CreateButton(parent, "MinusIncrementButton", "-", (Color?)null);
			GameObject gameObject2 = val4.GameObject;
			int? num2 = 20;
			num = 0;
			UIFactory.SetLayoutElement(gameObject2, num2, (int?)25, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			val4.OnClick = (Action)System.Delegate.Combine(val4.OnClick, new Action(axisControl.OnVectorMinusClicked));
			ButtonRef val5 = UIFactory.CreateButton(parent, "PlusIncrementButton", "+", (Color?)null);
			GameObject gameObject3 = val5.GameObject;
			int? num3 = 20;
			num = 0;
			UIFactory.SetLayoutElement(gameObject3, num3, (int?)25, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			val5.OnClick = (Action)System.Delegate.Combine(val5.OnClick, new Action(axisControl.OnVectorPlusClicked));
			return axisControl;
		}
	}
	public class ComponentCell : ButtonCell
	{
		public Toggle BehaviourToggle;

		public ButtonRef DestroyButton;

		public Action<bool, int> OnBehaviourToggled;

		public Action<int> OnDestroyClicked;

		private void BehaviourToggled(bool val)
		{
			OnBehaviourToggled?.Invoke(val, ((ButtonCell)this).CurrentDataIndex);
		}

		private void DestroyClicked()
		{
			OnDestroyClicked?.Invoke(((ButtonCell)this).CurrentDataIndex);
		}

		public override GameObject CreateContent(GameObject parent)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			GameObject result = ((ButtonCell)this).CreateContent(parent);
			((ButtonCell)this).Button.ButtonText.horizontalOverflow = (HorizontalWrapMode)0;
			Text val = default(Text);
			GameObject val2 = UIFactory.CreateToggle(((ButtonCell)this).UIRoot, "BehaviourToggle", ref BehaviourToggle, ref val, default(Color), 20, 20);
			int? num = 25;
			UIFactory.SetLayoutElement(val2, (int?)25, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((UnityEvent<bool>)(object)BehaviourToggle.onValueChanged).AddListener((UnityAction<bool>)BehaviourToggled);
			val2.transform.SetSiblingIndex(0);
			DestroyButton = UIFactory.CreateButton(((ButtonCell)this).UIRoot, "DestroyButton", "X", (Color?)new Color(0.3f, 0.2f, 0.2f));
			GameObject gameObject = ((Component)DestroyButton.Component).gameObject;
			num = 21;
			UIFactory.SetLayoutElement(gameObject, (int?)25, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef destroyButton = DestroyButton;
			destroyButton.OnClick = (Action)System.Delegate.Combine(destroyButton.OnClick, new Action(DestroyClicked));
			return result;
		}
	}
	public class ComponentList : ButtonListHandler<Component, ComponentCell>
	{
		public GameObjectInspector Parent;

		private static readonly Dictionary<string, string> compToStringCache = new Dictionary<string, string>();

		public ComponentList(ScrollPool<ComponentCell> scrollPool, Func<List<Component>> getEntriesMethod)
			: base(scrollPool, getEntriesMethod, (Action<ComponentCell, int>)null, (Func<Component, string, bool>)null, (Action<int>)null)
		{
			base.SetICell = SetComponentCell;
			base.ShouldDisplay = CheckShouldDisplay;
			base.OnCellClicked = OnComponentClicked;
		}

		public void Clear()
		{
			base.RefreshData();
			base.ScrollPool.Refresh(true, true);
		}

		private bool CheckShouldDisplay(Component _, string __)
		{
			return true;
		}

		public override void OnCellBorrowed(ComponentCell cell)
		{
			base.OnCellBorrowed(cell);
			cell.OnBehaviourToggled = (Action<bool, int>)System.Delegate.Combine(cell.OnBehaviourToggled, new Action<bool, int>(OnBehaviourToggled));
			cell.OnDestroyClicked = (Action<int>)System.Delegate.Combine(cell.OnDestroyClicked, new Action<int>(OnDestroyClicked));
		}

		public override void SetCell(ComponentCell cell, int index)
		{
			base.SetCell(cell, index);
		}

		private void OnComponentClicked(int index)
		{
			List<Component> list = base.GetEntries();
			if (index >= 0 && index < list.Count)
			{
				Component val = list[index];
				if (Object.op_Implicit((Object)(object)val))
				{
					InspectorManager.Inspect(val);
				}
			}
		}

		private void OnBehaviourToggled(bool value, int index)
		{
			try
			{
				List<Component> list = base.GetEntries();
				Component val = list[index];
				Behaviour val2 = ReflectionExtensions.TryCast<Behaviour>((object)val);
				if (val2 != null)
				{
					val2.enabled = value;
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Exception toggling Behaviour.enabled: " + ReflectionExtensions.ReflectionExToString(ex, true));
			}
		}

		private void OnDestroyClicked(int index)
		{
			try
			{
				List<Component> list = base.GetEntries();
				Component val = list[index];
				Object.DestroyImmediate((Object)(object)val);
				Parent.UpdateComponents();
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Exception destroying Component: " + ReflectionExtensions.ReflectionExToString(ex, true));
			}
		}

		private void SetComponentCell(ComponentCell cell, int index)
		{
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			List<Component> list = base.GetEntries();
			((ButtonCell)cell).Enable();
			Component val = list[index];
			Type actualType = ReflectionExtensions.GetActualType((object)val);
			if (!compToStringCache.ContainsKey(actualType.AssemblyQualifiedName))
			{
				compToStringCache.Add(actualType.AssemblyQualifiedName, SignatureHighlighter.Parse(actualType, true, (MemberInfo)null));
			}
			((ButtonCell)cell).Button.ButtonText.text = compToStringCache[actualType.AssemblyQualifiedName];
			if (typeof(Behaviour).IsAssignableFrom(actualType))
			{
				((Selectable)cell.BehaviourToggle).interactable = true;
				cell.BehaviourToggle.Set(ReflectionExtensions.TryCast<Behaviour>((object)val).enabled, false);
				cell.BehaviourToggle.graphic.color = new Color(0.8f, 1f, 0.8f, 0.3f);
			}
			else
			{
				((Selectable)cell.BehaviourToggle).interactable = false;
				cell.BehaviourToggle.Set(true, false);
				cell.BehaviourToggle.graphic.color = new Color(0.2f, 0.2f, 0.2f);
			}
			if (index == 0 && ((Component)cell.DestroyButton.Component).gameObject.activeSelf)
			{
				((Component)cell.DestroyButton.Component).gameObject.SetActive(false);
			}
			else if (index > 0 && !((Component)cell.DestroyButton.Component).gameObject.activeSelf)
			{
				((Component)cell.DestroyButton.Component).gameObject.SetActive(true);
			}
		}
	}
	public class GameObjectControls
	{
		public GameObjectInspector Parent { get; }

		public GameObject Target => Parent.Target;

		public GameObjectInfoPanel GameObjectInfo { get; }

		public TransformControls TransformControl { get; }

		public GameObjectControls(GameObjectInspector parent)
		{
			Parent = parent;
			GameObjectInfo = new GameObjectInfoPanel(this);
			TransformControl = new TransformControls(this);
		}

		public void UpdateGameObjectInfo(bool firstUpdate, bool force)
		{
			GameObjectInfo.UpdateGameObjectInfo(firstUpdate, force);
		}

		public void UpdateVectorSlider()
		{
			TransformControl.UpdateVectorSlider();
		}
	}
	public class GameObjectInfoPanel
	{
		private string lastGoName;

		private string lastPath;

		private bool lastParentState;

		private int lastSceneHandle;

		private string lastTag;

		private int lastLayer;

		private int lastFlags;

		private ButtonRef ViewParentButton;

		private InputFieldRef PathInput;

		private InputFieldRef NameInput;

		private Toggle ActiveSelfToggle;

		private Text ActiveSelfText;

		private Toggle IsStaticToggle;

		private ButtonRef SceneButton;

		private InputFieldRef InstanceIDInput;

		private InputFieldRef TagInput;

		private Dropdown LayerDropdown;

		private Dropdown FlagsDropdown;

		private static List<string> layerToNames;

		private static Dictionary<string, HideFlags> hideFlagsValues;

		public GameObjectControls Owner { get; }

		private GameObject Target => Owner.Target;

		public GameObjectInfoPanel(GameObjectControls owner)
		{
			Owner = owner;
			Create();
		}

		public void UpdateGameObjectInfo(bool firstUpdate, bool force)
		{
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02de: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0300: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Invalid comparison between Unknown and I4
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ec: Expected I4, but got Unknown
			//IL_03fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0402: Unknown result type (might be due to invalid IL or missing references)
			if (firstUpdate)
			{
				InstanceIDInput.Text = ((Object)Target).GetInstanceID().ToString();
			}
			if (force || (!NameInput.Component.isFocused && ((Object)Target).name != lastGoName))
			{
				lastGoName = ((Object)Target).name;
				Owner.Parent.Tab.TabText.text = "[G] " + ((Object)Target).name;
				NameInput.Text = ((Object)Target).name;
			}
			if (force || !PathInput.Component.isFocused)
			{
				string transformPath = UnityHelpers.GetTransformPath(Target.transform, false);
				if (transformPath != lastPath)
				{
					lastPath = transformPath;
					PathInput.Text = transformPath;
				}
			}
			if (force || Object.op_Implicit((Object)(object)Target.transform.parent) != lastParentState)
			{
				lastParentState = Object.op_Implicit((Object)(object)Target.transform.parent);
				((Selectable)ViewParentButton.Component).interactable = lastParentState;
				if (lastParentState)
				{
					((Graphic)ViewParentButton.ButtonText).color = Color.white;
					ViewParentButton.ButtonText.text = "◄ View Parent";
				}
				else
				{
					((Graphic)ViewParentButton.ButtonText).color = Color.grey;
					ViewParentButton.ButtonText.text = "No parent";
				}
			}
			if (force || Target.activeSelf != ActiveSelfToggle.isOn)
			{
				ActiveSelfToggle.Set(Target.activeSelf, false);
				((Graphic)ActiveSelfText).color = (ActiveSelfToggle.isOn ? Color.green : Color.red);
			}
			if (force || Target.isStatic != IsStaticToggle.isOn)
			{
				IsStaticToggle.Set(Target.isStatic, false);
			}
			Scene scene;
			if (!force)
			{
				scene = Target.scene;
				if (((Scene)(ref scene)).handle == lastSceneHandle)
				{
					goto IL_0310;
				}
			}
			scene = Target.scene;
			lastSceneHandle = ((Scene)(ref scene)).handle;
			Text buttonText = SceneButton.ButtonText;
			scene = Target.scene;
			object text;
			if (!((Scene)(ref scene)).IsValid())
			{
				text = "None (Asset/Resource)";
			}
			else
			{
				scene = Target.scene;
				text = ((Scene)(ref scene)).name;
			}
			buttonText.text = (string)text;
			goto IL_0310;
			IL_0310:
			if (force || (!TagInput.Component.isFocused && Target.tag != lastTag))
			{
				lastTag = Target.tag;
				TagInput.Text = lastTag;
			}
			if (force || Target.layer != lastLayer)
			{
				lastLayer = Target.layer;
				LayerDropdown.value = Target.layer;
			}
			if (force || (int)((Object)Target).hideFlags != lastFlags)
			{
				lastFlags = (int)((Object)Target).hideFlags;
				Text captionText = FlagsDropdown.captionText;
				HideFlags hideFlags = ((Object)Target).hideFlags;
				captionText.text = ((object)(HideFlags)(ref hideFlags)).ToString();
			}
		}

		private void DoSetParent(Transform transform)
		{
			ExplorerCore.Log("Setting target's transform parent to: " + (((Object)(object)transform == (Object)null) ? "null" : ("'" + ((Object)transform).name + "'")));
			if (Object.op_Implicit((Object)(object)Target.GetComponent<RectTransform>()))
			{
				Target.transform.SetParent(transform, false);
			}
			else
			{
				Target.transform.parent = transform;
			}
			UpdateGameObjectInfo(firstUpdate: false, force: false);
			Owner.TransformControl.UpdateTransformControlValues(force: false);
		}

		private void OnViewParentClicked()
		{
			if (Object.op_Implicit((Object)(object)Target) && Object.op_Implicit((Object)(object)Target.transform.parent))
			{
				Owner.Parent.OnTransformCellClicked(((Component)Target.transform.parent).gameObject);
			}
		}

		private void OnPathEndEdit(string input)
		{
			lastPath = input;
			if (string.IsNullOrEmpty(input))
			{
				DoSetParent(null);
				return;
			}
			Transform val = null;
			if (input.EndsWith("/"))
			{
				input = input.Remove(input.Length - 1);
			}
			GameObject val2 = GameObject.Find(input);
			if (val2 != null)
			{
				val = val2.transform;
			}
			else
			{
				string text = input.Split(new char[1] { '/' }).Last();
				Object[] array = RuntimeHelper.FindObjectsOfTypeAll(typeof(GameObject));
				List<GameObject> list = new List<GameObject>();
				Object[] array2 = array;
				foreach (Object val3 in array2)
				{
					if (val3.name == text)
					{
						list.Add(ReflectionExtensions.TryCast<GameObject>((object)val3));
					}
				}
				foreach (GameObject item in list)
				{
					string text2 = UnityHelpers.GetTransformPath(item.transform, true);
					if (text2.EndsWith("/"))
					{
						text2 = text2.Remove(text2.Length - 1);
					}
					if (text2 == input)
					{
						val = item.transform;
						break;
					}
				}
			}
			if (Object.op_Implicit((Object)(object)val))
			{
				DoSetParent(val);
				return;
			}
			ExplorerCore.LogWarning("Could not find any GameObject name or path '" + input + "'!");
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnNameEndEdit(string value)
		{
			((Object)Target).name = value;
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnCopyClicked()
		{
			ClipboardPanel.Copy(Target);
		}

		private void OnActiveSelfToggled(bool value)
		{
			Target.SetActive(value);
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnTagEndEdit(string value)
		{
			try
			{
				Target.tag = value;
				UpdateGameObjectInfo(firstUpdate: false, force: true);
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Exception setting tag! " + ReflectionExtensions.ReflectionExToString(ex, true));
			}
		}

		private void OnSceneButtonClicked()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			InspectorManager.Inspect(Target.scene);
		}

		private void OnExploreButtonClicked()
		{
			ObjectExplorerPanel panel = UIManager.GetPanel<ObjectExplorerPanel>(UIManager.Panels.ObjectExplorer);
			panel.SceneExplorer.JumpToTransform(Owner.Parent.Target.transform);
		}

		private void OnLayerDropdownChanged(int value)
		{
			Target.layer = value;
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnFlagsDropdownChanged(int value)
		{
			//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)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				HideFlags hideFlags = hideFlagsValues[FlagsDropdown.options[value].text];
				((Object)Target).hideFlags = hideFlags;
				UpdateGameObjectInfo(firstUpdate: false, force: true);
			}
			catch (Exception arg)
			{
				ExplorerCore.LogWarning($"Exception setting hideFlags: {arg}");
			}
		}

		private void OnDestroyClicked()
		{
			Object.Destroy((Object)(object)Target);
			InspectorManager.ReleaseInspector(Owner.Parent);
		}

		private void OnInstantiateClicked()
		{
			GameObject obj = Object.Instantiate<GameObject>(Target);
			InspectorManager.Inspect(obj);
		}

		public void Create()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0435: Unknown result type (might be due to invalid IL or missing references)
			//IL_043b: Unknown result type (might be due to invalid IL or missing references)
			//IL_054a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0550: Unknown result type (might be due to invalid IL or missing references)
			//IL_0609: Unknown result type (might be due to invalid IL or missing references)
			//IL_060f: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_0715: Unknown result type (might be due to invalid IL or missing references)
			//IL_073a: Unknown result type (might be due to invalid IL or missing references)
			//IL_081b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0845: Unknown result type (might be due to invalid IL or missing references)
			//IL_0926: Unknown result type (might be due to invalid IL or missing references)
			//IL_096e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a13: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aa5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b6a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c10: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d1f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dfe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e42: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e4c: Expected O, but got Unknown
			//IL_0e8d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f20: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fb8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fc2: Expected O, but got Unknown
			GameObject val2 = UIFactory.CreateVerticalGroup(Owner.Parent.Content, "TopInfoHolder", false, false, true, true, 3, new Vector4(3f, 3f, 3f, 3f), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)(TextAnchor)3);
			int? num = 100;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(val2, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			val2.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			GameObject val3 = UIFactory.CreateUIObject("ParentRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val3, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			num2 = 25;
			num = 9999;
			UIFactory.SetLayoutElement(val3, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			ViewParentButton = UIFactory.CreateButton(val3, "ViewParentButton", "◄ View Parent", (Color?)new Color(0.2f, 0.2f, 0.2f));
			ViewParentButton.ButtonText.fontSize = 13;
			GameObject gameObject = ((Component)ViewParentButton.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef viewParentButton = ViewParentButton;
			viewParentButton.OnClick = (Action)System.Delegate.Combine(viewParentButton.OnClick, new Action(OnViewParentClicked));
			PathInput = UIFactory.CreateInputField(val3, "PathInput", "...");
			((Graphic)PathInput.Component.textComponent).color = Color.grey;
			PathInput.Component.textComponent.fontSize = 14;
			GameObject uIRoot = ((UIModel)PathInput).UIRoot;
			num = 25;
			UIFactory.SetLayoutElement(uIRoot, (int?)100, num, (int?)9999, (int?)null, (int?)null, (int?)null, (bool?)null);
			PathInput.Component.lineType = (LineType)1;
			ButtonRef val4 = UIFactory.CreateButton(val3, "CopyButton", "Copy to Clipboard", (Color?)new Color(0.2f, 0.2f, 0.2f, 1f));
			((Graphic)val4.ButtonText).color = Color.yellow;
			GameObject gameObject2 = ((Component)val4.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)120, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val4.OnClick = (Action)System.Delegate.Combine(val4.OnClick, new Action(OnCopyClicked));
			UnityHelpers.GetOnEndEdit(PathInput.Component).AddListener((UnityAction<string>)delegate(string val)
			{
				OnPathEndEdit(val);
			});
			GameObject val5 = UIFactory.CreateUIObject("TitleRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val5, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			Text val6 = UIFactory.CreateLabel(val5, "Title", SignatureHighlighter.Parse(typeof(GameObject), false, (MemberInfo)null), (TextAnchor)3, default(Color), true, 17);
			GameObject gameObject3 = ((Component)val6).gameObject;
			num = 30;
			UIFactory.SetLayoutElement(gameObject3, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			NameInput = UIFactory.CreateInputField(val5, "NameInput", "untitled");
			GameObject gameObject4 = ((Component)NameInput.Component).gameObject;
			num = 30;
			UIFactory.SetLayoutElement(gameObject4, (int?)100, num, (int?)9999, (int?)null, (int?)null, (int?)null, (bool?)null);
			NameInput.Component.textComponent.fontSize = 15;
			UnityHelpers.GetOnEndEdit(NameInput.Component).AddListener((UnityAction<string>)delegate(string val)
			{
				OnNameEndEdit(val);
			});
			GameObject val7 = UIFactory.CreateUIObject("ParentRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val7, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			num = 25;
			num2 = 9999;
			UIFactory.SetLayoutElement(val7, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject val8 = UIFactory.CreateToggle(val7, "ActiveSelf", ref ActiveSelfToggle, ref ActiveSelfText, default(Color), 20, 20);
			num2 = 25;
			UIFactory.SetLayoutElement(val8, (int?)100, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ActiveSelfText.text = "ActiveSelf";
			((UnityEvent<bool>)(object)ActiveSelfToggle.onValueChanged).AddListener((UnityAction<bool>)OnActiveSelfToggled);
			Text val9 = default(Text);
			GameObject val10 = UIFactory.CreateToggle(val7, "IsStatic", ref IsStaticToggle, ref val9, default(Color), 20, 20);
			num2 = 25;
			UIFactory.SetLayoutElement(val10, (int?)80, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val9.text = "IsStatic";
			((Graphic)val9).color = Color.grey;
			((Selectable)IsStaticToggle).interactable = false;
			Text val11 = UIFactory.CreateLabel(val7, "InstanceIDLabel", "Instance ID:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject5 = ((Component)val11).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject5, (int?)90, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			InstanceIDInput = UIFactory.CreateInputField(val7, "InstanceIDInput", "error");
			GameObject gameObject6 = ((Component)InstanceIDInput.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject6, (int?)110, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)InstanceIDInput.Component.textComponent).color = Color.grey;
			InstanceIDInput.Component.readOnly = true;
			Text val12 = UIFactory.CreateLabel(val7, "TagLabel", "Tag:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject7 = ((Component)val12).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject7, (int?)40, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			TagInput = UIFactory.CreateInputField(val7, "TagInput", "none");
			GameObject gameObject8 = ((Component)TagInput.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject8, (int?)100, num2, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)TagInput.Component.textComponent).color = Color.white;
			UnityHelpers.GetOnEndEdit(TagInput.Component).AddListener((UnityAction<string>)delegate(string val)
			{
				OnTagEndEdit(val);
			});
			ButtonRef val13 = UIFactory.CreateButton(val7, "InstantiateBtn", "Instantiate", (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject9 = ((Component)val13.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject9, (int?)120, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val13.OnClick = (Action)System.Delegate.Combine(val13.OnClick, new Action(OnInstantiateClicked));
			ButtonRef val14 = UIFactory.CreateButton(val7, "DestroyBtn", "Destroy", (Color?)new Color(0.3f, 0.2f, 0.2f));
			GameObject gameObject10 = ((Component)val14.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject10, (int?)80, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val14.OnClick = (Action)System.Delegate.Combine(val14.OnClick, new Action(OnDestroyClicked));
			GameObject val15 = UIFactory.CreateUIObject("ParentRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val15, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			num2 = 25;
			num = 9999;
			UIFactory.SetLayoutElement(val15, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef val16 = UIFactory.CreateButton(val15, "ExploreBtn", "Show in Explorer", (Color?)new Color(0.15f, 0.15f, 0.15f));
			GameObject gameObject11 = ((Component)val16.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject11, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val16.ButtonText.fontSize = 12;
			val16.OnClick = (Action)System.Delegate.Combine(val16.OnClick, new Action(OnExploreButtonClicked));
			Text val17 = UIFactory.CreateLabel(val15, "SceneLabel", "Scene:", (TextAnchor)3, Color.grey, true, 14);
			GameObject gameObject12 = ((Component)val17).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject12, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			SceneButton = UIFactory.CreateButton(val15, "SceneButton", "untitled", (Color?)null);
			GameObject gameObject13 = ((Component)SceneButton.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject13, (int?)120, num, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef sceneButton = SceneButton;
			sceneButton.OnClick = (Action)System.Delegate.Combine(sceneButton.OnClick, new Action(OnSceneButtonClicked));
			Text val18 = UIFactory.CreateLabel(val15, "LayerLabel", "Layer:", (TextAnchor)3, Color.grey, true, 14);
			GameObject gameObject14 = ((Component)val18).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject14, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject val19 = UIFactory.CreateDropdown(val15, "LayerDropdown", ref LayerDropdown, "0", 14, (Action<int>)OnLayerDropdownChanged, (string[])null);
			num = 25;
			UIFactory.SetLayoutElement(val19, (int?)110, num, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)LayerDropdown.captionText).color = SignatureHighlighter.EnumGreen;
			if (layerToNames == null)
			{
				GetLayerNames();
			}
			foreach (string layerToName in layerToNames)
			{
				LayerDropdown.options.Add(new OptionData(layerToName));
			}
			LayerDropdown.value = 0;
			LayerDropdown.RefreshShownValue();
			Text val20 = UIFactory.CreateLabel(val15, "FlagsLabel", "Flags:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject15 = ((Component)val20).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject15, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject val21 = UIFactory.CreateDropdown(val15, "FlagsDropdown", ref FlagsDropdown, "None", 14, (Action<int>)OnFlagsDropdownChanged, (string[])null);
			((Graphic)FlagsDropdown.captionText).color = SignatureHighlighter.EnumGreen;
			num = 25;
			UIFactory.SetLayoutElement(val21, (int?)135, num, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			if (hideFlagsValues == null)
			{
				GetHideFlagNames();
			}
			foreach (string key in hideFlagsValues.Keys)
			{
				FlagsDropdown.options.Add(new OptionData(key));
			}
			FlagsDropdown.value = 0;
			FlagsDropdown.RefreshShownValue();
		}

		private static void GetLayerNames()
		{
			layerToNames = new List<string>();
			for (int i = 0; i < 32; i++)
			{
				string text = RuntimeHelper.LayerToName(i);
				if (string.IsNullOrEmpty(text))
				{
					text = i.ToString();
				}
				layerToNames.Add(text);
			}
		}

		private static void GetHideFlagNames()
		{
			//IL_002b: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			hideFlagsValues = new Dictionary<string, HideFlags>();
			Array values = System.Enum.GetValues(typeof(HideFlags));
			foreach (HideFlags item in values)
			{
				HideFlags value = item;
				hideFlagsValues.Add(((object)(HideFlags)(ref value)).ToString(), value);
			}
		}
	}
	public class TransformControls
	{
		private Vector3Control PositionControl;

		private Vector3Control LocalPositionControl;

		private Vector3Control RotationControl;

		private Vector3Control ScaleControl;

		public GameObjectControls Owner { get; }

		private GameObject Target => Owner.Target;

		public AxisControl CurrentSlidingAxisControl { get; set; }

		public TransformControls(GameObjectControls owner)
		{
			Owner = owner;
			Create();
		}

		public void UpdateTransformControlValues(bool force)
		{
			PositionControl.Update(force);
			LocalPositionControl.Update(force);
			RotationControl.Update(force);
			ScaleControl.Update(force);
		}

		public void UpdateVectorSlider()
		{
			AxisControl currentSlidingAxisControl = CurrentSlidingAxisControl;
			if (currentSlidingAxisControl != null)
			{
				if (!InputManager.GetMouseButton(0))
				{
					currentSlidingAxisControl.slider.value = 0f;
					currentSlidingAxisControl = null;
				}
				else
				{
					AxisControlOperation(currentSlidingAxisControl.slider.value, currentSlidingAxisControl.parent, currentSlidingAxisControl.axis);
				}
			}
		}

		public void AxisControlOperation(float value, Vector3Control parent, int axis)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: 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)
			//IL_003f: 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_0048: 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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: 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_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = Target.transform;
			Vector3 val = (Vector3)(parent.Type switch
			{
				TransformType.Position => transform.position, 
				TransformType.LocalPosition => transform.localPosition, 
				TransformType.Rotation => transform.localEulerAngles, 
				TransformType.Scale => transform.localScale, 
				_ => throw new NotImplementedException(), 
			});
			switch (axis)
			{
			case 0:
				val.x += value;
				break;
			case 1:
				val.y += value;
				break;
			case 2:
				val.z += value;
				break;
			}
			switch (parent.Type)
			{
			case TransformType.Position:
				transform.position = val;
				break;
			case TransformType.LocalPosition:
				transform.localPosition = val;
				break;
			case TransformType.Rotation:
				transform.localEulerAngles = val;
				break;
			case TransformType.Scale:
				transform.localScale = val;
				break;
			}
			UpdateTransformControlValues(force: false);
		}

		public void Create()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.CreateVerticalGroup(Owner.Parent.Content, "TransformControls", false, false, true, true, 2, new Vector4(2f, 2f, 0f, 0f), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			int? num = 100;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(val, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			PositionControl = Vector3Control.Create(this, val, "Position:", TransformType.Position);
			LocalPositionControl = Vector3Control.Create(this, val, "Local Position:", TransformType.LocalPosition);
			RotationControl = Vector3Control.Create(this, val, "Rotation:", TransformType.Rotation);
			ScaleControl = Vector3Control.Create(this, val, "Scale:", TransformType.Scale);
		}
	}
	public enum TransformType
	{
		Position,
		LocalPosition,
		Rotation,
		Scale
	}
	public class Vector3Control
	{
		private Vector3 lastValue;

		public TransformControls Owner { get; }

		public GameObject Target => Owner.Owner.Target;

		public Transform Transform => Target.transform;

		public TransformType Type { get; }

		public InputFieldRef MainInput { get; }

		public AxisControl[] AxisControls { get; } = new AxisControl[3];


		public InputFieldRef IncrementInput { get; set; }

		public float Increment { get; set; } = 0.1f;


		private Vector3 CurrentValue => (Vector3)(Type switch
		{
			TransformType.Position => Transform.position, 
			TransformType.LocalPosition => Transform.localPosition, 
			TransformType.Rotation => Transform.localEulerAngles, 
			TransformType.Scale => Transform.localScale, 
			_ => throw new NotImplementedException(), 
		});

		public Vector3Control(TransformControls owner, TransformType type, InputFieldRef input)
		{
			Owner = owner;
			Type = type;
			MainInput = input;
		}

		public void Update(bool force)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			Vector3 currentValue = CurrentValue;
			if (force || (!MainInput.Component.isFocused && !((object)(Vector3)(ref lastValue)).Equals((object?)currentValue)))
			{
				MainInput.Text = ParseUtility.ToStringForInput<Vector3>((object)currentValue);
				lastValue = currentValue;
			}
		}

		private void OnTransformInputEndEdit(TransformType type, string input)
		{
			//IL_003a: 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)
			//IL_0087: 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)
			Exception ex = default(Exception);
			switch (type)
			{
			case TransformType.Position:
			{
				Vector3 position = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref position, ref ex))
				{
					Target.transform.position = position;
				}
				break;
			}
			case TransformType.LocalPosition:
			{
				Vector3 localPosition = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref localPosition, ref ex))
				{
					Target.transform.localPosition = localPosition;
				}
				break;
			}
			case TransformType.Rotation:
			{
				Vector3 localEulerAngles = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref localEulerAngles, ref ex))
				{
					Target.transform.localEulerAngles = localEulerAngles;
				}
				break;
			}
			case TransformType.Scale:
			{
				Vector3 localScale = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref localScale, ref ex))
				{
					Target.transform.localScale = localScale;
				}
				break;
			}
			}
			Owner.UpdateTransformControlValues(force: true);
		}

		private void IncrementInput_OnEndEdit(string value)
		{
			float num = default(float);
			Exception ex = default(Exception);
			if (!ParseUtility.TryParse<float>(value, ref num, ref ex))
			{
				IncrementInput.Text = ParseUtility.ToStringForInput<float>((object)Increment);
				return;
			}
			Increment = num;
			AxisControl[] axisControls = AxisControls;
			foreach (AxisControl axisControl in axisControls)
			{
				axisControl.slider.minValue = 0f - num;
				axisControl.slider.maxValue = num;
			}
		}

		public static Vector3Control Create(TransformControls owner, GameObject transformGroup, string title, TransformType type)
		{
			//IL_001c: 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_00cb: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.CreateUIObject("Row_" + title, transformGroup, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			int? num = 25;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(val, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			Text val2 = UIFactory.CreateLabel(val, "PositionLabel", title, (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject = ((Component)val2).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)110, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			InputFieldRef val3 = UIFactory.CreateInputField(val, "InputField", "...");
			GameObject gameObject2 = ((Component)val3.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)100, num2, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			Vector3Control control = new Vector3Control(owner, type, val3);
			UnityHelpers.GetOnEndEdit(val3.Component).AddListener((UnityAction<string>)delegate(string value)
			{
				control.OnTransformInputEndEdit(type, value);
			});
			control.AxisControls[0] = AxisControl.Create(val, "X", 0, control);
			control.AxisControls[1] = AxisControl.Create(val, "Y", 1, control);
			control.AxisControls[2] = AxisControl.Create(val, "Z", 2, control);
			control.IncrementInput = UIFactory.CreateInputField(val, "IncrementInput", "...");
			control.IncrementInput.Text = "0.1";
			GameObject gameObject3 = control.IncrementInput.GameObject;
			int? num3 = 30;
			num2 = 0;
			UIFactory.SetLayoutElement(gameObject3, num3, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			UnityHelpers.GetOnEndEdit(control.IncrementInput.Component).AddListener((UnityAction<string>)control.IncrementInput_OnEndEdit);
			return control;
		}
	}
	internal class TimeScaleWidget
	{
		private static TimeScaleWidget Instance;

		private ButtonRef lockBtn;

		private bool locked;

		private InputFieldRef timeInput;

		private float desiredTime;

		private bool settingTimeScale;

		public TimeScaleWidget(GameObject parent)
		{
			Instance = this;
			ConstructUI(parent);
			InitPatch();
		}

		public void Update()
		{
			if (locked)
			{
				SetTimeScale(desiredTime);
			}
			if (!timeInput.Component.isFocused)
			{
				timeInput.Text = Time.timeScale.ToString("F2");
			}
		}

		private void SetTimeScale(float time)
		{
			settingTimeScale = true;
			Time.timeScale = time;
			settingTimeScale = false;
		}

		private void OnTimeInputEndEdit(string val)
		{
			if (float.TryParse(val, out var result))
			{
				SetTimeScale(result);
				desiredTime = result;
			}
		}

		private void OnPauseButtonClicked()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: 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)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			OnTimeInputEndEdit(timeInput.Text);
			locked = !locked;
			Color val = (locked ? new Color(0.3f, 0.3f, 0.2f) : new Color(0.2f, 0.2f, 0.2f));
			RuntimeHelper.SetColorBlock((Selectable)(object)lockBtn.Component, (Color?)val, (Color?)(val * 1.2f), (Color?)(val * 0.7f), (Color?)null);
			lockBtn.ButtonText.text = (locked ? "Unlock" : "Lock");
		}

		private void ConstructUI(GameObject parent)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			Text val = UIFactory.CreateLabel(parent, "TimeLabel", "Time:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject = ((Component)val).gameObject;
			int? num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)35, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			timeInput = UIFactory.CreateInputField(parent, "TimeInput", "timeScale");
			GameObject gameObject2 = ((Component)timeInput.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)40, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			UnityHelpers.GetOnEndEdit(timeInput.Component).AddListener((UnityAction<string>)OnTimeInputEndEdit);
			timeInput.Text = string.Empty;
			timeInput.Text = Time.timeScale.ToString();
			lockBtn = UIFactory.CreateButton(parent, "PauseButton", "Lock", (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject3 = ((Component)lockBtn.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject3, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef obj = lockBtn;
			obj.OnClick = (Action)System.Delegate.Combine(obj.OnClick, new Action(OnPauseButtonClicked));
		}

		private static void InitPatch()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			try
			{
				MethodInfo setMethod = typeof(Time).GetProperty("timeScale").GetSetMethod();
				ExplorerCore.Harmony.Patch((MethodBase)setMethod, new HarmonyMethod(AccessTools.Method(typeof(TimeScaleWidget), "Prefix_Time_set_timeScale", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
		}

		private static bool Prefix_Time_set_timeScale()
		{
			return !Instance.locked || Instance.settingTimeScale;
		}
	}
	public class AudioClipWidget : UnityObjectWidget
	{
		private static GameObject AudioPlayerObject;

		private static AudioSource Source;

		private static AudioClipWidget CurrentlyPlaying;

		private static Coroutine CurrentlyPlayingCoroutine;

		private static readonly string zeroLengthString = GetLengthString(0f);

		public AudioClip audioClip;

		private string fullLengthText;

		private ButtonRef toggleButton;

		private bool audioPlayerWanted;

		private GameObject audioPlayerRoot;

		private ButtonRef playStopButton;

		private Text progressLabel;

		private GameObject saveObjectRow;

		private InputFieldRef savePathInput;

		private GameObject cantSaveRow;

		public override void OnBorrowed(object target, Type targetType, ReflectionInspector inspector)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Invalid comparison between Unknown and I4
			base.OnBorrowed(target, targetType, inspector);
			audioPlayerRoot.transform.SetParent(inspector.UIRoot.transform);
			audioPlayerRoot.transform.SetSiblingIndex(inspector.UIRoot.transform.childCount - 2);
			audioClip = ReflectionExtensions.TryCast<AudioClip>(target);
			fullLengthText = GetLengthString(audioClip.length);
			if ((int)audioClip.loadType == 0)
			{
				cantSaveRow.SetActive(false);
				saveObjectRow.SetActive(true);
				SetDefaultSavePath();
			}
			else
			{
				cantSaveRow.SetActive(true);
				saveObjectRow.SetActive(false);
			}
			ResetProgressLabel();
		}

		public override void OnReturnToPool()
		{
			audioClip = null;
			if (audioPlayerWanted)
			{
				ToggleAudioWidget();
			}
			if (CurrentlyPlaying == this)
			{
				StopClip();
			}
			audioPlayerRoot.transform.SetParent(Pool<AudioClipWidget>.Instance.InactiveHolder.transform);
			base.OnReturnToPool();
		}

		private void ToggleAudioWidget()
		{
			if (audioPlayerWanted)
			{
				audioPlayerWanted = false;
				toggleButton.ButtonText.text = "Show Player";
				audioPlayerRoot.SetActive(false);
			}
			else
			{
				audioPlayerWanted = true;
				toggleButton.ButtonText.text = "Hide Player";
				audioPlayerRoot.SetActive(true);
			}
		}

		private void SetDefaultSavePath()
		{
			string text = ((Object)audioClip).name;
			if (string.IsNullOrEmpty(text))
			{
				text = "untitled";
			}
			savePathInput.Text = Path.Combine(ConfigManager.Default_Output_Path.Value, text + ".wav");
		}

		private static string GetLengthString(float seconds)
		{
			TimeSpan timeSpan = TimeSpan.FromSeconds(seconds);
			StringBuilder stringBuilder = new StringBuilder();
			if (timeSpan.Hours > 0)
			{
				stringBuilder.Append($"{timeSpan.Hours}:");
			}

UniverseLib.Mono.dll

Decompiled a year ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using HarmonyLib;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.Runtime.Mono;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("UniverseLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sinai")]
[assembly: AssemblyProduct("UniverseLib")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.4.3")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.3.0")]
[module: UnverifiableCode]
public static class MonoExtensions
{
	private static PropertyInfo p_childControlHeight = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlHeight");

	private static PropertyInfo p_childControlWidth = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlWidth");

	public static void AddListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.AddListener(new UnityAction(listener.Invoke));
	}

	public static void AddListener<T>(this UnityEvent<T> _event, Action<T> listener)
	{
		_event.AddListener((UnityAction<T>)listener.Invoke);
	}

	public static void RemoveListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.RemoveListener(new UnityAction(listener.Invoke));
	}

	public static void RemoveListener<T>(this UnityEvent<T> _event, Action<T> listener)
	{
		_event.RemoveListener((UnityAction<T>)listener.Invoke);
	}

	public static void Clear(this StringBuilder sb)
	{
		sb.Remove(0, sb.Length);
	}

	public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlHeight?.SetValue(group, value, null);
	}

	public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlWidth?.SetValue(group, value, null);
	}
}
namespace UniverseLib
{
	public static class ReflectionExtensions
	{
		public static Type GetActualType(this object obj)
		{
			return ReflectionUtility.Instance.Internal_GetActualType(obj);
		}

		public static object TryCast(this object obj)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, ReflectionUtility.Instance.Internal_GetActualType(obj));
		}

		public static object TryCast(this object obj, Type castTo)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, castTo);
		}

		public static T TryCast<T>(this object obj)
		{
			try
			{
				return (T)ReflectionUtility.Instance.Internal_TryCast(obj, typeof(T));
			}
			catch
			{
				return default(T);
			}
		}

		[Obsolete("This method is no longer necessary, just use Assembly.GetTypes().", false)]
		public static IEnumerable<Type> TryGetTypes(this Assembly asm)
		{
			return asm.GetTypes();
		}

		public static bool ReferenceEqual(this object objA, object objB)
		{
			if (objA == objB)
			{
				return true;
			}
			Object val = (Object)((objA is Object) ? objA : null);
			if (val != null)
			{
				Object val2 = (Object)((objB is Object) ? objB : null);
				if (val2 != null && Object.op_Implicit(val) && Object.op_Implicit(val2) && val.m_CachedPtr == val2.m_CachedPtr)
				{
					return true;
				}
			}
			return false;
		}

		public static string ReflectionExToString(this Exception e, bool innerMost = true)
		{
			if (e == null)
			{
				return "The exception was null.";
			}
			if (innerMost)
			{
				e = e.GetInnerMostException();
			}
			return $"{e.GetType()}: {e.Message}";
		}

		public static Exception GetInnerMostException(this Exception e)
		{
			while (e != null && e.InnerException != null)
			{
				e = e.InnerException;
			}
			return e;
		}
	}
	internal static class ReflectionPatches
	{
		internal static void Init()
		{
			Universe.Patch(typeof(Assembly), "GetTypes", (MethodType)0, new Type[0], null, null, AccessTools.Method(typeof(ReflectionPatches), "Finalizer_Assembly_GetTypes", (Type[])null, (Type[])null));
		}

		public static Exception Finalizer_Assembly_GetTypes(Assembly __instance, Exception __exception, ref Type[] __result)
		{
			if (__exception != null)
			{
				if (__exception is ReflectionTypeLoadException e)
				{
					__result = ReflectionUtility.TryExtractTypesFromException(e);
				}
				else
				{
					try
					{
						__result = __instance.GetExportedTypes();
					}
					catch (ReflectionTypeLoadException e2)
					{
						__result = ReflectionUtility.TryExtractTypesFromException(e2);
					}
					catch
					{
						__result = ArgumentUtility.EmptyTypes;
					}
				}
			}
			return null;
		}
	}
	public class ReflectionUtility
	{
		public static bool Initializing;

		public const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

		public static readonly SortedDictionary<string, Type> AllTypes = new SortedDictionary<string, Type>(StringComparer.OrdinalIgnoreCase);

		public static readonly List<string> AllNamespaces = new List<string>();

		private static readonly HashSet<string> uniqueNamespaces = new HashSet<string>();

		private static string[] allTypeNamesArray;

		private static readonly Dictionary<string, Type> shorthandToType = new Dictionary<string, Type>
		{
			{
				"object",
				typeof(object)
			},
			{
				"string",
				typeof(string)
			},
			{
				"bool",
				typeof(bool)
			},
			{
				"byte",
				typeof(byte)
			},
			{
				"sbyte",
				typeof(sbyte)
			},
			{
				"char",
				typeof(char)
			},
			{
				"decimal",
				typeof(decimal)
			},
			{
				"double",
				typeof(double)
			},
			{
				"float",
				typeof(float)
			},
			{
				"int",
				typeof(int)
			},
			{
				"uint",
				typeof(uint)
			},
			{
				"long",
				typeof(long)
			},
			{
				"ulong",
				typeof(ulong)
			},
			{
				"short",
				typeof(short)
			},
			{
				"ushort",
				typeof(ushort)
			},
			{
				"void",
				typeof(void)
			}
		};

		internal static readonly Dictionary<string, Type[]> baseTypes = new Dictionary<string, Type[]>();

		internal static ReflectionUtility Instance { get; private set; }

		public static event Action<Type> OnTypeLoaded;

		internal static void Init()
		{
			ReflectionPatches.Init();
			Instance = new ReflectionUtility();
			Instance.Initialize();
		}

		protected virtual void Initialize()
		{
			SetupTypeCache();
			Initializing = false;
		}

		public static string[] GetTypeNameArray()
		{
			if (allTypeNamesArray == null || allTypeNamesArray.Length != AllTypes.Count)
			{
				allTypeNamesArray = new string[AllTypes.Count];
				int num = 0;
				foreach (string key in AllTypes.Keys)
				{
					allTypeNamesArray[num] = key;
					num++;
				}
			}
			return allTypeNamesArray;
		}

		private static void SetupTypeCache()
		{
			if (Universe.Context == RuntimeContext.Mono)
			{
				ForceLoadManagedAssemblies();
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly asm in assemblies)
			{
				CacheTypes(asm);
			}
			AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded;
		}

		private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args)
		{
			if ((object)args.LoadedAssembly != null && !(args.LoadedAssembly.GetName().Name == "completions"))
			{
				CacheTypes(args.LoadedAssembly);
			}
		}

		private static void ForceLoadManagedAssemblies()
		{
			string path = Path.Combine(Application.dataPath, "Managed");
			if (!Directory.Exists(path))
			{
				return;
			}
			string[] files = Directory.GetFiles(path, "*.dll");
			foreach (string path2 in files)
			{
				try
				{
					Assembly assembly = Assembly.LoadFile(path2);
					assembly.GetTypes();
				}
				catch
				{
				}
			}
		}

		private static void CacheTypes(Assembly asm)
		{
			Type[] types = asm.GetTypes();
			foreach (Type type in types)
			{
				if (!string.IsNullOrEmpty(type.Namespace) && !uniqueNamespaces.Contains(type.Namespace))
				{
					uniqueNamespaces.Add(type.Namespace);
					int j;
					for (j = 0; j < AllNamespaces.Count && type.Namespace.CompareTo(AllNamespaces[j]) >= 0; j++)
					{
					}
					AllNamespaces.Insert(j, type.Namespace);
				}
				AllTypes[type.FullName] = type;
				ReflectionUtility.OnTypeLoaded?.Invoke(type);
			}
		}

		public static Type GetTypeByName(string fullName)
		{
			return Instance.Internal_GetTypeByName(fullName);
		}

		internal virtual Type Internal_GetTypeByName(string fullName)
		{
			if (shorthandToType.TryGetValue(fullName, out var value))
			{
				return value;
			}
			AllTypes.TryGetValue(fullName, out var value2);
			return value2;
		}

		internal virtual Type Internal_GetActualType(object obj)
		{
			return obj?.GetType();
		}

		internal virtual object Internal_TryCast(object obj, Type castTo)
		{
			return obj;
		}

		public static string ProcessTypeInString(Type type, string theString)
		{
			return Instance.Internal_ProcessTypeInString(theString, type);
		}

		internal virtual string Internal_ProcessTypeInString(string theString, Type type)
		{
			return theString;
		}

		public static void FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			Instance.Internal_FindSingleton(possibleNames, type, flags, instances);
		}

		internal virtual void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			foreach (string name in possibleNames)
			{
				FieldInfo field = type.GetField(name, flags);
				if ((object)field != null)
				{
					object value = field.GetValue(null);
					if (value != null)
					{
						instances.Add(value);
						break;
					}
				}
			}
		}

		public static Type[] TryExtractTypesFromException(ReflectionTypeLoadException e)
		{
			try
			{
				return e.Types.Where((Type it) => (object)it != null).ToArray();
			}
			catch
			{
				return ArgumentUtility.EmptyTypes;
			}
		}

		public static Type[] GetAllBaseTypes(object obj)
		{
			return GetAllBaseTypes(obj?.GetActualType());
		}

		public static Type[] GetAllBaseTypes(Type type)
		{
			if ((object)type == null)
			{
				throw new ArgumentNullException("type");
			}
			string assemblyQualifiedName = type.AssemblyQualifiedName;
			if (baseTypes.TryGetValue(assemblyQualifiedName, out var value))
			{
				return value;
			}
			List<Type> list = new List<Type>();
			while ((object)type != null)
			{
				list.Add(type);
				type = type.BaseType;
			}
			value = list.ToArray();
			baseTypes.Add(assemblyQualifiedName, value);
			return value;
		}

		public static void GetImplementationsOf(Type baseType, Action<HashSet<Type>> onResultsFetched, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			RuntimeHelper.StartCoroutine(DoGetImplementations(onResultsFetched, baseType, allowAbstract, allowGeneric, allowEnum));
		}

		private static IEnumerator DoGetImplementations(Action<HashSet<Type>> onResultsFetched, Type baseType, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			List<Type> resolvedTypes = new List<Type>();
			OnTypeLoaded += ourListener;
			HashSet<Type> set = new HashSet<Type>();
			IEnumerator coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator());
			while (coro2.MoveNext())
			{
				yield return null;
			}
			OnTypeLoaded -= ourListener;
			if (resolvedTypes.Count > 0)
			{
				coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator());
				while (coro2.MoveNext())
				{
					yield return null;
				}
			}
			onResultsFetched(set);
			void ourListener(Type t)
			{
				resolvedTypes.Add(t);
			}
		}

		private static IEnumerator<Type> DefaultTypesEnumerator()
		{
			string[] names = GetTypeNameArray();
			foreach (string name in names)
			{
				yield return AllTypes[name];
			}
		}

		private static IEnumerator GetImplementationsAsync(Type baseType, HashSet<Type> set, bool allowAbstract, bool allowGeneric, bool allowEnum, IEnumerator<Type> enumerator)
		{
			Stopwatch sw = new Stopwatch();
			sw.Start();
			bool isGenericParam = baseType?.IsGenericParameter ?? false;
			while (enumerator.MoveNext())
			{
				if (sw.ElapsedMilliseconds > 10)
				{
					yield return null;
					sw.Reset();
					sw.Start();
				}
				try
				{
					Type type = enumerator.Current;
					if (set.Contains(type) || (!allowAbstract && type.IsAbstract) || (!allowGeneric && type.IsGenericType) || (!allowEnum && type.IsEnum) || type.FullName.Contains("PrivateImplementationDetails") || type.FullName.Contains("DisplayClass") || Enumerable.Contains(type.FullName, '<'))
					{
						continue;
					}
					if (!isGenericParam)
					{
						if ((object)baseType == null || baseType.IsAssignableFrom(type))
						{
							goto IL_0269;
						}
					}
					else if ((!type.IsClass || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type)))
					{
						goto IL_0269;
					}
					goto end_IL_009f;
					IL_0269:
					set.Add(type);
					end_IL_009f:;
				}
				catch
				{
				}
			}
		}

		public static bool IsEnumerable(Type type)
		{
			return Instance.Internal_IsEnumerable(type);
		}

		protected virtual bool Internal_IsEnumerable(Type type)
		{
			return typeof(IEnumerable).IsAssignableFrom(type);
		}

		public static bool TryGetEnumerator(object ienumerable, out IEnumerator enumerator)
		{
			return Instance.Internal_TryGetEnumerator(ienumerable, out enumerator);
		}

		protected virtual bool Internal_TryGetEnumerator(object list, out IEnumerator enumerator)
		{
			enumerator = (list as IEnumerable).GetEnumerator();
			return true;
		}

		public static bool TryGetEntryType(Type enumerableType, out Type type)
		{
			return Instance.Internal_TryGetEntryType(enumerableType, out type);
		}

		protected virtual bool Internal_TryGetEntryType(Type enumerableType, out Type type)
		{
			if (enumerableType.IsArray)
			{
				type = enumerableType.GetElementType();
				return true;
			}
			Type[] interfaces = enumerableType.GetInterfaces();
			foreach (Type type2 in interfaces)
			{
				if (type2.IsGenericType)
				{
					Type genericTypeDefinition = type2.GetGenericTypeDefinition();
					if ((object)genericTypeDefinition == typeof(IEnumerable<>) || (object)genericTypeDefinition == typeof(IList<>) || (object)genericTypeDefinition == typeof(ICollection<>))
					{
						type = type2.GetGenericArguments()[0];
						return true;
					}
				}
			}
			type = typeof(object);
			return false;
		}

		public static bool IsDictionary(Type type)
		{
			return Instance.Internal_IsDictionary(type);
		}

		protected virtual bool Internal_IsDictionary(Type type)
		{
			return typeof(IDictionary).IsAssignableFrom(type);
		}

		public static bool TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			return Instance.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator);
		}

		protected virtual bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			dictEnumerator = EnumerateDictionary((IDictionary)dictionary);
			return true;
		}

		private IEnumerator<DictionaryEntry> EnumerateDictionary(IDictionary dict)
		{
			IDictionaryEnumerator enumerator = dict.GetEnumerator();
			while (enumerator.MoveNext())
			{
				yield return new DictionaryEntry(enumerator.Key, enumerator.Value);
			}
		}

		public static bool TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			return Instance.Internal_TryGetEntryTypes(dictionaryType, out keys, out values);
		}

		protected virtual bool Internal_TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			Type[] interfaces = dictionaryType.GetInterfaces();
			foreach (Type type in interfaces)
			{
				if (type.IsGenericType && (object)type.GetGenericTypeDefinition() == typeof(IDictionary<, >))
				{
					Type[] genericArguments = type.GetGenericArguments();
					keys = genericArguments[0];
					values = genericArguments[1];
					return true;
				}
			}
			keys = typeof(object);
			values = typeof(object);
			return false;
		}
	}
	public abstract class RuntimeHelper
	{
		internal static RuntimeHelper Instance { get; private set; }

		internal static void Init()
		{
			Instance = new MonoProvider();
			Instance.OnInitialize();
		}

		protected internal abstract void OnInitialize();

		public static Coroutine StartCoroutine(IEnumerator routine)
		{
			return Instance.Internal_StartCoroutine(routine);
		}

		protected internal abstract Coroutine Internal_StartCoroutine(IEnumerator routine);

		public static void StopCoroutine(Coroutine coroutine)
		{
			Instance.Internal_StopCoroutine(coroutine);
		}

		protected internal abstract void Internal_StopCoroutine(Coroutine coroutine);

		public static T AddComponent<T>(GameObject obj, Type type) where T : Component
		{
			return Instance.Internal_AddComponent<T>(obj, type);
		}

		protected internal abstract T Internal_AddComponent<T>(GameObject obj, Type type) where T : Component;

		public static ScriptableObject CreateScriptable(Type type)
		{
			return Instance.Internal_CreateScriptable(type);
		}

		protected internal abstract ScriptableObject Internal_CreateScriptable(Type type);

		public static string LayerToName(int layer)
		{
			return Instance.Internal_LayerToName(layer);
		}

		protected internal abstract string Internal_LayerToName(int layer);

		public static T[] FindObjectsOfTypeAll<T>() where T : Object
		{
			return Instance.Internal_FindObjectsOfTypeAll<T>();
		}

		public static Object[] FindObjectsOfTypeAll(Type type)
		{
			return Instance.Internal_FindObjectsOfTypeAll(type);
		}

		protected internal abstract T[] Internal_FindObjectsOfTypeAll<T>() where T : Object;

		protected internal abstract Object[] Internal_FindObjectsOfTypeAll(Type type);

		public static void GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list)
		{
			Instance.Internal_GraphicRaycast(raycaster, data, list);
		}

		protected internal abstract void Internal_GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list);

		public static GameObject[] GetRootGameObjects(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootGameObjects(scene);
		}

		protected internal abstract GameObject[] Internal_GetRootGameObjects(Scene scene);

		public static int GetRootCount(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootCount(scene);
		}

		protected internal abstract int Internal_GetRootCount(Scene scene);

		public static void SetColorBlockAuto(Selectable selectable, Color baseColor)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, baseColor, baseColor * 1.2f, baseColor * 0.8f);
		}

		public static void SetColorBlock(Selectable selectable, ColorBlock colors)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, colors);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, ColorBlock colors);

		public static void SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null)
		{
			Instance.Internal_SetColorBlock(selectable, normal, highlighted, pressed, disabled);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null);
	}
	internal class UniversalBehaviour : MonoBehaviour
	{
		internal static UniversalBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0015: 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)
			GameObject val = new GameObject("UniverseLibBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D);
			Instance = val.AddComponent<UniversalBehaviour>();
		}

		internal void Update()
		{
			Universe.Update();
		}
	}
	public class Universe
	{
		public enum GlobalState
		{
			WaitingToSetup,
			SettingUp,
			SetupCompleted
		}

		public const string NAME = "UniverseLib";

		public const string VERSION = "1.4.3";

		public const string AUTHOR = "Sinai";

		public const string GUID = "com.sinai.universelib";

		private static float startupDelay;

		private static Action<string, LogType> logHandler;

		public static RuntimeContext Context { get; } = RuntimeContext.Mono;


		public static GlobalState CurrentGlobalState { get; private set; }

		internal static Harmony Harmony { get; } = new Harmony("com.sinai.universelib");


		private static event Action OnInitialized;

		public static void Init(Action onInitialized = null, Action<string, LogType> logHandler = null)
		{
			Init(1f, onInitialized, logHandler, default(UniverseLibConfig));
		}

		public static void Init(float startupDelay, Action onInitialized, Action<string, LogType> logHandler, UniverseLibConfig config)
		{
			if (CurrentGlobalState == GlobalState.SetupCompleted)
			{
				InvokeOnInitialized(onInitialized);
				return;
			}
			if (startupDelay > Universe.startupDelay)
			{
				Universe.startupDelay = startupDelay;
			}
			ConfigManager.LoadConfig(config);
			OnInitialized += onInitialized;
			if (logHandler != null && Universe.logHandler == null)
			{
				Universe.logHandler = logHandler;
			}
			if (CurrentGlobalState == GlobalState.WaitingToSetup)
			{
				CurrentGlobalState = GlobalState.SettingUp;
				Log("UniverseLib 1.4.3 initializing...");
				UniversalBehaviour.Setup();
				ReflectionUtility.Init();
				RuntimeHelper.Init();
				RuntimeHelper.Instance.Internal_StartCoroutine(SetupCoroutine());
				Log("Finished UniverseLib initial setup.");
			}
		}

		internal static void Update()
		{
			UniversalUI.Update();
		}

		private static IEnumerator SetupCoroutine()
		{
			yield return null;
			Stopwatch sw = new Stopwatch();
			sw.Start();
			while (ReflectionUtility.Initializing || (float)sw.ElapsedMilliseconds * 0.001f < startupDelay)
			{
				yield return null;
			}
			InputManager.Init();
			UniversalUI.Init();
			Log("UniverseLib 1.4.3 initialized.");
			CurrentGlobalState = GlobalState.SetupCompleted;
			InvokeOnInitialized(Universe.OnInitialized);
		}

		private static void InvokeOnInitialized(Action onInitialized)
		{
			if (onInitialized == null)
			{
				return;
			}
			Delegate[] invocationList = onInitialized.GetInvocationList();
			foreach (Delegate @delegate in invocationList)
			{
				try
				{
					@delegate.DynamicInvoke();
				}
				catch (Exception arg)
				{
					LogWarning($"Exception invoking onInitialized callback! {arg}");
				}
			}
		}

		internal static void Log(object message)
		{
			Log(message, (LogType)3);
		}

		internal static void LogWarning(object message)
		{
			Log(message, (LogType)2);
		}

		internal static void LogError(object message)
		{
			Log(message, (LogType)0);
		}

		private static void Log(object message, LogType logType)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			logHandler("[UniverseLib] " + (message?.ToString() ?? string.Empty), logType);
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Invalid comparison between Unknown and I4
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			try
			{
				string text = (((int)methodType == 1) ? "get_" : (((int)methodType != 2) ? string.Empty : "set_"));
				string text2 = text;
				MethodInfo methodInfo = ((arguments == null) ? type.GetMethod(text2 + methodName, AccessTools.all) : type.GetMethod(text2 + methodName, AccessTools.all, null, arguments, null));
				if ((object)methodInfo == null)
				{
					return false;
				}
				PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo);
				if ((object)prefix != null)
				{
					val.AddPrefix(new HarmonyMethod(prefix));
				}
				if ((object)postfix != null)
				{
					val.AddPostfix(new HarmonyMethod(postfix));
				}
				if ((object)finalizer != null)
				{
					val.AddFinalizer(new HarmonyMethod(finalizer));
				}
				val.Patch();
				return true;
			}
			catch (Exception arg)
			{
				LogWarning($"\t Exception patching {type.FullName}.{methodName}: {arg}");
				return false;
			}
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				foreach (Type[] arguments in possibleArguments)
				{
					if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
					{
						return true;
					}
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			foreach (Type[] arguments in possibleArguments)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}
	}
}
namespace UniverseLib.Utility
{
	public static class ArgumentUtility
	{
		public static readonly Type[] EmptyTypes = new Type[0];

		public static readonly object[] EmptyArgs = new object[0];

		public static readonly Type[] ParseArgs = new Type[1] { typeof(string) };
	}
	public static class IOUtility
	{
		private static readonly char[] invalidDirectoryCharacters = Path.GetInvalidPathChars();

		private static readonly char[] invalidFilenameCharacters = Path.GetInvalidFileNameChars();

		public static string EnsureValidFilePath(string fullPathWithFile)
		{
			fullPathWithFile = string.Concat(fullPathWithFile.Split(invalidDirectoryCharacters));
			Directory.CreateDirectory(Path.GetDirectoryName(fullPathWithFile));
			return fullPathWithFile;
		}

		public static string EnsureValidFilename(string filename)
		{
			return string.Concat(filename.Split(invalidFilenameCharacters));
		}
	}
	public static class MiscUtility
	{
		public static bool ContainsIgnoreCase(this string _this, string s)
		{
			return CultureInfo.CurrentCulture.CompareInfo.IndexOf(_this, s, CompareOptions.IgnoreCase) >= 0;
		}

		public static bool HasFlag(this Enum flags, Enum value)
		{
			try
			{
				ulong num = Convert.ToUInt64(value);
				return (Convert.ToUInt64(flags) & num) == num;
			}
			catch
			{
				long num2 = Convert.ToInt64(value);
				return (Convert.ToInt64(flags) & num2) == num2;
			}
		}

		public static bool EndsWith(this StringBuilder sb, string _string)
		{
			int length = _string.Length;
			if (sb.Length < length)
			{
				return false;
			}
			int num = 0;
			int num2 = sb.Length - length;
			while (num2 < sb.Length)
			{
				if (sb[num2] != _string[num])
				{
					return false;
				}
				num2++;
				num++;
			}
			return true;
		}
	}
	public static class ParseUtility
	{
		internal delegate object ParseMethod(string input);

		internal delegate string ToStringMethod(object obj);

		public static readonly string NumberFormatString = "0.####";

		private static readonly Dictionary<int, string> numSequenceStrings = new Dictionary<int, string>();

		private static readonly HashSet<Type> nonPrimitiveTypes = new HashSet<Type>
		{
			typeof(string),
			typeof(decimal),
			typeof(DateTime)
		};

		private static readonly HashSet<Type> formattedTypes = new HashSet<Type>
		{
			typeof(float),
			typeof(double),
			typeof(decimal)
		};

		private static readonly Dictionary<string, string> typeInputExamples = new Dictionary<string, string>();

		private static readonly Dictionary<string, ParseMethod> customTypes = new Dictionary<string, ParseMethod>
		{
			{
				typeof(Vector2).FullName,
				TryParseVector2
			},
			{
				typeof(Vector3).FullName,
				TryParseVector3
			},
			{
				typeof(Vector4).FullName,
				TryParseVector4
			},
			{
				typeof(Quaternion).FullName,
				TryParseQuaternion
			},
			{
				typeof(Rect).FullName,
				TryParseRect
			},
			{
				typeof(Color).FullName,
				TryParseColor
			},
			{
				typeof(Color32).FullName,
				TryParseColor32
			},
			{
				typeof(LayerMask).FullName,
				TryParseLayerMask
			}
		};

		private static readonly Dictionary<string, ToStringMethod> customTypesToString = new Dictionary<string, ToStringMethod>
		{
			{
				typeof(Vector2).FullName,
				Vector2ToString
			},
			{
				typeof(Vector3).FullName,
				Vector3ToString
			},
			{
				typeof(Vector4).FullName,
				Vector4ToString
			},
			{
				typeof(Quaternion).FullName,
				QuaternionToString
			},
			{
				typeof(Rect).FullName,
				RectToString
			},
			{
				typeof(Color).FullName,
				ColorToString
			},
			{
				typeof(Color32).FullName,
				Color32ToString
			},
			{
				typeof(LayerMask).FullName,
				LayerMaskToString
			}
		};

		public static string FormatDecimalSequence(params object[] numbers)
		{
			if (numbers.Length == 0)
			{
				return null;
			}
			return string.Format(CultureInfo.CurrentCulture, GetSequenceFormatString(numbers.Length), numbers);
		}

		internal static string GetSequenceFormatString(int count)
		{
			if (count <= 0)
			{
				return null;
			}
			if (numSequenceStrings.ContainsKey(count))
			{
				return numSequenceStrings[count];
			}
			string[] array = new string[count];
			for (int i = 0; i < count; i++)
			{
				array[i] = $"{{{i}:{NumberFormatString}}}";
			}
			string text = string.Join(" ", array);
			numSequenceStrings.Add(count, text);
			return text;
		}

		public static bool CanParse(Type type)
		{
			return !string.IsNullOrEmpty(type?.FullName) && (type.IsPrimitive || type.IsEnum || nonPrimitiveTypes.Contains(type) || customTypes.ContainsKey(type.FullName));
		}

		public static bool CanParse<T>()
		{
			return CanParse(typeof(T));
		}

		public static bool TryParse<T>(string input, out T obj, out Exception parseException)
		{
			object obj2;
			bool result = TryParse(input, typeof(T), out obj2, out parseException);
			if (obj2 != null)
			{
				obj = (T)obj2;
			}
			else
			{
				obj = default(T);
			}
			return result;
		}

		public static bool TryParse(string input, Type type, out object obj, out Exception parseException)
		{
			obj = null;
			parseException = null;
			if ((object)type == null)
			{
				return false;
			}
			if ((object)type == typeof(string))
			{
				obj = input;
				return true;
			}
			if (type.IsEnum)
			{
				try
				{
					obj = Enum.Parse(type, input);
					return true;
				}
				catch (Exception e)
				{
					parseException = e.GetInnerMostException();
					return false;
				}
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					obj = customTypes[type.FullName](input);
				}
				else
				{
					obj = AccessTools.Method(type, "Parse", ArgumentUtility.ParseArgs, (Type[])null).Invoke(null, new object[1] { input });
				}
				return true;
			}
			catch (Exception e2)
			{
				Exception innerMostException = e2.GetInnerMostException();
				parseException = innerMostException;
			}
			return false;
		}

		public static string ToStringForInput<T>(object obj)
		{
			return ToStringForInput(obj, typeof(T));
		}

		public static string ToStringForInput(object obj, Type type)
		{
			if ((object)type == null || obj == null)
			{
				return null;
			}
			if ((object)type == typeof(string))
			{
				return obj as string;
			}
			if (type.IsEnum)
			{
				return Enum.IsDefined(type, obj) ? Enum.GetName(type, obj) : obj.ToString();
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					return customTypesToString[type.FullName](obj);
				}
				if (formattedTypes.Contains(type))
				{
					return AccessTools.Method(type, "ToString", new Type[2]
					{
						typeof(string),
						typeof(IFormatProvider)
					}, (Type[])null).Invoke(obj, new object[2]
					{
						NumberFormatString,
						CultureInfo.CurrentCulture
					}) as string;
				}
				return obj.ToString();
			}
			catch (Exception arg)
			{
				Universe.LogWarning($"Exception formatting object for input: {arg}");
				return null;
			}
		}

		public static string GetExampleInput<T>()
		{
			return GetExampleInput(typeof(T));
		}

		public static string GetExampleInput(Type type)
		{
			if (!typeInputExamples.ContainsKey(type.AssemblyQualifiedName))
			{
				try
				{
					if (type.IsEnum)
					{
						typeInputExamples.Add(type.AssemblyQualifiedName, Enum.GetNames(type).First());
					}
					else
					{
						object obj = Activator.CreateInstance(type);
						typeInputExamples.Add(type.AssemblyQualifiedName, ToStringForInput(obj, type));
					}
				}
				catch (Exception message)
				{
					Universe.LogWarning("Exception generating default instance for example input for '" + type.FullName + "'");
					Universe.Log(message);
					return "";
				}
			}
			return typeInputExamples[type.AssemblyQualifiedName];
		}

		internal static object TryParseVector2(string input)
		{
			//IL_0003: 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)
			Vector2 val = default(Vector2);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector2ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector2 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y);
		}

		internal static object TryParseVector3(string input)
		{
			//IL_0003: 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)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector3ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector3 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z);
		}

		internal static object TryParseVector4(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			Vector4 val = default(Vector4);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			val.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector4ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector4 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z, val.w);
		}

		internal static object TryParseQuaternion(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			if (array.Length == 4)
			{
				Quaternion val2 = default(Quaternion);
				val2.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
				val2.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
				val2.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
				val2.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
				return val2;
			}
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return Quaternion.Euler(val);
		}

		internal static string QuaternionToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Quaternion val) || 1 == 0)
			{
				return null;
			}
			Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles;
			return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z);
		}

		internal static object TryParseRect(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			string[] array = input.Split(new char[1] { ' ' });
			((Rect)(ref val)).x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).width = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).height = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string RectToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Rect val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width, ((Rect)(ref val)).height);
		}

		internal static object TryParseColor(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			string[] array = input.Split(new char[1] { ' ' });
			val.r = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = 1f;
			}
			return val;
		}

		internal static string ColorToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.r, val.g, val.b, val.a);
		}

		internal static object TryParseColor32(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color32 val = default(Color32);
			string[] array = input.Split(new char[1] { ' ' });
			val.r = byte.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = byte.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = byte.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = byte.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = byte.MaxValue;
			}
			return val;
		}

		internal static string Color32ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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)
			if (!(obj is Color32 val) || 1 == 0)
			{
				return null;
			}
			return $"{val.r} {val.g} {val.b} {val.a}";
		}

		internal static object TryParseLayerMask(string input)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return LayerMask.op_Implicit(int.Parse(input));
		}

		internal static string LayerMaskToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is LayerMask val) || 1 == 0)
			{
				return null;
			}
			return ((LayerMask)(ref val)).value.ToString();
		}
	}
	public static class SignatureHighlighter
	{
		public const string NAMESPACE = "#a8a8a8";

		public const string CONST = "#92c470";

		public const string CLASS_STATIC = "#3a8d71";

		public const string CLASS_INSTANCE = "#2df7b2";

		public const string STRUCT = "#0fba3a";

		public const string INTERFACE = "#9b9b82";

		public const string FIELD_STATIC = "#8d8dc6";

		public const string FIELD_INSTANCE = "#c266ff";

		public const string METHOD_STATIC = "#b55b02";

		public const string METHOD_INSTANCE = "#ff8000";

		public const string PROP_STATIC = "#588075";

		public const string PROP_INSTANCE = "#55a38e";

		public const string LOCAL_ARG = "#a6e9e9";

		public const string OPEN_COLOR = "<color=";

		public const string CLOSE_COLOR = "</color>";

		public const string OPEN_ITALIC = "<i>";

		public const string CLOSE_ITALIC = "</i>";

		public static readonly Regex ArrayTokenRegex = new Regex("\\[,*?\\]");

		private static readonly Regex colorTagRegex = new Regex("<color=#?[\\d|\\w]*>");

		public static readonly Color StringOrange = new Color(0.83f, 0.61f, 0.52f);

		public static readonly Color EnumGreen = new Color(0.57f, 0.76f, 0.43f);

		public static readonly Color KeywordBlue = new Color(0.3f, 0.61f, 0.83f);

		public static readonly string keywordBlueHex = KeywordBlue.ToHex();

		public static readonly Color NumberGreen = new Color(0.71f, 0.8f, 0.65f);

		private static readonly Dictionary<string, string> typeToRichType = new Dictionary<string, string>();

		private static readonly Dictionary<string, string> highlightedMethods = new Dictionary<string, string>();

		private static readonly Dictionary<Type, string> builtInTypesToShorthand = new Dictionary<Type, string>
		{
			{
				typeof(object),
				"object"
			},
			{
				typeof(string),
				"string"
			},
			{
				typeof(bool),
				"bool"
			},
			{
				typeof(byte),
				"byte"
			},
			{
				typeof(sbyte),
				"sbyte"
			},
			{
				typeof(char),
				"char"
			},
			{
				typeof(decimal),
				"decimal"
			},
			{
				typeof(double),
				"double"
			},
			{
				typeof(float),
				"float"
			},
			{
				typeof(int),
				"int"
			},
			{
				typeof(uint),
				"uint"
			},
			{
				typeof(long),
				"long"
			},
			{
				typeof(ulong),
				"ulong"
			},
			{
				typeof(short),
				"short"
			},
			{
				typeof(ushort),
				"ushort"
			},
			{
				typeof(void),
				"void"
			}
		};

		public static string Parse(Type type, bool includeNamespace, MemberInfo memberInfo = null)
		{
			if ((object)type == null)
			{
				throw new ArgumentNullException("type");
			}
			if (memberInfo is MethodInfo method)
			{
				return ParseMethod(method);
			}
			if (memberInfo is ConstructorInfo ctor)
			{
				return ParseConstructor(ctor);
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append("ref ").Append("</color>");
			}
			Type type2 = type;
			while (type2.HasElementType)
			{
				type2 = type2.GetElementType();
			}
			includeNamespace &= !builtInTypesToShorthand.ContainsKey(type2);
			if (!type.IsGenericParameter && (!type.HasElementType || !type.GetElementType().IsGenericParameter) && includeNamespace && TryGetNamespace(type, out var ns))
			{
				AppendOpenColor(stringBuilder, "#a8a8a8").Append(ns).Append("</color>").Append('.');
			}
			stringBuilder.Append(ProcessType(type));
			if ((object)memberInfo != null)
			{
				stringBuilder.Append('.');
				int index = stringBuilder.Length - 1;
				AppendOpenColor(stringBuilder, GetMemberInfoColor(memberInfo, out var isStatic)).Append(memberInfo.Name).Append("</color>");
				if (isStatic)
				{
					stringBuilder.Insert(index, "<i>");
					stringBuilder.Append("</i>");
				}
			}
			return stringBuilder.ToString();
		}

		private static string ProcessType(Type type)
		{
			string key = type.ToString();
			if (typeToRichType.ContainsKey(key))
			{
				return typeToRichType[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (!type.IsGenericParameter)
			{
				int length = stringBuilder.Length;
				Type declaringType = type.DeclaringType;
				while ((object)declaringType != null)
				{
					stringBuilder.Insert(length, HighlightType(declaringType) + ".");
					declaringType = declaringType.DeclaringType;
				}
				stringBuilder.Append(HighlightType(type));
				if (type.IsGenericType)
				{
					ProcessGenericArguments(type, stringBuilder);
				}
			}
			else
			{
				stringBuilder.Append("<color=").Append("#92c470").Append('>')
					.Append(type.Name)
					.Append("</color>");
			}
			string text = stringBuilder.ToString();
			typeToRichType.Add(key, text);
			return text;
		}

		internal static string GetClassColor(Type type)
		{
			if (type.IsAbstract && type.IsSealed)
			{
				return "#3a8d71";
			}
			if (type.IsEnum || type.IsGenericParameter)
			{
				return "#92c470";
			}
			if (type.IsValueType)
			{
				return "#0fba3a";
			}
			if (type.IsInterface)
			{
				return "#9b9b82";
			}
			return "#2df7b2";
		}

		private static bool TryGetNamespace(Type type, out string ns)
		{
			return !string.IsNullOrEmpty(ns = type.Namespace?.Trim());
		}

		private static StringBuilder AppendOpenColor(StringBuilder sb, string color)
		{
			return sb.Append("<color=").Append(color).Append('>');
		}

		private static string HighlightType(Type type)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				type = type.GetElementType();
			}
			int num = 0;
			Match match = ArrayTokenRegex.Match(type.Name);
			if (match != null && match.Success)
			{
				num = 1 + match.Value.Count((char c) => c == ',');
				type = type.GetElementType();
			}
			if (builtInTypesToShorthand.TryGetValue(type, out var value))
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append(value).Append("</color>");
			}
			else
			{
				stringBuilder.Append("<color=" + GetClassColor(type) + ">").Append(type.Name).Append("</color>");
			}
			if (num > 0)
			{
				stringBuilder.Append('[').Append(new string(',', num - 1)).Append(']');
			}
			return stringBuilder.ToString();
		}

		private static void ProcessGenericArguments(Type type, StringBuilder sb)
		{
			List<Type> list = type.GetGenericArguments().ToList();
			for (int i = 0; i < sb.Length; i++)
			{
				if (!list.Any())
				{
					break;
				}
				if (sb[i] != '`')
				{
					continue;
				}
				int num = i;
				i++;
				StringBuilder stringBuilder = new StringBuilder();
				for (; char.IsDigit(sb[i]); i++)
				{
					stringBuilder.Append(sb[i]);
				}
				string text = stringBuilder.ToString();
				int num2 = int.Parse(text);
				sb.Remove(num, text.Length + 1);
				int num3 = 1;
				num++;
				while (num3 < "</color>".Length && sb[num] == "</color>"[num3])
				{
					num3++;
					num++;
				}
				sb.Insert(num, '<');
				num++;
				int length = sb.Length;
				while (num2 > 0 && list.Any())
				{
					num2--;
					Type type2 = list.First();
					list.RemoveAt(0);
					sb.Insert(num, ProcessType(type2));
					if (num2 > 0)
					{
						num += sb.Length - length;
						sb.Insert(num, ", ");
						num += 2;
						length = sb.Length;
					}
				}
				sb.Insert(num + sb.Length - length, '>');
			}
		}

		public static string RemoveHighlighting(string _string)
		{
			if (_string == null)
			{
				throw new ArgumentNullException("_string");
			}
			_string = _string.Replace("<i>", string.Empty);
			_string = _string.Replace("</i>", string.Empty);
			_string = colorTagRegex.Replace(_string, string.Empty);
			_string = _string.Replace("</color>", string.Empty);
			return _string;
		}

		[Obsolete("Use 'ParseMethod(MethodInfo)' instead (rename).")]
		public static string HighlightMethod(MethodInfo method)
		{
			return ParseMethod(method);
		}

		public static string ParseMethod(MethodInfo method)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)method);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(method.DeclaringType, includeNamespace: false));
			stringBuilder.Append('.');
			string text = ((!method.IsStatic) ? "#ff8000" : "#b55b02");
			stringBuilder.Append("<color=" + text + ">" + method.Name + "</color>");
			if (method.IsGenericMethod)
			{
				stringBuilder.Append("<");
				Type[] genericArguments = method.GetGenericArguments();
				for (int i = 0; i < genericArguments.Length; i++)
				{
					Type type = genericArguments[i];
					if (type.IsGenericParameter)
					{
						stringBuilder.Append("<color=#92c470>" + genericArguments[i].Name + "</color>");
					}
					else
					{
						stringBuilder.Append(Parse(type, includeNamespace: false));
					}
					if (i < genericArguments.Length - 1)
					{
						stringBuilder.Append(", ");
					}
				}
				stringBuilder.Append(">");
			}
			stringBuilder.Append('(');
			ParameterInfo[] parameters = method.GetParameters();
			for (int j = 0; j < parameters.Length; j++)
			{
				ParameterInfo parameterInfo = parameters[j];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (j < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text2 = stringBuilder.ToString();
			highlightedMethods.Add(key, text2);
			return text2;
		}

		[Obsolete("Use 'ParseConstructor(ConstructorInfo)' instead (rename).")]
		public static string HighlightConstructor(ConstructorInfo ctor)
		{
			return ParseConstructor(ctor);
		}

		public static string ParseConstructor(ConstructorInfo ctor)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)ctor);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(ctor.DeclaringType, includeNamespace: false));
			string value = stringBuilder.ToString();
			stringBuilder.Append('.');
			stringBuilder.Append(value);
			stringBuilder.Append('(');
			ParameterInfo[] parameters = ctor.GetParameters();
			for (int i = 0; i < parameters.Length; i++)
			{
				ParameterInfo parameterInfo = parameters[i];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (i < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text = stringBuilder.ToString();
			highlightedMethods.Add(key, text);
			return text;
		}

		public static string GetMemberInfoColor(MemberInfo memberInfo, out bool isStatic)
		{
			isStatic = false;
			if (memberInfo is FieldInfo fieldInfo)
			{
				if (fieldInfo.IsStatic)
				{
					isStatic = true;
					return "#8d8dc6";
				}
				return "#c266ff";
			}
			if (memberInfo is MethodInfo methodInfo)
			{
				if (methodInfo.IsStatic)
				{
					isStatic = true;
					return "#b55b02";
				}
				return "#ff8000";
			}
			if (memberInfo is PropertyInfo propertyInfo)
			{
				if (propertyInfo.GetAccessors(nonPublic: true)[0].IsStatic)
				{
					isStatic = true;
					return "#588075";
				}
				return "#55a38e";
			}
			if (memberInfo is ConstructorInfo)
			{
				isStatic = true;
				return "#2df7b2";
			}
			throw new NotImplementedException(memberInfo.GetType().Name + " is not supported");
		}
	}
	public static class ToStringUtility
	{
		internal static Dictionary<string, MethodInfo> toStringMethods = new Dictionary<string, MethodInfo>();

		private const string nullString = "<color=grey>null</color>";

		private const string nullUnknown = "<color=grey>null</color> (?)";

		private const string destroyedString = "<color=red>Destroyed</color>";

		private const string untitledString = "<i><color=grey>untitled</color></i>";

		private const string eventSystemNamespace = "UnityEngine.EventSystem";

		public static string PruneString(string s, int chars = 200, int lines = 5)
		{
			if (string.IsNullOrEmpty(s))
			{
				return s;
			}
			StringBuilder stringBuilder = new StringBuilder(Math.Max(chars, s.Length));
			int num = 0;
			for (int i = 0; i < s.Length; i++)
			{
				if (num >= lines || i >= chars)
				{
					stringBuilder.Append("...");
					break;
				}
				char c = s[i];
				if (c == '\r' || c == '\n')
				{
					num++;
				}
				stringBuilder.Append(c);
			}
			return stringBuilder.ToString();
		}

		public static string ToStringWithType(object value, Type fallbackType, bool includeNamespace = true)
		{
			if (value.IsNullOrDestroyed() && (object)fallbackType == null)
			{
				return "<color=grey>null</color> (?)";
			}
			Type type = value?.GetActualType() ?? fallbackType;
			string text = SignatureHighlighter.Parse(type, includeNamespace);
			StringBuilder stringBuilder = new StringBuilder();
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					stringBuilder.Append("<color=grey>null</color>");
					AppendRichType(stringBuilder, text);
					return stringBuilder.ToString();
				}
				stringBuilder.Append("<color=red>Destroyed</color>");
				AppendRichType(stringBuilder, text);
				return stringBuilder.ToString();
			}
			Object val = (Object)((value is Object) ? value : null);
			if (val != null)
			{
				if (string.IsNullOrEmpty(val.name))
				{
					stringBuilder.Append("<i><color=grey>untitled</color></i>");
				}
				else
				{
					stringBuilder.Append('"');
					stringBuilder.Append(PruneString(val.name, 50, 1));
					stringBuilder.Append('"');
				}
				AppendRichType(stringBuilder, text);
			}
			else if (type.FullName.StartsWith("UnityEngine.EventSystem"))
			{
				stringBuilder.Append(text);
			}
			else
			{
				string text2 = ToString(value);
				if (type.IsGenericType || text2 == type.FullName || text2 == type.FullName + " " + type.FullName || text2 == "Il2Cpp" + type.FullName || type.FullName == "Il2Cpp" + text2)
				{
					stringBuilder.Append(text);
				}
				else
				{
					stringBuilder.Append(PruneString(text2));
					AppendRichType(stringBuilder, text);
				}
			}
			return stringBuilder.ToString();
		}

		private static void AppendRichType(StringBuilder sb, string richType)
		{
			sb.Append(' ');
			sb.Append('(');
			sb.Append(richType);
			sb.Append(')');
		}

		private static string ToString(object value)
		{
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					return "<color=grey>null</color>";
				}
				return "<color=red>Destroyed</color>";
			}
			Type actualType = value.GetActualType();
			if (!toStringMethods.ContainsKey(actualType.AssemblyQualifiedName))
			{
				MethodInfo method = actualType.GetMethod("ToString", ArgumentUtility.EmptyTypes);
				toStringMethods.Add(actualType.AssemblyQualifiedName, method);
			}
			value = value.TryCast(actualType);
			string theString;
			try
			{
				theString = (string)toStringMethods[actualType.AssemblyQualifiedName].Invoke(value, ArgumentUtility.EmptyArgs);
			}
			catch (Exception e)
			{
				theString = e.ReflectionExToString();
			}
			return ReflectionUtility.ProcessTypeInString(actualType, theString);
		}
	}
	public static class UnityHelpers
	{
		private static PropertyInfo onEndEdit;

		public static bool OccuredEarlierThanDefault(this float time)
		{
			return Time.realtimeSinceStartup - 0.01f >= time;
		}

		public static bool OccuredEarlierThan(this float time, float secondsAgo)
		{
			return Time.realtimeSinceStartup - secondsAgo >= time;
		}

		public static bool IsNullOrDestroyed(this object obj, bool suppressWarning = true)
		{
			try
			{
				if (obj == null)
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target instance is null!");
					}
					return true;
				}
				Object val = (Object)((obj is Object) ? obj : null);
				if (val != null && !Object.op_Implicit(val))
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target UnityEngine.Object was destroyed!");
					}
					return true;
				}
				return false;
			}
			catch
			{
				return true;
			}
		}

		public static string GetTransformPath(this Transform transform, bool includeSelf = false)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (includeSelf)
			{
				stringBuilder.Append(((Object)transform).name);
			}
			while (Object.op_Implicit((Object)(object)transform.parent))
			{
				transform = transform.parent;
				stringBuilder.Insert(0, '/');
				stringBuilder.Insert(0, ((Object)transform).name);
			}
			return stringBuilder.ToString();
		}

		public static string ToHex(this Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
			byte b2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
			byte b3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
			return $"{b:X2}{b2:X2}{b3:X2}";
		}

		public static Color ToColor(this string _string)
		{
			//IL_006c: 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)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_00ec: Unknown result type (might be due to invalid IL or missing references)
			_string = _string.Replace("#", "");
			if (_string.Length != 6)
			{
				return Color.magenta;
			}
			byte b = byte.Parse(_string.Substring(0, 2), NumberStyles.HexNumber);
			byte b2 = byte.Parse(_string.Substring(2, 2), NumberStyles.HexNumber);
			byte b3 = byte.Parse(_string.Substring(4, 2), NumberStyles.HexNumber);
			Color result = default(Color);
			result.r = (float)((decimal)b / 255m);
			result.g = (float)((decimal)b2 / 255m);
			result.b = (float)((decimal)b3 / 255m);
			result.a = 1f;
			return result;
		}

		public static UnityEvent<string> GetOnEndEdit(this InputField _this)
		{
			if ((object)onEndEdit == null)
			{
				onEndEdit = AccessTools.Property(typeof(InputField), "onEndEdit") ?? throw new Exception("Could not get InputField.onEndEdit property!");
			}
			return onEndEdit.GetValue(_this, null).TryCast<UnityEvent<string>>();
		}
	}
}
namespace UniverseLib.UI
{
	public class UIBase
	{
		internal static readonly int TOP_SORTORDER = 30000;

		public string ID { get; }

		public GameObject RootObject { get; }

		public RectTransform RootRect { get; }

		public Canvas Canvas { get; }

		public Action UpdateMethod { get; }

		public PanelManager Panels { get; }

		public bool Enabled
		{
			get
			{
				return Object.op_Implicit((Object)(object)RootObject) && RootObject.activeSelf;
			}
			set
			{
				UniversalUI.SetUIActive(ID, value);
			}
		}

		public UIBase(string id, Action updateMethod)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: 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)
			if (string.IsNullOrEmpty(id))
			{
				throw new ArgumentException("Cannot register a UI with a null or empty id!");
			}
			if (UniversalUI.registeredUIs.ContainsKey(id))
			{
				throw new ArgumentException("A UI with the id '" + id + "' is already registered!");
			}
			ID = id;
			UpdateMethod = updateMethod;
			RootObject = UIFactory.CreateUIObject(id + "_Root", UniversalUI.CanvasRoot);
			RootObject.SetActive(false);
			RootRect = RootObject.GetComponent<RectTransform>();
			Canvas = RootObject.AddComponent<Canvas>();
			Canvas.renderMode = (RenderMode)1;
			Canvas.referencePixelsPerUnit = 100f;
			Canvas.sortingOrder = TOP_SORTORDER;
			Canvas.overrideSorting = true;
			CanvasScaler val = RootObject.AddComponent<CanvasScaler>();
			val.referenceResolution = new Vector2(1920f, 1080f);
			val.screenMatchMode = (ScreenMatchMode)1;
			RootObject.AddComponent<GraphicRaycaster>();
			RectTransform component = RootObject.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.pivot = new Vector2(0.5f, 0.5f);
			Panels = CreatePanelManager();
			RootObject.SetActive(true);
			UniversalUI.registeredUIs.Add(id, this);
			UniversalUI.uiBases.Add(this);
		}

		protected virtual PanelManager CreatePanelManager()
		{
			return new PanelManager(this);
		}

		public void SetOnTop()
		{
			RootObject.transform.SetAsLastSibling();
			foreach (UIBase uiBasis in UniversalUI.uiBases)
			{
				int num = UniversalUI.CanvasRoot.transform.childCount - ((Transform)uiBasis.RootRect).GetSiblingIndex();
				uiBasis.Canvas.sortingOrder = TOP_SORTORDER - num;
			}
			UniversalUI.uiBases.Sort((UIBase a, UIBase b) => b.RootObject.transform.GetSiblingIndex().CompareTo(a.RootObject.transform.GetSiblingIndex()));
		}

		internal void Update()
		{
			try
			{
				Panels.Update();
				UpdateMethod?.Invoke();
			}
			catch (Exception arg)
			{
				Universe.LogWarning($"Exception invoking update method for {ID}: {arg}");
			}
		}
	}
	public static class UIFactory
	{
		internal static Vector2 largeElementSize = new Vector2(100f, 30f);

		internal static Vector2 smallElementSize = new Vector2(25f, 25f);

		internal static Color defaultTextColor = Color.white;

		public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2))
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name)
			{
				layer = 5,
				hideFlags = (HideFlags)61
			};
			if (Object.op_Implicit((Object)(object)parent))
			{
				val.transform.SetParent(parent.transform, false);
			}
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = sizeDelta;
			return val;
		}

		internal static void SetDefaultTextValues(Text text)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)text).color = defaultTextColor;
			text.font = UniversalUI.DefaultFont;
			text.fontSize = 14;
		}

		internal static void SetDefaultSelectableValues(Selectable selectable)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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)
			Navigation navigation = selectable.navigation;
			((Navigation)(ref navigation)).mode = (Mode)4;
			selectable.navigation = navigation;
			RuntimeHelper.Instance.Internal_SetColorBlock(selectable, (Color?)new Color(0.2f, 0.2f, 0.2f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)new Color(0.15f, 0.15f, 0.15f), (Color?)null);
		}

		public static LayoutElement SetLayoutElement(GameObject gameObject, int? minWidth = null, int? minHeight = null, int? flexibleWidth = null, int? flexibleHeight = null, int? preferredWidth = null, int? preferredHeight = null, bool? ignoreLayout = null)
		{
			LayoutElement val = gameObject.GetComponent<LayoutElement>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<LayoutElement>();
			}
			if (minWidth.HasValue)
			{
				val.minWidth = minWidth.Value;
			}
			if (minHeight.HasValue)
			{
				val.minHeight = minHeight.Value;
			}
			if (flexibleWidth.HasValue)
			{
				val.flexibleWidth = flexibleWidth.Value;
			}
			if (flexibleHeight.HasValue)
			{
				val.flexibleHeight = flexibleHeight.Value;
			}
			if (preferredWidth.HasValue)
			{
				val.preferredWidth = preferredWidth.Value;
			}
			if (preferredHeight.HasValue)
			{
				val.preferredHeight = preferredHeight.Value;
			}
			if (ignoreLayout.HasValue)
			{
				val.ignoreLayout = ignoreLayout.Value;
			}
			return val;
		}

		public static T SetLayoutGroup<T>(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			T val = gameObject.GetComponent<T>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<T>();
			}
			return SetLayoutGroup(val, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment);
		}

		public static T SetLayoutGroup<T>(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			if (forceWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandWidth = forceWidth.Value;
			}
			if (forceHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandHeight = forceHeight.Value;
			}
			if (childControlWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlWidth(childControlWidth.Value);
			}
			if (childControlHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlHeight(childControlHeight.Value);
			}
			if (spacing.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).spacing = spacing.Value;
			}
			if (padTop.HasValue)
			{
				((LayoutGroup)(object)group).padding.top = padTop.Value;
			}
			if (padBottom.HasValue)
			{
				((LayoutGroup)(object)group).padding.bottom = padBottom.Value;
			}
			if (padLeft.HasValue)
			{
				((LayoutGroup)(object)group).padding.left = padLeft.Value;
			}
			if (padRight.HasValue)
			{
				((LayoutGroup)(object)group).padding.right = padRight.Value;
			}
			if (childAlignment.HasValue)
			{
				((LayoutGroup)(object)group).childAlignment = childAlignment.Value;
			}
			return group;
		}

		public static GameObject CreatePanel(string name, GameObject parent, out GameObject contentHolder, Color? bgColor = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)1, (int?)1, (int?)1, (int?)1, (TextAnchor?)null);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.anchoredPosition = Vector2.zero;
			component.sizeDelta = Vector2.zero;
			((Graphic)val.AddComponent<Image>()).color = Color.black;
			val.AddComponent<RectMask2D>();
			contentHolder = CreateUIObject("Content", val);
			Image val2 = contentHolder.AddComponent<Image>();
			val2.type = (Type)3;
			((Graphic)val2).color = (Color)((!bgColor.HasValue) ? new Color(0.07f, 0.07f, 0.07f) : bgColor.Value);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentHolder, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)3, (int?)3, (int?)3, (int?)3, (int?)3, (TextAnchor?)null);
			return val;
		}

		public static GameObject CreateVerticalGroup(GameObject parent, string name, bool forceWidth, bool forceHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: 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)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)forceWidth, (bool?)forceHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateHorizontalGroup(GameObject parent, string name, bool forceExpandWidth, bool forceExpandHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: 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)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)forceExpandWidth, (bool?)forceExpandHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateGridGroup(GameObject parent, string name, Vector2 cellSize, Vector2 spacing, Color bgColor = default(Color))
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			GridLayoutGroup val2 = val.AddComponent<GridLayoutGroup>();
			((LayoutGroup)val2).childAlignment = (TextAnchor)0;
			val2.cellSize = cellSize;
			val2.spacing = spacing;
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static Text CreateLabel(GameObject parent, string name, string defaultText, TextAnchor alignment = 3, Color color = default(Color), bool supportRichText = true, int fontSize = 14)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: 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)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			Text val2 = val.AddComponent<Text>();
			SetDefaultTextValues(val2);
			val2.text = defaultText;
			((Graphic)val2).color = ((color == default(Color)) ? defaultTextColor : color);
			val2.supportRichText = supportRichText;
			val2.alignment = alignment;
			val2.fontSize = fontSize;
			return val2;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, Color? normalColor = null)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: 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_003d: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			Color valueOrDefault = normalColor.GetValueOrDefault();
			if (!normalColor.HasValue)
			{
				((Color)(ref valueOrDefault))..ctor(0.25f, 0.25f, 0.25f);
				normalColor = valueOrDefault;
			}
			ButtonRef buttonRef = CreateButton(parent, name, text, default(ColorBlock));
			RuntimeHelper instance = RuntimeHelper.Instance;
			Button component = buttonRef.Component;
			Color? normal = normalColor;
			Color? val = normalColor;
			float num = 1.2f;
			Color? highlighted = (val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			val = normalColor;
			num = 0.7f;
			instance.Internal_SetColorBlock((Selectable)(object)component, normal, highlighted, val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			return buttonRef;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, ColorBlock colors)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Text", val);
			Image val3 = val.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = new Color(1f, 1f, 1f, 1f);
			Button val4 = val.AddComponent<Button>();
			SetDefaultSelectableValues((Selectable)(object)val4);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val4, colors);
			Text val5 = val2.AddComponent<Text>();
			val5.text = text;
			SetDefaultTextValues(val5);
			val5.alignment = (TextAnchor)4;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			SetButtonDeselectListener(val4);
			return new ButtonRef(val4);
		}

		internal static void SetButtonDeselectListener(Button button)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			((UnityEvent)button.onClick).AddListener((UnityAction)delegate
			{
				((Selectable)button).OnDeselect((BaseEventData)null);
			});
		}

		public static GameObject CreateSlider(GameObject parent, string name, out Slider slider)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: 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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: 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_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Background", val);
			GameObject val3 = CreateUIObject("Fill Area", val);
			GameObject val4 = CreateUIObject("Fill", val3);
			GameObject val5 = CreateUIObject("Handle Slide Area", val);
			GameObject val6 = CreateUIObject("Handle", val5);
			Image val7 = val2.AddComponent<Image>();
			val7.type = (Type)1;
			((Graphic)val7).color = new Color(0.15f, 0.15f, 0.15f, 1f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.25f);
			component.anchorMax = new Vector2(1f, 0.75f);
			component.sizeDelta = new Vector2(0f, 0f);
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0f, 0.25f);
			component2.anchorMax = new Vector2(1f, 0.75f);
			component2.anchoredPosition = new Vector2(-5f, 0f);
			component2.sizeDelta = new Vector2(-20f, 0f);
			Image val8 = val4.AddComponent<Image>();
			val8.type = (Type)1;
			((Graphic)val8).color = new Color(0.3f, 0.3f, 0.3f, 1f);
			val4.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
			RectTransform component3 = val5.GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(-20f, 0f);
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			Image val9 = val6.AddComponent<Image>();
			((Graphic)val9).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.GetComponent<RectTransform>().sizeDelta = new Vector2(20f, 0f);
			slider = val.AddComponent<Slider>();
			slider.fillRect = val4.GetComponent<RectTransform>();
			slider.handleRect = val6.GetComponent<RectTransform>();
			((Selectable)slider).targetGraphic = (Graphic)(object)val9;
			slider.direction = (Direction)0;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)slider, (Color?)new Color(0.4f, 0.4f, 0.4f), (Color?)new Color(0.55f, 0.55f, 0.55f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)null);
			return val;
		}

		public static GameObject CreateScrollbar(GameObject parent, string name, out Scrollbar scrollbar)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: 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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Sliding Area", val);
			GameObject val3 = CreateUIObject("Handle", val2);
			Image val4 = val.AddComponent<Image>();
			val4.type = (Type)1;
			((Graphic)val4).color = new Color(0.1f, 0.1f, 0.1f);
			Image val5 = val3.AddComponent<Image>();
			val5.type = (Type)1;
			((Graphic)val5).color = new Color(0.4f, 0.4f, 0.4f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(-20f, -20f);
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.sizeDelta = new Vector2(20f, 20f);
			scrollbar = val.AddComponent<Scrollbar>();
			scrollbar.handleRect = component2;
			((Selectable)scrollbar).targetGraphic = (Graphic)(object)val5;
			SetDefaultSelectableValues((Selectable)(object)scrollbar);
			return val;
		}

		public static GameObject CreateToggle(GameObject parent, string name, out Toggle toggle, out Text text, Color bgColor = default(Color), int checkWidth = 20, int checkHeight = 20)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)3);
			toggle = val.AddComponent<Toggle>();
			toggle.isOn = true;
			SetDefaultSelectableValues((Selectable)(object)toggle);
			Toggle t2 = toggle;
			((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)delegate
			{
				((Selectable)t2).OnDeselect((BaseEventData)null);
			});
			GameObject val2 = CreateUIObject("Background", val);
			Image val3 = val2.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.04f, 0.04f, 0.04f, 0.75f) : bgColor);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null);
			SetLayoutElement(val2, checkWidth, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			GameObject val4 = CreateUIObject("Checkmark", val2);
			Image val5 = val4.AddComponent<Image>();
			((Graphic)val5).color = new Color(0.8f, 1f, 0.8f, 0.3f);
			GameObject val6 = CreateUIObject("Label", val);
			text = val6.AddComponent<Text>();
			text.text = "";
			text.alignment = (TextAnchor)3;
			SetDefaultTextValues(text);
			SetLayoutElement(val6, 0, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			toggle.graphic = (Graphic)(object)val5;
			((Selectable)toggle).targetGraphic = (Graphic)(object)val3;
			return val;
		}

		public static InputFieldRef CreateInputField(GameObject parent, string name, string placeHolderText)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: 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_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: 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_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: 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_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: 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)
			GameObject val = CreateUIObject(name, parent);
			Image val2 = val.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = new Color(0f, 0f, 0f, 0.5f);
			InputField val3 = val.AddComponent<InputField>();
			Navigation navigation = ((Selectable)val3).navigation;
			((Navigation)(ref navigation)).mode = (Mode)0;
			((Selectable)val3).navigation = navigation;
			val3.lineType = (LineType)0;
			((Selectable)val3).interactable = true;
			((Selectable)val3).transition = (Transition)1;
			((Selectable)val3).targetGraphic = (Graphic)(object)val2;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val3, (Color?)new Color(1f, 1f, 1f, 1f), (Color?)new Color(0.95f, 0.95f, 0.95f, 1f), (Color?)new Color(0.78f, 0.78f, 0.78f, 1f), (Color?)null);
			GameObject val4 = CreateUIObject("TextArea", val);
			val4.AddComponent<RectMask2D>();
			RectTransform component = val4.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.offsetMin = Vector2.zero;
			component.offsetMax = Vector2.zero;
			GameObject val5 = CreateUIObject("Placeholder", val4);
			Text val6 = val5.AddComponent<Text>();
			SetDefaultTextValues(val6);
			val6.text = placeHolderText ?? "...";
			((Graphic)val6).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.horizontalOverflow = (HorizontalWrapMode)0;
			val6.alignment = (TextAnchor)3;
			val6.fontSize = 14;
			RectTransform component2 = val5.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.offsetMin = Vector2.zero;
			component2.offsetMax = Vector2.zero;
			val3.placeholder = (Graphic)(object)val6;
			GameObject val7 = CreateUIObject("Text", val4);
			Text val8 = val7.AddComponent<Text>();
			SetDefaultTextValues(val8);
			val8.text = "";
			((Graphic)val8).color = new Color(1f, 1f, 1f, 1f);
			val8.horizontalOverflow = (HorizontalWrapMode)0;
			val8.alignment = (TextAnchor)3;
			val8.fontSize = 14;
			RectTransform component3 = val7.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			val3.textComponent = val8;
			val3.characterLimit = 16000;
			return new InputFieldRef(val3);
		}

		public static GameObject CreateDropdown(GameObject parent, string name, out Dropdown dropdown, string defaultItemText, int itemFontSize, Action<int> onValueChanged, string[] defaultOptions = null)
		{
			//IL_0009: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: 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_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: 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_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or m