Decompiled source of UCustomPrefabs Peak v0.0.1

UCustomPrefabs/PixelTools.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ScottyFoxArt.PixelTools.ShaderTextures;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
[Serializable]
[RequireComponent(typeof(Renderer))]
public class PeakLayeredTextureHelper : MonoBehaviour
{
	public Vector2Int TextureSize = new Vector2Int(512, 512);

	public List<Texture2D> LayerBundleTextures;

	public List<Texture2D> LayerBundleMasks;

	public string LayerBundleData;

	public LayerBundle layerbundle = new LayerBundle();

	public void Start()
	{
		Deserialize();
	}

	public void Deserialize()
	{
		if (string.IsNullOrWhiteSpace(LayerBundleData))
		{
			return;
		}
		try
		{
			layerbundle = JsonConvert.DeserializeObject<LayerBundle>(LayerBundleData);
			layerbundle.ReapplyTextures(LayerBundleTextures, LayerBundleMasks);
		}
		catch (Exception ex)
		{
			Debug.LogError((object)ex);
		}
	}

	public Texture2D RenderTextureBundle()
	{
		return ShaderTextureBuilder.RenderBundle(layerbundle, ((Vector2Int)(ref TextureSize)).x, ((Vector2Int)(ref TextureSize)).y);
	}
}
namespace ScottyFoxArt.PixelTools.Utilities
{
	public static class BlendModeUtils
	{
		private static Color white = new Color(1f, 1f, 1f, 1f);

		public static Color Burn(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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)
			return Color.LerpUnclamped(a, white - Divide(white - b, a), opacity);
		}

		public static Color Darken(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0022: 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_003a: 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_0052: 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_0068: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			val.r = Mathf.Min(a.r, b.r);
			val.g = Mathf.Min(a.g, b.g);
			val.b = Mathf.Min(a.b, b.b);
			val.a = Mathf.Min(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		public static Color Difference(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0023: 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_003c: 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_0055: 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_006c: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			val.r = Mathf.Abs(b.r - a.r);
			val.g = Mathf.Abs(b.g - a.g);
			val.b = Mathf.Abs(b.b - a.b);
			val.a = Mathf.Abs(b.a - a.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		public static Color Divide(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0024: 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_003e: 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_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_0071: 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)
			Color val = default(Color);
			val.r = a.r / (b.r + 1E-12f);
			val.g = a.g / (b.g + 1E-12f);
			val.b = a.b / (b.b + 1E-12f);
			val.a = a.a / (b.a + 1E-12f);
			return Color.LerpUnclamped(a, val, opacity);
		}

		public static Color Dodge(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_0090: 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_00ad: 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)
			Color val = default(Color);
			val.r = a.r / (1f - Mathf.Clamp(b.r, 1E-06f, 0.999999f));
			val.g = a.g / (1f - Mathf.Clamp(b.g, 1E-06f, 0.999999f));
			val.b = a.b / (1f - Mathf.Clamp(b.b, 1E-06f, 0.999999f));
			val.a = a.a / (1f - Mathf.Clamp(b.a, 1E-06f, 0.999999f));
			return Color.LerpUnclamped(a, val, opacity);
		}

		public static Color Exclusion(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, b + a - 2f * b * a, opacity);
		}

		public static Color HardLight(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0027: 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_0044: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_007d: 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)
			Color val = default(Color);
			val.r = HardLight_float(a.r, b.r);
			val.g = HardLight_float(a.g, b.g);
			val.b = HardLight_float(a.b, b.b);
			val.a = HardLight_float(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float HardLight_float(float a, float b, float opacity = 1f)
		{
			float num = ((!(b < 0.5f)) ? (2f * a * b) : (1f - 2f * (1f - a) * (1f - b)));
			return Mathf.LerpUnclamped(a, num, opacity);
		}

		public static Color HardMix(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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_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_0018: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, Step(white - a, b), opacity);
		}

		public static Color Lighten(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0022: 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_003a: 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_0052: 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_0068: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			val.r = Mathf.Max(a.r, b.r);
			val.g = Mathf.Max(a.g, b.g);
			val.b = Mathf.Max(a.b, b.b);
			val.a = Mathf.Max(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		public static Color LinearBurn(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_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)
			return Color.LerpUnclamped(a, a + b - white, opacity);
		}

		public static Color LinearDodge(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, a + b, opacity);
		}

		public static Color LinearLight(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0027: 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_0044: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_007d: 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)
			Color val = default(Color);
			val.r = LinearLight_float(a.r, b.r);
			val.g = LinearLight_float(a.g, b.g);
			val.b = LinearLight_float(a.b, b.b);
			val.a = LinearLight_float(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float LinearLight_float(float a, float b, float opacity = 1f)
		{
			if (b < 0.5f)
			{
				return Mathf.Max(a + 2f * b - 1f, 0f);
			}
			return Mathf.Min(a + 2f * (b - 0.5f), 1f);
		}

		public static Color LinearLightAddSub(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: 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_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, b + 2f * a - white, opacity);
		}

		public static Color Multiply(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, a * b, opacity);
		}

		public static Color Negation(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_0040: 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_0065: 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)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: 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)
			Color val = default(Color);
			val.r = 1f - Mathf.Abs(1f - b.r - a.r);
			val.g = 1f - Mathf.Abs(1f - b.g - a.g);
			val.b = 1f - Mathf.Abs(1f - b.b - a.b);
			val.a = 1f - Mathf.Abs(1f - b.a - a.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		public static Color Overlay(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0027: 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_0044: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_007d: 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)
			Color val = default(Color);
			val.r = Overlay_float(a.r, b.r);
			val.g = Overlay_float(a.g, b.g);
			val.b = Overlay_float(a.b, b.b);
			val.a = Overlay_float(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float Overlay_float(float a, float b, float opacity = 1f)
		{
			float num = ((!(a < 0.5f)) ? (2f * a * b) : (1f - 2f * (1f - a) * (1f - b)));
			return Mathf.LerpUnclamped(a, num, opacity);
		}

		public static Color PinLight(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0027: 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_0044: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_007d: 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)
			Color val = default(Color);
			val.r = PinLight_float(a.r, b.r);
			val.g = PinLight_float(a.g, b.g);
			val.b = PinLight_float(a.b, b.b);
			val.a = PinLight_float(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float PinLight_float(float a, float b, float opacity = 1f)
		{
			float num = ((!(b < 0.5f)) ? Mathf.Max(2f * (b - 0.5f), b) : Mathf.Min(2f * a, b));
			return Mathf.LerpUnclamped(a, num, opacity);
		}

		public static Color Screen(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: 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_0017: 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_0021: 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)
			return Color.LerpUnclamped(a, white - (white - b) * (white - a), opacity);
		}

		public static Color SoftLight(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0027: 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_0044: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_007d: 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)
			Color val = default(Color);
			val.r = SoftLight_float(a.r, b.r);
			val.g = SoftLight_float(a.g, b.g);
			val.b = SoftLight_float(a.b, b.b);
			val.a = SoftLight_float(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float SoftLight_float(float a, float b, float opacity = 1f)
		{
			float num = ((!(b < 0.5f)) ? (Mathf.Sqrt(a) * (2f * b - 1f) + 2f * a * (1f - b)) : (2f * a * b + a * a * (1f - 2f * b)));
			return Mathf.LerpUnclamped(a, num, opacity);
		}

		public static Color Step(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0022: 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_003a: 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_0052: 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_0068: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			val.r = Step(a.r, b.r);
			val.g = Step(a.g, b.g);
			val.b = Step(a.b, b.b);
			val.a = Step(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float Step(float value, float edge)
		{
			if (!(value < edge))
			{
				return 1f;
			}
			return 0f;
		}

		public static Color Subtract(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, a - b, opacity);
		}

		public static Color VividLight(Color a, Color b, float opacity = 1f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//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_0027: 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_0044: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_007d: 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)
			Color val = default(Color);
			val.r = VividLight_float(a.r, b.r);
			val.g = VividLight_float(a.g, b.g);
			val.b = VividLight_float(a.b, b.b);
			val.a = VividLight_float(a.a, b.a);
			return Color.LerpUnclamped(a, val, opacity);
		}

		private static float VividLight_float(float a, float b, float opacity = 1f)
		{
			a = Mathf.Clamp(a, 1E-06f, 0.999999f);
			float num = ((!(b < 0.5f)) ? (b / (2f * (1f - a))) : (1f - (1f - b) / (2f * a)));
			return Mathf.LerpUnclamped(a, num, opacity);
		}

		public static Color Overwrite(Color a, Color b, float opacity = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			return Color.LerpUnclamped(a, b, opacity);
		}
	}
	public static class PaletteUtils
	{
		public static void SampleColors_Dominate(Color[] colors, out Color average, out Color dominate, out Color brightest)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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_003e: 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_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: 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_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: 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)
			dominate = Color.white;
			brightest = Color.black;
			average = Color.black;
			Dictionary<Color, int> dictionary = new Dictionary<Color, int>();
			int num = 0;
			float num2 = 0f;
			float num3 = default(float);
			float num4 = default(float);
			float num5 = default(float);
			float num6 = default(float);
			float num7 = default(float);
			foreach (Color val in colors)
			{
				if (dictionary.ContainsKey(val))
				{
					dictionary[val]++;
				}
				else
				{
					dictionary.Add(val, 1);
				}
				if (dictionary[val] > num)
				{
					num = dictionary[val];
					dominate = val;
				}
				Color.RGBToHSV(val, ref num3, ref num4, ref num5);
				Color.RGBToHSV(brightest, ref num3, ref num6, ref num7);
				if ((double)num5 > 0.5 || num7 == 0f)
				{
					if (num4 == num2)
					{
						brightest = Color.Lerp(brightest, val, 0.5f);
					}
					else if (num4 > num2)
					{
						brightest = val;
						num2 = num4;
					}
				}
				average += val;
			}
			average /= (float)colors.Length;
			float num8 = default(float);
			float num9 = default(float);
			float num10 = default(float);
			Color.RGBToHSV(average, ref num8, ref num9, ref num10);
			float num11 = default(float);
			float num12 = default(float);
			Color.RGBToHSV(brightest, ref num6, ref num11, ref num12);
			brightest = Color.HSVToRGB(num8, Mathf.Lerp(num9, num11, 0.5f), Mathf.Lerp(num10, num12, 0.5f));
		}
	}
	public static class TextureUtils
	{
		public static Color[] ColorBlock(Color color, int width, int height)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (width < 1 || height < 1)
			{
				return null;
			}
			Color[] array = (Color[])(object)new Color[width * height];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = color;
			}
			return array;
		}

		public static Color[] ColorBlock(Color color, int size)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return ColorBlock(color, size, size);
		}

		public static Color[] ColorBlock(Color color, Vector2Int size)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return ColorBlock(color, ((Vector2Int)(ref size)).x, ((Vector2Int)(ref size)).y);
		}

		public static Color[] ColorBlock(Color color, Vector2 size)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: 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)
			return ColorBlock(color, (int)size.x, (int)size.y);
		}
	}
}
namespace ScottyFoxArt.PixelTools.ShaderTextures
{
	public enum BlendMode
	{
		None,
		Burn,
		Darken,
		Difference,
		Dodge,
		Divide,
		Exclusion,
		HardLight,
		HardMix,
		Lighten,
		LinearBurn,
		LinearDodge,
		LinearLight,
		LinearLightAddSub,
		Multiply,
		Negation,
		Overlay,
		PinLight,
		Screen,
		SoftLight,
		Subtract,
		VividLight,
		Overwrite,
		UVDraw
	}
	public static class BlendModeShaderLibrary
	{
		public static Shader Burn;

		public static Shader Darken;

		public static Shader Difference;

		public static Shader Dodge;

		public static Shader Divide;

		public static Shader Exclusion;

		public static Shader HardLight;

		public static Shader HardMix;

		public static Shader Lighten;

		public static Shader LinearBurn;

		public static Shader LinearDodge;

		public static Shader LinearLight;

		public static Shader LinearLightAddSub;

		public static Shader Multiply;

		public static Shader Negation;

		public static Shader Overlay;

		public static Shader PinLight;

		public static Shader Screen;

		public static Shader SoftLight;

		public static Shader Subtract;

		public static Shader VividLight;

		public static Shader Overwrite;

		public static Shader UVDraw;

		private const string PixelTools_ShaderBundle_File = "PixelTools/pixeltoolsshaders";

		private static bool _loaded;

		private static AssetBundle _shaderBundle;

		public static AssetBundle LoadEmbeddedAssetBundleFromCurrentAssembly(string resourcePath)
		{
			Assembly assembly = typeof(BlendModeShaderLibrary).Assembly;
			string text = resourcePath.Replace("\\", "/").Replace("/", ".");
			string name = assembly.FullName.Split(new char[1] { ',' })[0] + "." + text;
			try
			{
				using Stream stream = assembly.GetManifestResourceStream(name);
				if (stream == null)
				{
					Debug.LogError((object)"Failed to open stream for embedded AssetBundle.");
					return null;
				}
				byte[] array = new byte[stream.Length];
				stream.Read(array, 0, array.Length);
				return AssetBundle.LoadFromMemory(array);
			}
			catch (Exception ex)
			{
				Debug.LogError((object)ex);
			}
			return null;
		}

		private static Shader FetchShaderFromRegistry(string shaderName)
		{
			return _shaderBundle.LoadAsset<Shader>(shaderName);
		}

		public static Shader GetBlendMode(BlendMode blendmode)
		{
			if (!_loaded)
			{
				try
				{
					_shaderBundle = LoadEmbeddedAssetBundleFromCurrentAssembly("PixelTools/pixeltoolsshaders");
					Burn = FetchShaderFromRegistry("LayerBurn");
					Darken = FetchShaderFromRegistry("LayerDarken");
					Difference = FetchShaderFromRegistry("LayerDifference");
					Dodge = FetchShaderFromRegistry("LayerDodge");
					Divide = FetchShaderFromRegistry("LayerDivide");
					Exclusion = FetchShaderFromRegistry("LayerExclusion");
					HardLight = FetchShaderFromRegistry("LayerHardLight");
					HardMix = FetchShaderFromRegistry("LayerHardMix");
					Lighten = FetchShaderFromRegistry("LayerLighten");
					LinearBurn = FetchShaderFromRegistry("LayerLinearBurn");
					LinearDodge = FetchShaderFromRegistry("LayerLinearDodge");
					LinearLight = FetchShaderFromRegistry("LayerLinearLight");
					LinearLightAddSub = FetchShaderFromRegistry("LayerLinearLightAddSub");
					Multiply = FetchShaderFromRegistry("LayerMultiply");
					Negation = FetchShaderFromRegistry("LayerNegation");
					Overlay = FetchShaderFromRegistry("LayerOverlay");
					PinLight = FetchShaderFromRegistry("LayerPinLight");
					Screen = FetchShaderFromRegistry("LayerScreen");
					SoftLight = FetchShaderFromRegistry("LayerSoftLight");
					Subtract = FetchShaderFromRegistry("LayerSubtract");
					VividLight = FetchShaderFromRegistry("LayerVividLight");
					Overwrite = FetchShaderFromRegistry("LayerOverride");
					UVDraw = FetchShaderFromRegistry("LayerUVDraw");
					_loaded = true;
				}
				catch
				{
					Debug.LogWarning((object)"Failed To Load PixelTool Shaders...!");
				}
			}
			if (_loaded)
			{
				switch (blendmode)
				{
				case BlendMode.Burn:
					return Burn;
				case BlendMode.Darken:
					return Darken;
				case BlendMode.Difference:
					return Difference;
				case BlendMode.Dodge:
					return Dodge;
				case BlendMode.Divide:
					return Divide;
				case BlendMode.Exclusion:
					return Exclusion;
				case BlendMode.HardLight:
					return HardLight;
				case BlendMode.HardMix:
					return HardMix;
				case BlendMode.Lighten:
					return Lighten;
				case BlendMode.LinearBurn:
					return LinearBurn;
				case BlendMode.LinearDodge:
					return LinearDodge;
				case BlendMode.LinearLight:
					return LinearLight;
				case BlendMode.LinearLightAddSub:
					return LinearLightAddSub;
				case BlendMode.Multiply:
					return Multiply;
				case BlendMode.Negation:
					return Negation;
				case BlendMode.Overlay:
					return Overlay;
				case BlendMode.PinLight:
					return PinLight;
				case BlendMode.Screen:
					return Screen;
				case BlendMode.SoftLight:
					return SoftLight;
				case BlendMode.Subtract:
					return Subtract;
				case BlendMode.VividLight:
					return VividLight;
				case BlendMode.Overwrite:
					return Overwrite;
				case BlendMode.UVDraw:
					return UVDraw;
				}
			}
			return null;
		}
	}
	[ExecuteInEditMode]
	public class BundleWatcher : MonoBehaviour
	{
		public LayerBundleData layerBundleData;

		public Renderer meshRenderer;

		public int materialIndex;

		private void OnValidate()
		{
			layerBundleData?.onTextureGenerated.RemoveListener((UnityAction<Texture2D>)OnTextureGenerated);
			layerBundleData?.onTextureGenerated.AddListener((UnityAction<Texture2D>)OnTextureGenerated);
		}

		public void OnEnable()
		{
			layerBundleData?.onTextureGenerated.AddListener((UnityAction<Texture2D>)OnTextureGenerated);
		}

		public void OnDisable()
		{
			layerBundleData?.onTextureGenerated.RemoveListener((UnityAction<Texture2D>)OnTextureGenerated);
		}

		public void OnDestroy()
		{
			layerBundleData?.onTextureGenerated.RemoveListener((UnityAction<Texture2D>)OnTextureGenerated);
		}

		public void OnTextureGenerated(Texture2D texture)
		{
			if (!((Object)(object)meshRenderer == (Object)null))
			{
				Material[] sharedMaterials = meshRenderer.sharedMaterials;
				if (materialIndex >= 0 || materialIndex < sharedMaterials.Length)
				{
					sharedMaterials[materialIndex].mainTexture = (Texture)(object)texture;
				}
			}
		}
	}
	public class ShaderTextureTester : MonoBehaviour
	{
		[SerializeReference]
		public bool generateTextureOutput;

		public Vector2Int outputSize = new Vector2Int(512, 512);

		public LayerBundle layerBundle = new LayerBundle();

		private void Start()
		{
			GenerateTexture();
		}

		public void GenerateTexture()
		{
			Texture2D val = ShaderTextureBuilder.RenderBundle(layerBundle, ((Vector2Int)(ref outputSize)).x, ((Vector2Int)(ref outputSize)).y, generateTextureOutput);
			((Component)this).GetComponent<Renderer>().sharedMaterial.mainTexture = (Texture)(object)val;
			if (generateTextureOutput)
			{
				File.WriteAllBytes(Path.Combine(Application.dataPath, $"ShaderTextureTest_{((object)val).GetHashCode()}.png"), ImageConversion.EncodeToPNG(val));
			}
		}
	}
	public class LayerConverter : JsonConverter<Layer>
	{
		public override void WriteJson(JsonWriter writer, Layer value, JsonSerializer serializer)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			JObject val = new JObject();
			val.Add("name", JToken.op_Implicit(value.name));
			val.Add("enabled", JToken.op_Implicit(value.enabled));
			val.Add("mode", JToken.FromObject((object)value.mode));
			val.Add("color", JToken.op_Implicit(ColorUtility.ToHtmlStringRGBA(value.color)));
			((JToken)val).WriteTo(writer, Array.Empty<JsonConverter>());
		}

