using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using ContractQueen.Behaviors; using ContractQueen.ContractEvents; using ContractQueen.ContractManager; using ContractQueen.Contracts; using ContractQueen.Patches; using ContractQueen.Persist; using FrogDataLib.DataManagement; using HarmonyLib; using Microsoft.CodeAnalysis; using Mirror; using Unity.VisualScripting; using UnityEngine; using YAPYAP; using YAPYAP.Npc.Frog; using YapLocalizer; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("dev.mamallama.contractqueen")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.3.2.0")] [assembly: AssemblyInformationalVersion("0.3.2+dba98a7cfc5d038db297582d2de3ec532f794d35")] [assembly: AssemblyProduct("dev.mamallama.contractqueen")] [assembly: AssemblyTitle("ContractQueen")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.3.2.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace ContractQueen { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("dev.mamallama.contractqueen", "ContractQueen", "0.3.2")] public class ContractQueenPlugin : BaseUnityPlugin { internal const string contractName = "CONTRACT_QUEEN_TEST_CONTRACT_NAME"; internal const string contractDesc = "CONTRACT_QUEEN_TEST_CONTRACT_DESC"; internal static FrogDataContainerSimple container; public const string Id = "dev.mamallama.contractqueen"; internal static ManualLogSource Log { get; private set; } internal static FrogDatabaseDTO Database => container.Data; public static string Name => "ContractQueen"; public static string Version => "0.3.2"; private void Awake() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; Log.LogMessage((object)"Loading localized contract data"); ModLocalizedText val = new ModLocalizedText("CONTRACT_QUEEN_TEST_CONTRACT_NAME", ""); val.SetLocalization((SystemLanguage)10, "Rescue Frogs"); val = new ModLocalizedText("CONTRACT_QUEEN_TEST_CONTRACT_DESC", ""); val.SetLocalization((SystemLanguage)10, "Rescued {0}/{1} Frogs"); Harmony val2 = new Harmony("dev.mamallama.contractqueen"); val2.PatchAll(typeof(DungeonTasksPatches)); val2.PatchAll(typeof(NetworkPuppetPropPatches)); val2.PatchAll(typeof(FrogStateMachinePatches)); container = new FrogDataContainerSimple("dev.mamallama.contractqueen"); Log.LogInfo((object)$"Patch count: {val2.GetPatchedMethods().Count()}"); ContractsModule contractsModule = new ContractsModule("dev.mamallama.contractqueen"); contractsModule.RegisterContract("RescueFrogsQuest", (GameplayTaskSO)(object)RescueFrogsTask.Create()); } } } namespace ContractQueen.Persist { [Serializable] public class FrogDatabaseDTO : FrogDataModel { internal Dictionary AssetLookupTable = new Dictionary(); [SerializeField] public List FrogData; public FrogDatabaseDTO() { FrogData = new List(); } public FrogDataDTO GetFrogData(AssetMUD mud) { //IL_0006: 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) if (AssetLookupTable.TryGetValue(mud, out FrogDataDTO value)) { ContractQueenPlugin.Log.LogDebug((object)("Mapped a DTO for frog: " + ((AssetMUD)(ref mud)).GetDigest())); return value; } FrogDataDTO frogDataDTO = new FrogDataDTO { MUDToken = mud.Identifier }; FrogData.Add(frogDataDTO); ContractQueenPlugin.Log.LogDebug((object)"Created a new DTO for a frog"); return frogDataDTO; } public override void OnAfterSerialize() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) ContractQueenPlugin.Log.LogDebug((object)$"Received serialization callback, {FrogData.Count} items in list"); AssetLookupTable.Clear(); foreach (FrogDataDTO frogDatum in FrogData) { AssetLookupTable[new AssetMUD(frogDatum.MUDToken)] = frogDatum; } } public override void OnBeforeSerialize() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) ContractQueenPlugin.Log.LogDebug((object)"Saving all FrogContractBehaviors"); FrogData.Clear(); FrogContractBehavior[] array = Object.FindObjectsByType((FindObjectsInactive)0, (FindObjectsSortMode)0); FrogContractBehavior[] array2 = array; AssetMUD val = default(AssetMUD); foreach (FrogContractBehavior frogContractBehavior in array2) { ((AssetMUD)(ref val))..ctor((NetworkBehaviour)(object)((Component)frogContractBehavior).GetComponent()); frogContractBehavior.Data.MUDToken = val.Identifier; ContractQueenPlugin.Log.LogDebug((object)("Saved a DTO for frog:" + ((AssetMUD)(ref val)).GetDigest())); FrogData.Add(frogContractBehavior.Data); } } } [Serializable] public class FrogDataDTO { [SerializeField] public string MUDToken = string.Empty; [SerializeField] public bool HasBeenCounted; } } namespace ContractQueen.Patches { internal class DungeonTasksPatches { [HarmonyPatch(typeof(DungeonTasks), "PreAwake")] [HarmonyPostfix] internal static void AddContractsToRandomPool() { ContractsRegistry.Lock(); IReadOnlyList lockedList = ContractsRegistry.LockedList; GameplayTaskSO[] frozenConstants = ContractsRegistry.FrozenConstants; GameplayTaskSO[] frozenRandoms = ContractsRegistry.FrozenRandoms; GameplayTaskSO[] frozenCollectibles = ContractsRegistry.FrozenCollectibles; int num = frozenConstants.Length + frozenRandoms.Length + frozenCollectibles.Length; int num2 = 0; foreach (GameplayTaskSO item in lockedList) { item.TaskId = num + num2; num2++; } DungeonTasks instance = DungeonTasks.Instance; GameplayTaskSO[] array = frozenRandoms; IReadOnlyList readOnlyList = lockedList; int num3 = 0; GameplayTaskSO[] array2 = (GameplayTaskSO[])(object)new GameplayTaskSO[array.Length + readOnlyList.Count]; ReadOnlySpan readOnlySpan = new ReadOnlySpan(array); readOnlySpan.CopyTo(new Span(array2).Slice(num3, readOnlySpan.Length)); num3 += readOnlySpan.Length; foreach (GameplayTaskSO item2 in readOnlyList) { array2[num3] = item2; num3++; } instance.randomTasks = array2; DungeonTasks instance2 = DungeonTasks.Instance; List list = new List(); list.AddRange(frozenConstants); list.AddRange(frozenRandoms); list.AddRange(frozenCollectibles); list.AddRange(lockedList); instance2.allTasks = list.ToArray(); ContractQueenPlugin.Log.LogMessage((object)$"Added {num2} contract(s) to pool starting from ID {num} to {num + num2 - 1}"); } } internal static class FrogStateMachinePatches { [HarmonyPatch(typeof(FrogStateMachine), "Awake")] [HarmonyPostfix] internal static void AwakePatch(FrogStateMachine __instance) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) if (((Object)((Component)__instance).gameObject).GetInstanceID() <= 0) { FrogContractBehavior frogContractBehavior = ComponentHolderProtocol.AddComponent((Object)(object)__instance); AssetMUD mud = default(AssetMUD); ((AssetMUD)(ref mud))..ctor((NetworkBehaviour)(object)__instance); FrogDataDTO frogData = ContractQueenPlugin.Database.GetFrogData(mud); frogContractBehavior.Data = frogData; } } } internal static class NetworkPuppetPropPatches { [HarmonyPatch(typeof(NetworkPuppetProp), "OnDropped")] [HarmonyPostfix] internal static void ServerSetInInventoryPatch(NetworkPuppetProp __instance) { FrogContractBehavior component = ((Component)__instance).GetComponent(); ContractQueenPlugin.Log.LogDebug((object)$"OnDropped: {((Object)((Component)__instance).gameObject).name} | {__instance.DisplayName}({((Object)__instance).GetInstanceID()}), isFrog: {(Object)(object)component != (Object)null}"); if (!((Object)(object)component == (Object)null) && !component.HasBeenCounted) { ContractQueenPlugin.Log.LogDebug((object)$"New frog: {!component.HasBeenCounted}"); Events.CountFrog(component); } } } } namespace ContractQueen.Contracts { public class RescueFrogsTask : GameplayTaskSO { [SerializeField] private int frogCount = 3; public static RescueFrogsTask Create() { RescueFrogsTask rescueFrogsTask = ScriptableObject.CreateInstance(); ((GameplayTaskSO)rescueFrogsTask).nameLocalisationKey = "CONTRACT_QUEEN_TEST_CONTRACT_NAME"; ((GameplayTaskSO)rescueFrogsTask).descriptionLocalisationKey = "CONTRACT_QUEEN_TEST_CONTRACT_DESC"; ((GameplayTaskSO)rescueFrogsTask).pointValue = 300; return rescueFrogsTask; } public override bool CanBeCreated() { return true; } protected override int CalculateTargetProgress() { return frogCount; } public override void SubscribeToProgressEvents(GameplayTask runtimeTask) { GameplayTask runtimeTask2 = runtimeTask; Action action = delegate { ContractQueenPlugin.Log.LogDebug((object)"Counted a frog for a quest"); runtimeTask2.AdvanceProgress(1); }; runtimeTask2.SetProgressHandler((Delegate)action); Events.FrogCountedEvent += action; } public override void UnsubscribeFromProgressEvents(GameplayTask runtimeTask) { if (runtimeTask.GetProgressHandler() is Action value) { Events.FrogCountedEvent -= value; runtimeTask.SetProgressHandler((Delegate)null); } } } } namespace ContractQueen.ContractManager { public class ContractBundle { public readonly string Name; public readonly GameplayTaskSO Contract; public ContractBundle(string name, GameplayTaskSO contract) { Name = name; Contract = contract; base..ctor(); } } internal class ContractBundleComparer : IComparer { public static readonly IComparer NameOrdinal = new ContractBundleComparer(); public int Compare(ContractBundle x, ContractBundle y) { if (x == y) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } return StringComparer.Ordinal.Compare(x.Name, y.Name); } } public sealed class ContractsModule { private readonly string GUID; private readonly SortedSet _contracts; public ContractsModule(string guid) { GUID = guid; _contracts = ContractsRegistry.EnsureGUID(GUID); } public bool RegisterContract(ContractBundle contract) { return _contracts.Add(contract); } public bool RegisterContract(string name, GameplayTaskSO contract) { return _contracts.Add(new ContractBundle(name, contract)); } public void RegisterMany(IEnumerable items) { LinqUtility.AddRange((ICollection)_contracts, items); } } internal static class ContractsRegistry { private static readonly SortedDictionary> Registry = new SortedDictionary>(StringComparer.Ordinal); private static bool Finalized = false; private static IReadOnlyList _cachedLockedList = Array.Empty(); internal static GameplayTaskSO[] FrozenConstants { get; private set; } = Array.Empty(); internal static GameplayTaskSO[] FrozenCollectibles { get; private set; } = Array.Empty(); internal static GameplayTaskSO[] FrozenRandoms { get; private set; } = Array.Empty(); public static IReadOnlyList LockedList => _cachedLockedList; internal static SortedSet EnsureGUID(string GUID) { if (Finalized) { throw new InvalidOperationException("Cannot add quests after main menu is reached"); } if (Registry.TryGetValue(GUID, out SortedSet value)) { return value; } SortedSet sortedSet = new SortedSet(ContractBundleComparer.NameOrdinal); Registry[GUID] = sortedSet; return sortedSet; } internal static void Lock() { try { List list = new List(); foreach (SortedSet value in Registry.Values) { foreach (ContractBundle item in value) { list.Add(item.Contract); } } FrozenConstants = DungeonTasks.Instance.constantTasks; FrozenRandoms = DungeonTasks.Instance.randomTasks; FrozenCollectibles = DungeonTasks.Instance.collectableTasks; ContractQueenPlugin.Log.LogMessage((object)ListContracts()); _cachedLockedList = list.AsReadOnly(); Finalized = true; } catch (Exception ex) { ContractQueenPlugin.Log.LogError((object)(ex.Message + "\n\n" + ex.StackTrace)); } } public static string ListContracts() { StringBuilder stringBuilder = new StringBuilder("Contracts Loaded:\n"); foreach (KeyValuePair> item in Registry) { stringBuilder.AppendLine(" [" + item.Key + "]"); foreach (ContractBundle item2 in item.Value) { stringBuilder.AppendLine(" -" + item2.Name); } } return stringBuilder.ToString(); } } } namespace ContractQueen.ContractEvents { public static class Events { public static event Action? FrogCountedEvent; internal static void CountFrog(FrogContractBehavior frog) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) if ((int)GameManager.Instance.CurrentGameState == 0) { Events.FrogCountedEvent?.Invoke(frog); } frog.Count(); } } } namespace ContractQueen.Behaviors { public class FrogContractBehavior : MonoBehaviour { public FrogDataDTO Data; public NetworkPuppetProp Owner { get; protected set; } public bool HasBeenCounted => Data.HasBeenCounted; private void Awake() { Owner = ((Component)this).gameObject.GetComponent(); if ((Object)(object)Owner == (Object)null) { ContractQueenPlugin.Log.LogError((object)"Unable to establish owner in FrogContractBehavior"); } } public void Count() { Data.HasBeenCounted = true; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ConstantExpectedAttribute : Attribute { public object? Min { get; set; } public object? Max { get; set; } } [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ExperimentalAttribute : Attribute { public string DiagnosticId { get; } public string? UrlFormat { get; set; } public ExperimentalAttribute(string diagnosticId) { DiagnosticId = diagnosticId; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class SetsRequiredMembersAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class StringSyntaxAttribute : Attribute { public const string CompositeFormat = "CompositeFormat"; public const string DateOnlyFormat = "DateOnlyFormat"; public const string DateTimeFormat = "DateTimeFormat"; public const string EnumFormat = "EnumFormat"; public const string GuidFormat = "GuidFormat"; public const string Json = "Json"; public const string NumericFormat = "NumericFormat"; public const string Regex = "Regex"; public const string TimeOnlyFormat = "TimeOnlyFormat"; public const string TimeSpanFormat = "TimeSpanFormat"; public const string Uri = "Uri"; public const string Xml = "Xml"; public string Syntax { get; } public object?[] Arguments { get; } public StringSyntaxAttribute(string syntax) { Syntax = syntax; Arguments = new object[0]; } public StringSyntaxAttribute(string syntax, params object?[] arguments) { Syntax = syntax; Arguments = arguments; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class UnscopedRefAttribute : Attribute { } } namespace System.Runtime.Versioning { [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class RequiresPreviewFeaturesAttribute : Attribute { public string? Message { get; } public string? Url { get; set; } public RequiresPreviewFeaturesAttribute() { } public RequiresPreviewFeaturesAttribute(string? message) { Message = message; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CallerArgumentExpressionAttribute : Attribute { public string ParameterName { get; } public CallerArgumentExpressionAttribute(string parameterName) { ParameterName = parameterName; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CollectionBuilderAttribute : Attribute { public Type BuilderType { get; } public string MethodName { get; } public CollectionBuilderAttribute(Type builderType, string methodName) { BuilderType = builderType; MethodName = methodName; } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CompilerFeatureRequiredAttribute : Attribute { public const string RefStructs = "RefStructs"; public const string RequiredMembers = "RequiredMembers"; public string FeatureName { get; } public bool IsOptional { get; set; } public CompilerFeatureRequiredAttribute(string featureName) { FeatureName = featureName; } } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute { public string[] Arguments { get; } public InterpolatedStringHandlerArgumentAttribute(string argument) { Arguments = new string[1] { argument }; } public InterpolatedStringHandlerArgumentAttribute(params string[] arguments) { Arguments = arguments; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class InterpolatedStringHandlerAttribute : Attribute { } [EditorBrowsable(EditorBrowsableState.Never)] [ExcludeFromCodeCoverage] internal static class IsExternalInit { } [AttributeUsage(AttributeTargets.Method, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ModuleInitializerAttribute : Attribute { } [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class OverloadResolutionPriorityAttribute : Attribute { public int Priority { get; } public OverloadResolutionPriorityAttribute(int priority) { Priority = priority; } } [AttributeUsage(AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)] [ExcludeFromCodeCoverage] internal sealed class ParamCollectionAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class RequiredMemberAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] [EditorBrowsable(EditorBrowsableState.Never)] [ExcludeFromCodeCoverage] internal sealed class RequiresLocationAttribute : Attribute { } [AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class SkipLocalsInitAttribute : Attribute { } }