		public override Layer ReadJson(JsonReader reader, Type objectType, Layer existingValue, bool hasExistingValue, JsonSerializer serializer)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			JObject val = JObject.Load(reader);
			string text = ((object)val["color"])?.ToString();
			Debug.LogWarning((object)text);
			Color white = default(Color);
			if (!ColorUtility.TryParseHtmlString("#" + text, ref white))
			{
				white = Color.white;
			}
			Layer result = default(Layer);
			result.name = ((object)val["name"])?.ToString();
			JToken obj = val["enabled"];
			result.enabled = obj != null && obj.ToObject<bool>();
			JToken obj2 = val["mode"];
			result.mode = ((obj2 != null) ? obj2.ToObject<BlendMode>() : BlendMode.None);
			result.color = white;
			return result;
		}
	}
	[Serializable]
	[JsonConverter(typeof(LayerConverter))]
	public struct Layer
	{
		public string name;

		public bool enabled;

		public BlendMode mode;

		public Color color;

		public Texture2D texture;

		public Texture2D mask;

		public Layer(string name = "Layer", bool enabled = true, BlendMode mode = BlendMode.Overwrite, Color color = default(Color), Texture2D texture = null, Texture2D mask = null)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			this.name = name;
			this.enabled = enabled;
			this.mode = mode;
			this.color = color;
			this.texture = texture;
			this.mask = mask;
		}
	}
	public class LayerBundleConverter : JsonConverter<LayerBundle>
	{
		public override void WriteJson(JsonWriter writer, LayerBundle value, JsonSerializer serializer)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: 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_0020: Unknown result type (might be due to invalid IL or missing references)
			JObject val = new JObject();
			val.Add("backgroundColor", JToken.op_Implicit(ColorUtility.ToHtmlStringRGBA(value.backgroundColor)));
			val.Add("layers", (JToken)(object)JArray.FromObject((object)value.layers, serializer));
			((JToken)val).WriteTo(writer, Array.Empty<JsonConverter>());
		}

		public override LayerBundle ReadJson(JsonReader reader, Type objectType, LayerBundle existingValue, bool hasExistingValue, JsonSerializer serializer)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_0042: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			JObject obj = JObject.Load(reader);
			Color white = default(Color);
			if (!ColorUtility.TryParseHtmlString(((object)obj["color"])?.ToString(), ref white))
			{
				white = Color.white;
			}
			JArray val = (JArray)obj["layers"];
			return new LayerBundle
			{
				backgroundColor = white,
				layers = (((val != null) ? ((JToken)val).ToObject<List<Layer>>(serializer) : null) ?? new List<Layer>())
			};
		}
	}
	[Serializable]
	[JsonConverter(typeof(LayerBundleConverter))]
	public class LayerBundle
	{
		public Color backgroundColor = Color.white;

		public List<Layer> layers = new List<Layer>();

		public void ReapplyTextures(List<Texture2D> textures, List<Texture2D> masks)
		{
			if (textures.Count != layers.Count || masks.Count != layers.Count)
			{
				Debug.LogWarning((object)"Reapply Textures has invalid textures/or/masks count. may throw error.");
			}
			for (int i = 0; i < layers.Count; i++)
			{
				try
				{
					Layer value = layers[i];
					value.texture = textures[i];
					value.mask = masks[i];
					layers[i] = value;
				}
				catch
				{
					Debug.LogError((object)$"Error Applying Texture To Layer {i}");
				}
			}
		}

		public int AddLayer(string name, Texture2D texture, Texture2D mask, Color color, BlendMode mode = BlendMode.Overwrite, bool enabled = true, int index = int.MaxValue)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			Layer layer = new Layer(name, enabled, mode, color, texture, mask);
			AddLayer(layer, index);
			return index;
		}

		public int AddLayer(Layer layer, int index = int.MaxValue)
		{
			index = GetNearestValidIndex(index);
			if (index == layers.Count)
			{
				layers.Add(layer);
			}
			else
			{
				layers.Insert(index, layer);
			}
			return index;
		}

		public void AddLayers(IEnumerable<Layer> layers)
		{
			foreach (Layer layer in layers)
			{
				AddLayer(layer);
			}
		}

		public bool RemoveLayer(int index)
		{
			if (!IsValidIndex(index))
			{
				return false;
			}
			layers.RemoveAt(index);
			return true;
		}

		public bool RemoveLayer(string name)
		{
			return RemoveLayer(FindName(name));
		}

		public bool SetLayer(int index, Layer layer)
		{
			if (!IsValidIndex(index))
			{
				return false;
			}
			layers[index] = layer;
			return true;
		}

		public bool SetLayer(string name, Layer layer)
		{
			return SetLayer(FindName(name), layer);
		}

		public int FindName(string name)
		{
			int num = 0;
			using (List<Layer>.Enumerator enumerator = layers.GetEnumerator())
			{
				while (enumerator.MoveNext() && !(enumerator.Current.name == name))
				{
					num++;
				}
			}
			if (num != layers.Count)
			{
				return num;
			}
			return -1;
		}

		public bool TryGetLayer(int index, out Layer layer)
		{
			layer = default(Layer);
			if (!IsValidIndex(index))
			{
				return false;
			}
			layer = layers[index];
			return true;
		}

		public bool TryGetLayer(string name, out Layer layer)
		{
			return TryGetLayer(FindName(name), out layer);
		}

		public bool IsValidIndex(int index)
		{
			if (index >= 0)
			{
				return index < layers.Count;
			}
			return false;
		}

		public int GetNearestValidIndex(int index)
		{
			if (index > layers.Count)
			{
				index = layers.Count;
			}
			else if (index < 0)
			{
				index = 0;
			}
			return index;
		}

		public void SetLayerEnabled(int index, bool enabled)
		{
			if (TryGetLayer(index, out var layer))
			{
				layer.enabled = enabled;
				SetLayer(index, layer);
			}
		}

		public void SetLayerEnabled(string name, bool enabled)
		{
			SetLayerEnabled(FindName(name), enabled);
		}

		public void SetLayerMode(int index, BlendMode mode)
		{
			if (TryGetLayer(index, out var layer))
			{
				layer.mode = mode;
				SetLayer(index, layer);
			}
		}

		public void SetLayerMode(string name, BlendMode mode)
		{
			SetLayerMode(FindName(name), mode);
		}

		public void SetLayerTexture(int index, Texture2D texture)
		{
			if (TryGetLayer(index, out var layer))
			{
				layer.texture = texture;
				SetLayer(index, layer);
			}
		}

		public void SetLayerTexture(string name, Texture2D texture)
		{
			SetLayerTexture(FindName(name), texture);
		}

		public void SetLayerMask(int index, Texture2D mask)
		{
			if (TryGetLayer(index, out var layer))
			{
				layer.texture = mask;
				SetLayer(index, layer);
			}
		}

		public void SetLayerMask(string name, Texture2D mask)
		{
			SetLayerMask(FindName(name), mask);
		}

		public void SetLayerColor(int index, Color color)
		{
			//IL_000e: 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 (TryGetLayer(index, out var layer))
			{
				layer.color = color;
				SetLayer(index, layer);
			}
		}

		public void SetLayerColor(string name, Color color)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			SetLayerColor(FindName(name), color);
		}
	}
	[Serializable]
	[CreateAssetMenu(fileName = "LayerBundleData", menuName = "ScriptableObjects/Layer Bundle Data", order = 1)]
	public class LayerBundleData : ScriptableObject
	{
		public Vector2Int outputSize = new Vector2Int(512, 512);

		public LayerBundle layerBundle = new LayerBundle();

		[NonSerialized]
		[HideInInspector]
		public UnityEvent<Texture2D> onTextureGenerated = new UnityEvent<Texture2D>();

		public bool updateMaterials;

		public List<MaterialInfo> materialsToUpdate = new List<MaterialInfo>();

		[HideInInspector]
		public bool generateOutput;

		[HideInInspector]
		public string outputLocation = "Output.png";

		[NonSerialized]
		[HideInInspector]
		public Texture2D texture;

		private void UpdateMaterials(Texture2D texture)
		{
			if (!updateMaterials)
			{
				return;
			}
			foreach (MaterialInfo item in materialsToUpdate)
			{
				if ((Object)(object)item.material == (Object)null || item.textureProperties.Count == 0)
				{
					continue;
				}
				foreach (string textureProperty in item.textureProperties)
				{
					item.material.SetTexture(textureProperty, (Texture)(object)texture);
				}
			}
		}

		public Texture2D GenerateTexture()
		{
			texture = ShaderTextureBuilder.RenderBundle(layerBundle, ((Vector2Int)(ref outputSize)).x, ((Vector2Int)(ref outputSize)).y, generateOutput);
			if ((Object)(object)texture != (Object)null && generateOutput)
			{
				string text = outputLocation.Substring(outputLocation.LastIndexOf(".")).ToUpper();
				byte[] array = null;
				switch (text)
				{
				case ".EXR":
					array = ImageConversion.EncodeToEXR(texture);
					break;
				case ".JPG":
					array = ImageConversion.EncodeToJPG(texture);
					break;
				case ".PNG":
					array = ImageConversion.EncodeToPNG(texture);
					break;
				case ".TGA":
					array = ImageConversion.EncodeToTGA(texture);
					break;
				default:
					outputLocation += ".png";
					array = ImageConversion.EncodeToPNG(texture);
					break;
				}
				string text2 = Path.Combine(Application.dataPath, outputLocation);
				File.WriteAllBytes(text2, array);
				Debug.Log((object)("Writting Image:\n" + text2));
			}
			UpdateMaterials(texture);
			onTextureGenerated.Invoke(texture);
			return texture;
		}
	}
	[Serializable]
	public struct MaterialInfo
	{
		public Material material;

		public List<string> textureProperties;
	}
	public static class ShaderTextureBuilder
	{
		public static Texture2D RenderBundle(LayerBundle bundle, int width, int height, bool ReadToMemory = false)
		{
			return new ShaderTextureBuilder_Job(null, bundle, width, height, ReadToMemory).Render();
		}

		public static Texture2D RenderBundle(LayerBundleData bundleData)
		{
			return new ShaderTextureBuilder_Job(null, bundleData.layerBundle, ((Vector2Int)(ref bundleData.outputSize)).x, ((Vector2Int)(ref bundleData.outputSize)).y, bundleData.generateOutput).Render();
		}

		public static void RenderBundle_Async(Action<Texture2D> listener, LayerBundle bundle, int width, int height, bool ReadToMemory = false)
		{
		}

		public static void RenderBundle_Async(Action<Texture2D> listener, LayerBundleData bundleData)
		{
		}
	}
	public class ShaderTextureBuilder_Job
	{
		private Action<Texture2D> _listener;

		private LayerBundle _bundle;

		private int _width = -1;

		private int _height = -1;

		public bool _readtomemory;

		private Texture2D _texture;

		private RenderTexture _buffer;

		private Material _material;

		public ShaderTextureBuilder_Job(Action<Texture2D> listener, LayerBundle bundle, int width, int height, bool readtomemory)
		{
			_listener = listener;
			_bundle = bundle;
			_width = width;
			_height = height;
			_readtomemory = readtomemory;
		}

		public Texture2D Render()
		{
			if (!Validate())
			{
				return null;
			}
			Prepare();
			RenderBackground();
			foreach (Layer layer in _bundle.layers)
			{
				RenderLayer(layer);
			}
			if (_readtomemory)
			{
				ReadToMemory();
			}
			Cleanup();
			_listener?.Invoke(_texture);
			return _texture;
		}

		private bool Validate()
		{
			if (_width > 0)
			{
				return _height > 0;
			}
			return false;
		}

		private void Prepare()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			_buffer = new RenderTexture(_width, _height, 0, (RenderTextureFormat)0, (RenderTextureReadWrite)2);
			_texture = new Texture2D(_width, _height, (TextureFormat)5, false, false, true);
		}

		private bool FetchShader(Layer layer)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			Shader blendMode = BlendModeShaderLibrary.GetBlendMode(layer.mode);
			if ((Object)(object)blendMode == (Object)null)
			{
				Debug.Log((object)"Shader Missing!!! Check Library.");
				return false;
			}
			if ((Object)(object)_material == (Object)null)
			{
				_material = new Material(blendMode);
			}
			if ((Object)(object)_material.shader != (Object)(object)blendMode)
			{
				_material.shader = blendMode;
			}
			return true;
		}

		private void RenderBackground()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			Color32[] array = (Color32[])(object)new Color32[_width * _height];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = Color32.op_Implicit(_bundle.backgroundColor);
			}
			_texture.SetPixels32(array);
			_texture.Apply();
			RenderTexture active = RenderTexture.active;
			Graphics.CopyTexture((Texture)(object)_texture, (Texture)(object)_buffer);
			RenderTexture.active = active;
		}

		private void RenderLayer(Layer layer)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (layer.enabled && FetchShader(layer))
			{
				_material.SetColor("_Color", layer.color);
				_material.SetTexture("_BaseMap", (Texture)(object)_texture);
				_material.SetTexture("_BlendMap", (Texture)(object)layer.texture);
				_material.SetTexture("_MaskMap", (Texture)(object)layer.mask);
				RenderTexture active = RenderTexture.active;
				Graphics.Blit((Texture)null, _buffer, _material, 0);
				Graphics.CopyTexture((Texture)(object)_buffer, (Texture)(object)_texture);
				RenderTexture.active = active;
			}
		}

		private void ReadToMemory()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			RenderTexture active = RenderTexture.active;
			RenderTexture.active = _buffer;
			_texture.ReadPixels(new Rect(0f, 0f, (float)_width, (float)_height), 0, 0, false);
			_texture.Apply();
			RenderTexture.active = active;
		}

		private void Cleanup()
		{
			if ((Object)(object)RenderTexture.active == (Object)(object)_buffer)
			{
				RenderTexture.active = null;
			}
			_buffer.Release();
			Object.DestroyImmediate((Object)(object)_material);
			Object.DestroyImmediate((Object)(object)_buffer);
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

UCustomPrefabs/UCustomPrefabsAPI.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using Microsoft.CodeAnalysis;
using UCustomPrefabsAPI.Extras.AssetBundles;
using UCustomPrefabsAPI.Extras.CustomActions;
using UCustomPrefabsAPI.Extras.Utility;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("0.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace UCustomPrefabsAPI
{
	public class ActionStateMachine
	{
		private class StateActions
		{
			public List<Action<string>> OnEnter = new List<Action<string>>();

			public List<Action> OnUpdate = new List<Action>();

			public List<Action<string>> OnExit = new List<Action<string>>();
		}

		private Dictionary<string, StateActions> _StatesActions = new Dictionary<string, StateActions>();

		private List<Action<string, string>> OnStateChanged = new List<Action<string, string>>();

		private List<Action> OnUpdate = new List<Action>();

		private List<Action> OnDestroy = new List<Action>();

		private StateActions _CurrentActions;

		public string State { get; private set; } = string.Empty;


		public bool HasState(string name)
		{
			return _StatesActions.ContainsKey(name);
		}

		public void AddState(string name)
		{
			Internal_AddState(name);
		}

		private StateActions Internal_AddState(string name, bool addState = true)
		{
			if (!_StatesActions.TryGetValue(name, out var value) && addState)
			{
				value = new StateActions();
				_StatesActions.Add(name, value);
			}
			return value;
		}

		public void AddOnEnter(string name, Action<string> action, bool addState = false)
		{
			Internal_AddState(name, addState)?.OnEnter.Add(action);
		}

		public void AddOnUpdate(string name, Action action, bool addState = false)
		{
			Internal_AddState(name, addState)?.OnUpdate.Add(action);
		}

		public void AddOnExit(string name, Action<string> action, bool addState = false)
		{
			Internal_AddState(name, addState)?.OnExit.Add(action);
		}

		public void AddOnStateChanged(Action<string, string> action)
		{
			OnStateChanged.Add(action);
		}

		public void AddOnUpdate(Action action)
		{
			OnUpdate.Add(action);
		}

		public void AddOnDestroy(Action action)
		{
			OnDestroy.Add(action);
		}

		public void Do_OnEnter()
		{
			_CurrentActions?.OnEnter.ForEach(delegate(Action<string> action)
			{
				try
				{
					action?.Invoke(State);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			});
		}

		public void Do_OnExit()
		{
			_CurrentActions?.OnExit.ForEach(delegate(Action<string> action)
			{
				try
				{
					action?.Invoke(State);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			});
		}

		public void Do_OnStateChanged(string lastState)
		{
			OnStateChanged.ForEach(delegate(Action<string, string> action)
			{
				try
				{
					action?.Invoke(lastState, State);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			});
		}

		public void SetState(string name)
		{
			if (!(State == name))
			{
				_StatesActions.TryGetValue(name, out _CurrentActions);
				State = name;
			}
		}

		public void Update()
		{
			_CurrentActions?.OnUpdate.ForEach(delegate(Action action)
			{
				action?.Invoke();
			});
			OnUpdate.ForEach(delegate(Action action)
			{
				try
				{
					action?.Invoke();
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			});
		}

		public void Destroy()
		{
			OnDestroy.ForEach(delegate(Action action)
			{
				try
				{
					action?.Invoke();
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			});
		}
	}
	public abstract class CustomActionsBase : HandlerReferencer, IComparable<CustomActionsBase>
	{
		private ActionStateMachine StateMachine => base.Handler?.StateMachine;

		public int Priority { get; set; }

		public void AddOnEnter(string name, Action<string> action, bool addState = false)
		{
			StateMachine.AddOnEnter(name, action, addState);
		}

		public void AddOnUpdate(string name, Action action, bool addState = false)
		{
			StateMachine.AddOnUpdate(name, action, addState);
		}

		public void AddOnExit(string name, Action<string> action, bool addState = false)
		{
			StateMachine.AddOnExit(name, action, addState);
		}

		public void AddOnStateChanged(Action<string, string> action)
		{
			StateMachine.AddOnStateChanged(action);
		}

		public void AddOnUpdate(Action action)
		{
			StateMachine.AddOnUpdate(action);
		}

		public void AddOnDestroy(Action action)
		{
			StateMachine.AddOnDestroy(action);
		}

		public abstract void RegisterActions();

		public virtual void HandleTemplateData(object[] data)
		{
		}

		public int CompareTo(CustomActionsBase other)
		{
			return Priority.CompareTo(other.Priority);
		}
	}
	public static class UCustomPrefabFileHelper
	{
		public static List<string> FindDirectoriesWithFileName(string path, string fileName)
		{
			List<string> list = new List<string>();
			Queue<string> queue = new Queue<string>();
			queue.Enqueue(path);
			while (queue.Count > 0)
			{
				string text = queue.Dequeue();
				try
				{
					if (File.Exists(Path.Combine(text, fileName)))
					{
						list.Add(text);
					}
					string[] directories = Directory.GetDirectories(text);
					foreach (string item in directories)
					{
						queue.Enqueue(item);
					}
				}
				catch (Exception ex)
				{
					Debug.LogError((object)("Unable to Access " + text));
					Debug.LogError((object)ex);
				}
			}
			return list;
		}

		private static bool IsAssetBundle(string path)
		{
			bool result = false;
			try
			{
				using FileStream input = new FileStream(path, FileMode.Open, FileAccess.Read);
				using BinaryReader binaryReader = new BinaryReader(input);
				byte[] bytes = binaryReader.ReadBytes(8);
				string @string = Encoding.ASCII.GetString(bytes);
				if (@string.StartsWith("UnityFS") || @string.StartsWith("UnityRaw") || @string.StartsWith("UnityWeb"))
				{
					result = true;
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine("Error Reading File : " + ex.Message);
			}
			return result;
		}

		public static void TryToLoadTemplateAssetBundlesFromPath<T>(string path)
		{
			try
			{
				string[] files = Directory.GetFiles(Path.Combine(Path.GetDirectoryName(typeof(T).Assembly.Location), path));
				List<string> list = new List<string>();
				string[] array = files;
				foreach (string path2 in array)
				{
					if (IsAssetBundle(path2))
					{
						list.Add(Path.Combine(path, Path.GetFileName(path2)));
					}
				}
				foreach (string item in list)
				{
					if (AssetBundleRegistry.Register<T>(item, out var name))
					{
						if (!TryToLoadTemplatesFromAssetBundle(name))
						{
							Debug.Log((object)("Unable to load Templates from Assetbundle : " + name));
							AssetBundleRegistry.Remove(name, unloadAllLoadedObjects: true);
						}
						else
						{
							Debug.Log((object)("Registering AssetBundle : " + item));
						}
					}
				}
			}
			catch (Exception ex)
			{
				Debug.Log((object)("Unable To Access Path : " + path));
				Debug.LogError((object)ex);
			}
		}

		public static bool TryToLoadTemplatesFromAssetBundle(string assetBundleName)
		{
			TextAsset val = AssetBundleRegistry.LoadAsset<TextAsset>(assetBundleName, "templates.ucp.txt");
			if ((Object)(object)val == (Object)null || string.IsNullOrWhiteSpace(val.text))
			{
				Debug.Log((object)("Unable to Read Templates Json from " + assetBundleName));
				return false;
			}
			UCustomPrefab_AssetBundle_TemplatesJSON uCustomPrefab_AssetBundle_TemplatesJSON = new UCustomPrefab_AssetBundle_TemplatesJSON();
			JsonUtility.FromJsonOverwrite(val.text, (object)uCustomPrefab_AssetBundle_TemplatesJSON);
			if (!uCustomPrefab_AssetBundle_TemplatesJSON.Verify())
			{
				Debug.Log((object)"Templates Data is Invalid!");
				return false;
			}
			for (int i = 0; i < uCustomPrefab_AssetBundle_TemplatesJSON.Template_Names.Count; i++)
			{
				TemplateRegistry.LateRegister(uCustomPrefab_AssetBundle_TemplatesJSON.Template_Names[i], assetBundleName, uCustomPrefab_AssetBundle_TemplatesJSON.Template_Prefabs[i]);
			}
			return true;
		}
	}
	[Serializable]
	public class UCustomPrefab_AssetBundle_TemplatesJSON
	{
		public string Name;

		public string Author;

		public string Description;

		public List<string> Template_Names = new List<string>();

		public List<string> Template_Prefabs = new List<string>();

		public bool Verify()
		{
			if (!string.IsNullOrWhiteSpace(Name) && !string.IsNullOrWhiteSpace(Author) && !string.IsNullOrWhiteSpace(Description) && Template_Names.Count != 0)
			{
				return Template_Prefabs.Count != 0;
			}
			return false;
		}
	}
	public class InstanceInfo
	{
		public string ID { get; private set; } = string.Empty;


		public Transform Target { get; private set; }

		public string TemplateUID { get; private set; } = string.Empty;


		public UCustomPrefabHandler Handler { get; private set; }

		public InstanceInfo(string id, string template_uid)
		{
			ID = id;
			TemplateUID = template_uid;
		}

		public bool SetTarget(Transform target)
		{
			if ((Object)(object)target == (Object)null)
			{
				Debug.LogWarning((object)"Target Doesn't Exist!");
				return false;
			}
			Target = target;
			Reset();
			return true;
		}

		public bool IsValid()
		{
			if ((Object)(object)Handler != (Object)null)
			{
				return (Object)(object)Target != (Object)null;
			}
			return false;
		}

		public void Reset()
		{
			if ((Object)(object)Target == (Object)null || (Object)(object)((Component)Target).gameObject == (Object)null || DestroyHandler())
			{
				return;
			}
			try
			{
				Handler = ((Component)Target).gameObject.AddComponent<UCustomPrefabHandler>();
				if (!Object.op_Implicit((Object)(object)Handler))
				{
					Debug.LogWarning((object)"Handler Unable to be added to GameObject. Ignore.");
					return;
				}
				Handler.Instance = this;
				Handler.Initialize();
			}
			catch (Exception ex)
			{
				Debug.LogError((object)ex);
			}
		}

		public bool DestroyHandler(bool reset = true, bool destroy = true)
		{
			if ((Object)(object)Handler == (Object)null)
			{
				return false;
			}
			UCustomPrefabHandler handler = Handler;
			Handler = null;
			if (destroy)
			{
				handler.HandleDestroy(reset);
			}
			return true;
		}

		public void PrepareRemove()
		{
			DestroyHandler(reset: false);
		}
	}
	public static class InstanceManager
	{
		private static Dictionary<string, InstanceInfo> Instances = new Dictionary<string, InstanceInfo>();

		public static bool TryGetInstance(string uid, out InstanceInfo instance)
		{
			instance = null;
			if (string.IsNullOrWhiteSpace(uid))
			{
				return false;
			}
			Verify();
			if (Instances.TryGetValue(uid, out instance))
			{
				return instance != null;
			}
			return false;
		}

		public static InstanceInfo[] GetInstancesInTarget(Transform target)
		{
			if ((Object)(object)target == (Object)null)
			{
				return new InstanceInfo[0];
			}
			UCustomPrefabHandler[] components = ((Component)target).gameObject.GetComponents<UCustomPrefabHandler>();
			InstanceInfo[] array = new InstanceInfo[components.Length];
			for (int i = 0; i < components.Length; i++)
			{
				array[i] = components[i]?.Instance;
			}
			return array;
		}

		public static InstanceInfo[] GetInstancesInTargetChildren(Transform target)
		{
			if ((Object)(object)target == (Object)null)
			{
				return new InstanceInfo[0];
			}
			UCustomPrefabHandler[] componentsInChildren = ((Component)target).gameObject.GetComponentsInChildren<UCustomPrefabHandler>(true);
			InstanceInfo[] array = new InstanceInfo[componentsInChildren.Length];
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				array[i] = componentsInChildren[i]?.Instance;
			}
			return array;
		}

		public static InstanceInfo[] GetInstancesInTargetParent(Transform target)
		{
			if ((Object)(object)target == (Object)null)
			{
				return new InstanceInfo[0];
			}
			UCustomPrefabHandler[] componentsInParent = ((Component)target).gameObject.GetComponentsInParent<UCustomPrefabHandler>();
			InstanceInfo[] array = new InstanceInfo[componentsInParent.Length];
			for (int i = 0; i < componentsInParent.Length; i++)
			{
				array[i] = componentsInParent[i]?.Instance;
			}
			return array;
		}

		public static bool Register(string uid, string template_uid, Transform target)
		{
			if (string.IsNullOrWhiteSpace(uid) || string.IsNullOrWhiteSpace(template_uid) || (Object)(object)target == (Object)null)
			{
				return false;
			}
			Verify();
			if (Instances.ContainsKey(uid))
			{
				return false;
			}
			InstanceInfo instanceInfo = new InstanceInfo(uid, template_uid);
			if (!instanceInfo.SetTarget(target))
			{
				return false;
			}
			Instances.Add(uid, instanceInfo);
			return true;
		}

		public static void Verify()
		{
			List<string> list = new List<string>();
			foreach (KeyValuePair<string, InstanceInfo> instance in Instances)
			{
				if (instance.Value == null || !instance.Value.IsValid())
				{
					list.Add(instance.Key);
				}
			}
			foreach (string item in list)
			{
				Remove(item);
			}
		}

		public static void RemoveInstancesFromTarget(Transform target)
		{
			InstanceInfo[] instancesInTarget = GetInstancesInTarget(target);
			for (int i = 0; i < instancesInTarget.Length; i++)
			{
				Remove(instancesInTarget[i]?.ID);
			}
		}

		public static void RemoveInstancesFromTargetChildren(Transform target)
		{
			InstanceInfo[] instancesInTargetChildren = GetInstancesInTargetChildren(target);
			for (int i = 0; i < instancesInTargetChildren.Length; i++)
			{
				Remove(instancesInTargetChildren[i]?.ID);
			}
		}

		public static void RemoveInstancesFromTargetParent(Transform target)
		{
			InstanceInfo[] instancesInTargetParent = GetInstancesInTargetParent(target);
			for (int i = 0; i < instancesInTargetParent.Length; i++)
			{
				Remove(instancesInTargetParent[i]?.ID);
			}
		}

		public static void Remove(string uid)
		{
			try
			{
				if (!string.IsNullOrWhiteSpace(uid) && Instances.TryGetValue(uid, out var value))
				{
					value?.PrepareRemove();
					Instances.Remove(uid);
				}
			}
			catch
			{
				Debug.LogWarning((object)("Unable to remove Instance ID : \"" + uid + "\" Ignoring."));
			}
		}

		public static void ResetInstance(string uid)
		{
			if (!string.IsNullOrWhiteSpace(uid) && Instances.TryGetValue(uid, out var value))
			{
				value?.Reset();
			}
		}

		public static void Reset()
		{
			foreach (string item in new List<string>(Instances.Keys))
			{
				Remove(item);
			}
			Instances.Clear();
		}
	}
	public class InstanceReferencer
	{
		private WeakReference<InstanceInfo> _Instance_Reference = new WeakReference<InstanceInfo>(null);

		public InstanceInfo Instance
		{
			get
			{
				_Instance_Reference.TryGetTarget(out var target);
				return target;
			}
			set
			{
				_Instance_Reference.SetTarget(value);
			}
		}
	}
	public class HandlerReferencer
	{
		private WeakReference<UCustomPrefabHandler> _Handler_Reference = new WeakReference<UCustomPrefabHandler>(null);

		public UCustomPrefabHandler Handler
		{
			get
			{
				_Handler_Reference.TryGetTarget(out var target);
				return target;
			}
			set
			{
				_Handler_Reference.SetTarget(value);
			}
		}
	}
	public class UCustomPrefabHandler : MonoBehaviour
	{
		private InstanceReferencer _instanceReferencer = new InstanceReferencer();

		private Dictionary<Type, CustomActionsBase> RegisteredCustomActions = new Dictionary<Type, CustomActionsBase>();

		public Dictionary<string, Dictionary<string, PrefabTemplate>> Templates = new Dictionary<string, Dictionary<string, PrefabTemplate>>();

		private bool IsDestroyed;

		public InstanceInfo Instance
		{
			get
			{
				return _instanceReferencer.Instance;
			}
			set
			{
				_instanceReferencer.Instance = value;
			}
		}

		public ActionStateMachine StateMachine { get; private set; } = new ActionStateMachine();


		public Dictionary<string, PrefabTemplate> LoadedTemplates { get; private set; } = new Dictionary<string, PrefabTemplate>();


		public void Initialize()
		{
			AddState("init");
			AddState("default");
			RegisterTemplate();
			InitializeAndRegisterCustomActions();
			SetState("default");
		}

		public void SetState(string name, bool reset = true)
		{
			string state = StateMachine.State;
			StateMachine.Do_OnExit();
			ResetTemplates();
			InstantiateStateTemplates(name);
			StateMachine.SetState(name);
			StateMachine.Do_OnEnter();
			StateMachine.Do_OnStateChanged(state);
		}

		public void AddState(string name)
		{
			if (!StateMachine.HasState(name))
			{
				StateMachine.AddState(name);
				Templates.Add(name, new Dictionary<string, PrefabTemplate>());
			}
		}

		public bool TryGetCustomActions<T>(out T customActions) where T : CustomActionsBase
		{
			customActions = null;
			if (RegisteredCustomActions.TryGetValue(typeof(T), out var value))
			{
				customActions = (T)value;
			}
			return customActions != null;
		}

		public T RegisterCustomActions<T>(object[] data = null, int priority = -1) where T : CustomActionsBase
		{
			return (T)RegisterCustomActions(typeof(T), data, priority);
		}

		public CustomActionsBase RegisterCustomActions(Type type, object[] data = null, int priority = -1)
		{
			if (RegisteredCustomActions.TryGetValue(type, out var value))
			{
				return value;
			}
			value = (CustomActionsBase)Activator.CreateInstance(type);
			if (value == null)
			{
				return null;
			}
			value.Priority = priority;
			value.HandleTemplateData(data);
			RegisteredCustomActions.Add(type, value);
			return value;
		}

		public void InitializeAndRegisterCustomActions()
		{
			foreach (KeyValuePair<Type, CustomActionsBase> item in RegisteredCustomActions.OrderBy((KeyValuePair<Type, CustomActionsBase> x) => x.Value.Priority))
			{
				CustomActionsBase value = item.Value;
				value.Handler = this;
				value.RegisterActions();
			}
		}

		public void RegisterTemplate()
		{
			if (Instance == null || !TemplateRegistry.TryGetTemplate(Instance.TemplateUID, out var template))
			{
				return;
			}
			for (int i = 0; i < template.Templates.Count; i++)
			{
				PrefabTemplate prefabTemplate = template.Templates[i];
				if (!Templates.ContainsKey(prefabTemplate.State))
				{
					AddState(prefabTemplate.State);
				}
				Templates[prefabTemplate.State].Add($"{template.UID}:{i}", prefabTemplate);
			}
			foreach (KeyValuePair<Type, object[]> customAction in template.GetCustomActions())
			{
				RegisterCustomActions(customAction.Key, (object[])customAction.Value[1], (int)customAction.Value[0]);
			}
		}

		public void ResetTemplates(bool includePersistent = false)
		{
			List<string> list = new List<string>();
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in LoadedTemplates)
			{
				if ((Object)(object)loadedTemplate.Value == (Object)null || !loadedTemplate.Value.Persistent || includePersistent)
				{
					list.Add(loadedTemplate.Key);
				}
			}
			foreach (string item in list)
			{
				PrefabTemplate prefabTemplate = LoadedTemplates[item];
				if ((Object)(object)prefabTemplate != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)prefabTemplate).gameObject);
				}
				LoadedTemplates.Remove(item);
			}
		}

		public void InstantiateTemplate(string uid, PrefabTemplate template)
		{
			if (!LoadedTemplates.ContainsKey(uid) && !((Object)(object)template == (Object)null))
			{
				template = Object.Instantiate<GameObject>(((Component)template).gameObject, ((Component)this).transform).GetComponent<PrefabTemplate>();
				LoadedTemplates.Add(uid, template);
			}
		}

		public void InstantiateStateTemplates(string state)
		{
			if (!Templates.TryGetValue(state, out var value))
			{
				return;
			}
			foreach (KeyValuePair<string, PrefabTemplate> item in value)
			{
				InstantiateTemplate(item.Key, item.Value);
			}
		}

		public PrefabTemplate GetTemplateWithTag(params string[] tags)
		{
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in LoadedTemplates)
			{
				if (loadedTemplate.Value.HasTag(tags))
				{
					return loadedTemplate.Value;
				}
			}
			return null;
		}

		public List<PrefabTemplate> GetTemplatesWithTag(params string[] tags)
		{
			List<PrefabTemplate> list = new List<PrefabTemplate>();
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in LoadedTemplates)
			{
				if (loadedTemplate.Value.HasTag(tags))
				{
					list.Add(loadedTemplate.Value);
				}
			}
			return list;
		}

		public TaggedBehaviour GetTagInTemplates(params string[] tags)
		{
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in LoadedTemplates)
			{
				if (loadedTemplate.Value.HasTag(tags))
				{
					return loadedTemplate.Value;
				}
				foreach (TaggedBehaviour item in loadedTemplate.Value.FindTagsInChildren(tags))
				{
					if ((Object)(object)item != (Object)null)
					{
						return item;
					}
				}
			}
			return null;
		}

		public List<TaggedBehaviour> GetTagsInTemplates(params string[] tags)
		{
			List<TaggedBehaviour> list = new List<TaggedBehaviour>();
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in LoadedTemplates)
			{
				if (loadedTemplate.Value.HasTag(tags))
				{
					list.Add(loadedTemplate.Value);
				}
				list.AddRange(loadedTemplate.Value.FindTagsInChildren(tags));
			}
			return list;
		}

		private void Update()
		{
			if (!IsDestroyed)
			{
				StateMachine.Update();
			}
		}

		private void FixedUpdate()
		{
		}

		private void LateUpdate()
		{
		}

		private void OnDestroy()
		{
			HandleDestroy();
		}

		public void HandleDestroy(bool reset = true)
		{
			if (IsDestroyed)
			{
				return;
			}
			((Behaviour)this).enabled = false;
			IsDestroyed = true;
			StateMachine.Destroy();
			ResetTemplates(includePersistent: true);
			if (Instance != null)
			{
				Instance.DestroyHandler(reset: false, destroy: false);
				if (reset)
				{
					Instance.Reset();
				}
				else
				{
					InstanceManager.Verify();
				}
			}
			Object.Destroy((Object)(object)this);
		}
	}
	public static class TemplateRegistry
	{
		public class TemplateData
		{
			public string UID;

			public GameObject Container;

			public List<CustomActionsTemplate> CustomActionsTemplates = new List<CustomActionsTemplate>();

			public List<PrefabTemplate> Templates = new List<PrefabTemplate>();

			public TemplateData(string uid)
			{
				UID = uid;
			}

			public void InstantiateContainer()
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Expected O, but got Unknown
				Reset();
				GameObject val = new GameObject(UID ?? "");
				val.transform.parent = TemplateContainer.transform;
				Container = val;
				((Object)Container).hideFlags = (HideFlags)61;
				Container.SetActive(false);
			}

			public void InstantiatePrefab(GameObject prefab)
			{
				Reset();
				GameObject val = Object.Instantiate<GameObject>(prefab, TemplateContainer.transform);
				if (Object.op_Implicit((Object)(object)val))
				{
					Container = val;
					((Object)Container).hideFlags = (HideFlags)61;
					Container.SetActive(false);
					CustomActionsTemplate[] components = Container.GetComponents<CustomActionsTemplate>();
					foreach (CustomActionsTemplate customActions in components)
					{
						AddCustomActionsTemplate(customActions);
					}
					PrefabTemplate[] componentsInChildren = Container.GetComponentsInChildren<PrefabTemplate>(true);
					foreach (PrefabTemplate prefab2 in componentsInChildren)
					{
						AddTemplate(prefab2);
					}
				}
			}

			public T InstantiateCustomActionsTemplate<T>() where T : CustomActionsTemplate
			{
				if (!Object.op_Implicit((Object)(object)Container))
				{
					Debug.LogWarning((object)"Could not add CustomActionsTemplate. : Container Missing...!");
					return null;
				}
				return Container.AddComponent<T>();
			}

			public void InstantiateTemplate(GameObject prefab)
			{
				if (!Object.op_Implicit((Object)(object)Container))
				{
					Debug.LogWarning((object)"Could not instatiate Template. : Container Missing...!");
					return;
				}
				GameObject val = Object.Instantiate<GameObject>(prefab, Container.transform);
				if (!Object.op_Implicit((Object)(object)val))
				{
					Debug.LogWarning((object)"Could not instatiate Template. : Invalid Prefab...!");
					return;
				}
				PrefabTemplate component = val.GetComponent<PrefabTemplate>();
				if (!Object.op_Implicit((Object)(object)component))
				{
					Debug.LogWarning((object)"Template does not have PrefabTemplate component.");
				}
				else
				{
					AddTemplate(component);
				}
			}

			public void AddCustomActionsTemplate(CustomActionsTemplate customActions)
			{
				CustomActionsTemplates.Add(customActions);
			}

			public void AddTemplate(PrefabTemplate prefab, bool reParent = false)
			{
				if (Object.op_Implicit((Object)(object)prefab))
				{
					if (reParent)
					{
						((Component)prefab).transform.parent = Container.transform;
					}
					Templates.Add(prefab);
				}
			}

			public Dictionary<Type, object[]> GetCustomActions()
			{
				Dictionary<Type, object[]> dictionary = new Dictionary<Type, object[]>();
				foreach (CustomActionsTemplate customActionsTemplate in CustomActionsTemplates)
				{
					Type type = customActionsTemplate.RegisterCustomActionsBaseType();
					if (type != null && !dictionary.ContainsKey(type))
					{
						dictionary.Add(type, new object[2]
						{
							customActionsTemplate.Priority,
							customActionsTemplate.PrepareTemplateData()
						});
					}
				}
				return dictionary;
			}

			public void Reset()
			{
				Object.DestroyImmediate((Object)(object)Container);
				CustomActionsTemplates.Clear();
				Templates.Clear();
			}
		}

		private static Dictionary<string, TemplateData> TemplateDatas = new Dictionary<string, TemplateData>();

		private static readonly List<string> ReservedNames = new List<string> { "none" };

		private static GameObject _templateContainer;

		private static Queue<string> _LateRegistry = new Queue<string>();

		public static string Default { get; private set; } = string.Empty;


		public static GameObject TemplateContainer
		{
			get
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_001c: Expected O, but got Unknown
				if ((Object)(object)_templateContainer == (Object)null)
				{
					_templateContainer = new GameObject("UCustomPrefabsAPI_Templates");
					Object.DontDestroyOnLoad((Object)(object)_templateContainer);
					((Object)_templateContainer).hideFlags = (HideFlags)61;
					_templateContainer.SetActive(false);
				}
				return _templateContainer;
			}
		}

		public static void SetDefault(string uid)
		{
			if (TemplateDatas.ContainsKey(uid))
			{
				Default = uid;
			}
			else
			{
				Debug.LogWarning((object)("Tempate uid : \"" + uid + "\" is not registered."));
			}
		}

		public static bool TryGetTemplate(string uid, out TemplateData template)
		{
			bool flag = TemplateDatas.TryGetValue(uid, out template);
			if (!flag)
			{
				flag = TemplateDatas.TryGetValue(Default, out template);
				Debug.LogWarning((object)("Default Template will be used instead of Template uid : \"" + uid + "\""));
			}
			return flag;
		}

		public static void Register(string uid, GameObject prefab)
		{
			if (ReservedNames.Contains(uid.ToLower()))
			{
				Debug.LogWarning((object)("Template uid : \"" + uid + "\" is reserved."));
				return;
			}
			if (TemplateDatas.ContainsKey(uid))
			{
				Debug.LogWarning((object)("Template uid : \"" + uid + "\" already registered."));
				return;
			}
			if (!Object.op_Implicit((Object)(object)prefab))
			{
				Debug.LogWarning((object)("Template uid : \"" + uid + "\" prefab is invalid."));
				return;
			}
			TemplateData templateData = new TemplateData(uid);
			templateData.InstantiatePrefab(prefab);
			TemplateDatas.Add(uid, templateData);
		}

		public static void LateRegister(string uid, string assetbundle, string prefabPath)
		{
			_LateRegistry.Enqueue(uid);
			_LateRegistry.Enqueue(assetbundle);
			_LateRegistry.Enqueue(prefabPath);
		}

		public static void CommitLateRegistry()
		{
			while (_LateRegistry.Count > 0)
			{
				string uid = _LateRegistry.Dequeue();
				string assetbundleName = _LateRegistry.Dequeue();
				string name = _LateRegistry.Dequeue();
				GameObject val = AssetBundleRegistry.LoadPrefab(assetbundleName, name);
				if (!((Object)(object)val == (Object)null))
				{
					Register(uid, val);
				}
			}
		}

		public static void RegisterEmpty(string uid)
		{
			if (TemplateDatas.ContainsKey(uid))
			{
				Debug.LogWarning((object)("Template uid : \"" + uid + "\" already registered."));
				return;
			}
			TemplateData templateData = new TemplateData(uid);
			templateData.InstantiateContainer();
			TemplateDatas.Add(uid, templateData);
		}

		public static List<string> GetTemplatesWithCustomActions<T>() where T : CustomActionsBase
		{
			return GetTemplatesWithCustomActions(typeof(T));
		}

		public static List<string> GetTemplatesWithCustomActions(string customAction_uid)
		{
			if (!CustomActionsRegistry.TryGetActions(customAction_uid, out var actionsType))
			{
				return new List<string>();
			}
			return GetTemplatesWithCustomActions(actionsType);
		}

		private static List<string> GetTemplatesWithCustomActions(Type customAction_type)
		{
			List<string> list = new List<string>();
			foreach (KeyValuePair<string, TemplateData> templateData in TemplateDatas)
			{
				foreach (CustomActionsTemplate customActionsTemplate in templateData.Value.CustomActionsTemplates)
				{
					Type type = customActionsTemplate.RegisterCustomActionsBaseType();
					if (!(type == null) && type == customAction_type)
					{
						list.Add(templateData.Key);
					}
				}
			}
			return list;
		}
	}
	public abstract class CustomActionsTemplate : MonoBehaviour
	{
		public int Priority;

		public abstract Type RegisterCustomActionsBaseType();

		public virtual object[] PrepareTemplateData()
		{
			return null;
		}
	}
	public class PrefabTemplate : TaggedBehaviour
	{
		[Tooltip("Determines if this template get's removed on state change.")]
		public bool Persistent;

		[Tooltip("State this template is instantiated.")]
		public string State = "default";
	}
}
namespace UCustomPrefabsAPI.Extras.Utility
{
	public static class SearchUtils
	{
		public static Transform RecursivelyFindChild(Transform parent, string name)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			Debug.Log((object)("RecursivelyFindChild " + ((Object)parent).name + ":" + name));
			foreach (Transform item in parent)
			{
				Transform val = item;
				if (((Object)val).name == name)
				{
					return val;
				}
				Transform val2 = RecursivelyFindChild(val, name);
				if (Object.op_Implicit((Object)(object)val2))
				{
					return val2;
				}
			}
			return null;
		}

		public static Transform IterativelyFindChild(Transform parent, string name)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			Debug.Log((object)("IterativelyFindChild " + ((Object)parent).name + ":" + name));
			Queue<Transform> queue = new Queue<Transform>();
			queue.Enqueue(parent);
			while (queue.Count != 0)
			{
				foreach (Transform item in queue.Dequeue())
				{
					Transform val = item;
					if (((Object)val).name == name)
					{
						return val;
					}
					queue.Enqueue(val);
				}
			}
			return null;
		}

		public static void RecursivelyCollectChildNames(Transform target, ref Dictionary<string, Transform> looseNameRefs)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			Debug.Log((object)("RecursivelyCollectChildNames " + ((Object)target).name));
			if (looseNameRefs == null)
			{
				looseNameRefs = new Dictionary<string, Transform>();
			}
			foreach (Transform item in target)
			{
				Transform val = item;
				if (!looseNameRefs.ContainsKey(((Object)val).name))
				{
					looseNameRefs.Add(((Object)val).name, val);
				}
				if (val.childCount > 0)
				{
					RecursivelyCollectChildNames(val, ref looseNameRefs);
				}
			}
		}

		public static void IterativelyCollectChildNames(Transform target, ref Dictionary<string, Transform> looseNameRefs)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			Debug.Log((object)("IterativelyCollectChildNames " + ((Object)target).name));
			if (looseNameRefs == null)
			{
				looseNameRefs = new Dictionary<string, Transform>();
			}
			Queue<Transform> queue = new Queue<Transform>();
			queue.Enqueue(target);
			while (queue.Count != 0)
			{
				foreach (Transform item in queue.Dequeue())
				{
					Transform val = item;
					if (!looseNameRefs.ContainsKey(((Object)val).name))
					{
						looseNameRefs.Add(((Object)val).name, val);
					}
					queue.Enqueue(val);
				}
			}
		}

		public static void FixPaths(ref string[] paths, string replace, string with)
		{
			for (int i = 0; i < paths.Length; i++)
			{
				paths[i] = paths[i].Replace(replace, with);
			}
		}

		public static string FindPath(Transform root, Transform target)
		{
			string text = (Object.op_Implicit((Object)(object)target) ? ((Object)target).name : string.Empty);
			while ((Object)(object)target != (Object)null && (Object)(object)target.parent != (Object)(object)root)
			{
				target = target.parent;
				text = ((Object)target).name + "/" + text;
			}
			return text;
		}

		public static string RelativeFindPath(Transform origin, Transform target)
		{
			HashSet<Transform> hashSet = MapParentHierarchy(target);
			string text = string.Empty;
			if (hashSet.Contains(origin))
			{
				text = FindPath(origin, target);
			}
			else
			{
				foreach (Transform item in MapParentHierarchy(origin))
				{
					text += "../";
					if (hashSet.Contains(item))
					{
						text += FindPath(item, target);
						break;
					}
				}
			}
			return text;
		}

		public static Transform RelativeFind(Transform origin, string relativePath)
		{
			Queue<string> queue = new Queue<string>(relativePath.Split(new char[1] { '/' }));
			Transform val = origin;
			try
			{
				while ((Object)(object)val != (Object)null && queue.Count > 0)
				{
					string text = queue.Dequeue();
					switch (text)
					{
					case "..":
						val = val.parent;
						break;
					case "*":
						val = IterativelyFindChild(origin, queue.Dequeue());
						break;
					case "**":
						val = FindParent(val, queue.Dequeue());
						break;
					case "|":
					{
						string assetbundleName = queue.Dequeue();
						string name = queue.Dequeue();
						Transform val3 = IterativelyFindChild(val, assetbundleName);
						if (!Object.op_Implicit((Object)(object)val3))
						{
							val3 = IterativelyFindChild(val, name);
						}
						val = val3;
						break;
					}
					case "||":
					{
						string assetbundleName = queue.Dequeue();
						string name = queue.Dequeue();
						Transform val3 = FindParent(val, assetbundleName);
						if (!Object.op_Implicit((Object)(object)val3))
						{
							val3 = FindParent(val, name);
						}
						val = val3;
						break;
					}
					case "@":
					{
						string assetbundleName = queue.Dequeue();
						GameObject val2 = AssetBundleRegistry.LoadPrefab(assetbundleName, string.Join("/", queue));
						if (Object.op_Implicit((Object)(object)val2))
						{
							val = val2.transform;
						}
						break;
					}
					default:
						val = val.Find(text);
						break;
					}
				}
			}
			catch (Exception)
			{
				Debug.LogError((object)"Invalid Relative Path.");
				val = null;
			}
			return val;
		}

		public static Transform FindParent(Transform origin, string name)
		{
			Debug.Log((object)$"FindParent {origin}:{name}");
			bool flag = false;
			Transform val = origin;
			while (!flag && (Object)(object)val != (Object)null)
			{
				val = val.parent;
				if (((Object)val).name == name)
				{
					flag = true;
				}
			}
			if (!flag)
			{
				return null;
			}
			return val;
		}

		public static HashSet<Transform> MapParentHierarchy(Transform root)
		{
			HashSet<Transform> hashSet = new HashSet<Transform>();
			while ((Object)(object)root.parent != (Object)null)
			{
				hashSet.Add(root.parent);
				root = root.parent;
			}
			return hashSet;
		}
	}
	public class TaggedBehaviour : MonoBehaviour
	{
		[Tooltip("WIP Tags to help organize things in UCustomPrefabs.")]
		public string[] Tags;

		private HashSet<string> _tagset;

		public HashSet<string> TagSet
		{
			get
			{
				if (_tagset == null)
				{
					_tagset = new HashSet<string>();
					InitTags();
				}
				return _tagset;
			}
		}

		private void InitTags()
		{
			string[] tags = Tags;
			foreach (string item in tags)
			{
				_tagset.Add(item);
			}
		}

		public virtual void AddTag(params string[] tags)
		{
			foreach (string item in tags)
			{
				TagSet.Add(item);
			}
		}

		public virtual void RemoveTag(params string[] tags)
		{
			foreach (string item in tags)
			{
				TagSet.Remove(item);
			}
		}

		public virtual bool HasTag(params string[] tags)
		{
			foreach (string item in tags)
			{
				if (!TagSet.Contains(item))
				{
					return false;
				}
			}
			return tags.Length != 0;
		}

		public virtual void ClearTags()
		{
			TagSet.Clear();
		}

		public virtual TaggedBehaviour FindTagInChildren(params string[] tags)
		{
			TaggedBehaviour[] componentsInChildren = ((Component)this).GetComponentsInChildren<TaggedBehaviour>(true);
			foreach (TaggedBehaviour taggedBehaviour in componentsInChildren)
			{
				if (taggedBehaviour.HasTag(tags))
				{
					return taggedBehaviour;
				}
			}
			return null;
		}

		public virtual List<TaggedBehaviour> FindTagsInChildren(params string[] tags)
		{
			List<TaggedBehaviour> list = new List<TaggedBehaviour>();
			TaggedBehaviour[] componentsInChildren = ((Component)this).GetComponentsInChildren<TaggedBehaviour>(true);
			foreach (TaggedBehaviour taggedBehaviour in componentsInChildren)
			{
				if (taggedBehaviour.HasTag(tags))
				{
					list.Add(taggedBehaviour);
				}
			}
			return list;
		}
	}
	public class TaggedData : TaggedBehaviour
	{
		[Tooltip("WIP Tag Data to help serialize things in UCustomPrefabs.")]
		public string[] Data;

		private Dictionary<string, string> _tagdata;

		public Dictionary<string, string> TagData
		{
			get
			{
				if (_tagdata == null)
				{
					_tagdata = new Dictionary<string, string>();
					InitTagData();
				}
				return _tagdata;
			}
		}

		private void InitTagData()
		{
			for (int i = 0; i < Data.Length && i < Tags.Length; i++)
			{
				try
				{
					_tagdata.Add(Tags[i], Data[i]);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			}
		}

		public override void AddTag(params string[] tags)
		{
			for (int i = 0; i + 1 < tags.Length; i += 2)
			{
				base.TagSet.Add(tags[i]);
				try
				{
					TagData.Add(tags[i], tags[i + 1]);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			}
		}

		public override void RemoveTag(params string[] tags)
		{
			foreach (string text in tags)
			{
				base.TagSet.Remove(text);
				try
				{
					TagData.Remove(text);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			}
		}

		public bool TryGetTagData(string tag, out string data)
		{
			return TagData.TryGetValue(tag, out data);
		}
	}
}
namespace UCustomPrefabsAPI.Extras.Utility.Serialization
{
	public abstract class MonobehaviourSerialized : MonoBehaviour, ISerializationCallbackReceiver
	{
		public string Data = string.Empty;

		public void OnAfterDeserialize()
		{
			if (!string.IsNullOrWhiteSpace(Data))
			{
				string data = Data;
				JsonUtility.FromJsonOverwrite(Data, (object)this);
				Data = data;
			}
		}

		public void OnBeforeSerialize()
		{
			Data = string.Empty;
			Data = JsonUtility.ToJson((object)this);
		}
	}
}
namespace UCustomPrefabsAPI.Extras.Tokens
{
	public static class TokenRegistry
	{
		private static Dictionary<string, string> _tokens = new Dictionary<string, string>();

		private static Dictionary<string, HashSet<Action<string>>> _listeners = new Dictionary<string, HashSet<Action<string>>>();

		public static void SetToken(string token, string data)
		{
			if (!_tokens.ContainsKey(token))
			{
				_tokens.Add(token, data);
			}
			else
			{
				_tokens[token] = data;
			}
		}

		public static string GetToken(string token)
		{
			if (!_tokens.TryGetValue(token, out var value))
			{
				return string.Empty;
			}
			return value;
		}

		public static void InvokeListeners(string token)
		{
			if (!_listeners.TryGetValue(token, out var value))
			{
				return;
			}
			foreach (Action<string> item in value)
			{
				try
				{
					item?.Invoke(token);
				}
				catch (Exception ex)
				{
					Debug.LogError((object)ex);
				}
			}
		}

		public static void Listen(string token, Action<string> action)
		{
			if (!_listeners.TryGetValue(token, out var value))
			{
				value = new HashSet<Action<string>>();
				_listeners.Add(token, value);
			}
			value.Add(action);
		}

		public static void StopListening(string token, Action<string> action)
		{
			if (_listeners.TryGetValue(token, out var value))
			{
				value.Remove(action);
			}
		}

		public static void RemoveListeners(string token)
		{
			if (_listeners.TryGetValue(token, out var value))
			{
				value.Clear();
			}
		}
	}
}
namespace UCustomPrefabsAPI.Extras.Profiles
{
	public class Profile
	{
		private Dictionary<string, ProfileData> _data = new Dictionary<string, ProfileData>();

		private List<ProfileData> _list = new List<ProfileData>();

		private bool locked;

		private WeakReference<ProfileManager> _manager;

		private const char START_TAG = '[';

		private const char END_TAG = ']';

		public int Count => _list.Count;

		public ProfileManager Manager
		{
			get
			{
				if (_manager != null && _manager.TryGetTarget(out var target))
				{
					return target;
				}
				return null;
			}
		}

		public void SetManager(ProfileManager manager)
		{
			if (manager != null)
			{
				_manager = new WeakReference<ProfileManager>(manager);
			}
		}

		public Profile(ProfileManager manager)
		{
			SetManager(manager);
		}

		public Profile Clone()
		{
			Profile profile = new Profile(Manager);
			foreach (KeyValuePair<string, ProfileData> datum in _data)
			{
				ProfileData value = datum.Value;
				profile.SetData(datum.Key, value.Data, value.GetType());
			}
			foreach (KeyValuePair<string, ProfileData> datum2 in _data)
			{
				ProfileData value2 = datum2.Value;
				int index = _list.IndexOf(value2);
				profile.SetDataIndex(datum2.Key, index);
			}
			return profile;
		}

		public void SetData(string key, object value, Type type)
		{
			if (Manager == null)
			{
				return;
			}
			if (!_data.TryGetValue(key, out var value2) && !locked)
			{
				if (!Manager.TryInstantiateDataType(type, out value2))
				{
					_data.Add(key, value2);
				}
				_list.Add(value2);
				value2.Data = value;
			}
			else
			{
				value2.Data = value;
			}
		}

		public void SetData<T>(string key, T value)
		{
			SetData(key, value, typeof(T));
		}

		public T GetData<T>(string key)
		{
			TryGetData<T>(key, out var value);
			return value;
		}

		public bool TryGetData<T>(string key, out T value)
		{
			ProfileData value2;
			bool num = _data.TryGetValue(key, out value2);
			if (num)
			{
				value = (T)value2.Data;
				return num;
			}
			value = default(T);
			return num;
		}

		public bool HasData(string key)
		{
			return _data.ContainsKey(key);
		}

		public void RemoveData(string key)
		{
			if (!locked && _data.TryGetValue(key, out var value))
			{
				_data.Remove(key);
				_list.Remove(value);
			}
		}

		public void PurgeData()
		{
			if (!locked)
			{
				_data.Clear();
				_list.Clear();
			}
		}

		public void SetDataIndex(string key, int index)
		{
			if (!locked && _data.TryGetValue(key, out var value) && _list.IndexOf(value) != index)
			{
				_list.Remove(value);
				_list.Insert(index, value);
			}
		}

		public int GetDataIndex(string key)
		{
			if (!_data.TryGetValue(key, out var value))
			{
				return -1;
			}
			return _list.IndexOf(value);
		}

		public void LockEdits()
		{
			locked = true;
		}

		public string Serialize(bool useChecksum = true)
		{
			List<string> list = new List<string>();
			for (int i = 0; i < Count; i++)
			{
				list.Add(string.Empty);
			}
			foreach (KeyValuePair<string, ProfileData> datum in _data)
			{
				ProfileData value = datum.Value;
				string text = value.Serailize();
				if (value.Size == -1)
				{
					text = $"{'['}{text}{']'}";
				}
				list[GetDataIndex(datum.Key)] = text;
			}
			string text2 = string.Join(string.Empty, list);
			if (useChecksum)
			{
				text2 = GenerateChecksum(text2) + text2;
			}
			return text2;
		}

		public void Deserialize(string input, bool hasChecksum = true, int offset = 0)
		{
			if (hasChecksum && !ValidateChecksum(input))
			{
				Debug.LogWarning((object)"Profile data does not match checksum--");
				Debug.LogWarning((object)"data may be incorrect... Ignoring");
				return;
			}
			int num = (hasChecksum ? 1 : 0);
			for (int i = offset; i < _list.Count; i++)
			{
				ProfileData profileData = _list[i];
				int num2 = profileData.Size;
				bool flag = num2 == -1;
				if (flag)
				{
					num2 = FindDataSize(input, num);
				}
				if (num2 > 0)
				{
					string data = ((!flag) ? input.Substring(num, num2) : input.Substring(num + 1, num2 - 1));
					profileData.Deserialize(data);
					num += num2;
				}
			}
		}

		private bool ValidateChecksum(string input)
		{
			char num = input[0];
			char c = GenerateChecksum(input, 1);
			return num == c;
		}

		private char GenerateChecksum(string input, int offset = 0)
		{
			int i = offset;
			char c = '#';
			for (; i < input.Length; i++)
			{
				char c2 = input[i];
				c ^= c2;
				bool num = c % 2 == 0;
				c = (char)(c % 26 + 65);
				c = (num ? char.ToUpper(c) : char.ToLower(c));
			}
			return c;
		}

		private int FindDataSize(string input, int pointer)
		{
			pointer = input.IndexOf('[', pointer);
			if (pointer < 0)
			{
				return -1;
			}
			int num = 0;
			int num2 = 0;
			while (pointer < input.Length)
			{
				switch (input[pointer])
				{
				case '[':
					num2++;
					break;
				case ']':
					num2--;
					break;
				}
				if (num2 == 0)
				{
					break;
				}
				num++;
				pointer++;
			}
			return num;
		}
	}
	public abstract class ProfileData
	{
		public object Data { get; set; }

		public Type Type { get; set; } = typeof(string);


		public int Size { get; set; } = -1;


		public virtual bool TryGet<T>(out T data)
		{
			data = default(T);
			int num;
			if (Data != null)
			{
				num = (Type.IsInstanceOfType(typeof(T)) ? 1 : 0);
				if (num != 0)
				{
					data = (T)Data;
					return (byte)num != 0;
				}
			}
			else
			{
				num = 0;
			}
			Debug.Log((object)"Data is invalid.");
			return (byte)num != 0;
		}

		public virtual string Serailize()
		{
			if (Data == null)
			{
				return null;
			}
			string text = Data.ToString();
			if (Size != -1)
			{
				try
				{
					text = text.Substring(0, Size);
				}
				catch (Exception)
				{
					Debug.Log((object)"Data is too small.");
				}
			}
			return text;
		}

		public virtual void Deserialize(string data)
		{
			if (string.IsNullOrEmpty(data))
			{
				return;
			}
			if (Size != -1)
			{
				try
				{
					data = data.Substring(0, Size);
				}
				catch (Exception)
				{
					Debug.Log((object)"Data is too small.");
				}
			}
			Data = data;
		}
	}
	public class ProfileManager
	{
		private Dictionary<string, Profile> Profiles = new Dictionary<string, Profile>();

		private Profile Template;

		private Dictionary<Type, Type> DataTypes = new Dictionary<Type, Type>
		{
			{
				typeof(string),
				typeof(ProfileData)
			},
			{
				typeof(float),
				typeof(ProfileData_Float)
			},
			{
				typeof(int),
				typeof(ProfileData_Integer)
			},
			{
				typeof(bool),
				typeof(ProfileData_Boolean)
			},
			{
				typeof(char),
				typeof(ProfileData_Char)
			}
		};

		public Profile InstantiateProfile()
		{
			return new Profile(this);
		}

		public Profile CreateProfile(string name)
		{
			if (Template == null)
			{
				return null;
			}
			if (TryGetProfile(name, out var config))
			{
				return config;
			}
			config = Template.Clone();
			config.LockEdits();
			Profiles.Add(name, config);
			return config;
		}

		public bool TryGetProfile(string name, out Profile config)
		{
			return Profiles.TryGetValue(name, out config);
		}

		public void RegisterTemplate(Profile profile)
		{
			ClearTemplate();
			Template = profile;
		}

		public void ClearProfiles()
		{
			Profiles.Clear();
		}

		public void ClearTemplate()
		{
			Template = null;
		}

		public void RegisterDataType<T>(Type type) where T : ProfileData
		{
			try
			{
				DataTypes.Add(type, typeof(T));
			}
			catch (ArgumentException)
			{
				Console.WriteLine("Data Type Already Registered.");
			}
		}

		public bool TryInstantiateDataType(Type type, out ProfileData data)
		{
			data = null;
			if (DataTypes.TryGetValue(type, out var value))
			{
				data = (ProfileData)Activator.CreateInstance(value);
			}
			return data != null;
		}
	}
	internal static class ProfileRegistry
	{
		private static Dictionary<string, ProfileManager> ProfileManagers = new Dictionary<string, ProfileManager>();

		public static ProfileManager CreateProfileManager(string uid)
		{
			if (ProfileManagers.TryGetValue(uid, out var value))
			{
				return value;
			}
			value = new ProfileManager();
			ProfileManagers.Add(uid, value);
			return value;
		}

		public static Profile CreateProfile(string uid, string name)
		{
			ProfileManagers.TryGetValue(uid, out var value);
			return value?.CreateProfile(name);
		}

		public static void RegisterProfileTemplate(string uid, Profile template)
		{
			ProfileManagers.TryGetValue(uid, out var value);
			value?.RegisterTemplate(template);
		}

		public static bool TryGetProfile(string uid, string name, out Profile profile)
		{
			profile = null;
			if (!ProfileManagers.TryGetValue(uid, out var value))
			{
				return false;
			}
			return value.TryGetProfile(name, out profile);
		}
	}
	public class ProfileData_Float : ProfileData
	{
		public ProfileData_Float()
		{
			base.Type = typeof(float);
		}

		public override void Deserialize(string data)
		{
			if (float.TryParse(data, out var result))
			{
				base.Data = result;
			}
		}
	}
	public class ProfileData_Integer : ProfileData
	{
		public ProfileData_Integer()
		{
			base.Type = typeof(int);
		}

		public override void Deserialize(string data)
		{
			if (int.TryParse(data, out var result))
			{
				base.Data = result;
			}
		}
	}
	public class ProfileData_Boolean : ProfileData
	{
		public ProfileData_Boolean()
		{
			base.Type = typeof(bool);
			base.Size = 1;
		}

		public override string Serailize()
		{
			if (!TryGet<bool>(out var data))
			{
				return "0";
			}
			if (!data)
			{
				return "0";
			}
			return "1";
		}

		public override void Deserialize(string data)
		{
			if (string.IsNullOrEmpty(data))
			{
				return;
			}
			bool result;
			if (data.Length == 1)
			{
				switch (data.ToUpper())
				{
				case "T":
					base.Data = true;
					break;
				case "F":
					base.Data = false;
					break;
				case "1":
					base.Data = true;
					break;
				case "0":
					base.Data = false;
					break;
				}
			}
			else if (bool.TryParse(data, out result))
			{
				base.Data = result;
			}
		}
	}
	public class ProfileData_Char : ProfileData
	{
		public ProfileData_Char()
		{
			base.Type = typeof(char);
			base.Size = 1;
		}

		public override void Deserialize(string data)
		{
			if (!string.IsNullOrEmpty(data) && data.Length > 0)
			{
				base.Data = data[0];
			}
		}
	}
}
namespace UCustomPrefabsAPI.Extras.CustomActions
{
	public static class CustomActionsRegistry
	{
		private static Dictionary<string, Type> RegisteredCustomActions = new Dictionary<string, Type>();

		public static bool TryGetActions(string uid, out Type actionsType)
		{
			return RegisteredCustomActions.TryGetValue(uid, out actionsType);
		}

		public static void Register<T>(string uid) where T : CustomActionsBase
		{
			if (RegisteredCustomActions.ContainsKey(uid))
			{
				Debug.LogWarning((object)("CustomActions uid : \"" + uid + "\" already registered."));
			}
			else
			{
				RegisteredCustomActions.Add(uid, typeof(T));
			}
		}
	}
	public class LooseReferenceAction : CustomActionsTemplate
	{
		[SerializeField]
		public string CustomActionName;

		[SerializeField]
		public string Data;

		public override Type RegisterCustomActionsBaseType()
		{
			CustomActionsRegistry.TryGetActions(CustomActionName, out var actionsType);
			return actionsType;
		}

		public override object[] PrepareTemplateData()
		{
			return new object[1] { Data };
		}
	}
}
namespace UCustomPrefabsAPI.Extras.AssetBundles
{
	public class AssetBundleData
	{
		public string name;

		public string path;

		public bool embedded;

		public Assembly assembly;

		public AssetBundle assetbundle;

		public AssetBundleData(Type origin, string path, string name = null, bool embedded = false)
		{
			assembly = origin.Assembly;
			this.path = path;
			this.embedded = embedded;
			if (string.IsNullOrWhiteSpace(name))
			{
				name = Path.GetFileName(path);
			}
			this.name = name;
		}

		public bool LoadAssetBundle()
		{
			if (string.IsNullOrWhiteSpace(path))
			{
				return false;
			}
			if (embedded)
			{
				return LoadEmbedded();
			}
			return Load();
		}

		private bool Load()
		{
			assetbundle = null;
			try
			{
				string text = Path.Combine(Path.GetDirectoryName(assembly.Location), path);
				assetbundle = AssetBundle.LoadFromFile(text);
			}
			catch (Exception ex)
			{
				Debug.Log((object)"Unable to load assetbundle. Make sure your pathing is correct.");
				Debug.Log((object)"Make sure to use LoadEmbeddedAssetBundle if using an embedded resource");
				Debug.LogError((object)ex);
			}
			if (!Object.op_Implicit((Object)(object)assetbundle))
			{
				return false;
			}
			embedded = false;
			return true;
		}

		private bool LoadEmbedded()
		{
			assetbundle = null;
			try
			{
				string text = path.Replace('\\', '.');
				text = text.Replace('/', '.');
				text = assembly.FullName.Split(new char[1] { ',' })[0] + "." + text;
				using Stream stream = assembly.GetManifestResourceStream(text);
				assetbundle = AssetBundle.LoadFromStream(stream);
			}
			catch (Exception ex)
			{
				Debug.Log((object)"Unable to load assetbundle. Make sure your pathing is correct.");
				Debug.Log((object)"Embedded Resources use \".\" instead of the usual \"\\\".");
				Debug.LogError((object)ex);
			}
			if (!Object.op_Implicit((Object)(object)assetbundle))
			{
				return false;
			}
			return true;
		}

		public GameObject LoadPrefab(string name)
		{
			AssetBundle obj = assetbundle;
			if (obj == null)
			{
				return null;
			}
			return obj.LoadAsset<GameObject>(name);
		}

		public T LoadAsset<T>(string name) where T : Object
		{
			AssetBundle obj = assetbundle;
			if (obj == null)
			{
				return default(T);
			}
			return obj.LoadAsset<T>(name);
		}

		public void Unload(bool unloadAllLoadedObjects)
		{
			AssetBundle obj = assetbundle;
			if (obj != null)
			{
				obj.Unload(unloadAllLoadedObjects);
			}
		}
	}
	public static class AssetBundleRegistry
	{
		private static Dictionary<string, AssetBundleData> AssetBundles = new Dictionary<string, AssetBundleData>();

		public static bool Register<T>(string path, string name = null)
		{
			AssetBundleData assetBundleData = new AssetBundleData(typeof(T), path, name);
			if (HasAssetBundle(assetBundleData.name) || !assetBundleData.LoadAssetBundle())
			{
				return false;
			}
			AssetBundles.Add(assetBundleData.name, assetBundleData);
			return true;
		}

		public static bool Register<T>(string path, out string name)
		{
			name = null;
			AssetBundleData assetBundleData = new AssetBundleData(typeof(T), path);
			if (HasAssetBundle(assetBundleData.name) || !assetBundleData.LoadAssetBundle())
			{
				return false;
			}
			AssetBundles.Add(assetBundleData.name, assetBundleData);
			name = assetBundleData.name;
			return true;
		}

		public static void RegisterEmbedded<T>(string path, string name = null)
		{
			AssetBundleData assetBundleData = new AssetBundleData(typeof(T), path, name, embedded: true);
			if (!HasAssetBundle(assetBundleData.name) && assetBundleData.LoadAssetBundle())
			{
				AssetBundles.Add(assetBundleData.name, assetBundleData);
			}
		}

		public static void Remove(string assetbundleName, bool unloadAllLoadedObjects)
		{
			if (AssetBundles.TryGetValue(assetbundleName, out var value))
			{
				value.Unload(unloadAllLoadedObjects);
				AssetBundles.Remove(assetbundleName);
			}
		}

		public static bool HasAssetBundle(string name)
		{
			return AssetBundles.ContainsKey(name);
		}

		public static GameObject LoadPrefab(string assetbundleName, string name)
		{
			if (!AssetBundles.TryGetValue(assetbundleName, out var value))
			{
				return null;
			}
			return value.LoadPrefab(name);
		}

		public static T LoadAsset<T>(string assetbundleName, string name) where T : Object
		{
			if (!AssetBundles.TryGetValue(assetbundleName, out var value))
			{
				return default(T);
			}
			return value.LoadAsset<T>(name);
		}
	}
}
namespace UCustomPrefabsAPI.Extras.Animation
{
	[Serializable]
	public class BoneMapPair
	{
		public string origin = string.Empty;

		public string target = string.Empty;
	}
	[Serializable]
	public class BoneMap
	{
		public bool UsePaths;

		private Dictionary<string, BoneMapPair> _dict = new Dictionary<string, BoneMapPair>();

		public List<BoneMapPair> bonePairs = new List<BoneMapPair>();

		public void AddDefaultHumanBoneNames()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			ClearPairs();
			HumanBodyBones[] humanBodyBonesAry = RigUtilities.HumanBodyBonesAry;
			for (int i = 0; i < humanBodyBonesAry.Length; i++)
			{
				HumanBodyBones val = humanBodyBonesAry[i];
				AddPair(((object)(HumanBodyBones)(ref val)).ToString(), string.Empty);
			}
		}

		public void AddHumanBones(Animator animator)
		{
			//IL_0026: 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_0075: 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)
			if (!Object.op_Implicit((Object)(object)animator))
			{
				Debug.LogWarning((object)"Animator not found.");
				return;
			}
			ClearPairs();
			HumanBodyBones[] humanBodyBonesAry = RigUtilities.HumanBodyBonesAry;
			foreach (HumanBodyBones val in humanBodyBonesAry)
			{
				try
				{
					Transform boneTransform = animator.GetBoneTransform(val);
					if (Object.op_Implicit((Object)(object)boneTransform))
					{
						if (UsePaths)
						{
							AddPair(Enum.GetName(typeof(HumanBodyBones), val), SearchUtils.FindPath(((Component)animator).transform, boneTransform));
						}
						else
						{
							AddPair(Enum.GetName(typeof(HumanBodyBones), val), ((Object)boneTransform).name);
						}
					}
				}
				catch (Exception)
				{
				}
			}
		}

		public void AddRecursiveBones(Transform target)
		{
			ClearPairs();
			Dictionary<string, Transform> looseNameRefs = new Dictionary<string, Transform>();
			SearchUtils.RecursivelyCollectChildNames(target, ref looseNameRefs);
			foreach (KeyValuePair<string, Transform> item in looseNameRefs)
			{
				if (UsePaths)
				{
					AddPair(item.Key, SearchUtils.FindPath(target, item.Value));
				}
				else
				{
					AddPair(item.Key, item.Key);
				}
			}
		}

		public List<string> MatchBoneMaps(BoneMap target)
		{
			ValidateDict();
			List<string> list = new List<string>();
			if (target != null)
			{
				foreach (BoneMapPair bonePair in bonePairs)
				{
					if (target.HasPair(bonePair.origin))
					{
						list.Add(bonePair.origin);
					}
				}
			}
			return list;
		}

		public bool HasPair(string origin)
		{
			ValidateDict();
			if (!_dict.TryGetValue(origin, out var value))
			{
				return false;
			}
			return !string.IsNullOrWhiteSpace(value.target);
		}

		public string FetchPair(string origin)
		{
			ValidateDict();
			if (!_dict.TryGetValue(origin, out var value))
			{
				return string.Empty;
			}
			return value.target;
		}

		public void AddPair(string origin, string target)
		{
			ValidateDict();
			if (!_dict.ContainsKey(origin))
			{
				BoneMapPair boneMapPair = new BoneMapPair
				{
					origin = origin,
					target = target
				};
				bonePairs.Add(boneMapPair);
				_dict.Add(origin, boneMapPair);
			}
		}

		public void RemovePair(string origin)
		{
			ValidateDict();
			if (_dict.TryGetValue(origin, out var value))
			{
				bonePairs.Remove(value);
				_dict.Remove(origin);
			}
		}

		public void ClearEmptyPairs()
		{
			ValidateDict();
			HashSet<string> hashSet = new HashSet<string>(_dict.Keys);
			foreach (BoneMapPair bonePair in bonePairs)
			{
				if (!string.IsNullOrEmpty(bonePair.target))
				{
					hashSet.Remove(bonePair.origin);
				}
			}
			foreach (string item in hashSet)
			{
				_dict.Remove(item);
			}
		}

		public void ClearPairs()
		{
			_dict.Clear();
			bonePairs.Clear();
		}

		public void ValidateDict()
		{
			HashSet<string> hashSet = new HashSet<string>(_dict.Keys);
			foreach (BoneMapPair bonePair in bonePairs)
			{
				if (_dict.ContainsKey(bonePair.origin))
				{
					hashSet.Remove(bonePair.origin);
				}
				else
				{
					_dict.Add(bonePair.origin, bonePair);
				}
			}
			foreach (string item in hashSet)
			{
				_dict.Remove(item);
			}
		}
	}
	[Serializable]
	public class BoneRigInfo
	{
		public string version = string.Empty;

		public List<Quaternion> rotations = new List<Quaternion>();

		public bool useRotations = true;

		public List<Vector3> positions = new List<Vector3>();

		public bool usePositions;

		public List<string> originPaths = new List<string>();

		public List<string> targetPaths = new List<string>();

		public int rootIndex = -1;

		public Vector3 offset = Vector3.zero;

		public bool originUsePaths;

		public bool targetUsePaths;
	}
	public class BoneRigTracker
	{
		public Transform origin;

		public Transform target;

		public List<Transform> originBones = new List<Transform>();

		public List<Transform> targetBones = new List<Transform>();

		public List<Quaternion> rotations = new List<Quaternion>();

		public bool useRotations;

		public List<Vector3> positions = new List<Vector3>();

		public bool usePositions;

		public int rootIndex = -1;

		public Transform pivot;

		public Vector3 offset = Vector3.zero;

		public BoneRigTracker(Transform origin, Transform target)
		{
			//IL_0034: 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)
			this.origin = origin;
			this.target = target;
		}

		public void SetUpRig(BoneRigInfo info, Transform pivot = null)
		{
			if (info != null)
			{
				this.pivot = pivot;
				rotations = new List<Quaternion>(info.rotations);
				useRotations = info.useRotations;
				positions = new List<Vector3>(info.positions);
				usePositions = info.usePositions;
				rootIndex = info.rootIndex;
				RegisterBones(info);
				VerifyBones();
			}
		}

		private void RegisterBones(BoneRigInfo info)
		{
			//IL_0123: 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_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: 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_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)origin) || !Object.op_Implicit((Object)(object)target))
			{
				return;
			}
			int count = info.originPaths.Count;
			originBones = new List<Transform>(count);
			targetBones = new List<Transform>(count);
			Dictionary<string, Transform> looseNameRefs = null;
			Dictionary<string, Transform> looseNameRefs2 = null;
			if (!info.originUsePaths)
			{
				SearchUtils.IterativelyCollectChildNames(origin, ref looseNameRefs);
			}
			if (!info.targetUsePaths)
			{
				SearchUtils.IterativelyCollectChildNames(target, ref looseNameRefs2);
			}
			for (int i = 0; i < count; i++)
			{
				Transform value;
				if (info.originUsePaths)
				{
					value = origin.Find(info.originPaths[i]);
				}
				else
				{
					looseNameRefs.TryGetValue(info.originPaths[i], out value);
				}
				Transform value2;
				if (info.targetUsePaths)
				{
					value2 = target.Find(info.targetPaths[i]);
				}
				else
				{
					looseNameRefs2.TryGetValue(info.targetPaths[i], out value2);
				}
				originBones.Add(value);
				targetBones.Add(value2);
			}
			VerifyBones();
			if (info.version == "0.0.4")
			{
				offset = info.offset;
			}
			else if (rootIndex >= 0 && rootIndex < targetBones.Count)
			{
				Transform val = targetBones[rootIndex];
				offset = val.position - Vector3.Project(info.offset, val.up);
				offset = val.InverseTransformVector(offset - val.position);
			}
		}

		public void VerifyBones()
		{
			for (int i = 0; i < originBones.Count; i++)
			{
				if (i >= 0 && (!Object.op_Implicit((Object)(object)originBones[i]) || !Object.op_Implicit((Object)(object)targetBones[i])))
				{
					RemoveBone(i);
					i--;
				}
			}
		}

		public void RemoveBone(int index)
		{
			Debug.LogWarning((object)"Removing Bone!");
			try
			{
				originBones.RemoveAt(index);
				targetBones.RemoveAt(index);
				if (useRotations)
				{
					rotations.RemoveAt(index);
				}
				if (usePositions)
				{
					positions.RemoveAt(index);
				}
				if (index < rootIndex && rootIndex != -1)
				{
					rootIndex--;
				}
				else if (rootIndex == index || rootIndex < 0 || rootIndex == originBones.Count)
				{
					rootIndex = -1;
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)ex);
			}
		}

		public bool GetBonePair(int index, out Transform origin, out Transform target)
		{
			origin = originBones[index];
			target = targetBones[index];
			if ((Object)(object)origin == (Object)null || (Object)(object)target == (Object)null)
			{
				Debug.LogWarning((object)"Bone seem to be invalid, Will Verify Bone Rig.");
				VerifyBones();
				Update();
				return false;
			}
			return true;
		}

		public void Update()
		{
			for (int i = 0; i < originBones.Count; i++)
			{
				if (!GetBonePair(i, out var val, out var val2))
				{
					return;
				}
				if (useRotations)
				{
					UpdateBoneRotation(i, val, val2);
				}
				if (usePositions)
				{
					UpdateBonePosition(i, val, val2);
				}
			}
			UpdatePivotOffset();
		}

		private void UpdateBoneRotation(int index, Transform origin, Transform target)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			RigUtilities.ApplyRotationOffset(origin, target, rotations[index]);
		}

		private void UpdateBonePosition(int index, Transform origin, Transform target)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			RigUtilities.ApplyPositionOffset(origin, target, positions[index]);
		}

		public void UpdatePivotOffset()
		{
			//IL_005e: 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)
			if (rootIndex != -1)
			{
				if ((Object)(object)pivot != (Object)null)
				{
					RigUtilities.ApplyPositionOffset(originBones[rootIndex], pivot, offset);
				}
				else
				{
					RigUtilities.ApplyPositionOffset(originBones[rootIndex], targetBones[rootIndex], offset);
				}
			}
		}
	}
	[Serializable]
	public class RigBuilder : MonoBehaviour
	{
		private BoneRigInfo _rig;

		public string Data = string.Empty;

		public BoneRigInfo Rig
		{
			get
			{
				if (_rig == null)
				{
					Deserialize();
				}
				return _rig;
			}
		}

		public void Deserialize()
		{
			if (string.IsNullOrWhiteSpace(Data))
			{
				return;
			}
			_rig = new BoneRigInfo();
			try
			{
				JsonUtility.FromJsonOverwrite(Data, (object)_rig);
			}
			catch (Exception ex)
			{
				Debug.LogError((object)ex);
			}
		}
	}
	[Serializable]
	public class RigBuilderTemplate : MonoBehaviour
	{
		public GameObject RigPrefab;

		public AnimationClip ReferencePose;

		public bool PoseTargetRig;

		public bool PoseTemplateRig;

		public string RootName = "Hips";

		private BoneMap _bonemap;

		public string Data = string.Empty;

		public BoneMap BoneMap
		{
			get
			{
				if (_bonemap == null)
				{
					Deserialize();
				}
				return _bonemap;
			}
		}

		public virtual bool BuildRig(Transform target, BoneMap targetBoneMap, out BoneRigInfo rig)
		{
			return RigUtilities.TryBuildRig(this, target, targetBoneMap, out rig);
		}

		public void Deserialize()
		{
			if (string.IsNullOrEmpty(Data))
			{
				return;
			}
			if (_bonemap == null)
			{
				_bonemap = new BoneMap();
			}
			try
			{
				JsonUtility.FromJsonOverwrite(Data, (object)_bonemap);
				_bonemap.ValidateDict();
			}
			catch (Exception ex)
			{
				Debug.LogError((object)ex);
			}
		}
	}
	public static class RigUtilities
	{
		public const string CurrentRigVersion = "0.0.4";

		public static HumanBodyBones[] HumanBodyBonesAry = (HumanBodyBones[])Enum.GetValues(typeof(HumanBodyBones));

		public static bool TryBuildRig(RigBuilderTemplate Template, Transform target, BoneMap targetBoneMap, out BoneRigInfo rig)
		{
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			rig = null;
			Transform val = null;
			Transform val2 = null;
			try
			{
				val = ((Component)Object.Instantiate<Transform>(target, (Transform)null)).transform;
				val2 = Object.Instantiate<GameObject>(Template.RigPrefab, (Transform)null).transform;
				if (Template.PoseTargetRig)
				{
					AnimationClip referencePose = Template.ReferencePose;
					if (referencePose != null)
					{
						referencePose.SampleAnimation(((Component)val).gameObject, 0f);
					}
				}
				if (Template.PoseTemplateRig)
				{
					AnimationClip referencePose2 = Template.ReferencePose;
					if (referencePose2 != null)
					{
						referencePose2.SampleAnimation(((Component)val2).gameObject, 0f);
					}
				}
				Dictionary<string, Transform> looseNameRefs = new Dictionary<string, Transform>();
				Dictionary<string, Transform> looseNameRefs2 = new Dictionary<string, Transform>();
				SearchUtils.RecursivelyCollectChildNames(val, ref looseNameRefs);
				SearchUtils.RecursivelyCollectChildNames(val2, ref looseNameRefs2);
				List<string> list = targetBoneMap.MatchBoneMaps(Template.BoneMap);
				List<KeyValuePair<Transform, Transform>> list2 = new List<KeyValuePair<Transform, Transform>>();
				List<string> list3 = new List<string>();
				foreach (string item in list)
				{
					Transform value = null;
					Transform value2 = null;
					string text = targetBoneMap.FetchPair(item);
					string text2 = Template.BoneMap.FetchPair(item);
					if (targetBoneMap.UsePaths)
					{
						value = val.Find(text);
					}
					else
					{
						looseNameRefs.TryGetValue(text, out value);
					}
					if (Template.BoneMap.UsePaths)
					{
						value2 = val2.Find(text2);
					}
					else
					{
						looseNameRefs2.TryGetValue(text2, out value2);
					}
					if (Object.op_Implicit((Object)(object)value2) && Object.op_Implicit((Object)(object)value))
					{
						list2.Add(new KeyValuePair<Transform, Transform>(value, value2));
						list3.Add(item);
					}
				}
				int count = list2.Count;
				rig = new BoneRigInfo();
				rig.version = "0.0.4";
				rig.originUsePaths = targetBoneMap.UsePaths;
				rig.targetUsePaths = Template.BoneMap.UsePaths;
				for (int i = 0; i < count; i++)
				{
					string text3 = list3[i];
					Transform value3 = list2[i].Value;
					Transform key = list2[i].Key;
					rig.targetPaths.Add(Template.BoneMap.FetchPair(text3));
					rig.originPaths.Add(targetBoneMap.FetchPair(text3));
					rig.rotations.Add(CalculateRotationOffset(value3, key));
					if (rig.rootIndex == -1 && text3 == Template.RootName)
					{
						rig.rootIndex = i;
						rig.offset = CalculatePositionOffset(key, value3);
					}
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)ex);
				return false;
			}
			finally
			{
				Object.DestroyImmediate((Object)(object)((val != null) ? ((Component)val).gameObject : null));
				Object.DestroyImmediate((Object)(object)((val2 != null) ? ((Component)val2).gameObject : null));
			}
			return true;
		}

		public static float CalculateHeightRatio(Transform origin, Transform target)
		{
			//IL_0001: 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)
			return origin.position.y / target.position.y;
		}

		public static Vector3 CalculatePositionOffset(Transform origin, Transform target)
		{
			//IL_0002: 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_000d: 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)
			return target.InverseTransformVector(origin.position - target.position);
		}

		public static Quaternion CalculateRotationOffset(Transform origin, Transform target)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//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_0011: Unknown result type (might be due to invalid IL or missing references)
			return Quaternion.Inverse(origin.rotation) * target.rotation;
		}

		public static void ApplyPositionOffset(Transform origin, Transform target, Vector3 offset)
		{
			//IL_0002: 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_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			origin.position = target.position + target.TransformVector(offset);
		}

		public static void ApplyRotationOffset(Transform origin, Transform target, Quaternion offset)
		{
			//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_0008: Unknown result type (might be due to invalid IL or missing references)
			origin.rotation = target.rotation * offset;
		}
	}
}

UCustomPrefabs/UCustomPrefabsAPI.Peak.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using DG.Tweening;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using Steamworks;
using TMPro;
using UCustomPrefabsAPI.Extras.Animation;
using UCustomPrefabsAPI.Extras.AssetBundles;
using UCustomPrefabsAPI.Extras.CustomActions;
using UCustomPrefabsAPI.Extras.Utility;
using UCustomPrefabsAPI.Peak;
using UCustomPrefabsAPI.Peak.ActionUtils;
using UCustomPrefabsAPI.Peak.CustomActions;
using UCustomPrefabsAPI.Peak.Patches.Listeners;
using UCustomPrefabsAPI.Peak.Utils;
using UCustomPrefabsAPI.PhotonUtils.Networking;
using UCustomPrefabsAPI.RuntimeExtras;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.UI;
using Zorro.Core;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
[Serializable]
[RequireComponent(typeof(Renderer))]
public class PeakLayeredTextureHelper : MonoBehaviour
{
	private Renderer renderer;

	private Material material;

	public Vector2Int TextureSize = new Vector2Int(512, 512);

	[HideInInspector]
	public List<Texture2D> LayerBundleTextures;

	[HideInInspector]
	public List<Texture2D> LayerBundleMasks;

	[HideInInspector]
	public string LayerBundleData;
}
public class MeshUtils
{
	public static Mesh MakeReadableMeshCopy(Mesh nonReadableMesh)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Expected O, but got Unknown
		//IL_001e: 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_009b: Unknown result type (might be due to invalid IL or missing references)
		Mesh val = new Mesh();
		((Object)val).name = ((Object)nonReadableMesh).name + "_copy";
		val.indexFormat = nonReadableMesh.indexFormat;
		CopyVertexBuffers(val, nonReadableMesh);
		val.subMeshCount = nonReadableMesh.subMeshCount;
		GraphicsBuffer indexBuffer = nonReadableMesh.GetIndexBuffer();
		int num = indexBuffer.stride * indexBuffer.count;
		byte[] array = new byte[num];
		indexBuffer.GetData((Array)array);
		val.SetIndexBufferParams(indexBuffer.count, nonReadableMesh.indexFormat);
		val.SetIndexBufferData<byte>(array, 0, 0, num, (MeshUpdateFlags)0);
		indexBuffer.Release();
		uint num2 = 0u;
		for (int i = 0; i < val.subMeshCount; i++)
		{
			uint indexCount = nonReadableMesh.GetIndexCount(i);
			val.SetSubMesh(i, new SubMeshDescriptor((int)num2, (int)indexCount, (MeshTopology)0), (MeshUpdateFlags)0);
			num2 += indexCount;
		}
		CopyBlendShapes(val, nonReadableMesh);
		val.RecalculateNormals();
		val.RecalculateBounds();
		val.boneWeights = nonReadableMesh.boneWeights;
		val.bindposes = nonReadableMesh.bindposes;
		return val;
	}

	private static void CopyBlendShapes(Mesh targetMesh, Mesh sourceMesh)
	{
		try
		{
			for (int i = 0; i < sourceMesh.blendShapeCount; i++)
			{
				string blendShapeName = sourceMesh.GetBlendShapeName(i);
				int blendShapeFrameCount = sourceMesh.GetBlendShapeFrameCount(i);
				for (int j = 0; j < blendShapeFrameCount; j++)
				{
					float blendShapeFrameWeight = sourceMesh.GetBlendShapeFrameWeight(i, j);
					Vector3[] array = (Vector3[])(object)new Vector3[sourceMesh.vertexCount];
					Vector3[] array2 = (Vector3[])(object)new Vector3[sourceMesh.vertexCount];
					Vector3[] array3 = (Vector3[])(object)new Vector3[sourceMesh.vertexCount];
					sourceMesh.GetBlendShapeFrameVertices(i, j, array, array2, array3);
					targetMesh.AddBlendShapeFrame(blendShapeName, blendShapeFrameWeight, array, array2, array3);
				}
			}
		}
		catch (Exception ex)
		{
			Debug.LogException(ex);
		}
	}

	private static void CopyVertexBuffers(Mesh targetMesh, Mesh sourceMesh)
	{
		for (int i = 0; i < sourceMesh.vertexBufferCount; i++)
		{
			GraphicsBuffer vertexBuffer = sourceMesh.GetVertexBuffer(i);
			int num = vertexBuffer.stride * vertexBuffer.count;
			byte[] array = new byte[num];
			vertexBuffer.GetData((Array)array);
			targetMesh.SetVertexBufferParams(sourceMesh.vertexCount, sourceMesh.GetVertexAttributes());
			targetMesh.SetVertexBufferData<byte>(array, 0, 0, num, i, (MeshUpdateFlags)0);
			vertexBuffer.Release();
		}
	}
}
namespace UCustomPrefabsAPI.PhotonUtils.Networking
{
	public class PlayerConfigHelper : MonoBehaviourPunCallbacks
	{
		public const string UCustomPrefabPrefix = "ucp_";

		public const string CharacterTag = "ucp_char";

		public const string SkeletonTag = "ucp_skel";

		public const string ChickenTag = "ucp_chkn";

		public UCustomPrefabHandler CharacterHandler;

		public UCustomPrefabHandler PassportDummy_Handler;

		public UCustomPrefabHandler ChickenHandler;

		public string CurrentCharacterTemplate
		{
			get
			{
				if (((Dictionary<object, object>)(object)((MonoBehaviourPun)this).photonView.Owner.CustomProperties).TryGetValue((object)"ucp_char", out object value))
				{
					return (string)value;
				}
				return "NoPreference";
			}
		}

		public string CurrentSkeletonTemplate
		{
			get
			{
				if (((Dictionary<object, object>)(object)((MonoBehaviourPun)this).photonView.Owner.CustomProperties).TryGetValue((object)"ucp_skel", out object value))
				{
					return (string)value;
				}
				return "NoPreference";
			}
		}

		public string CurrentChickenTemplate
		{
			get
			{
				if (((Dictionary<object, object>)(object)((MonoBehaviourPun)this).photonView.Owner.CustomProperties).TryGetValue((object)"ucp_chkn", out object value))
				{
					return (string)value;
				}
				return "NoPreference";
			}
		}

		public PlayerCustomizationDummy PassportDummy
		{
			get
			{
				PassportManager instance = PassportManager.instance;
				if (!Object.op_Implicit((Object)(object)instance))
				{
					return null;
				}
				return instance.dummy;
			}
		}

		public static bool TryGetConfigHandler(Player player, out PlayerConfigHelper config)
		{
			config = ((Component)player.character).GetComponent<PlayerConfigHelper>();
			return Object.op_Implicit((Object)(object)config);
		}

		public static bool TryGetConfigHandler(Character character, out PlayerConfigHelper config)
		{
			config = ((Component)character).GetComponent<PlayerConfigHelper>();
			return Object.op_Implicit((Object)(object)config);
		}

		public static void UpdatePlayerData()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_0045: Expected O, but got Unknown
			Hashtable val = new Hashtable();
			((Dictionary<object, object>)val).Add((object)"ucp_char", (object)Plugin.PreferredCharacterConfig.Value);
			((Dictionary<object, object>)val).Add((object)"ucp_skel", (object)Plugin.PreferredSkeletonConfig.Value);
			((Dictionary<object, object>)val).Add((object)"ucp_chkn", (object)Plugin.PreferredChickenConfig.Value);
			Hashtable val2 = val;
			PhotonNetwork.LocalPlayer.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null);
		}

		public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)
		{
			if (targetPlayer == ((MonoBehaviourPun)this).photonView.Owner)
			{
				PurgeInstance(ChickenHandler);
				PurgeInstance(PassportDummy_Handler);
				PurgeInstance(CharacterHandler);
				Hashtable customProperties = targetPlayer.CustomProperties;
				if (((Dictionary<object, object>)(object)customProperties).TryGetValue((object)"ucp_char", out object value) && value is string token)
				{
					UpdateCharacterTemplate(targetPlayer, token);
				}
				if (((Dictionary<object, object>)(object)customProperties).TryGetValue((object)"ucp_skel", out value) && value is string token2)
				{
					UpdateSkeletonTemplate(targetPlayer, token2);
				}
				if (((Dictionary<object, object>)(object)customProperties).TryGetValue((object)"ucp_chkn", out value) && value is string token3)
				{
					UpdateChickenTemplate(targetPlayer, token3);
				}
				PassportManager instance = PassportManager.instance;
				if (instance != null)
				{
					instance.SetActiveButton();
				}
			}
		}

		public static void SetCharacterTemplate(string template)
		{
			//IL_000b: 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_0025: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			Plugin.PreferredCharacterConfig.Value = template;
			Hashtable val = new Hashtable();
			((Dictionary<object, object>)val).Add((object)"ucp_char", (object)Plugin.PreferredCharacterConfig.Value);
			Hashtable val2 = val;
			PhotonNetwork.LocalPlayer.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null);
		}

		public static void SetSkeletonTemplate(string template)
		{
			//IL_000b: 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_0025: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			Plugin.PreferredSkeletonConfig.Value = template;
			Hashtable val = new Hashtable();
			((Dictionary<object, object>)val).Add((object)"ucp_skel", (object)Plugin.PreferredSkeletonConfig.Value);
			Hashtable val2 = val;
			PhotonNetwork.LocalPlayer.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null);
		}

		public static void SetChickenTemplate(string template)
		{
			//IL_000b: 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_0025: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			Plugin.PreferredChickenConfig.Value = template;
			Hashtable val = new Hashtable();
			((Dictionary<object, object>)val).Add((object)"ucp_chkn", (object)Plugin.PreferredChickenConfig.Value);
			Hashtable val2 = val;
			PhotonNetwork.LocalPlayer.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null);
		}

		private void UpdateCharacterTemplate(Player targetPlayer, string token)
		{
			PurgeInstance(CharacterHandler);
			string text = CustomTemplateUtils.Evaluate_Peak_Custom_Template(this, PeakTemplateType.Character, token);
			if (!CustomTemplateUtils.IsSpecialTemplate(text))
			{
				RegisterInstance(string.Format("{0}:{1}:{2}", "ucp_char", targetPlayer.ActorNumber, text), text, ((Component)this).transform, out CharacterHandler);
			}
			if (((MonoBehaviourPun)this).photonView.IsMine)
			{
				PurgeInstance(PassportDummy_Handler);
				if (!CustomTemplateUtils.IsSpecialTemplate(text))
				{
					RegisterInstance($"dummy:{targetPlayer.ActorNumber}:{text}", text, ((Component)PassportDummy).transform, out PassportDummy_Handler);
				}
			}
		}

		private void UpdateSkeletonTemplate(Player targetPlayer, string token)
		{
		}

		public void CreateSkeletonInstance(Skelleton skeleton)
		{
			string text = CustomTemplateUtils.Evaluate_Peak_Custom_Template(this, PeakTemplateType.Skeleton, CurrentSkeletonTemplate);
			if (!CustomTemplateUtils.IsSpecialTemplate(text))
			{
				InstanceManager.Register(string.Format("{0}:{1}:{2}:{3}", "ucp_skel", ((MonoBehaviourPun)this).photonView.OwnerActorNr, text, ((Object)skeleton).GetInstanceID()), text, ((Component)skeleton).transform);
			}
		}

		private void UpdateChickenTemplate(Player targetPlayer, string token)
		{
			PurgeInstance(ChickenHandler);
			string text = CustomTemplateUtils.Evaluate_Peak_Custom_Template(this, PeakTemplateType.Chicken, token);
			if (!CustomTemplateUtils.IsSpecialTemplate(text))
			{
				RegisterInstance(string.Format("{0}:{1}:{2}", "ucp_chkn", targetPlayer.ActorNumber, text), text, ((Component)this).transform, out ChickenHandler);
			}
		}

		public static void PurgeInstance(UCustomPrefabHandler handler)
		{
			if (!((Object)(object)handler == (Object)null) && Object.op_Implicit((Object)(object)handler) && handler.Instance != null)
			{
				InstanceManager.Remove(handler.Instance.ID);
			}
		}

		public static bool RegisterInstance(string uid, string template_uid, Transform target, out UCustomPrefabHandler handler)
		{
			handler = null;
			if (VerifyTemplate(template_uid) && InstanceManager.Register(uid, template_uid, target))
			{
				InstanceInfo val = default(InstanceInfo);
				InstanceManager.TryGetInstance(uid, ref val);
				handler = val.Handler;
				return true;
			}
			return false;
		}

		public static bool VerifyTemplate(string templateID)
		{
			if (string.IsNullOrWhiteSpace(templateID))
			{
				return false;
			}
			TemplateData val = default(TemplateData);
			return TemplateRegistry.TryGetTemplate(templateID, ref val);
		}

		public void Start()
		{
			if (((MonoBehaviourPun)this).photonView.IsMine)
			{
				UpdatePlayerData();
			}
			((MonoBehaviourPunCallbacks)this).OnPlayerPropertiesUpdate(((MonoBehaviourPun)this).photonView.Owner, ((MonoBehaviourPun)this).photonView.Owner.CustomProperties);
		}

		public void Update()
		{
			Update_Debug_Model_Selection();
		}

		public void Update_Debug_Model_Selection()
		{
			if (((MonoBehaviourPun)this).photonView.IsMine)
			{
				if (Input.GetKeyDown((KeyCode)91))
				{
					PassportManager.instance.OpenTab((Type)(-13377701));
				}
				if (Input.GetKeyDown((KeyCode)93))
				{
					PassportManager.instance.OpenTab((Type)0);
				}
			}
		}
	}
}
namespace UCustomPrefabsAPI.RuntimeExtras
{
	public class MeshHider : CustomActionsBase
	{
		private static RenderingLayerMask Hidden_Mask = RenderingLayerMask.op_Implicit(0);

		private Dictionary<Renderer, RenderingLayerMask> _renderers = new Dictionary<Renderer, RenderingLayerMask>();

		private Stack<Renderer> _InvalidKeys = new Stack<Renderer>();

		public override void RegisterActions()
		{
			((CustomActionsBase)this).AddOnStateChanged((Action<string, string>)Init);
			((CustomActionsBase)this).AddOnDestroy((Action)Reset);
		}

		public void Init(string last, string state)
		{
			RegisterMeshHiderTemplates();
			HideRenderers();
		}

		public void Reset()
		{
			ResetRenderers();
		}

		public void RegisterMeshHiderTemplates()
		{
			TemplateData val = default(TemplateData);
			if (!TemplateRegistry.TryGetTemplate(((HandlerReferencer)this).Handler.Instance.TemplateUID, ref val))
			{
				return;
			}
			foreach (CustomActionsTemplate customActionsTemplate in val.CustomActionsTemplates)
			{
				if (customActionsTemplate is MeshHider_Template template)
				{
					RegisterRenderers(template);
				}
			}
		}

		public void RegisterRenderers(MeshHider_Template template)
		{
			//IL_0288: 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)
			//IL_00fe: 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_0229: Unknown result type (might be due to invalid IL or missing references)
			MeshHider_Template.HiderMethod parsedHiderMethod = template.ParsedHiderMethod;
			List<string> meshesHidden = template.MeshesHidden;
			switch (parsedHiderMethod)
			{
			case MeshHider_Template.HiderMethod.Directory:
			{
				foreach (string item in meshesHidden)
				{
					Transform val2 = ((Component)((HandlerReferencer)this).Handler).transform.Find(item);
					if (Object.op_Implicit((Object)(object)val2))
					{
						Renderer component = ((Component)val2).GetComponent<Renderer>();
						if (Object.op_Implicit((Object)(object)component))
						{
							_renderers[component] = RenderingLayerMask.op_Implicit(component.renderingLayerMask);
						}
					}
				}
				break;
			}
			case MeshHider_Template.HiderMethod.Name:
			{
				Dictionary<string, Transform> dictionary2 = new Dictionary<string, Transform>();
				SearchUtils.IterativelyCollectChildNames(((Component)((HandlerReferencer)this).Handler).transform, ref dictionary2);
				{
					foreach (string item2 in meshesHidden)
					{
						if (dictionary2.TryGetValue(item2, out var value2))
						{
							Renderer component2 = ((Component)value2).GetComponent<Renderer>();
							if (Object.op_Implicit((Object)(object)component2))
							{
								_renderers[component2] = RenderingLayerMask.op_Implicit(component2.renderingLayerMask);
							}
						}
					}
					break;
				}
			}
			case MeshHider_Template.HiderMethod.ChildrenOfDirectory:
			{
				foreach (string item3 in meshesHidden)
				{
					Transform val4 = ((Component)((HandlerReferencer)this).Handler).transform.Find(item3);
					if (!Object.op_Implicit((Object)(object)val4))
					{
						continue;
					}
					Renderer[] componentsInChildren = ((Component)val4).GetComponentsInChildren<Renderer>(true);
					foreach (Renderer val5 in componentsInChildren)
					{
						if ((Object)(object)((Component)val5).transform != (Object)(object)val4)
						{
							_renderers[val5] = RenderingLayerMask.op_Implicit(val5.renderingLayerMask);
						}
					}
				}
				break;
			}
			case MeshHider_Template.HiderMethod.ChildrenOfName:
			{
				Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
				SearchUtils.IterativelyCollectChildNames(((Component)((HandlerReferencer)this).Handler).transform, ref dictionary);
				{
					foreach (string item4 in meshesHidden)
					{
						if (!dictionary.TryGetValue(item4, out var value))
						{
							continue;
						}
						Renderer[] componentsInChildren = ((Component)value).GetComponentsInChildren<Renderer>(true);
						foreach (Renderer val3 in componentsInChildren)
						{
							if ((Object)(object)((Component)val3).transform != (Object)(object)value)
							{
								_renderers[val3] = RenderingLayerMask.op_Implicit(val3.renderingLayerMask);
							}
						}
					}
					break;
				}
			}
			case MeshHider_Template.HiderMethod.Everything:
			{
				Renderer[] componentsInChildren = ((Component)((Component)((HandlerReferencer)this).Handler).transform).GetComponentsInChildren<Renderer>(true);
				foreach (Renderer val in componentsInChildren)
				{
					_renderers[val] = RenderingLayerMask.op_Implicit(val.renderingLayerMask);
				}
				break;
			}
			case MeshHider_Template.HiderMethod.SearchUtilTokens:
				Debug.LogWarning((object)"SearchUtilTokens Still TODO, This will be Ignored.");
				break;
			default:
				Debug.LogWarning((object)"Unknown HiderMethod...");
				break;
			}
		}

		public void DoPostValidation()
		{
			PurgeInvalidRenderers();
		}

		public void PurgeInvalidRenderers()
		{
			while (_InvalidKeys.Count > 0)
			{
				_renderers.Remove(_InvalidKeys.Pop());
			}
		}

		public bool ValidateRenderer(Renderer renderer)
		{
			if ((Object)(object)renderer != (Object)null && Object.op_Implicit((Object)(object)renderer))
			{
				return true;
			}
			_InvalidKeys.Push(renderer);
			return false;
		}

		public void HideRenderers()
		{
			foreach (KeyValuePair<Renderer, RenderingLayerMask> renderer in _renderers)
			{
				if (ValidateRenderer(renderer.Key))
				{
					renderer.Key.forceRenderingOff = true;
				}
			}
			DoPostValidation();
		}

		public void ResetRenderers()
		{
			foreach (KeyValuePair<Renderer, RenderingLayerMask> renderer in _renderers)
			{
				if (ValidateRenderer(renderer.Key))
				{
					renderer.Key.forceRenderingOff = false;
				}
			}
			DoPostValidation();
			_renderers.Clear();
		}

		public void Update()
		{
		}
	}
	public class RigHelper : CustomActionsBase
	{
		private RigHelper_Template.TargetMethod targetMethod = RigHelper_Template.TargetMethod.Name;

		private string RigRootPath = "Hip";

		private Transform Root;

		private Dictionary<RigBuilder, BoneRigTracker> Rig_Targets = new Dictionary<RigBuilder, BoneRigTracker>();

		private Stack<RigBuilder> BrokenRigs = new Stack<RigBuilder>();

		public override void RegisterActions()
		{
			((CustomActionsBase)this).AddOnStateChanged((Action<string, string>)BuildRigs);
			((CustomActionsBase)this).AddOnUpdate((Action)Update);
			((CustomActionsBase)this).AddOnDestroy((Action)CleanUp);
		}

		public override void HandleTemplateData(object[] data)
		{
			targetMethod = (RigHelper_Template.TargetMethod)data[0];
			RigRootPath = (string)data[1];
		}

		public void CleanUp()
		{
			Root = null;
			foreach (RigBuilder key in Rig_Targets.Keys)
			{
				if (Object.op_Implicit((Object)(object)key))
				{
					Object.DestroyImmediate((Object)(object)key);
				}
			}
			Rig_Targets.Clear();
		}

		public void BuildRigs(string last, string state)
		{
			CleanUp();
			switch (targetMethod)
			{
			case RigHelper_Template.TargetMethod.Directory:
				Root = ((Component)((HandlerReferencer)this).Handler).transform.Find(RigRootPath);
				break;
			case RigHelper_Template.TargetMethod.Name:
				Root = SearchUtils.IterativelyFindChild(((Component)((HandlerReferencer)this).Handler).transform, RigRootPath);
				break;
			default:
				Debug.LogWarning((object)"Unknown TargetMethod");
				return;
			}
			if (!Object.op_Implicit((Object)(object)Root))
			{
				return;
			}
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in ((HandlerReferencer)this).Handler.LoadedTemplates)
			{
				RigBuilder[] componentsInChildren = ((Component)loadedTemplate.Value).GetComponentsInChildren<RigBuilder>(true);
				foreach (RigBuilder rig in componentsInChildren)
				{
					SetUpRig(rig, Root.parent);
				}
			}
			Update();
		}

		public void SetUpRig(RigBuilder rig, Transform hips)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			if (Object.op_Implicit((Object)(object)Root) && !Rig_Targets.TryGetValue(rig, out var value))
			{
				value = new BoneRigTracker(((Component)rig).transform, hips);
				value.SetUpRig(rig.Rig, (Transform)null);
				Rig_Targets.Add(rig, value);
			}
		}

		public void Update()
		{
			if (!Object.op_Implicit((Object)(object)Root) || !((Component)Root).gameObject.activeInHierarchy)
			{
				return;
			}
			foreach (KeyValuePair<RigBuilder, BoneRigTracker> rig_Target in Rig_Targets)
			{
				if (!Object.op_Implicit((Object)(object)rig_Target.Key))
				{
					BrokenRigs.Push(rig_Target.Key);
				}
				else
				{
					rig_Target.Value.Update();
				}
			}
			ValidateRigs();
		}

		public void ValidateRigs()
		{
			if (BrokenRigs.Count != 0)
			{
				Debug.LogWarning((object)"Removing Broken Rigs.");
			}
			while (BrokenRigs.Count > 0)
			{
				Rig_Targets.Remove(BrokenRigs.Pop());
			}
		}
	}
	public class ShaderFix : CustomActionsBase
	{
		public override void RegisterActions()
		{
			((CustomActionsBase)this).AddOnStateChanged((Action<string, string>)DoInit);
		}

		public void DoInit(string last, string state)
		{
			foreach (KeyValuePair<string, PrefabTemplate> loadedTemplate in ((HandlerReferencer)this).Handler.LoadedTemplates)
			{
				FixShaders(((Component)loadedTemplate.Value).transform);
			}
		}

		public void FixShaders(Transform target)
		{
			Renderer[] componentsInChildren = ((Component)target).GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val in componentsInChildren)
			{
				Material[] sharedMaterials = val.sharedMaterials;
				for (int j = 0; j < sharedMaterials.Length; j++)
				{
					Shader val2 = Shader.Find(((Object)sharedMaterials[j].shader).name);
					if ((Object)(object)val2 != (Object)null)
					{
						sharedMaterials[j].shader = val2;
					}
				}
				val.sharedMaterials = sharedMaterials;
			}
		}
	}
	public class MeshHider_Template : CustomActionsTemplate
	{
		[Serializable]
		public enum HiderMethod
		{
			Directory,
			Name,
			ChildrenOfDirectory,
			ChildrenOfName,
			Everything,
			SearchUtilTokens
		}

		[SerializeField]
		[HideInInspector]
		public string HiderMethod_data;

		[SerializeField]
		public List<string> MeshesHidden = new List<string>();

		[SerializeField]
		public bool AlwaysCheck;

		public HiderMethod ParsedHiderMethod
		{
			get
			{
				if (!Enum.TryParse<HiderMethod>(HiderMethod_data, out var result))
				{
					return HiderMethod.Directory;
				}
				return result;
			}
		}

		public override Type RegisterCustomActionsBaseType()
		{
			return typeof(MeshHider);
		}
	}
	public class RigHelper_Template : CustomActionsTemplate
	{
		[Serializable]
		public enum TargetMethod
		{
			Directory,
			Name
		}

		[SerializeField]
		[HideInInspector]
		public string TargetMethod_data;

		[SerializeField]
		public string RigRootPath = "Hip";

		public override object[] PrepareTemplateData()
		{
			Enum.TryParse<TargetMethod>(TargetMethod_data, out var result);
			return new object[2] { result, RigRootPath };
		}

		public override Type RegisterCustomActionsBaseType()
		{
			return typeof(RigHelper);
		}
	}
	public class ShaderFix_Template : CustomActionsTemplate
	{
		public override Type RegisterCustomActionsBaseType()
		{
			return typeof(ShaderFix);
		}
	}
	public enum ConstraintTemplatePathingType
	{
		ContainerChildren,
		AllChildren,
		LastChildren,
		FirstChildren,
		Manual
	}
	[Serializable]
	public enum TargetMethod
	{
		Directory,
		Name
	}
	[Serializable]
	public class ConstraintTemplate : MonoBehaviour
	{
		public struct BakedConstraintTemplate
		{
			public ConstraintTemplate template;

			public Transform[] followers;

			public Transform origin;

			public Transform target;

			public Vector3[] pos;

			public Quaternion[] rot;

			public Vector3[] scl;

			public BakedConstraintTemplate(ConstraintTemplate template, Transform origin, Transform target)
			{
				this.template = template;
				followers = null;
				this.origin = origin;
				this.target = target;
				pos = null;
				rot = null;
				scl = null;
				ReAttach(origin, target);
			}

			public void ReAttach(Transform origin, Transform target)
			{
				this.origin = origin;
				this.target = target;
				FindFollowers();
			}

			private void FindFollowers()
			{
				//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: 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)
				followers = (Transform[])(object)new Transform[template.Paths.Count];
				pos = (Vector3[])(object)new Vector3[template.Paths.Count];
				rot = (Quaternion[])(object)new Quaternion[template.Paths.Count];
				scl = (Vector3[])(object)new Vector3[template.Paths.Count];
				for (int i = 0; i < followers.Length; i++)
				{
					Transform val = origin.Find(template.Paths[i]);
					followers[i] = val;
					if (Object.op_Implicit((Object)(object)val))
					{
						pos[i] = val.localPosition;
						rot[i] = val.localRotation;
						scl[i] = val.localScale;
					}
				}
			}

			public void UpdateFollowers()
			{
				//IL_0028: 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_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: Unknown result type (might be due to invalid IL or missing references)
				//IL_0050: 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)
				for (int i = 0; i < followers.Length; i++)
				{
					Transform val = followers[i];
					if (Object.op_Implicit((Object)(object)val))
					{
						Transform obj = target;
						Vector3 val2 = template.Positions[i];
						Quaternion val3 = template.Rotations[i];
						Vector3 scale = template.Scales[i];
						ApplyOffsets(val, obj, in val2, in val3, in scale);
					}
				}
			}

			public void RestoreFollowers()
			{
				//IL_001d: 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_0041: Unknown result type (might be due to invalid IL or missing references)
				for (int i = 0; i < followers.Length; i++)
				{
					Transform val = followers[i];
					if (Object.op_Implicit((Object)(object)val))
					{
						val.localPosition = pos[i];
						val.localRotation = rot[i];
						val.localScale = scl[i];
					}
				}
			}
		}

		public Transform TargetObject;

		public string TargetPath = string.Empty;

		public string TargetMethod_data;

		public List<string> Paths = new List<string>();

		public List<Vector3> Positions = new List<Vector3>();

		public List<Vector3> Scales = new List<Vector3>();

		public List<Quaternion> Rotations = new List<Quaternion>();

		public static void ApplyOffsets(Transform origin, Transform target, in Vector3 pos, in Quaternion rot, in Vector3 scale)
		{
			//IL_0002: 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_000e: 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_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_003a: 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_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_0077: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_009e: 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)
			origin.position = target.position + target.rotation * pos;
			origin.rotation = target.rotation * rot;
			Vector3 lossyScale = target.lossyScale;
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(lossyScale.x * scale.x, lossyScale.y * scale.y, lossyScale.z * scale.z);
			Vector3 lossyScale2 = origin.parent.lossyScale;
			origin.localScale = new Vector3(val.x / lossyScale2.x, val.y / lossyScale2.y, val.z / lossyScale2.z);
		}
	}
	[Serializable]
	public class PeakAccessoryTextureHelper : TaggedBehaviour
	{
		public string TargetTexture = "_MainTex";

		public List<int> TargetMaterials = new List<int>();

		public List<Texture> DefaultTextures;

		public void Reset()
		{
			DefaultTextures = null;
		}

		public void Register_Default_Textures()
		{
			if (DefaultTextures != null)
			{
				return;
			}
			DefaultTextures = new List<Texture>();
			Material[] sharedMaterials = ((Component)this).GetComponent<Renderer>().sharedMaterials;
			foreach (int targetMaterial in TargetMaterials)
			{
				DefaultTextures.Add(sharedMaterials[targetMaterial].GetTexture(TargetTexture));
			}
		}

		public void Set_Texture(Texture texture)
		{
			Register_Default_Textures();
			Renderer component = ((Component)this).GetComponent<Renderer>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			Material[] materials = component.materials;
			if ((Object)(object)texture == (Object)null)
			{
				for (int i = 0; i < DefaultTextures.Count; i++)
				{
					materials[TargetMaterials[i]].SetTexture(TargetTexture, DefaultTextures[i]);
				}
				return;
			}
			foreach (int targetMaterial in TargetMaterials)
			{
				materials[targetMaterial].SetTexture(TargetTexture, texture);
			}
		}
	}
	public class SteamAvatarHelper : TaggedBehaviour
	{
		public string TargetTexture = "_MainTex";

		[SerializeField]
		[HideInInspector]
		public List<int> TargetMaterials = new List<int>();

		private CSteamID ourSteamID;

		public void Load_Player_Avatar(PhotonView view)
		{
			//IL_0001: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			if (ourSteamID != default(CSteamID))
			{
				Peak_SteamUtils.Fetch_SteamID_Avatar(ourSteamID, SteamAvatarLoaded);
			}
			else
			{
				Peak_SteamUtils.Fetch_SteamID(view, SteamID_Loaded);
			}
		}

		private void SteamID_Loaded(CSteamID steamID)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: 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)
			ourSteamID = steamID;
			Peak_SteamUtils.Fetch_SteamID_Avatar(ourSteamID, SteamAvatarLoaded);
		}

		private void SteamAvatarLoaded(Texture2D avatar)
		{
			Renderer component = ((Component)this).GetComponent<Renderer>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			Material[] materials = component.materials;
			foreach (int targetMaterial in TargetMaterials)
			{
				materials[targetMaterial].SetTexture(TargetTexture, (Texture)(object)avatar);
			}
		}
	}
	public class Peak_SteamUtils
	{
		public static Dictionary<CSteamID, Texture2D> LoadedAvatars = new Dictionary<CSteamID, Texture2D>();

		private const int RequestUserInfo_Interval = 500;

		public static void Fetch_SteamID(PhotonView view, Action<CSteamID> callback)
		{
			if ((Object)(object)view == (Object)null)
			{
				return;
			}
			TaskAwaiter<CSteamID> awaiter = Fetch_Photonview_SteamID(view).GetAwaiter();
			awaiter.OnCompleted(delegate
			{
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				object? obj = callback?.Target;
				Object val = (Object)((obj is Object) ? obj : null);
				if (val == null || Object.op_Implicit(val))
				{
					callback?.Invoke(awaiter.GetResult());
				}
			});
		}

		public static void Fetch_SteamID_Avatar(CSteamID steamID, Action<Texture2D> callback)
		{
			//IL_000d: 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_0016: 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)
			if (steamID == default(CSteamID))
			{
				return;
			}
			TaskAwaiter<Texture2D> awaiter = Fetch_SteamAvatar(steamID).GetAwaiter();
			awaiter.OnCompleted(delegate
			{
				object? obj = callback?.Target;
				Object val = (Object)((obj is Object) ? obj : null);
				if (val == null || Object.op_Implicit(val))
				{
					callback?.Invoke(awaiter.GetResult());
				}
			});
		}

		public static void Clear_Loaded_Avatars()
		{
			LoadedAvatars.Clear();
		}

		private static async Task<CSteamID> Fetch_Photonview_SteamID(PhotonView view)
		{
			if (view.IsMine)
			{
				return SteamUser.GetSteamID();
			}
			if (Object.op_Implicit((Object)(object)view))
			{
				return await Find_Nickname_SteamID(view.Owner.NickName);
			}
			return default(CSteamID);
		}

		private static async Task<CSteamID> Find_Nickname_SteamID(string nickname)
		{
			CSteamID lobbyID = default(CSteamID);
			if (!GameHandler.GetService<SteamLobbyHandler>().InSteamLobby(ref lobbyID))
			{
				return default(CSteamID);
			}
			int numMembers = SteamMatchmaking.GetNumLobbyMembers(lobbyID);
			new Dictionary<string, CSteamID>();
			for (int i = 0; i < numMembers; i++)
			{
				CSteamID memberID = SteamMatchmaking.GetLobbyMemberByIndex(lobbyID, i);
				await RequestUserInfo(memberID, NameOnly: true);
				if (SteamFriends.GetFriendPersonaName(memberID) == nickname)
				{
					return memberID;
				}
			}
			Debug.LogWarning((object)("Unable to find nickname in steam lobby : " + nickname));
			return default(CSteamID);
		}

		private static async Task<Texture2D> Fetch_SteamAvatar(CSteamID steamID)
		{
			//IL_000e: 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 (LoadedAvatars.TryGetValue(steamID, out var value))
			{
				return value;
			}
			await RequestUserInfo(steamID);
			int largeFriendAvatar = SteamFriends.GetLargeFriendAvatar(steamID);
			if (largeFriendAvatar == -1)
			{
				Debug.LogWarning((object)$"Failed to GetLargeFriendAvatar {steamID}");
				return null;
			}
			uint num = default(uint);
			uint num2 = default(uint);
			if (!SteamUtils.GetImageSize(largeFriendAvatar, ref num, ref num2) || num == 0 || num2 == 0)
			{
				Debug.LogWarning((object)$"Failed to GetImageSize {steamID}");
				return null;
			}
			byte[] image = new byte[4 * num * num2];
			if (!SteamUtils.GetImageRGBA(largeFriendAvatar, image, image.Length))
			{
				Debug.LogWarning((object)$"Failed to GetImageRGBA {steamID}");
				return null;
			}
			FlipImageHorizontally(ref image, num, num2);
			value = new Texture2D((int)num, (int)num2, (TextureFormat)4, false);
			value.LoadRawTextureData(image);
			value.Apply();
			LoadedAvatars.Add(steamID, value);
			return value;
		}

		private static void FlipImageHorizontally(ref byte[] image, uint width, uint height)
		{
			int num = (int)(width * 4);
			int num2 = (int)height / 2;
			for (int i = 0; i < num2; i++)
			{
				int num3 = i * num;
				int num4 = ((int)(height - 1) - i) * num;
				for (int j = 0; j < num; j += 4)
				{
					int num5 = num3 + j;
					int num6 = num4 + j;
					byte b = image[num5];
					byte b2 = image[num5 + 1];
					byte b3 = image[num5 + 2];
					byte b4 = image[num5 + 3];
					image[num5] = image[num6];
					image[num5 + 1] = image[num6 + 1];
					image[num5 + 2] = image[num6 + 2];
					image[num5 + 3] = image[num6 + 3];
					image[num6] = b;
					image[num6 + 1] = b2;
					image[num6 + 2] = b3;
					image[num6 + 3] = b4;
				}
			}
		}

		private static async Task RequestUserInfo(CSteamID steamID, bool NameOnly = false)
		{
			//IL_000e: 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)
			while (SteamFriends.RequestUserInformation(steamID, NameOnly))
			{
				await Task.Delay(500);
			}
		}
	}
}
namespace UCustomPrefabsAPI.Peak
{
	public class Peak_Chicken : Peak_Module
	{
		private List<Tweener> _activeTweens = new List<Tweener>();

		private Dictionary<Renderer, List<float>> OpacityLibrary = new Dictionary<Renderer, List<float>>();

		public override void Init()
		{
			ToggleChickenInit();
			CharacterCustomization_Listeners.BecomeChicken_Postfix.Listen(instance.Character, BecomeChicken);
			CharacterCustomization_Listeners.BecomeHuman_Postfix.Listen(instance.Character, BecomeHuman);
		}

		public override void Reset()
		{
			OpacityLibrary = new Dictionary<Renderer, List<float>>();
			KillTweeners();
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.BecomeChicken_Postfix.Un_Listen(instance.Character, BecomeChicken);
			CharacterCustomization_Listeners.BecomeHuman_Postfix.Un_Listen(instance.Character, BecomeHuman);
		}

		public bool TryFindMeshHider(out MeshHider hider)
		{
			return ((HandlerReferencer)instance).Handler.TryGetCustomActions<MeshHider>(ref hider);
		}

		public void ToggleChickenInit()
		{
			if (instance.CharacterCustomization.isCannibalizable)
			{
				SetOpacity(instance.IsChickenTemplate ? 1 : 0);
			}
			else
			{
				SetOpacity((!instance.IsChickenTemplate) ? 1 : 0);
			}
		}

		private void BecomeChicken(CharacterCustomization customization)
		{
			DoFadeAnimation(customization, instance.IsChickenTemplate ? 1 : 0);
		}

		private void BecomeHuman(CharacterCustomization customization)
		{
			DoFadeAnimation(customization, (!instance.IsChickenTemplate) ? 1 : 0);
		}

		private List<float> GetOpacityLibrary(Renderer renderer)
		{
			if (OpacityLibrary.TryGetValue(renderer, out var value))
			{
				return value;
			}
			value = new List<float>();
			OpacityLibrary[renderer] = value;
			Material[] materials = renderer.materials;
			for (int i = 0; i < materials.Length; i++)
			{
				if (materials[i].HasFloat(CharacterCustomization.Opacity))
				{
					value.Add(materials[i].GetFloat(CharacterCustomization.Opacity));
				}
				else
				{
					value.Add(1f);
				}
			}
			return value;
		}

		private void DoFadeAnimation(CharacterCustomization customization, float opacity)
		{
			KillTweeners();
			foreach (Renderer template_Renderer in instance.Template_Renderers)
			{
				Material[] materials = template_Renderer.materials;
				List<float> opacityLibrary = GetOpacityLibrary(template_Renderer);
				for (int i = 0; i < materials.Length; i++)
				{
					if (materials[i].HasFloat(CharacterCustomization.Opacity))
					{
						AddTweener((Tweener)(object)ShortcutExtensions.DOFloat(materials[i], opacityLibrary[i] * opacity, CharacterCustomization.Opacity, 1f));
					}
				}
			}
		}

		private void SetOpacity(float opacity)
		{
			KillTweeners();
			foreach (Renderer template_Renderer in instance.Template_Renderers)
			{
				Material[] materials = template_Renderer.materials;
				List<float> opacityLibrary = GetOpacityLibrary(template_Renderer);
				for (int i = 0; i < materials.Length; i++)
				{
					if (materials[i].HasFloat(CharacterCustomization.Opacity))
					{
						materials[i].SetFloat(CharacterCustomization.Opacity, opacityLibrary[i] * opacity);
					}
				}
			}
		}

		private void AddTweener(Tweener tweener)
		{
			_activeTweens.Add(tweener);
		}

		private void KillTweeners()
		{
			foreach (Tweener activeTween in _activeTweens)
			{
				if (activeTween != null)
				{
					TweenExtensions.Kill((Tween)(object)activeTween, false);
				}
			}
			_activeTweens.Clear();
		}
	}
	public class Peak_Constraints : Peak_Module
	{
		private List<ConstraintTemplate.BakedConstraintTemplate> BakedConstraints = new List<ConstraintTemplate.BakedConstraintTemplate>();

		public bool ConstraintsAreActive = true;

		public override void Init()
		{
			RebuildConstraints();
			CharacterCustomization_Listeners.BecomeChicken_Prefix.Listen(instance.Character, BecomeChicken);
			CharacterCustomization_Listeners.BecomeHuman_Prefix.Listen(instance.Character, BecomeHuman);
		}

		public override void Update()
		{
			UpdateConstraints();
		}

		public override void Reset()
		{
			Reset_Constraints();
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.BecomeChicken_Prefix.Un_Listen(instance.Character, BecomeChicken);
			CharacterCustomization_Listeners.BecomeHuman_Prefix.Un_Listen(instance.Character, BecomeHuman);
		}

		public void RebuildConstraints()
		{
			string templateUID = ((HandlerReferencer)instance).Handler.Instance.TemplateUID;
			TemplateData val = default(TemplateData);
			if (TemplateRegistry.TryGetTemplate(templateUID, ref val))
			{
				Debug.Log((object)(templateUID ?? ""));
				ConstraintTemplate[] componentsInChildren = val.Container.GetComponentsInChildren<ConstraintTemplate>(true);
				foreach (ConstraintTemplate constraintTemplate in componentsInChildren)
				{
					foreach (PrefabTemplate value in ((HandlerReferencer)instance).Handler.LoadedTemplates.Values)
					{
						RegisterConstraints(((Component)value).transform, val.Container.transform, constraintTemplate);
					}
				}
			}
			if (instance.CharacterCustomization.isCannibalizable)
			{
				Toggle_Constraints(instance.IsChickenTemplate);
			}
			else
			{
				Toggle_Constraints(!instance.IsChickenTemplate);
			}
			UpdateConstraints();
		}

		public void Toggle_Constraints(bool isActive = true)
		{
			ConstraintsAreActive = isActive;
			if (!isActive && BakedConstraints.Count != 0)
			{
				for (int num = BakedConstraints.Count - 1; num >= 0; num--)
				{
					BakedConstraints[num].RestoreFollowers();
				}
			}
		}

		public void Reset_Constraints()
		{
			if (BakedConstraints.Count != 0)
			{
				for (int num = BakedConstraints.Count - 1; num >= 0; num--)
				{
					BakedConstraints[num].RestoreFollowers();
				}
			}
			BakedConstraints.Clear();
		}

		public void RegisterConstraints(Transform loadedTemplate, Transform refTemplate, ConstraintTemplate constraintTemplate)
		{
			Transform origin = null;
			switch ((TargetMethod)Enum.Parse(typeof(TargetMethod), constraintTemplate.TargetMethod_data))
			{
			case TargetMethod.Directory:
				origin = ((Component)((HandlerReferencer)instance).Handler).transform.Find(constraintTemplate.TargetPath);
				break;
			case TargetMethod.Name:
				origin = SearchUtils.IterativelyFindChild(((Component)((HandlerReferencer)instance).Handler).transform, constraintTemplate.TargetPath);
				break;
			}
			if (!Object.op_Implicit((Object)(object)refTemplate) || !Object.op_Implicit((Object)(object)constraintTemplate?.TargetObject))
			{
				Debug.LogWarning((object)"Invalid Template Reference, Unable to build constraints.");
				return;
			}
			string text = SearchUtils.FindPath(refTemplate, constraintTemplate.TargetObject);
			text = text.Substring(text.IndexOf('/') + 1);
			Transform val = loadedTemplate.Find(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				Debug.LogWarning((object)"Invalid Template Root, Unable to build constraints.");
				Debug.LogWarning((object)text);
			}
			else
			{
				ConstraintTemplate.BakedConstraintTemplate item = new ConstraintTemplate.BakedConstraintTemplate(constraintTemplate, origin, val);
				BakedConstraints.Add(item);
			}
		}

		public void UpdateConstraints()
		{
			if (!ConstraintsAreActive)
			{
				return;
			}
			foreach (ConstraintTemplate.BakedConstraintTemplate bakedConstraint in BakedConstraints)
			{
				bakedConstraint.UpdateFollowers();
			}
		}

		private void BecomeChicken(CharacterCustomization customization)
		{
			Toggle_Constraints(instance.IsChickenTemplate);
		}

		private void BecomeHuman(CharacterCustomization customization)
		{
			Toggle_Constraints(!instance.IsChickenTemplate);
		}
	}
	public class Peak_HideTheBody : Peak_Module
	{
		public bool IsVertexGhostShowing => instance.Character?.refs.hideTheBody.isShowing ?? false;

		public override void Init()
		{
			Update_Renderers_VertexGhost();
			HideTheBody_Listeners.Toggle_Postfix.Listen(instance.Character, Toggle);
		}

		public override void Destroy()
		{
			HideTheBody_Listeners.Toggle_Postfix.Un_Listen(instance.Character, Toggle);
		}

		public void Toggle(HideTheBody hideTheBody)
		{
			Update_Renderers_VertexGhost();
		}

		public void Update_Renderers_VertexGhost()
		{
			foreach (Renderer template_Renderer in instance.Template_Renderers)
			{
				Material[] materials = template_Renderer.materials;
				for (int i = 0; i < materials.Length; i++)
				{
					materials[i].SetFloat(CharacterCustomization.VertexGhost, (float)((!IsVertexGhostShowing) ? 1 : 0));
				}
			}
		}
	}
	public class Peak_LayerFix : Peak_Module
	{
		public override void Init()
		{
			Do_Layer_Fix();
			Hide_Shadows();
		}

		public void Do_Layer_Fix()
		{
			foreach (PrefabTemplate template in instance.Templates)
			{
				GameObjectExtensions.SetLayerRecursivly(((Component)template).gameObject, LayerMask.NameToLayer("Character"));
			}
		}

		public void Hide_Shadows()
		{
			foreach (PrefabTemplate template in instance.Templates)
			{
				Renderer[] componentsInChildren = ((Component)template).GetComponentsInChildren<Renderer>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].shadowCastingMode = (ShadowCastingMode)0;
				}
			}
		}
	}
	public class Peak_ObjectToggler : Peak_Module
	{
		private List<PeakAccessoryObjectToggler> togglers = new List<PeakAccessoryObjectToggler>();

		public override void Init()
		{
			RegisterObjectTogglers();
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Listen(instance.Character, UpdateObjectTogglers);
		}

		public override void Reset()
		{
			instance.Reset_Customization_Renderers();
			togglers.Clear();
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Un_Listen(instance.Character, UpdateObjectTogglers);
		}

		public void RegisterObjectTogglers()
		{
			togglers = new List<PeakAccessoryObjectToggler>();
			foreach (TaggedBehaviour tagsInTemplate in ((HandlerReferencer)instance).Handler.GetTagsInTemplates(new string[1] { "PeakAccessoryObjectToggler" }))
			{
				if (tagsInTemplate is PeakAccessoryObjectToggler peakAccessoryObjectToggler)
				{
					peakAccessoryObjectToggler.Rebuild();
					togglers.Add(peakAccessoryObjectToggler);
				}
			}
			UpdateObjectTogglers();
		}

		public void UpdateObjectTogglers(CharacterCustomization _ = null)
		{
			HashSet<PeakAccessoryType> hashSet = new HashSet<PeakAccessoryType>();
			foreach (PeakAccessoryObjectToggler toggler in togglers)
			{
				((Component)toggler).gameObject.SetActive(toggler.HideOnTarget);
				foreach (PeakAccessoryTarget toggleTargetType in toggler.ToggleTargetTypes)
				{
					if (instance.Is_PeakAccessoryTarget_Active(toggleTargetType))
					{
						((Component)toggler).gameObject.SetActive(!toggler.HideOnTarget);
						if (toggler.HideTargetAccessory)
						{
							hashSet.Add(toggleTargetType.type);
						}
					}
				}
			}
			instance.Reset_Customization_Renderers();
			foreach (PeakAccessoryType item in hashSet)
			{
				instance.Toggle_PeakAccessoryType(item);
			}
		}
	}
	public class Peak_PulseStatus : Peak_Module
	{
		public override void Init()
		{
			CharacterCustomization_Listeners.PulseStatus_Postfix.Listen(instance.Character, DoPulseStatus);
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.PulseStatus_Postfix.Un_Listen(instance.Character, DoPulseStatus);
		}

		public void DoPulseStatus(Color color)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			foreach (Renderer template_Renderer in instance.Template_Renderers)
			{
				Material[] materials = template_Renderer.materials;
				for (int i = 0; i < materials.Length; i++)
				{
					if (materials[i].HasColor(CharacterCustomization.StatusColor))
					{
						materials[i].SetColor(CharacterCustomization.StatusColor, color);
					}
					if (materials[i].HasFloat(CharacterCustomization.StatusGlow))
					{
						materials[i].SetFloat(CharacterCustomization.StatusGlow, 1f);
						ShortcutExtensions.DOFloat(materials[i], 0f, CharacterCustomization.StatusGlow, 0.5f);
					}
				}
			}
		}
	}
	public class Peak_ScoutRank : Peak_Module
	{
		public override void Init()
		{
		}
	}
	public class Peak_SkinToneHelper : Peak_Module
	{
		public List<PeakSkinToneHelper> Registered_SkinToneHelpers = new List<PeakSkinToneHelper>();

		public override void Init()
		{
			RegisterSkinToneHelpers();
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Listen(instance.Character, UpdateSkinTone);
		}

		public override void Reset()
		{
			Registered_SkinToneHelpers.Clear();
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Un_Listen(instance.Character, UpdateSkinTone);
		}

		public void RegisterSkinToneHelpers()
		{
			foreach (TaggedBehaviour tagsInTemplate in ((HandlerReferencer)instance).Handler.GetTagsInTemplates(new string[1] { "SkinTone" }))
			{
				if (tagsInTemplate is PeakSkinToneHelper item)
				{
					Registered_SkinToneHelpers.Add(item);
				}
			}
			UpdateSkinTone(instance.CharacterCustomization);
		}

		public void UpdateSkinTone(CharacterCustomization customization)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Color color = ((Renderer)customization.refs.mainRenderer).material.GetColor(CharacterCustomization.SkinColor);
				foreach (PeakSkinToneHelper registered_SkinToneHelper in Registered_SkinToneHelpers)
				{
					registered_SkinToneHelper.Set_SkinTone(color);
				}
			}
			catch
			{
				Debug.LogError((object)"Couldn't Update SkinTone.");
			}
		}
	}
	public class Peak_Status : Peak_Module
	{
		public override void Init()
		{
		}
	}
	public class Peak_SteamAvatar : Peak_Module
	{
		public override void Init()
		{
			Update_SteamAvatarHelpers();
		}

		public void Update_SteamAvatarHelpers()
		{
			foreach (TaggedBehaviour tagsInTemplate in ((HandlerReferencer)instance).Handler.GetTagsInTemplates(new string[1] { "SteamAvatar" }))
			{
				if (tagsInTemplate is SteamAvatarHelper steamAvatarHelper)
				{
					steamAvatarHelper.Load_Player_Avatar(instance.PhotonView);
				}
			}
		}
	}
	public class Peak_TextureHelper : Peak_Module
	{
		private List<PeakAccessoryTextureHelper> textureHelpers = new List<PeakAccessoryTextureHelper>();

		public override void Init()
		{
			RegisterTextureHelpers();
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Listen(instance.Character, UpdateTextureHelpers);
		}

		public override void Reset()
		{
			textureHelpers.Clear();
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Un_Listen(instance.Character, UpdateTextureHelpers);
		}

		public void RegisterTextureHelpers()
		{
			foreach (TaggedBehaviour tagsInTemplate in ((HandlerReferencer)instance).Handler.GetTagsInTemplates(new string[1] { "PeakAccessoryTextureHelper" }))
			{
				if (tagsInTemplate is PeakAccessoryTextureHelper peakAccessoryTextureHelper)
				{
					peakAccessoryTextureHelper.Reset();
					textureHelpers.Add(peakAccessoryTextureHelper);
				}
			}
			UpdateTextureHelpers(instance.CharacterCustomization);
		}

		public void UpdateTextureHelpers(CharacterCustomization customization)
		{
			foreach (PeakAccessoryTextureHelper textureHelper in textureHelpers)
			{
				textureHelper.Set_Texture(instance.Fetch_PeakAccessoryType_Texture(PeakAccessoryType.Outfit));
			}
		}
	}
	public class Peak_TextureSwapper : Peak_Module
	{
		private List<PeakAccessoryTextureSwapper> textureSwappers = new List<PeakAccessoryTextureSwapper>();

		public override void Init()
		{
			RegisterTextureSwappers();
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Listen(instance.Character, UpdateTextureSwappers);
		}

		public override void Reset()
		{
			textureSwappers.Clear();
		}

		public override void Destroy()
		{
			CharacterCustomization_Listeners.OnPlayerDataChange_Postfix.Un_Listen(instance.Character, UpdateTextureSwappers);
		}

		public void RegisterTextureSwappers()
		{
			foreach (TaggedBehaviour tagsInTemplate in ((HandlerReferencer)instance).Handler.GetTagsInTemplates(new string[1] { "PeakAccessoryTextureSwapper" }))
			{
				if (tagsInTemplate is PeakAccessoryTextureSwapper peakAccessoryTextureSwapper)
				{
					peakAccessoryTextureSwapper.Reset();
					textureSwappers.Add(peakAccessoryTextureSwapper);
				}
			}
			UpdateTextureSwappers(instance.CharacterCustomization);
		}

		public void UpdateTextureSwappers(CharacterCustomization customization)
		{
			foreach (PeakAccessoryTextureSwapper textureSwapper in textureSwappers)
			{
				foreach (PeakAccessoryTarget toggleTargetType in textureSwapper.ToggleTargetTypes)
				{
					if (instance.Is_PeakAccessoryTarget_Active(toggleTargetType))
					{
						textureSwapper.Set_CurrentTarget(toggleTargetType);
						break;
					}
					textureSwapper.Set_Texture(null);
				}
			}
		}
	}
	public abstract class Peak_Module
	{
		public Peak_CustomHelper instance;

		public virtual void Init()
		{
		}

		public virtual void Update()
		{
		}

		public virtual void Reset()
		{
		}

		public virtual void Destroy()
		{
		}
	}
	public static class PluginInfo
	{
		public const string GUID = "UCustomPrefabsAPI.Peak";

		public const string NAME = "UCustomPrefabsAPI.Peak";

		public const string VERSION = "0.0.1";

		public const string WEBSITE = "https://github.com/ScottyFox/UCustomPrefabsAPI/tree/peak";
	}
	[BepInPlugin("UCustomPrefabsAPI.Peak", "UCustomPrefabsAPI.Peak", "0.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public static ConfigFile config;

		public static ConfigEntry<string> TemplatesFileFinderName;

		public static ConfigEntry<bool> EveryoneUsePreferredConfig;

		public static ConfigEntry<string> PreferredCharacterConfig;

		public static ConfigEntry<string> PreferredSkeletonConfig;

		public static ConfigEntry<string> PreferredChickenConfig;

		internal static Harmony instance = new Harmony("UCustomPrefabsAPI.Peak");

		private void Awake()
		{
			try
			{
				SetUpConfig();
				RegisterAssetBundles();
				RegisterCustomActions();
				RegisterCustomTemplates();
				instance.PatchAll(Assembly.GetExecutingAssembly());
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin UCustomPrefabsAPI.Peak is loaded!");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin UCustomPrefabsAPI.Peak failed to load...");
				((BaseUnityPlugin)this).Logger.LogError((object)ex);
			}
		}

		public void SetUpConfig()
		{
			config = ((BaseUnityPlugin)this).Config;
			TemplatesFileFinderName = config.Bind<string>("UCustomPrefabs Config", "Templates Folder Finder File", "ucustomprefabs.templates.txt", (ConfigDescription)null);
			EveryoneUsePreferredConfig = config.Bind<bool>("Player Config", "Everyone Uses Preferred Templates", false, (ConfigDescription)null);
			PreferredCharacterConfig = config.Bind<string>("Player Config", "Preferred Character Template", "", (ConfigDescription)null);
			PreferredSkeletonConfig = config.Bind<string>("Player Config", "Preferred Skeleton Template", "", (ConfigDescription)null);
			PreferredChickenConfig = config.Bind<string>("Player Config", "Preferred Chicken Template", "", (ConfigDescription)null);
		}

		public static void RegisterAssetBundles()
		{
			AssetBundleRegistry.RegisterEmbedded<Plugin>("custompassporticons", "CustomPassportIcons");
		}

		public static void RegisterCustomActions()
		{
			CustomActionsRegistry.Register<Peak_CustomHelper>("Peak_PlayerHelper");
			CustomActionsRegistry.Register<MeshHider>("MeshHider");
			CustomActionsRegistry.Register<RigHelper>("RigHelper");
			CustomActionsRegistry.Register<ShaderFix>("ShaderFix");
		}

		public static void RegisterCustomTemplates()
		{
		}

		public static void BulkLoadTemplates()
		{
			foreach (string item in UCustomPrefabFileHelper.FindDirectoriesWithFileName(Paths.PluginPath, TemplatesFileFinderName.Value))
			{
				UCustomPrefabFileHelper.TryToLoadTemplateAssetBundlesFromPath<Plugin>(item);
			}
			TemplateRegistry.CommitLateRegistry();
		}
	}
	[HarmonyPatch]
	internal static class CustomizationPatch
	{
		[HarmonyPatch(typeof(Customization), "GetList")]
		[HarmonyPrefix]
		private static bool GetList_Prefix_Patch(Type type, ref object[] __result)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			if (!PassportHelper.IsSpecialCustomization(type, out var templateType))
			{
				return true;
			}
			object[] array = PassportHelper.Construct_Customization_List(templateType);
			__result = array;
			return false;
		}

		public static CustomizationOption[] Test_list()
		{
			return Singleton<Customization>.Instance.GetList((Type)(-13377701));
		}
	}
	[HarmonyPatch]
	internal static class GameHandlerPatch
	{
		[HarmonyPatch(typeof(GameHandler), "Initialize")]
		[HarmonyPostfix]
		private static void Initialize_Postfix_Patch(ref GameHandler __instance)
		{
			Plugin.BulkLoadTemplates();
		}
	}
	[HarmonyPatch]
	internal static class MainMenuPatch
	{
		[HarmonyPatch(typeof(MainMenu), "Start")]
		[HarmonyPostfix]
		private static void Start_Postfix_Patch(ref MainMenu __instance)
		{
			InstanceManager.Verify();
			Peak_SteamUtils.Clear_Loaded_Avatars();
		}
	}
	[HarmonyPatch]
	internal static class PassportPatch
	{
		[HarmonyPatch(typeof(PassportManager), "SetOption")]
		[HarmonyPrefix]
		private static bool SetOption_Prefix_Patch(ref PassportManager __instance, CustomizationOption option)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			Debug.Log((object)"SetOption_Prefix_Patch");
			if (!PassportHelper.IsSpecialCustomization(option.type, out var _))
			{
				return true;
			}
			Debug.Log((object)"Is Custom Typed SetOption");
			if (!(option is PassportHelper.CustomizationOption_Custom customizationOption_Custom))
			{
				return true;
			}
			string templateID = customizationOption_Custom.TemplateID;
			Debug.Log((object)("ID Selected = " + templateID));
			switch (customizationOption_Custom.TemplateType)
			{
			case PeakTemplateType.Character:
				PlayerConfigHelper.SetCharacterTemplate(templateID);
				break;
			case PeakTemplateType.Skeleton:
				PlayerConfigHelper.SetSkeletonTemplate(templateID);
				break;
			case PeakTemplateType.Chicken:
				PlayerConfigHelper.SetChickenTemplate(templateID);
				break;
			}
			__instance.SetActiveButton();
			__instance.dummy.UpdateDummy();
			return false;
		}

		[HarmonyPatch(typeof(PassportManager), "SetActiveButton")]
		[HarmonyPrefix]
		private static bool SetActiveButton_Prefix_Patch(ref PassportManager __instance)
		{
			//IL_0002: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			if (!PassportHelper.IsSpecialCustomization(__instance.activeType, out var templateType))
			{
				return true;
			}
			if (!PlayerConfigHelper.TryGetConfigHandler(Character.localCharacter, out var config))
			{
				return true;
			}
			PassportHelper.Fetch_Template_List(templateType);
			string text = templateType switch
			{
				PeakTemplateType.Character => config.CurrentCharacterTemplate, 
				PeakTemplateType.Skeleton => config.CurrentSkeletonTemplate, 
				PeakTemplateType.Chicken => config.CurrentChickenTemplate, 
				_ => string.Empty, 
			};
			PassportHelper.CustomizationOption_Custom customizationOption_Custom = null;
			PassportButton[] buttons = __instance.buttons;
			foreach (PassportButton val in buttons)
			{
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.currentOption) && val.currentOption is PassportHelper.CustomizationOption_Custom customizationOption_Custom2)
				{
					if (text == customizationOption_Custom2.TemplateID)
					{
						customizationOption_Custom = customizationOption_Custom2;
						((Graphic)val.border).color = __instance.activeBorderColor;
					}
					else
					{
						((Graphic)val.border).color = __instance.inactiveBorderColor;
					}
				}
			}
			((TMP_Text)PassportHelper.Custom_Name_Display).text = customizationOption_Custom?.DisplayName;
			return false;
		}

		[HarmonyPatch(typeof(PassportManager), "OpenTab")]
		[HarmonyPrefix]
		private static bool OpenTab_Prefix_Patch(ref PassportManager __instance, Type type)
		{
			//IL_0000: 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_0009: 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)
			PassportHelper.SwitchToCustomTab(type);
			__instance.activeType = type;
			if (!PassportHelper.IsSpecialCustomization(__instance.activeType, out var _))
			{
				return true;
			}
			__instance.CameraOut();
			__instance.SetButtons();
			__instance.dummy.UpdateDummy();
			return false;
		}
	}
	[HarmonyPatch]
	internal static class PlayerPatch
	{
		[HarmonyPatch(typeof(Character), "Start")]
		[HarmonyPostfix]
		private static void Start_Postfix_Patch(ref Character __instance)
		{
			if (!__instance.isBot && Object.op_Implicit((Object)(object)((Component)__instance).transform.Find("Scout")) && !Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<PlayerConfigHelper>()))
			{
				((Component)__instance).gameObject.AddComponent<PlayerConfigHelper>();
			}
		}
	}
	[HarmonyPatch]
	internal static class SkeletonPatch
	{
		[HarmonyPatch(typeof(Skelleton), "SpawnSkelly")]
		[HarmonyPostfix]
		private static void SpawnSkelly_Postfix_Patch(ref Skelleton __instance, Character target)
		{
			if (PlayerConfigHelper.TryGetConfigHandler(target, out var config))
			{
				config.CreateSkeletonInstance(__instance);
			}
		}
	}
	[Serializable]
	public class PeakAccessoryObjectToggler : TaggedBehaviour
	{
		public bool HideOnTarget;

		public bool HideTargetAccessory = true;

		public List<string> Hints = new List<string>();

		public List<string> Types = new List<string>();

		public List<PeakAccessoryTarget> ToggleTargetTypes = new List<PeakAccessoryTarget>();

		public void Rebuild()
		{
			if (Hints.Count != Types.Count)
			{
				Debug.LogWarning((object)("Invalid Hint:Types Count, PeakAccessoryTargets in " + ((Object)((Component)this).gameObject).name + " : PeakAccessoryObjectToggler"));
				return;
			}
			for (int i = 0; i < Hints.Count; i++)
			{
				ToggleTargetTypes.Add(new PeakAccessoryTarget(Types[i], Hints[i]));
			}
		}
	}
	[Serializable]
	public struct PeakAccessoryTextureSwapperPair
	{
		public PeakAccessoryTarget TargetAccessory;

		public Texture2D Texture;
	}
	[Serializable]
	public class PeakAccessoryTextureSwapper : TaggedBehaviour
	{
		public string TargetTexture = "_MainTex";

		public List<string> Hints = new List<string>();

		public List<string> Types = new List<string>();

		public List<Texture2D> Textures = new List<Texture2D>();

		public List<int> TargetMaterials = new List<int>();

		public List<PeakAccessoryTarget> ToggleTargetTypes = new List<PeakAccessoryTarget>();

		public List<Texture> DefaultTextures;

		public void Reset()
		{
			if (Hints.Count != Types.Count)
			{
				Debug.LogWarning((object)("Invalid Hint:Types Count, PeakAccessoryTargets in " + ((Object)((Component)this).gameObject).name + " : PeakAccessoryTextureSwapper"));
				return;
			}
			DefaultTextures = null;
			for (int i = 0; i < Hints.Count; i++)
			{
				ToggleTargetTypes.Add(new PeakAccessoryTarget(Types[i], Hints[i]));
			}
		}

		public void Set_CurrentTarget(PeakAccessoryTarget target)
		{
			int index = ToggleTargetTypes.IndexOf(target);
			Set_Texture((Texture)(object)Textures[index]);
		}

		public void Register_Default_Textures()
		{
			if (DefaultTextures != null)
			{
				return;
			}
			DefaultTextures = new List<Texture>();
			Material[] sharedMaterials = ((Component)this).GetComponent<Renderer>().sharedMaterials;
			foreach (int targetMaterial in TargetMaterials)
			{
				try
				{
					DefaultTextures.Add(sharedMaterials[targetMaterial].GetTexture(TargetTexture));
				}
				catch
				{
				}
			}
		}

		public void Set_Texture(Texture texture)
		{
			Register_Default_Textures();
			Renderer component = ((Component)this).GetComponent<Renderer>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			Material[] materials = component.materials;
			if ((Object)(object)texture == (Object)null)
			{
				for (int i = 0; i < TargetMaterials.Count; i++)
				{
					try
					{
						materials[TargetMaterials[i]].SetTexture(TargetTexture, DefaultTextures[i]);
					}
					catch
					{
					}
				}
				return;
			}
			foreach (int targetMaterial in TargetMaterials)
			{
				try
				{
					materials[targetMaterial].SetTexture(TargetTexture, texture);
				}
				catch
				{
				}
			}
		}
	}
	public class PeakSkinToneHelper : TaggedBehaviour
	{
		[SerializeField]
		[HideInInspector]
		public List<int> TargetMaterials = new List<int>();

		public void Set_SkinTone(Color skinColor)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			Renderer component = ((Component)this).GetComponent<Renderer>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			Material[] materials = component.materials;
			foreach (int targetMaterial in TargetMaterials)
			{
				materials[targetMaterial].SetFloat("_UseSkinTone", 1f);
				materials[targetMaterial].SetColor(CharacterCustomization.SkinColor, skinColor);
			}
		}
	}
	public enum PeakAccessoryType
	{
		Accessory,
		Eyes,
		Outfit,
		Hat,
		Mouth,
		Shorts,
		Skirt,
		NoPants,
		ScoutRank
	}
	internal static class Peak_InfoStub
	{
		public static readonly string[] Default_Desc = new string[1] { "[?] Custom" };

		public static readonly string Default_ID = string.Empty;

		public static readonly Dictionary<PeakAccessoryType, string[]> Descriptions = new Dictionary<PeakAccessoryType, string[]>
		{
			[PeakAccessoryType.Accessory] = new string[21]
			{
				"[0] None", "[1] Charlie", "[2] Jagged Hair", "[3] Parted Hair", "[4] Microbangs", "[5] Raised Brow", "[6] Brows Dot", "[7] Brows Thick", "[8] Brows Angry", "[9] Glasses Round",
				"[10] Aviator", "[11] Cheekbones", "[12] Face Paint", "[13] Scar", "[14] Bow", "[15] Eyepatch", "[16] Glasses Broken", "[17] Groucho", "[18] Tiny Sunglasses", "[19] Scar 2",
				"[?] Custom"
			},
			[PeakAccessoryType.Eyes] = new string[19]
			{
				"[0] Basic", "[1] Lashes", "[2] Half", "[3] Shine", "[4] Squint", "[5] Angry", "[6] Eyeliner", "[7] Sad", "[8] Cry", "[9] Tired",
				"[10] Almond", "[11] Surprised", "[12] Small", "[13] Concern", "[14] Anime", "[15] Real", "[16] Aggro", "[17] Inverted", "[?] Custom"
			},
			[PeakAccessoryType.Outfit] = new string[19]
			{
				"[0] Seagull (Shorts)", "[1] Seagull (Skirt)", "[2] Turtle (Shorts)", "[3] Turtle (Skirt)", "[4] Sailor (Shorts)", "[5] Sailor (Skirt)", "[6] Castaway (Shorts)", "[7] Castaway (Skirt)", "[8] Tropical (Shorts)", "[9] Tropical (Skirt)",
				"[10] Cookie (Shorts)", "[11] Cookie (Skirt)", "[12] Balloon (Shorts)", "[13] Balloon (Skirt)", "[14] Scoutmaster (Shorts)", "[15] Scoutmaster (Skirt)", "[16] Cowboy", "[17] Astronaut", "[?] Custom"
			},
			[PeakAccessoryType.Hat] = new string[28]
			{
				"[0] Cap", "[1] Beret", "[2] Pith (Fedora)", "[3] Propeller", "[4] Straw", "[5] Aviator", "[6] Sailor", "[7] Medic", "[8] Midsummer", "[9] Mushroom",
				"[10] Crab", "[11] Courier", "[12] Scoutmaster", "[13] Bandana", "[14] Ninja Headband", "[15] Chef Hat", "[16] Wizard Hat", "[17] Wolf Ears", "[18] Crown", "[19] Goat",
				"[20] DesertHat", "[21] Visor", "[22] SunHat", "[23] Cowboy", "[24] BingBong", "[25] RacingHelmet", "[26] Astronaut", "[?] Custom"
			},
			[PeakAccessoryType.Mouth] = new string[20]
			{
				"[0] Smile", "[1] CalArts", "[2] Cat", "[3] Cheek", "[4] Drool", "[5] Sad", "[6] Frown", "[7] Kissy", "[8] Nonplussed", "[9] O",
				"[10] Squiggle", "[11] Triangle", "[12] Smirk", "[13] Cringe", "[14] Teeth", "[15] Vamp", "[16] Aggro", "[17] Wacky", "[18] Labu", "[?] Custom"
			},
			[PeakAccessoryType.ScoutRank] = new string[10] { "[0] Default", "[1] Ascent 1", "[2] Ascent 2", "[3] Ascent 3", "[4] Ascent 4", "[5] Ascent 5", "[6] Ascent 6", "[7] Ascent 7", "[8] Ascent 8", "[?] Custom" }
		};

		public static readonly Dictionary<PeakAccessoryType, string[]> IDs = new Dictionary<PeakAccessoryType, string[]>
		{
			[PeakAccessoryType.Accessory] = new string[21]
			{
				"Accessory_None", "Accessory_Charlie", "Accessory_JaggedHair", "Accessory_PartedHair", "Accessory_Microbangs", "Accessory_RaisedBrow", "Accessory_Brows_Dot", "Accessory_Brows_Thick", "Accessory_Brows_Angry", "Accessory_Glasses_Round",
				"Accessory_Aviator", "Accessory_Cheekbones", "Accessory_Face_Paint", "Accessory_Scar", "Accessory_Bow", "Accessory_Eyepatch", "Accessory_Glasses_Broken", "Accessory_Groucho", "Accessory_Tiny_Sunglasses", "Accessory_Scar2",
				"[?] Custom"
			},
			[PeakAccessoryType.Eyes] = new string[19]
			{
				"Eye_Basic", "Eye_Lashes", "Eye_Half", "Eye_Shine", "Eye_Squint", "Eye_Angry", "Eye_Eyeliner", "Eye_Sad", "Eye_Cry", "Eye_Tired",
				"Eye_Almond", "Eye_Surprised", "Eye_Small", "Eye_Concern", "Eye_Anime", "Eye_Real", "Eye_Aggro", "Eye_Inverted", "[?] Custom"
			},
			[PeakAccessoryType.Outfit] = new string[19]
			{
				"Fit_Seagull_Shorts", "Fit_Seagull_Skirt", "Fit_Turtle_Shorts", "Fit_Turtle_Skirt", "Fit_Sailor_Shorts", "Fit_Sailor_Skirt", "Fit_Castaway_Shorts", "Fit_Castaway_Skirt", "Fit_Tropical_Shorts", "Fit_Tropical_Skirt",
				"Fit_Cookie_Shorts", "Fit_Cookie_Skirt", "Fit_Balloon_Shorts", "Fit_Balloon_Skirt", "Fit_Scoutmaster_Shorts", "Fit_Scoutmaster_Skirt", "Fit_Cowboy", "Fit_Astronaut", "[?] Custom"
			},
			[PeakAccessoryType.Hat] = new string[28]
			{
				"Hat_Cap", "Hat_Beret", "Hat_Pith", "Hat_Propeller", "Hat_Straw", "Hat_Aviator", "Hat_Sailor", "Hat_Medic", "Hat_Midsummer", "Hat_Mushroom",
				"Hat_Crab", "Hat_Courier", "Hat_Scoutmaster", "Hat_Bandana", "Hat_NinjaHeadband", "Hat_ChefHat", "Hat_WizardHat", "Hat_WolfEars", "Hat_Crown", "Hat_Goat",
				"Hat_DesertHat", "Hat_Visor", "Hat_SunHat", "Hat_Cowboy", "Hat_BingBong", "Hat_RacingHelmet", "Hat_Astronaut", "[?] Custom"
			},
			[PeakAccessoryType.Mouth] = new string[20]
			{
				"Mouth_Smile", "Mouth_CalArts", "Mouth_Cat", "Mouth_Cheek", "Mouth_Drool", "Mouth_Sad", "Mouth_Frown", "Mouth_Kissy", "Mouth_Nonplussed", "Mouth_O",
				"Mouth_Squiggle", "Mouth_Triangle", "Mouth_Smirk", "Mouth_Cringe", "Mouth_Teeth", "Mouth_Vamp", "Mouth_Aggro", "Mouth_Wacky", "Mouth_Labu", "[?] Custom"
			},
			[PeakAccessoryType.ScoutRank] = new string[10] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "?" }
		};

		public static string[] Fetch_Desc(PeakAccessoryType type)
		{
			if (Descriptions.TryGetValue(type, out var value))
			{
				return value;
			}
			return Default_Desc;
		}

		public static string Fetch_ID(PeakAccessoryType type, int index)
		{
			if (!IDs.TryGetValue(type, out var value))
			{
				return Default_ID;
			}
			return value[Mathf.Clamp(index, 0, value.Length - 1)];
		}
	}
	[Serializable]
	public struct PeakAccessoryTarget
	{
		public PeakAccessoryType type;

		public string hint;

		public PeakAccessoryTarget(string type, string hint)
		{
			Enum.TryParse<PeakAccessoryType>(type.TrimStart(Array.Empty<char>()).TrimEnd(Array.Empty<char>()), ignoreCase: true, out this.type);
			this.hint = hint;
		}
	}
}
namespace UCustomPrefabsAPI.Peak.Scripts
{
	public static class LobbyAnalyzer
	{
		public static void Analyze()
		{
			//IL_000e: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			CSteamID val = default(CSteamID);
			if (GameHandler.GetService<SteamLobbyHandler>().InSteamLobby(ref val))
			{
				int numLobbyMembers = SteamMatchmaking.GetNumLobbyMembers(val);
				for (int i = 0; i < numLobbyMembers; i++)
				{
					SteamMatchmaking.GetLobbyMemberByIndex(val, i);
				}
			}
			foreach (Player allPlayer in PlayerHandler.GetAllPlayers())
			{
				_ = allPlayer;
			}
		}
	}
	public static class MaterialEvaluator
	{
		public struct MaterialInfoOutput
		{
			public Material materialRef;

			public Dictionary<string, float> float_dict;

			public Dictionary<string, Vector4> vector_dict;

			public Dictionary<string, Texture> texture_dict;

			public MaterialInfoOutput(Material material)
			{
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				materialRef = material;
				string[] propertyNames = material.GetPropertyNames((MaterialPropertyType)0);
				string[] propertyNames2 = material.GetPropertyNames((MaterialPropertyType)2);
				string[] propertyNames3 = material.GetPropertyNames((MaterialPropertyType)4);
				float_dict = new Dictionary<string, float>();
				vector_dict = new Dictionary<string, Vector4>();
				texture_dict = new Dictionary<string, Texture>();
				string[] array = propertyNames;
				foreach (string text in array)
				{
					float_dict[text] = material.GetFloat(text);
				}
				array = propertyNames2;
				foreach (string text2 in array)
				{
					vector_dict[text2] = material.GetVector(text2);
				}
				array = propertyNames3;
				foreach (string text3 in array)
				{
					texture_dict[text3] = material.GetTexture(text3);
				}
			}

			public void Retarget(Material material)
			{
				//IL_006b: Unknown result type (might be due to invalid IL or missing references)
				foreach (string key in float_dict.Keys)
				{
					material.SetFloat(key, float_dict[key]);
				}
				foreach (string key2 in vector_dict.Keys)
				{
					material.SetVector(key2, vector_dict[key2]);
				}
				foreach (string key3 in texture_dict.Keys)
				{
					material.SetTexture(key3, texture_dict[key3]);
				}
			}

			public void Reapply()
			{
				//IL_0075: Unknown result type (might be due to invalid IL or missing references)
				foreach (string key in float_dict.Keys)
				{
					materialRef.SetFloat(key, float_dict[key]);
				}
				foreach (string key2 in vector_dict.Keys)
				{
					materialRef.SetVector(key2, vector_dict[key2]);
				}
				foreach (string key3 in texture_dict.Keys)
				{
					materialRef.SetTexture(key3, texture_dict[key3]);
				}
			}
		}

		public static MaterialInfoOutput EvaluateMaterial(Material material)
		{
			return new MaterialInfoOutput(material);
		}
	}
}
namespace UCustomPrefabsAPI.Peak.ActionUtils
{
	public class ListenerHelper<A, B> where A : class
	{
		private Dictionary<A, List<Action<B>>> listeners = new Dictionary<A, List<Action<B>>>();

		public void Listen(A target, Action<B> callback)
		{
			if (target != null && callback != null)
			{
				if (!listeners.TryGetValue(target, out var value))
				{
					value = new List<Action<B>>();
					listeners[target] = value;
				}
				if (!value.Contains(callback))
				{
					value.Add(callback);
				}
			}
		}

		public void Un_Listen(A target, Action<B> callback)
		{
			if (target != null && callback != null && listeners.TryGetValue(target, out var value))
			{
				value.Remove(callback);
			}
		}

		public void Clear_Listeners()
		{
			listeners.Clear();
		}

		public void Invoke(A target, B args)
		{
			if (target == null)
			{
				return;
			}
			Validate_Listeners();
			if (!listeners.TryGetValue(target, out var value))
			{
				return;
			}
			for (int i = 0; i < value.Count; i++)
			{
				Action<B> action = value[i];
				if (action != null)
				{
					try
					{
						action(args);
					}
					catch (Exception)
					{
						value.RemoveAt(i--);
					}
				}
			}
			if (value.Count == 0)
			{
				listeners.Remove(target);
			}
		}

		public void Validate_Listeners()
		{
			bool flag = false;
			foreach (List<Action<B>> value in listeners.Values)
			{
				if (value == null)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				return;
			}
			Debug.LogWarning((object)"Some Listeners have become invalid, Rebuilding Listeners.");
			Dictionary<A, List<Action<B>>> dictionary = new Dictionary<A, List<Action<B>>>();
			foreach (KeyValuePair<A, List<Action<B>>> listener in listeners)
			{
				if (listener.Key == null)
				{
					continue;
				}
				List<Action<B>> list = new List<Action<B>>();
				foreach (Action<B> item in list)
				{
					if (item != null)
					{
						list.Add(item);
					}
				}
				dictionary[listener.Key] = list;
			}
			listeners = dictionary;
		}
	}
}
namespace UCustomPrefabsAPI.Peak.Utils
{
	internal static class CustomTemplateUtils
	{
		public const string Default_Template = "Default";

		public const string NoPreference_Template = "NoPreference";

		public static readonly List<string> Special_TemplateNames = new List<string>(2) { "Default", "NoPreference" };

		public static List<string> Fetch_Peak_Custom_Template_IDs()
		{
			return TemplateRegistry.GetTemplatesWithCustomActions<Peak_CustomHelper>();
		}

		public static Dictionary<string, Peak_Custom_Template> Fetch_Peak_Custom_Templates(PeakTemplateType type)
		{
			Dictionary<string, Peak_Custom_Template> dictionary = new Dictionary<string, Peak_Custom_Template>();
			TemplateData val = default(TemplateData);
			foreach (string item in Fetch_Peak_Custom_Template_IDs())
			{
				if (!TemplateRegistry.TryGetTemplate(item, ref val))
				{
					continue;
				}
				CustomActionsTemplate val2 = ((IEnumerable<CustomActionsTemplate>)val.CustomActionsTemplates).FirstOrDefault((Func<CustomActionsTemplate, bool>)((CustomActionsTemplate cat) => cat is Peak_Custom_Template));
				if (Object.op_Implicit((Object)(object)val2))
				{
					Peak_Custom_Template peak_Custom_Template = (Peak_Custom_Template)(object)val2;
					if (peak_Custom_Template.TemplateType == type)
					{
						dictionary[item] = peak_Custom_Template;
					}
				}
			}
			return dictionary;
		}

		public static Texture Get_Peak_Custom_Template_Icon(string templateID)
		{
			Texture result = null;
			TemplateData val = default(TemplateData);
			if (TemplateRegistry.TryGetTemplate(templateID, ref val))
			{
				Peak_Custom_Template peak_Custom_Template = (Peak_Custom_Template)(object)((IEnumerable<CustomActionsTemplate>)val.CustomActionsTemplates).FirstOrDefault((Func<CustomActionsTemplate, bool>)((CustomActionsTemplate a) => a is Peak_Custom_Template));
				if ((Object)(object)peak_Custom_Template != (Object)null)
				{
					result = peak_Custom_Template.PassportIcon;
				}
			}
			return result;
		}

		public static string Get_Peak_Custom_Template_DisplayName(string templateID)
		{
			string result = null;
			TemplateData val = default(TemplateData);
			if (TemplateRegistry.TryGetTemplate(templateID, ref val))
			{
				Peak_Custom_Template peak_Custom_Template = (Peak_Custom_Template)(object)((IEnumerable<CustomActionsTemplate>)val.CustomActionsTemplates).FirstOrDefault((Func<CustomActionsTemplate, bool>)((CustomActionsTemplate a) => a is Peak_Custom_Template));
				if ((Object)(object)peak_Custom_Template != (Object)null)
				{
					result = peak_Custom_Template.PassportDisplayName;
				}
			}
			return result;
		}

		public static bool IsSpecialTemplate(string templateID)
		{
			return Special_TemplateNames.Contains(templateID);
		}

		public static string Evaluate_Peak_Custom_Template(PlayerConfigHelper config, PeakTemplateType type, string templateID)
		{
			if (templateID == "Default")
			{
				return "Default";
			}
			Dictionary<string, Peak_Custom_Template> dictionary = Fetch_Peak_Custom_Templates(type);
			if (!IsSpecialTemplate(templateID) && (string.IsNullOrWhiteSpace(templateID) || !dictionary.TryGetValue(templateID, out var _)))
			{
				templateID = "NoPreference";
			}
			if (templateID == "NoPreference")
			{
				templateID = Fetch_Preferred_Peak_Custom_Template(dictionary, config, type, templateID);
			}
			return templateID;
		}

		private static string Fetch_Preferred_Peak_Custom_Template(Dictionary<string, Peak_Custom_Template> templates, PlayerConfigHelper config, PeakTemplateType type, string templateID)
		{
			if (type == PeakTemplateType.Character)
			{
				return "Default";
			}
			if (Fetch_Peak_Custom_Templates(PeakTemplateType.Character).TryGetValue(config.CurrentCharacterTemplate, out var value))
			{
				Peak_Custom_Template value2;
				switch (type)
				{
				case PeakTemplateType.Skeleton:
					templateID = ((!(value.PreferredSkeletonID == "Default")) ? ((!templates.TryGetValue(value.PreferredSkeletonID, out value2)) ? "Default" : value.PreferredSkeletonID) : "Default");
					break;
				case PeakTemplateType.Chicken:
					templateID = ((!(value.PreferredChickenID == "Default")) ? ((!templates.TryGetValue(value.PreferredChickenID, out value2)) ? "Default" : value.PreferredChickenID) : "Default");
					break;
				}
			}
			return templateID;
		}

		public static PeakTemplateType GetHandlerType(UCustomPrefabHandler handler)
		{
			TemplateData val = default(TemplateData);
			if (!TemplateRegistry.TryGetTemplate(handler.Instance.TemplateUID, ref val))
			{
				return PeakTemplateType.Character;
			}
			CustomActionsTemplate val2 = ((IEnumerable<CustomActionsTemplate>)val.CustomActionsTemplates).FirstOrDefault((Func<CustomActionsTemplate, bool>)((CustomActionsTemplate cat) => cat is Peak_Custom_Template));
			if (!Object.op_Implicit((Object)(object)val2))
			{
				return PeakTemplateType.Character;
			}
			return ((Peak_Custom_Template)(object)val2).TemplateType;
		}
	}
	internal static class PassportHelper
	{
		public class CustomizationOption_Custom : CustomizationOption
		{
			public string TemplateID = string.Empty;

			public string DisplayName = string.Empty;

			public PeakTemplateType TemplateType;
		}

		[CompilerGenerated]
		private static class <>O
		{
			public static UnityAction <0>__TogglePassportBookmark;
		}

		public const int Character_Enum = -13377701;

		public const int Skeleton_Enum = -13377702;

		public const int Chicken_Enum = -13377703;

		public static Vector3 Original_ButtonContainer_Position;

		public static readonly Vector3 ButtonContainer_Name_Offset = new Vector3(0f, -20f, 0f);

		public static List<PassportTab> CustomTabs = new List<PassportTab>();

		public static GameObject CustomContainer;

		public static Button BookmarkButton;

		public static TextMeshProUGUI Custom_Name_Display;

		public static Texture NoPreferenceIcon => AssetBundleRegistry.LoadAsset<Texture>("CustomPassportIcons", "NoPreferenceIcon");

		public static Texture CustomCharacterIcon => AssetBundleRegistry.LoadAsset<Texture>("CustomPassportIcons", "CustomCharacterPassportIcon");

		public static Texture CustomSkeletonIcon => AssetBundleRegistry.LoadAsset<Texture>("CustomPassportIcons", "CustomSkeletonPassportIcon");

		public static Texture CustomChickenIcon => AssetBundleRegistry.LoadAsset<Texture>("CustomPassportIcons", "CustomChickenPassportIcon");

		public static GameObject CustomBookmarkPrefab => AssetBundleRegistry.LoadPrefab("CustomPassportIcons", "BookmarkButton");

		public static Texture EmptyIcon => AssetBundleRegistry.LoadAsset<Texture>("CustomPassportIcons", "Empty");

		public static Texture LockedIcon => ((Component)PassportManager.instance.buttons[0]).GetComponent<PassportButton>().lockedIcon.texture;

		public static Transform OriginalTabContainer => ((Component)PassportManager.instance.tabs[0]).transform.parent;

		public static Transform OriginalButtonContainer => ((Component)PassportManager.instance.buttons[0]).transform.parent;

		public static bool IsSpecialCustomization(Type type, out PeakTemplateType templateType)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Expected I4, but got Unknown
			templateType = PeakTemplateType.Character;
			switch ((int)type)
			{
			case -13377701:
				templateType = PeakTemplateType.Character;
				return true;
			case -13377702:
				templateType = PeakTemplateType.Skeleton;
				return true;
			case -13377703:
				templateType = PeakTemplateType.Chicken;
				return true;
			default:
				return false;
			}
		}

		public static Type GetSpecialCustomization(PeakTemplateType type)
		{
			return (Type)(type switch
			{
				PeakTemplateType.Character => -13377701, 
				PeakTemplateType.Skeleton => -13377702, 
				PeakTemplateType.Chicken => -13377703, 
				_ => 0, 
			});
		}

		public static CustomizationOption[] Construct_Customization_List(PeakTemplateType type)
		{
			//IL_0007: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_0071: 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_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			List<CustomizationOption> list = new List<CustomizationOption>();
			Type specialCustomization = GetSpecialCustomization(type);
			CustomizationOption_Custom customizationOption_Custom = ScriptableObject.CreateInstance<CustomizationOption_Custom>();
			((Object)customizationOption_Custom).SetName("NoPreference");
			((CustomizationOption)customizationOption_Custom).color = Color.white;
			((CustomizationOption)customizationOption_Custom).texture = NoPreferenceIcon;
			((CustomizationOption)customizationOption_Custom).type = specialCustomization;
			customizationOption_Custom.TemplateID = "NoPreference";
			customizationOption_Custom.DisplayName = "No Preference";
			customizationOption_Custom.TemplateType = type;
			list.Add((CustomizationOption)(object)customizationOption_Custom);
			CustomizationOption_Custom customizationOption_Custom2 = ScriptableObject.CreateInstance<CustomizationOption_Custom>();
			((Object)customizationOption_Custom2).SetName("Default");
			((CustomizationOption)customizationOption_Custom2).color = Color.white;
			((CustomizationOption)customizationOption_Custom2).texture = EmptyIcon;
			((CustomizationOption)customizationOption_Custom2).type = specialCustomization;
			customizationOption_Custom2.TemplateID = "Default";
			customizationOption_Custom2.DisplayName = "Default";
			customizationOption_Custom2.TemplateType = type;
			list.Add((CustomizationOption)(object)customizationOption_Custom2);
			foreach (string item in Fetch_Template_List(type))
			{
				CustomizationOption_Custom customizationOption_Custom3 = ScriptableObject.CreateInstance<CustomizationOption_Custom>();
				((Object)customizationOption_Custom3).SetName(item);
				((CustomizationOption)customizationOption_Custom3).color = Color.white;
				((CustomizationOption)customizationOption_Custom3).texture = GetTemplateIcon(item);
				((CustomizationOption)customizationOption_Custom3).type = specialCustomization;
				customizationOption_Custom3.DisplayName = GetTemplateDisplayName(item);
				customizationOption_Custom3.TemplateID = item;
				customizationOption_Custom3.TemplateType = type;
				list.Add((CustomizationOption)(object)customizationOption_Custom3);
			}
			return list.ToArray();
		}

		public static Texture GetTemplateIcon(string templateID)
		{
			Texture val = CustomTemplateUtils.Get_Peak_Custom_Template_Icon(templateID);
			if ((Object)(object)val == (Object)null)
			{
				val = LockedIcon;
			}
			return val;
		}

		public static string GetTemplateDisplayName(string templateID)
		{
			string text = CustomTemplateUtils.Get_Peak_Custom_Template_DisplayName(templateID);
			if (string.IsNullOrWhiteSpace(text))
			{
				text = templateID;
			}
			return text;
		}

		public static List<string> Fetch_Template_List(PeakTemplateType type)
		{
			return CustomTemplateUtils.Fetch_Peak_Custom_Templates(type).Keys.ToList();
		}

		public static void VerifyAndInitializeCustomTabs()
		{
			//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Invalid comparison between Unknown and I4
			//IL_01f1: 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_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Invalid comparison between Unknown and I4
			//IL_013e: 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)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Expected O, but got Unknown
			Debug.Log((object)"VerifyAndInitializeCustomTabs");
			if (CustomTabs.Count != 0 && !CustomTabs.Any((PassportTab t) => !Object.op_Implicit((Object)(object)t)))
			{
				return;
			}
			CustomTabs.Clear();
			CustomContainer = Object.Instantiate<GameObject>(((Component)OriginalTabContainer).gameObject, OriginalTabContainer.parent);
			PassportTab[] componentsInChildren = CustomContainer.GetComponentsInChildren<PassportTab>(true);
			foreach (PassportTab val in componentsInChildren)
			{
				Type type = val.type;
				if ((int)type != 0)
				{
					if ((int)type != 10)
					{
						if ((int)type == 20)
						{
							val.type = (Type)(-13377703);
							Transform obj = ((Component)val).transform.Find("Panel/Icon");
							RawImage val2 = ((obj != null) ? ((Component)obj).GetComponent<RawImage>() : null);
							if (Object.op_Implicit((Object)(object)val2))
							{
								val2.texture = CustomChickenIcon;
							}
							CustomTabs.Add(val);
						}
						else
						{
							Object.DestroyImmediate((Object)(object)((Component)val).gameObject);
						}
					}
					else
					{
						val.type = (Type)(-13377702);
						Transform obj2 = ((Component)val).transform.Find("Panel/Icon");
						RawImage val3 = ((obj2 != null) ? ((Component)obj2).GetComponent<RawImage>() : null);
						if (Object.op_Implicit((Object)(object)val3))
						{
							val3.texture = CustomSkeletonIcon;
						}
						CustomTabs.Add(val);
					}
				}
				else
				{
					val.type = (Type)(-13377701);
					Transform obj3 = ((Component)val).transform.Find("Panel/Icon");
					RawImage val4 = ((obj3 != null) ? ((Component)obj3).GetComponent<RawImage>() : null);
					if (Object.op_Implicit((Object)(object)val4))
					{
						val4.texture = CustomCharacterIcon;
					}
					CustomTabs.Add(val);
				}
			}
			PassportManager.instance.tabs = CollectionExtensions.AddRangeToArray<PassportTab>(PassportManager.instance.tabs, CustomTabs.ToArray());
			try
			{
				GameObject obj4 = Object.Instantiate<GameObject>(CustomBookmarkPrefab, OriginalTabContainer.parent.parent.parent);
				obj4.transform.localPosition = new Vector3(300f, 307f, 0f);
				BookmarkButton = obj4.GetComponent<Button>();
				Button bookmarkButton = BookmarkButton;
				if (bookmarkButton != null)
				{
					ButtonClickedEvent onClick = bookmarkButton.onClick;
					object obj5 = <>O.<0>__TogglePassportBookmark;
					if (obj5 == null)
					{
						UnityAction val5 = TogglePassportBookmark;
						<>O.<0>__TogglePassportBookmark = val5;
						obj5 = (object)val5;
					}
					((UnityEvent)onClick).AddListener((UnityAction)obj5);
				}
			}
			catch
			{
				Debug.LogError((object)"Failed to Create Custom Bookmark");
			}
			try
			{
				GameObject obj7 = Object.Instantiate<GameObject>(((Component)PassportManager.instance.nameText).gameObject, OriginalButtonContainer.parent);
				((Object)obj7).name = "CustomNameDisplay";
				obj7.transform.localPosition = new Vector3(-193f, 95f, 0f);
				obj7.transform.SetSiblingIndex(0);
				Custom_Name_Display = obj7.GetComponent<TextMeshProUGUI>();
				((Graphic)Custom_Name_Display).color = Color.black;
				((TMP_Text)Custom_Name_Display).alignment = (TextAlignmentOptions)513;
				((TMP_Text)Custom_Name_Display).fontStyle = (FontStyles)0;
				((TMP_Text)Custom_Name_Display).text = "";
			}
			catch
			{
				Debug.LogError((object)"Failed to Create Custom Display Text");
			}
			Original_ButtonContainer_Position = ((Component)OriginalButtonContainer).transform.localPosition;
		}

		public static void TogglePassportBookmark()
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			RawImage component = ((Component)((Component)BookmarkButton).transform.Find("RawImage_Blue")).GetComponent<RawImage>();
			RawImage component2 = ((Component)((Component)BookmarkButton).transform.Find("RawImage_Red")).GetComponent<RawImage>();
			if (IsSpecialCustomization(PassportManager.instance.activeType, out var _))
			{
				((Component)component).gameObject.SetActive(false);
				((Component)component2).gameObject.SetActive(true);
				((Selectable)BookmarkButton).targetGraphic = (Graphic)(object)component2;
				PassportManager.instance.OpenTab((Type)0);
			}
			else
			{
				((Component)component).gameObject.SetActive(true);
				((Component)component2).gameObject.SetActive(false);
				((Selectable)BookmarkButton).targetGraphic = (Graphic)(object)component;
				PassportManager.instance.OpenTab((Type)(-13377701));
			}
		}

		public static void SwitchToCustomTab(Type type)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			VerifyAndInitializeCustomTabs();
			if (!IsSpecialCustomization(type, out var _))
			{
				CustomContainer.SetActive(false);
				((Component)Custom_Name_Display).gameObject.SetActive(false);
				((Component)OriginalTabContainer).gameObject.SetActive(true);
				((Component)OriginalButtonContainer).transform.localPosition = Original_ButtonContainer_Position;
				return;
			}
			CustomContainer.SetActive(true);
			((Component)Custom_Name_Display).gameObject.SetActive(true);
			((Component)OriginalTabContainer).gameObject.SetActive(false);
			((Component)OriginalButtonContainer).transform.localPosition = ButtonContainer_Name_Offset;
			foreach (PassportTab customTab in CustomTabs)
			{
				if (customTab.type == type)
				{
					customTab.Open();
				}
				else
				{
					customTab.Close();
				}
			}
		}
	}
}
namespace UCustomPrefabsAPI.Peak.Patches.Listeners
{
	[HarmonyPatch]
	public static class CharacterCustomization_Listeners
	{
		public static ListenerHelper<Character, CharacterCustomization> CharacterDied_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> CharacterPassedOut_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> OnRevive_RPC_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> OnPlayerDataChange_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, Color> PulseStatus_Postfix = new ListenerHelper<Character, Color>();

		public static ListenerHelper<Character, CharacterCustomization> BecomeChicken_Prefix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> BecomeChicken_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> BecomeHuman_Prefix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> BecomeHuman_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> ShowChicken_Postfix = new ListenerHelper<Character, CharacterCustomization>();

		public static ListenerHelper<Character, CharacterCustomization> Hi