Decompiled source of CrowdControl EnterTheGungeon v2.2.0
BepInEx/plugins/CrowdControl/AsyncBridge.dll
Decompiled 2 weeks agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Threading; using System.Threading.Tasks; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("Daniel Grunwald, Omer Mor, Alex Davies, jnm2")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © 2012–2018 Daniel Grunwald, Omer Mor, Alex Davies, Joseph Musser")] [assembly: AssemblyDescription("C# 5 async/await support for .NET Framework pre-4.5\r\nThis package is now unified to include all functionality from AsyncBridge.Net35 and AsyncBridge.Portable.")] [assembly: AssemblyFileVersion("0.3.1.0")] [assembly: AssemblyInformationalVersion("0.3.1")] [assembly: AssemblyProduct("AsyncBridge")] [assembly: AssemblyTitle("C# 5 async/await support for .NET Framework pre-4.5")] [assembly: AssemblyVersion("0.3.1.0")] public static class AsyncCompatLibExtensions { public static TaskAwaiter GetAwaiter(this Task task) { if (task == null) { throw new ArgumentNullException("task"); } return new TaskAwaiter(task); } public static TaskAwaiter<TResult> GetAwaiter<TResult>(this Task<TResult> task) { if (task == null) { throw new ArgumentNullException("task"); } return new TaskAwaiter<TResult>(task); } public static ConfiguredTaskAwaitable<TResult> ConfigureAwait<TResult>(this Task<TResult> task, bool continueOnCapturedContext) { if (task == null) { throw new ArgumentNullException("task"); } return new ConfiguredTaskAwaitable<TResult>(task, continueOnCapturedContext); } public static ConfiguredTaskAwaitable ConfigureAwait(this Task task, bool continueOnCapturedContext) { if (task == null) { throw new ArgumentNullException("task"); } return new ConfiguredTaskAwaitable(task, continueOnCapturedContext); } } namespace System.Threading { internal static class ExecutionContextEx { public static void Dispose(this ExecutionContext context) { } } } namespace System.Threading.Tasks { public static class TaskEx { private static Task s_preCompletedTask; private static Task s_preCanceledTask; private const string ArgumentOutOfRange_TimeoutNonNegativeOrMinusOne = "The timeout must be non-negative or -1, and it must be less than or equal to Int32.MaxValue."; static TaskEx() { s_preCompletedTask = (Task)(object)FromResult(result: false); s_preCanceledTask = ((Func<Task>)delegate { TaskCompletionSource<bool> obj = new TaskCompletionSource<bool>(); obj.TrySetCanceled(); return (Task)(object)obj.Task; })(); } public static Task Run(Action action) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Run(action, CancellationToken.None); } public static Task Run(Action action, CancellationToken cancellationToken) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return Task.Factory.StartNew(action, cancellationToken, (TaskCreationOptions)0, TaskScheduler.Default); } public static Task<TResult> Run<TResult>(Func<TResult> function) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Run(function, CancellationToken.None); } public static Task<TResult> Run<TResult>(Func<TResult> function, CancellationToken cancellationToken) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return Task.Factory.StartNew<TResult>(function, cancellationToken, (TaskCreationOptions)0, TaskScheduler.Default); } public static Task Run(Func<Task> function) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Run(function, CancellationToken.None); } public static Task Run(Func<Task> function, CancellationToken cancellationToken) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return TaskExtensions.Unwrap(TaskEx.Run<Task>(function, cancellationToken)); } public static Task<TResult> Run<TResult>(Func<Task<TResult>> function) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Run(function, CancellationToken.None); } public static Task<TResult> Run<TResult>(Func<Task<TResult>> function, CancellationToken cancellationToken) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return TaskExtensions.Unwrap<TResult>(TaskEx.Run<Task<TResult>>(function, cancellationToken)); } public static Task Delay(int dueTime) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Delay(dueTime, CancellationToken.None); } public static Task Delay(TimeSpan dueTime) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Delay(dueTime, CancellationToken.None); } public static Task Delay(TimeSpan dueTime, CancellationToken cancellationToken) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) long num = (long)dueTime.TotalMilliseconds; if (num < -1 || num > int.MaxValue) { throw new ArgumentOutOfRangeException("dueTime", "The timeout must be non-negative or -1, and it must be less than or equal to Int32.MaxValue."); } return Delay((int)num, cancellationToken); } public static Task Delay(int dueTime, CancellationToken cancellationToken) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) if (dueTime < -1) { throw new ArgumentOutOfRangeException("dueTime", "The timeout must be non-negative or -1, and it must be less than or equal to Int32.MaxValue."); } if (((CancellationToken)(ref cancellationToken)).IsCancellationRequested) { return s_preCanceledTask; } if (dueTime == 0) { return s_preCompletedTask; } TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); CancellationTokenRegistration ctr = default(CancellationTokenRegistration); Timer timer = null; timer = new Timer(delegate { ((CancellationTokenRegistration)(ref ctr)).Dispose(); timer.Dispose(); tcs.TrySetResult(true); }, null, -1, -1); if (((CancellationToken)(ref cancellationToken)).CanBeCanceled) { ctr = ((CancellationToken)(ref cancellationToken)).Register((Action)delegate { timer.Dispose(); tcs.TrySetCanceled(); }); } timer.Change(dueTime, -1); return (Task)(object)tcs.Task; } public static Task WhenAll(params Task[] tasks) { return WhenAll((IEnumerable<Task>)tasks); } public static Task<TResult[]> WhenAll<TResult>(params Task<TResult>[] tasks) { return WhenAll((IEnumerable<Task<TResult>>)tasks); } public static Task WhenAll(IEnumerable<Task> tasks) { return (Task)(object)WhenAllCore(tasks, delegate(Task[] completedTasks, TaskCompletionSource<object> tcs) { tcs.TrySetResult((object)null); }); } public static Task<TResult[]> WhenAll<TResult>(IEnumerable<Task<TResult>> tasks) { return WhenAllCore(tasks.Cast<Task>(), delegate(Task[] completedTasks, TaskCompletionSource<TResult[]> tcs) { tcs.TrySetResult((from Task<TResult> t in completedTasks select t.Result).ToArray()); }); } private static Task<TResult> WhenAllCore<TResult>(IEnumerable<Task> tasks, Action<Task[], TaskCompletionSource<TResult>> setResultAction) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) if (tasks == null) { throw new ArgumentNullException("tasks"); } TaskCompletionSource<TResult> tcs = new TaskCompletionSource<TResult>(); Task[] array = (tasks as Task[]) ?? tasks.ToArray(); if (array.Length == 0) { setResultAction(array, tcs); } else { Task.Factory.ContinueWhenAll(array, (Action<Task[]>)delegate(Task[] completedTasks) { List<Exception> targetList = null; bool flag = false; foreach (Task val in completedTasks) { if (val.IsFaulted) { AddPotentiallyUnwrappedExceptions(ref targetList, (Exception)(object)val.Exception); } else if (val.IsCanceled) { flag = true; } } if (targetList != null && targetList.Count > 0) { tcs.TrySetException((IEnumerable<Exception>)targetList); } else if (flag) { tcs.TrySetCanceled(); } else { setResultAction(completedTasks, tcs); } }, CancellationToken.None, (TaskContinuationOptions)524288, TaskScheduler.Default); } return tcs.Task; } public static Task<Task> WhenAny(params Task[] tasks) { return WhenAny((IEnumerable<Task>)tasks); } public static Task<Task> WhenAny(IEnumerable<Task> tasks) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (tasks == null) { throw new ArgumentNullException("tasks"); } TaskCompletionSource<Task> val = new TaskCompletionSource<Task>(); Task.Factory.ContinueWhenAny<bool>((tasks as Task[]) ?? tasks.ToArray(), (Func<Task, bool>)val.TrySetResult, CancellationToken.None, (TaskContinuationOptions)524288, TaskScheduler.Default); return val.Task; } public static Task<Task<TResult>> WhenAny<TResult>(params Task<TResult>[] tasks) { return WhenAny((IEnumerable<Task<TResult>>)tasks); } public static Task<Task<TResult>> WhenAny<TResult>(IEnumerable<Task<TResult>> tasks) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (tasks == null) { throw new ArgumentNullException("tasks"); } TaskCompletionSource<Task<TResult>> val = new TaskCompletionSource<Task<TResult>>(); Task.Factory.ContinueWhenAny<TResult, bool>((tasks as Task<TResult>[]) ?? tasks.ToArray(), (Func<Task<TResult>, bool>)val.TrySetResult, CancellationToken.None, (TaskContinuationOptions)524288, TaskScheduler.Default); return val.Task; } public static Task<TResult> FromResult<TResult>(TResult result) { TaskCompletionSource<TResult> obj = new TaskCompletionSource<TResult>((object)result); obj.TrySetResult(result); return obj.Task; } public static YieldAwaitable Yield() { return default(YieldAwaitable); } private static void AddPotentiallyUnwrappedExceptions(ref List<Exception> targetList, Exception exception) { AggregateException ex = (AggregateException)(object)((exception is AggregateException) ? exception : null); if (targetList == null) { targetList = new List<Exception>(); } if (ex != null) { targetList.Add((ex.InnerExceptions.Count == 1) ? exception.InnerException : exception); } else { targetList.Add(exception); } } } } namespace System.Runtime { [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = false, Inherited = false)] internal sealed class TargetedPatchingOptOutAttribute : Attribute { private readonly string m_reason; public string Reason => m_reason; public TargetedPatchingOptOutAttribute(string reason) { m_reason = reason; } } } namespace System.Runtime.CompilerServices { internal struct AsyncMethodBuilderCore { private sealed class MoveNextRunner { private readonly ExecutionContext m_context; internal IAsyncStateMachine m_stateMachine; [SecurityCritical] private static ContextCallback s_invokeMoveNext; [SecurityCritical] internal MoveNextRunner(ExecutionContext context) { m_context = context; } [SecuritySafeCritical] internal void Run() { if (m_context == null) { m_stateMachine.MoveNext(); return; } ContextCallback callback = InvokeMoveNext; ExecutionContext.Run(m_context, callback, m_stateMachine); } [SecurityCritical] private static void InvokeMoveNext(object stateMachine) { ((IAsyncStateMachine)stateMachine).MoveNext(); } } internal IAsyncStateMachine m_stateMachine; [SecuritySafeCritical] [DebuggerStepThrough] internal void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { if (stateMachine == null) { throw new ArgumentNullException("stateMachine"); } stateMachine.MoveNext(); } public void SetStateMachine(IAsyncStateMachine stateMachine) { if (stateMachine == null) { throw new ArgumentNullException("stateMachine"); } if (m_stateMachine != null) { throw new InvalidOperationException("The builder was not properly initialized."); } m_stateMachine = stateMachine; } [SecuritySafeCritical] internal Action GetCompletionAction<TMethodBuilder, TStateMachine>(ref TMethodBuilder builder, ref TStateMachine stateMachine) where TMethodBuilder : IAsyncMethodBuilder where TStateMachine : IAsyncStateMachine { MoveNextRunner moveNextRunner = new MoveNextRunner(ExecutionContext.Capture()); Action result = moveNextRunner.Run; if (m_stateMachine == null) { builder.PreBoxInitialization(); m_stateMachine = stateMachine; m_stateMachine.SetStateMachine(m_stateMachine); } moveNextRunner.m_stateMachine = m_stateMachine; return result; } internal static void ThrowAsync(Exception exception, SynchronizationContext targetContext) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown if (targetContext != null) { try { targetContext.Post(delegate(object state) { throw TaskAwaiter.PrepareExceptionForRethrow((Exception)state); }, exception); return; } catch (Exception ex) { exception = (Exception)new AggregateException(new Exception[2] { exception, ex }); } } ThreadPool.QueueUserWorkItem(delegate(object state) { throw TaskAwaiter.PrepareExceptionForRethrow((Exception)state); }, exception); } } internal class AsyncMethodTaskCache<TResult> { private sealed class AsyncMethodBooleanTaskCache : AsyncMethodTaskCache<bool> { private readonly TaskCompletionSource<bool> m_true = CreateCompleted(result: true); private readonly TaskCompletionSource<bool> m_false = CreateCompleted(result: false); internal override TaskCompletionSource<bool> FromResult(bool result) { if (!result) { return m_false; } return m_true; } } private sealed class AsyncMethodInt32TaskCache : AsyncMethodTaskCache<int> { private static readonly TaskCompletionSource<int>[] Int32Tasks; private const int INCLUSIVE_INT32_MIN = -1; private const int EXCLUSIVE_INT32_MAX = 9; static AsyncMethodInt32TaskCache() { Int32Tasks = CreateInt32Tasks(); } private static TaskCompletionSource<int>[] CreateInt32Tasks() { TaskCompletionSource<int>[] array = new TaskCompletionSource<int>[10]; for (int i = 0; i < array.Length; i++) { array[i] = CreateCompleted(i - 1); } return array; } internal override TaskCompletionSource<int> FromResult(int result) { if (result < -1 || result >= 9) { return CreateCompleted(result); } return Int32Tasks[result - -1]; } } internal static readonly AsyncMethodTaskCache<TResult> Singleton; static AsyncMethodTaskCache() { Singleton = CreateCache(); } internal static TaskCompletionSource<TResult> CreateCompleted(TResult result) { TaskCompletionSource<TResult> obj = new TaskCompletionSource<TResult>(); obj.TrySetResult(result); return obj; } private static AsyncMethodTaskCache<TResult> CreateCache() { Type typeFromHandle = typeof(TResult); if ((object)typeFromHandle == typeof(bool)) { return (AsyncMethodTaskCache<TResult>)(object)new AsyncMethodBooleanTaskCache(); } if ((object)typeFromHandle == typeof(int)) { return (AsyncMethodTaskCache<TResult>)(object)new AsyncMethodInt32TaskCache(); } return null; } internal virtual TaskCompletionSource<TResult> FromResult(TResult result) { return CreateCompleted(result); } } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class AsyncStateMachineAttribute : StateMachineAttribute { public AsyncStateMachineAttribute(Type stateMachineType) : base(stateMachineType) { } } public struct AsyncTaskMethodBuilder : IAsyncMethodBuilder { private static readonly TaskCompletionSource<VoidTaskResult> s_cachedCompleted; private AsyncTaskMethodBuilder<VoidTaskResult> m_builder; public Task Task => (Task)(object)m_builder.Task; private object ObjectIdForDebugger => Task; static AsyncTaskMethodBuilder() { s_cachedCompleted = AsyncTaskMethodBuilder<VoidTaskResult>.s_defaultResultTask; } public static AsyncTaskMethodBuilder Create() { return default(AsyncTaskMethodBuilder); } [DebuggerStepThrough] public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { m_builder.Start(ref stateMachine); } public void SetStateMachine(IAsyncStateMachine stateMachine) { m_builder.SetStateMachine(stateMachine); } void IAsyncMethodBuilder.PreBoxInitialization() { _ = Task; } public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { m_builder.AwaitOnCompleted(ref awaiter, ref stateMachine); } public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { m_builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine); } public void SetResult() { m_builder.SetResult(s_cachedCompleted); } public void SetException(Exception exception) { m_builder.SetException(exception); } internal void SetNotificationForWaitCompletion(bool enabled) { m_builder.SetNotificationForWaitCompletion(enabled); } } public struct AsyncTaskMethodBuilder<TResult> : IAsyncMethodBuilder { internal static readonly TaskCompletionSource<TResult> s_defaultResultTask; private System.Runtime.CompilerServices.AsyncMethodBuilderCore m_coreState; private TaskCompletionSource<TResult> m_task; internal TaskCompletionSource<TResult> CompletionSource { get { TaskCompletionSource<TResult> val = m_task; if (val == null) { val = (m_task = new TaskCompletionSource<TResult>()); } return val; } } public Task<TResult> Task => CompletionSource.Task; private object ObjectIdForDebugger => Task; static AsyncTaskMethodBuilder() { s_defaultResultTask = AsyncMethodTaskCache<TResult>.CreateCompleted(default(TResult)); try { AsyncVoidMethodBuilder.PreventUnobservedTaskExceptions(); } catch { } } public static AsyncTaskMethodBuilder<TResult> Create() { return default(AsyncTaskMethodBuilder<TResult>); } [DebuggerStepThrough] public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { m_coreState.Start(ref stateMachine); } public void SetStateMachine(IAsyncStateMachine stateMachine) { m_coreState.SetStateMachine(stateMachine); } void IAsyncMethodBuilder.PreBoxInitialization() { _ = Task; } public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { try { Action completionAction = m_coreState.GetCompletionAction(ref this, ref stateMachine); awaiter.OnCompleted(completionAction); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } } [SecuritySafeCritical] public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { try { Action completionAction = m_coreState.GetCompletionAction(ref this, ref stateMachine); awaiter.UnsafeOnCompleted(completionAction); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } } public void SetResult(TResult result) { TaskCompletionSource<TResult> task = m_task; if (task == null) { m_task = GetTaskForResult(result); } else if (!task.TrySetResult(result)) { throw new InvalidOperationException("The Task was already completed."); } } internal void SetResult(TaskCompletionSource<TResult> completedTask) { if (m_task == null) { m_task = completedTask; } else { SetResult(default(TResult)); } } public void SetException(Exception exception) { if (exception == null) { throw new ArgumentNullException("exception"); } TaskCompletionSource<TResult> completionSource = CompletionSource; if (!((exception is OperationCanceledException) ? completionSource.TrySetCanceled() : completionSource.TrySetException(exception))) { throw new InvalidOperationException("The Task was already completed."); } } internal void SetNotificationForWaitCompletion(bool enabled) { } private TaskCompletionSource<TResult> GetTaskForResult(TResult result) { AsyncMethodTaskCache<TResult> singleton = AsyncMethodTaskCache<TResult>.Singleton; if (singleton == null) { return AsyncMethodTaskCache<TResult>.CreateCompleted(result); } return singleton.FromResult(result); } } public struct AsyncVoidMethodBuilder : IAsyncMethodBuilder { private readonly SynchronizationContext m_synchronizationContext; private System.Runtime.CompilerServices.AsyncMethodBuilderCore m_coreState; private object m_objectIdForDebugger; private static int s_preventUnobservedTaskExceptionsInvoked; private object ObjectIdForDebugger => m_objectIdForDebugger ?? (m_objectIdForDebugger = new object()); static AsyncVoidMethodBuilder() { try { PreventUnobservedTaskExceptions(); } catch { } } private AsyncVoidMethodBuilder(SynchronizationContext synchronizationContext) { m_synchronizationContext = synchronizationContext; synchronizationContext?.OperationStarted(); m_coreState = default(System.Runtime.CompilerServices.AsyncMethodBuilderCore); m_objectIdForDebugger = null; } internal static void PreventUnobservedTaskExceptions() { if (Interlocked.CompareExchange(ref s_preventUnobservedTaskExceptionsInvoked, 1, 0) == 0) { TaskScheduler.UnobservedTaskException += delegate(object s, UnobservedTaskExceptionEventArgs e) { e.SetObserved(); }; } } public static AsyncVoidMethodBuilder Create() { return new AsyncVoidMethodBuilder(SynchronizationContext.Current); } [DebuggerStepThrough] public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { m_coreState.Start(ref stateMachine); } public void SetStateMachine(IAsyncStateMachine stateMachine) { m_coreState.SetStateMachine(stateMachine); } void IAsyncMethodBuilder.PreBoxInitialization() { } public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { try { Action completionAction = m_coreState.GetCompletionAction(ref this, ref stateMachine); awaiter.OnCompleted(completionAction); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } } [SecuritySafeCritical] public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { try { Action completionAction = m_coreState.GetCompletionAction(ref this, ref stateMachine); awaiter.UnsafeOnCompleted(completionAction); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } } public void SetResult() { if (m_synchronizationContext != null) { NotifySynchronizationContextOfCompletion(); } } public void SetException(Exception exception) { if (exception == null) { throw new ArgumentNullException("exception"); } if (m_synchronizationContext != null) { try { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, m_synchronizationContext); return; } finally { NotifySynchronizationContextOfCompletion(); } } System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } private void NotifySynchronizationContextOfCompletion() { try { m_synchronizationContext.OperationCompleted(); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } } } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerFilePathAttribute : Attribute { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public CallerFilePathAttribute() { } } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerLineNumberAttribute : Attribute { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public CallerLineNumberAttribute() { } } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerMemberNameAttribute : Attribute { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public CallerMemberNameAttribute() { } } public struct ConfiguredTaskAwaitable<TResult> { public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion { private readonly Task<TResult> m_task; private readonly bool m_continueOnCapturedContext; public bool IsCompleted => ((Task)m_task).IsCompleted; internal ConfiguredTaskAwaiter(Task<TResult> task, bool continueOnCapturedContext) { m_task = task; m_continueOnCapturedContext = continueOnCapturedContext; } public void OnCompleted(Action continuation) { TaskAwaiter.OnCompletedInternal((Task)(object)m_task, continuation, m_continueOnCapturedContext); } [SecurityCritical] public void UnsafeOnCompleted(Action continuation) { TaskAwaiter.OnCompletedInternal((Task)(object)m_task, continuation, m_continueOnCapturedContext); } public TResult GetResult() { TaskAwaiter.ValidateEnd((Task)(object)m_task); return m_task.Result; } } private readonly ConfiguredTaskAwaiter m_configuredTaskAwaiter; internal ConfiguredTaskAwaitable(Task<TResult> task, bool continueOnCapturedContext) { m_configuredTaskAwaiter = new ConfiguredTaskAwaiter(task, continueOnCapturedContext); } public ConfiguredTaskAwaiter GetAwaiter() { return m_configuredTaskAwaiter; } } public struct ConfiguredTaskAwaitable { public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion { private readonly Task m_task; private readonly bool m_continueOnCapturedContext; public bool IsCompleted => m_task.IsCompleted; internal ConfiguredTaskAwaiter(Task task, bool continueOnCapturedContext) { m_task = task; m_continueOnCapturedContext = continueOnCapturedContext; } public void OnCompleted(Action continuation) { TaskAwaiter.OnCompletedInternal(m_task, continuation, m_continueOnCapturedContext); } [SecurityCritical] public void UnsafeOnCompleted(Action continuation) { TaskAwaiter.OnCompletedInternal(m_task, continuation, m_continueOnCapturedContext); } public void GetResult() { TaskAwaiter.ValidateEnd(m_task); } } private readonly ConfiguredTaskAwaiter m_configuredTaskAwaiter; internal ConfiguredTaskAwaitable(Task task, bool continueOnCapturedContext) { m_configuredTaskAwaiter = new ConfiguredTaskAwaiter(task, continueOnCapturedContext); } public ConfiguredTaskAwaiter GetAwaiter() { return m_configuredTaskAwaiter; } } internal interface IAsyncMethodBuilder { void PreBoxInitialization(); } public interface IAsyncStateMachine { void MoveNext(); void SetStateMachine(IAsyncStateMachine stateMachine); } public interface ICriticalNotifyCompletion : INotifyCompletion { [SecurityCritical] void UnsafeOnCompleted(Action continuation); } public interface INotifyCompletion { void OnCompleted(Action continuation); } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class IteratorStateMachineAttribute : StateMachineAttribute { public IteratorStateMachineAttribute(Type stateMachineType) : base(stateMachineType) { } } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class StateMachineAttribute : Attribute { public Type StateMachineType { get; private set; } public StateMachineAttribute(Type stateMachineType) { StateMachineType = stateMachineType; } } public struct TaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion { private static readonly MethodInfo s_prepForRemoting; private static readonly object[] s_emptyParams; internal const bool CONTINUE_ON_CAPTURED_CONTEXT_DEFAULT = true; private const string InvalidOperationException_TaskNotCompleted = "The task has not yet completed."; private readonly Task m_task; public bool IsCompleted => m_task.IsCompleted; private static bool IsValidLocationForInlining { get { SynchronizationContext current = SynchronizationContext.Current; if (current != null && (object)current.GetType() != typeof(SynchronizationContext)) { return false; } return TaskScheduler.Current == TaskScheduler.Default; } } static TaskAwaiter() { s_prepForRemoting = GetPrepForRemotingMethodInfo(); s_emptyParams = new object[0]; } internal TaskAwaiter(Task task) { m_task = task; } public void OnCompleted(Action continuation) { OnCompletedInternal(m_task, continuation, continueOnCapturedContext: true); } [SecurityCritical] public void UnsafeOnCompleted(Action continuation) { OnCompletedInternal(m_task, continuation, continueOnCapturedContext: true); } public void GetResult() { ValidateEnd(m_task); } internal static void ValidateEnd(Task task) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)task.Status != 5) { HandleNonSuccess(task); } } private static void HandleNonSuccess(Task task) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Invalid comparison between Unknown and I4 if (!task.IsCompleted) { try { task.Wait(); } catch { } } if ((int)task.Status != 5) { ThrowForNonSuccess(task); } } private static void ThrowForNonSuccess(Task task) { //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_0009: Invalid comparison between Unknown and I4 //IL_0012: 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_000d: Invalid comparison between Unknown and I4 TaskStatus status = task.Status; if ((int)status != 6) { if ((int)status == 7) { throw PrepareExceptionForRethrow(((Exception)(object)task.Exception).InnerException); } throw new InvalidOperationException("The task has not yet completed."); } throw new TaskCanceledException(task); } internal static void OnCompletedInternal(Task task, Action continuation, bool continueOnCapturedContext) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) if (continuation == null) { throw new ArgumentNullException("continuation"); } SynchronizationContext syncContext = (continueOnCapturedContext ? SynchronizationContext.Current : null); if (syncContext != null && (object)syncContext.GetType() != typeof(SynchronizationContext)) { task.ContinueWith((Action<Task>)delegate { try { syncContext.Post(delegate(object state) { ((Action)state)(); }, continuation); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } }, CancellationToken.None, (TaskContinuationOptions)524288, TaskScheduler.Default); return; } TaskScheduler val = (continueOnCapturedContext ? TaskScheduler.Current : TaskScheduler.Default); if (task.IsCompleted) { Task.Factory.StartNew((Action<object>)delegate(object state) { ((Action)state)(); }, (object)continuation, CancellationToken.None, (TaskCreationOptions)0, val); return; } if (val != TaskScheduler.Default) { task.ContinueWith((Action<Task>)delegate { RunNoException(continuation); }, CancellationToken.None, (TaskContinuationOptions)524288, val); return; } task.ContinueWith((Action<Task>)delegate { //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (IsValidLocationForInlining) { RunNoException(continuation); } else { Task.Factory.StartNew((Action<object>)delegate(object state) { RunNoException((Action)state); }, (object)continuation, CancellationToken.None, (TaskCreationOptions)0, TaskScheduler.Default); } }, CancellationToken.None, (TaskContinuationOptions)524288, TaskScheduler.Default); } private static void RunNoException(Action continuation) { try { continuation(); } catch (Exception exception) { System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync(exception, null); } } internal static Exception PrepareExceptionForRethrow(Exception exc) { if ((object)s_prepForRemoting != null) { try { s_prepForRemoting.Invoke(exc, s_emptyParams); } catch { } } return exc; } private static MethodInfo GetPrepForRemotingMethodInfo() { try { return typeof(Exception).GetMethod("PrepForRemoting", BindingFlags.Instance | BindingFlags.NonPublic); } catch { return null; } } } public struct TaskAwaiter<TResult> : ICriticalNotifyCompletion, INotifyCompletion { private readonly Task<TResult> m_task; public bool IsCompleted => ((Task)m_task).IsCompleted; internal TaskAwaiter(Task<TResult> task) { m_task = task; } public void OnCompleted(Action continuation) { TaskAwaiter.OnCompletedInternal((Task)(object)m_task, continuation, continueOnCapturedContext: true); } [SecurityCritical] public void UnsafeOnCompleted(Action continuation) { TaskAwaiter.OnCompletedInternal((Task)(object)m_task, continuation, continueOnCapturedContext: true); } public TResult GetResult() { TaskAwaiter.ValidateEnd((Task)(object)m_task); return m_task.Result; } } [StructLayout(LayoutKind.Sequential, Size = 1)] internal struct VoidTaskResult { } [StructLayout(LayoutKind.Sequential, Size = 1)] public struct YieldAwaitable { [StructLayout(LayoutKind.Sequential, Size = 1)] public struct YieldAwaiter : ICriticalNotifyCompletion, INotifyCompletion { private static readonly Task s_completed; public bool IsCompleted => false; static YieldAwaiter() { s_completed = (Task)(object)TaskEx.FromResult(0); } public void OnCompleted(Action continuation) { s_completed.GetAwaiter().OnCompleted(continuation); } [SecurityCritical] public void UnsafeOnCompleted(Action continuation) { s_completed.GetAwaiter().UnsafeOnCompleted(continuation); } public void GetResult() { } } public YieldAwaiter GetAwaiter() { return default(YieldAwaiter); } } }
BepInEx/plugins/CrowdControl/ConnectorLib.JSON.dll
Decompiled 2 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security; using System.Security.Permissions; using System.Threading; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("Warp World, Inc.")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("© 2026 Warp World, Inc.")] [assembly: AssemblyFileVersion("5.0.9776.24445")] [assembly: AssemblyInformationalVersion("5.0.9776.24445+90c600e1db2ff53dd548283d7fc60b5af3e3ec86")] [assembly: AssemblyProduct("ConnectorLib.JSON")] [assembly: AssemblyTitle("ConnectorLib.JSON")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("5.0.9776.24445")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [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] [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] [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 ConnectorLib.JSON { public class CamelCaseStringEnumConverter : JsonConverter<Enum> { public override void WriteJson(JsonWriter writer, Enum? value, JsonSerializer serializer) { if (value == null) { serializer.Serialize(writer, (object)null); } else { serializer.Serialize(writer, (object)value.ToCamelCase()); } } public override Enum ReadJson(JsonReader reader, Type objectType, Enum? existingValue, bool hasExistingValue, JsonSerializer serializer) { return ReadJToken(JToken.ReadFrom(reader), objectType); } public static Enum ReadJToken(JToken reader, Type objectType) { //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_0009: Invalid comparison between Unknown and I4 //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 JTokenType type = reader.Type; if ((int)type != 6) { if ((int)type == 8) { string text = Extensions.Value<string>((IEnumerable<JToken>)reader); if (text == null) { throw new SerializationException("The value was null."); } try { return (Enum)Enum.Parse(objectType, text, ignoreCase: true); } catch (Exception) { throw new SerializationException("The value was not recognized."); } } throw new SerializationException("The value was not a string or number."); } int? num = Extensions.Value<int>((IEnumerable<JToken>)reader); if (!num.HasValue) { throw new SerializationException("The value was null."); } return (Enum)Enum.ToObject(objectType, num.Value); } } public class DataRequest : SimpleJSONRequest { public string key; public DataRequest(string key) { this.key = key; type = RequestType.DataRequest; } } public class DataResponse : SimpleJSONResponse { public string key; public JToken? value; public EffectStatus status; public long timeRemaining; public string? message; [JsonConstructor] public DataResponse(string key, EffectStatus status, object? value = null, long timeRemaining = 0L, string? message = null) { this.key = key; this.value = value.IfNotNull((Func<object, JToken?>)JToken.FromObject); this.status = status; this.timeRemaining = timeRemaining; this.message = message; type = ResponseType.DataResponse; } public static DataResponse SuccessIfDefined(string key, object? value, string failMessage = "") { if (value == null) { return Retry(key, 0L, failMessage); } if (value is string input && input.IsNullOrWhiteSpace()) { return Retry(key, 0L, failMessage); } return Success(key, value); } public static DataResponse Success(string key, object? value) { return new DataResponse(key, EffectStatus.Success, value, 0L); } public static DataResponse Success(string key, object? value, string? message) { return new DataResponse(key, EffectStatus.Success, value, 0L, message); } public static DataResponse Failure(string key) { return new DataResponse(key, EffectStatus.Failure, null, 0L); } public static DataResponse Failure(string key, string? message) { return new DataResponse(key, EffectStatus.Failure, null, 0L, message); } public static DataResponse Failure(string key, object? value, string? message = null) { return new DataResponse(key, EffectStatus.Failure, value, 0L, message); } public static DataResponse Retry(string key, long delay = 0L, string? message = null) { return new DataResponse(key, EffectStatus.Retry, null, delay, message); } } public class EffectRequest : SimpleJSONRequest { public class Target { public string? service; public string? id; public string? name; public string? avatar; } public string? code; public string? message; public JToken? parameters; public uint? quantity; public JArray? targets; public long? duration; public string? viewer; public JArray? viewers; public long? cost; public Dictionary<string, object?>? arguments; public Guid? requestID; [JsonConverter(typeof(IEffectSourceDetails.Converter))] public IEffectSourceDetails? sourceDetails; public EffectRequest() { type = RequestType.EffectStart; } } public class EffectResponse : SimpleJSONResponse { private class MetadataConverter : JsonConverter<Dictionary<string, DataResponse>?> { public override void WriteJson(JsonWriter writer, Dictionary<string, DataResponse>? value, JsonSerializer serializer) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown if (value == null) { serializer.Serialize(writer, (object)null); return; } JObject val = new JObject(); foreach (KeyValuePair<string, DataResponse> item in value) { JObject val2 = JObject.FromObject((object)item.Value); val2.Remove("key"); val[item.Key] = (JToken)(object)val2; } serializer.Serialize(writer, (object)val); } public override Dictionary<string, DataResponse>? ReadJson(JsonReader reader, Type objectType, Dictionary<string, DataResponse>? existingValue, bool hasExistingValue, JsonSerializer serializer) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown JObject val = (JObject)serializer.Deserialize(reader); if (val == null) { return null; } Dictionary<string, DataResponse> dictionary = new Dictionary<string, DataResponse>(); foreach (JProperty item in val.Properties()) { JObject val2 = (JObject)item.Value; val2["key"] = JToken.op_Implicit(item.Name); dictionary.Add(item.Name, ((JToken)val2).ToObject<DataResponse>()); } return dictionary; } } public EffectStatus status; public string? message; public StandardErrors messageID; public long timeRemaining; [JsonConverter(typeof(MetadataConverter))] public Dictionary<string, DataResponse>? metadata; public EffectResponse() { } public EffectResponse(uint id, EffectStatus status) : this(id, status, 0L) { } public EffectResponse(uint id, EffectStatus status, StandardErrors messageID, string? message = null) : this(id, status, 0L, messageID, message) { } public EffectResponse(uint id, EffectStatus status, string? message) : this(id, status, 0L, message) { } public EffectResponse(uint id, EffectStatus status, TimeSpan timeRemaining) : this(id, status, checked((long)timeRemaining.TotalMilliseconds)) { } public EffectResponse(uint id, EffectStatus status, TimeSpan timeRemaining, StandardErrors messageID) : this(id, status, checked((long)timeRemaining.TotalMilliseconds), messageID) { } public EffectResponse(uint id, EffectStatus status, TimeSpan timeRemaining, string? message) : this(id, status, checked((long)timeRemaining.TotalMilliseconds), message) { } public EffectResponse(uint id, EffectStatus status, long timeRemaining, string? message = null) { base.id = id; this.status = status; this.timeRemaining = timeRemaining; this.message = message; type = ResponseType.EffectRequest; } [JsonConstructor] public EffectResponse(uint id, EffectStatus status, long timeRemaining, StandardErrors messageID, string? message = null) { base.id = id; this.status = status; this.timeRemaining = timeRemaining; this.messageID = messageID; this.message = message; type = ResponseType.EffectRequest; } public static EffectResponse Success(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Success, message); } public static EffectResponse Success(uint id, long delay, string? message = null) { return new EffectResponse(id, EffectStatus.Success, delay, message); } public static EffectResponse Success(uint id, TimeSpan delay, string? message = null) { return new EffectResponse(id, EffectStatus.Success, delay, message); } public static EffectResponse Failure(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Failure, message); } public static EffectResponse Failure(uint id, StandardErrors error, string? message = null) { return new EffectResponse(id, EffectStatus.Failure, error, message); } public static EffectResponse Unavailable(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Unavailable, message); } public static EffectResponse Unavailable(uint id, StandardErrors error) { return new EffectResponse(id, EffectStatus.Unavailable, error); } public static EffectResponse Retry(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Retry, 0L, message); } public static EffectResponse Retry(uint id, long delay, string? message = null) { return new EffectResponse(id, EffectStatus.Retry, delay, message); } public static EffectResponse Retry(uint id, TimeSpan delay, string? message = null) { return new EffectResponse(id, EffectStatus.Retry, delay, message); } public static EffectResponse Retry(uint id, StandardErrors error) { return new EffectResponse(id, EffectStatus.Retry, 0L, error); } public static EffectResponse Retry(uint id, long delay, StandardErrors error) { return new EffectResponse(id, EffectStatus.Retry, delay, error); } public static EffectResponse Retry(uint id, TimeSpan delay, StandardErrors error) { return new EffectResponse(id, EffectStatus.Retry, delay, error); } public static EffectResponse Paused(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Paused, 0L, message); } public static EffectResponse Paused(uint id, long timeRemaining, string? message = null) { return new EffectResponse(id, EffectStatus.Paused, timeRemaining, message); } public static EffectResponse Paused(uint id, TimeSpan timeRemaining, string? message = null) { return new EffectResponse(id, EffectStatus.Paused, timeRemaining, message); } public static EffectResponse Paused(uint id, StandardErrors error) { return new EffectResponse(id, EffectStatus.Paused, 0L, error); } public static EffectResponse Paused(uint id, long timeRemaining, StandardErrors error) { return new EffectResponse(id, EffectStatus.Paused, timeRemaining, error); } public static EffectResponse Paused(uint id, TimeSpan timeRemaining, StandardErrors error) { return new EffectResponse(id, EffectStatus.Paused, timeRemaining, error); } public static EffectResponse Resumed(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Resumed, 0L, message); } public static EffectResponse Resumed(uint id, long timeRemaining, string? message = null) { return new EffectResponse(id, EffectStatus.Resumed, timeRemaining, message); } public static EffectResponse Resumed(uint id, TimeSpan timeRemaining, string? message = null) { return new EffectResponse(id, EffectStatus.Resumed, timeRemaining, message); } public static EffectResponse Resumed(uint id, StandardErrors error) { return new EffectResponse(id, EffectStatus.Resumed, 0L, error); } public static EffectResponse Resumed(uint id, long timeRemaining, StandardErrors error) { return new EffectResponse(id, EffectStatus.Resumed, timeRemaining, error); } public static EffectResponse Resumed(uint id, TimeSpan timeRemaining, StandardErrors error) { return new EffectResponse(id, EffectStatus.Resumed, timeRemaining, error); } public static EffectResponse Finished(uint id, string? message = null) { return new EffectResponse(id, EffectStatus.Finished, 0L, message); } public static EffectResponse Finished(uint id, StandardErrors error) { return new EffectResponse(id, EffectStatus.Finished, 0L, error); } } public interface IEffectSourceDetails { public class Converter : JsonConverter<IEffectSourceDetails?> { public static readonly Converter Instance = new Converter(); public override IEffectSourceDetails? ReadJson(JsonReader reader, Type objectType, IEffectSourceDetails? existingValue, bool hasExistingValue, JsonSerializer serializer) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)reader.TokenType == 11) { return null; } JObject val = JObject.Load(reader); JToken obj = val["type"]; return ((obj != null) ? Extensions.Value<string>((IEnumerable<JToken>)obj) : null) switch { "twitch-channel-reward" => ((JToken)val).ToObject<TwitchChannelRewardSourceDetails>(), "stream-labs-donation" => ((JToken)val).ToObject<StreamLabsDonationSourceDetails>(), "event-hype-train" => ((JToken)val).ToObject<HypeTrainSourceDetails>(), "tiktok-gift" => ((JToken)val).ToObject<TikTokGiftSourceDetails>(), "tiktok-like" => ((JToken)val).ToObject<TikTokLikeSourceDetails>(), "tiktok-follow" => ((JToken)val).ToObject<TikTokFollowSourceDetails>(), "tiktok-share" => ((JToken)val).ToObject<TikTokShareSourceDetails>(), "pulsoid-trigger" => ((JToken)val).ToObject<PulsoidTriggerSourceDetails>(), "crowd-control-test" => ((JToken)val).ToObject<CrowdControlTestSourceDetails>(), "crowd-control-chaos-mode" => ((JToken)val).ToObject<CrowdControlChaosModeSourceDetails>(), "crowd-control-retry" => ((JToken)val).ToObject<CrowdControlRetrySourceDetails>(), _ => null, }; } public override void WriteJson(JsonWriter writer, IEffectSourceDetails? value, JsonSerializer serializer) { serializer.Serialize(writer, (object)((value == null) ? null : JObject.FromObject((object)value))); } } [JsonProperty("type")] string Type { get; } } public class TwitchChannelRewardSourceDetails : IEffectSourceDetails { [JsonProperty("type")] public string Type => "twitch-channel-reward"; [JsonProperty("rewardID")] public string RewardID { get; set; } [JsonProperty("redemptionID")] public string RedemptionID { get; set; } [JsonProperty("twitchID")] public string TwitchID { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("cost")] public int Cost { get; set; } } public class StreamLabsDonationSourceDetails : IEffectSourceDetails { [JsonProperty("type")] public string Type => "stream-labs-donation"; [JsonProperty("donationID")] public string DonationID { get; set; } [JsonProperty("cost")] public string Cost { get; set; } [JsonProperty("currency")] public string Currency { get; set; } [JsonProperty("name")] public string? Name { get; set; } [JsonProperty("message")] public string? Message { get; set; } } public class HypeTrainSourceDetails : IEffectSourceDetails { public class Contribution { [JsonProperty("user_id")] public string UserID { get; set; } [JsonProperty("user_login")] public string UserLogin { get; set; } [JsonProperty("user_name")] public string UserName { get; set; } [JsonProperty("type")] public string Type { get; set; } [JsonProperty("total")] public int Total { get; set; } } [JsonProperty("type")] public string Type => "event-hype-train"; [JsonProperty("total")] public int Total { get; set; } [JsonProperty("progress")] public int Progress { get; set; } [JsonProperty("goal")] public int Goal { get; set; } [JsonProperty("top_contributions")] public List<Contribution> TopContributions { get; set; } [JsonProperty("last_contribution")] public Contribution LastContribution { get; set; } [JsonProperty("level")] public int Level { get; set; } } public abstract class TikTokSourceDetails : IEffectSourceDetails { [JsonProperty("type")] public abstract string Type { get; } [JsonProperty("cost")] public int Cost { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("userID")] public string UserID { get; set; } } public class TikTokGiftSourceDetails : TikTokSourceDetails { [JsonProperty("type")] public override string Type => "tiktok-gift"; [JsonProperty("giftID")] public int GiftID { get; set; } [JsonProperty("giftName")] public string GiftName { get; set; } [JsonProperty("transactionID")] public string? TransactionID { get; set; } } public class TikTokLikeSourceDetails : TikTokSourceDetails { [JsonProperty("type")] public override string Type => "tiktok-like"; } public class TikTokFollowSourceDetails : TikTokSourceDetails { [JsonProperty("type")] public override string Type => "tiktok-follow"; } public class TikTokShareSourceDetails : TikTokSourceDetails { [JsonProperty("type")] public override string Type => "tiktok-share"; } public class PulsoidTriggerSourceDetails : IEffectSourceDetails { [JsonProperty("type")] public string Type => "pulsoid-trigger"; [JsonProperty("heartRate")] public int HeartRate { get; set; } [JsonProperty("uuid")] public Guid Uuid { get; set; } [JsonProperty("triggerType")] public string TriggerType { get; set; } [JsonProperty("targetHeartRate")] public int TargetHeartRate { get; set; } [JsonProperty("holdTime")] public int HoldTime { get; set; } [JsonProperty("cooldown")] public int Cooldown { get; set; } } public class CrowdControlTestSourceDetails : IEffectSourceDetails { [JsonProperty("type")] public string Type => "crowd-control-test"; } public class CrowdControlChaosModeSourceDetails : IEffectSourceDetails { [JsonProperty("type")] public string Type => "crowd-control-chaos-mode"; } public class CrowdControlRetrySourceDetails : IEffectSourceDetails { [JsonProperty("type")] public string Type => "crowd-control-retry"; } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum EffectStatus { Success = 0, Failure = 1, Unavailable = 2, Retry = 3, Queue = 4, Running = 5, Paused = 6, Resumed = 7, Finished = 8, Wait = 9, RemoteScheduled = 10, Visible = 128, NotVisible = 129, Selectable = 130, NotSelectable = 131, Reserved0 = 160, NotReady = 255 } public class EffectUpdate : SimpleJSONResponse { [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum IdentifierType { Effect, Group, Category } [Obsolete("This field is deprecated. Please use the ids field instead.")] [JsonProperty(/*Could not decode attribute arguments.*/)] public string? code; [JsonProperty(/*Could not decode attribute arguments.*/)] public string[]? ids; public IdentifierType idType; public EffectStatus status; public string? message; public EffectUpdate() { } public EffectUpdate(string id, EffectStatus status, string? message = null) { ids = new string[1] { id }; idType = IdentifierType.Effect; this.status = status; this.message = message; type = ResponseType.EffectStatus; } public EffectUpdate(string id, IdentifierType idType, EffectStatus status, string? message = null) { ids = new string[1] { id }; this.idType = idType; this.status = status; this.message = message; type = ResponseType.EffectStatus; } public EffectUpdate(string[] ids, EffectStatus status, string? message = null) { this.ids = ids; idType = IdentifierType.Effect; this.status = status; this.message = message; type = ResponseType.EffectStatus; } public EffectUpdate(string[] ids, IdentifierType idType, EffectStatus status, string? message = null) { this.ids = ids; this.idType = idType; this.status = status; this.message = message; type = ResponseType.EffectStatus; } public EffectUpdate(IEnumerable<string> ids, EffectStatus status, string? message = null) { this.ids = ids.ToArray(); idType = IdentifierType.Effect; this.status = status; this.message = message; type = ResponseType.EffectStatus; } public EffectUpdate(IEnumerable<string> ids, IdentifierType idType, EffectStatus status, string? message = null) { this.ids = ids.ToArray(); this.idType = idType; this.status = status; this.message = message; type = ResponseType.EffectStatus; } } public class EmptyRequest : SimpleJSONRequest { } public class EmptyResponse : SimpleJSONResponse { } internal static class EnumEx { internal static string ToCamelCase(this Enum value) { return value.ToString("G").ToCamelCase(); } } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum GameState { Unknown = 0, Error = -1, Unmodded = -2, BadGameSettings = -3, WrongVersion = -4, NotFocused = -5, Loading = -6, InLevel = 1, [Obsolete("Use InLevel instead. This state is redundant and does not provide any additional information about the game state.")] Ready = 1, TitleScreen = -17, Credits = -18, Menu = -13, Paused = -7, WrongMode = -8, SafeArea = -9, StartingArea = -19, Dialogue = -20, Cutscene = -11, BadPlayerState = -12, InputLocked = -21, Map = -14, UntimedArea = -10, InCombat = -15, NotInCombat = -16, PipelineBusy = -128, NotReady = int.MinValue } public class GameUpdate : SimpleJSONResponse { public GameState state; public string? message; public GameUpdate(GameState state, string? message = null) { this.state = state; this.message = message; type = ResponseType.GameUpdate; } } public class GenericEventRequest : SimpleJSONRequest { [JsonProperty(PropertyName = "internal")] public bool @internal; public string eventType; public Dictionary<string, object?>? data; public GenericEventRequest(string eventType) { type = RequestType.GenericEvent; this.eventType = eventType; } [JsonConstructor] public GenericEventRequest(string eventType, IEnumerable<KeyValuePair<string, object?>>? data) : this(eventType) { this.data = ((data != null) ? data.ToDictionary() : null); } [JsonConstructor] public GenericEventRequest(string eventType, IEnumerable<KeyValuePair<string, object?>>? data, bool @internal) : this(eventType, data) { this.@internal = @internal; } } public class GenericEventResponse : SimpleJSONResponse { [JsonProperty(PropertyName = "internal")] public bool @internal; public string eventType; public Dictionary<string, object?>? data; public GenericEventResponse(string eventType) { type = ResponseType.GenericEvent; this.eventType = eventType; } public GenericEventResponse(string eventType, IEnumerable<KeyValuePair<string, object>>? data, bool @internal = false) : this(eventType) { this.data = ((data != null) ? data.ToDictionary() : null); this.@internal = @internal; } [JsonConstructor] public GenericEventResponse(string eventType, Dictionary<string, object>? data, [JsonProperty(PropertyName = "internal")] bool @internal) : this(eventType, data) { this.@internal = @internal; } } internal class HexColorConverter : JsonConverter<ParameterColorValue> { private static readonly Dictionary<char, byte> CHAR_LOOKUP = new Dictionary<char, byte> { { '0', 0 }, { '1', 1 }, { '2', 2 }, { '3', 3 }, { '4', 4 }, { '5', 5 }, { '6', 6 }, { '7', 7 }, { '8', 8 }, { '9', 9 }, { 'A', 10 }, { 'B', 11 }, { 'C', 12 }, { 'D', 13 }, { 'E', 14 }, { 'F', 15 } }; public override void WriteJson(JsonWriter writer, ParameterColorValue value, JsonSerializer serializer) { serializer.Serialize(writer, (object)string.Format("#{0}{1:X2}{2:X2}{3:X2}", (value.A != byte.MaxValue) ? value.A.ToString("X2") : string.Empty, value.R, value.G, value.B)); } public override ParameterColorValue ReadJson(JsonReader reader, Type objectType, ParameterColorValue existingValue, bool hasExistingValue, JsonSerializer serializer) { if (TryParse(serializer.Deserialize<string>(reader), out var color)) { return color; } throw new SerializationException("Unrecognized color code."); } public static bool TryParse(string? value, out ParameterColorValue color) { if (value == null) { color = default(ParameterColorValue); return false; } value = value.TrimStart(new char[1] { '#' }); switch (value.Length) { case 6: { string[] array2 = value.Chop(2); byte result2; byte red3 = (byte)(byte.TryParse(array2[0], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result2) ? result2 : 0); byte green3 = (byte)(byte.TryParse(array2[1], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result2) ? result2 : 0); byte blue3 = (byte)(byte.TryParse(array2[2], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result2) ? result2 : 0); color = ParameterColorValue.FromArgb(red3, green3, blue3); return true; } case 8: { string[] array = value.Chop(2); byte result; byte alpha2 = (byte)(byte.TryParse(array[0], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); byte red2 = (byte)(byte.TryParse(array[1], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); byte green2 = (byte)(byte.TryParse(array[2], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); byte blue2 = (byte)(byte.TryParse(array[3], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); color = ParameterColorValue.FromArgb(alpha2, red2, green2, blue2); return true; } case 3: { byte value3; byte red4 = (byte)(CHAR_LOOKUP.TryGetValue(value[0], out value3) ? checked((byte)(value3 * 16)) : 0); byte green4 = (byte)(CHAR_LOOKUP.TryGetValue(value[1], out value3) ? checked((byte)(value3 * 16)) : 0); byte blue4 = (byte)(CHAR_LOOKUP.TryGetValue(value[2], out value3) ? checked((byte)(value3 * 16)) : 0); color = ParameterColorValue.FromArgb(red4, green4, blue4); return true; } case 4: { byte value2; byte alpha = (byte)(CHAR_LOOKUP.TryGetValue(value[0], out value2) ? checked((byte)(value2 * 16)) : 0); byte red = (byte)(CHAR_LOOKUP.TryGetValue(value[1], out value2) ? checked((byte)(value2 * 16)) : 0); byte green = (byte)(CHAR_LOOKUP.TryGetValue(value[2], out value2) ? checked((byte)(value2 * 16)) : 0); byte blue = (byte)(CHAR_LOOKUP.TryGetValue(value[3], out value2) ? checked((byte)(value2 * 16)) : 0); color = ParameterColorValue.FromArgb(alpha, red, green, blue); return true; } default: color = default(ParameterColorValue); return false; } } } internal static class IEnumerableEx { internal static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> values) where TKey : notnull { Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(); foreach (KeyValuePair<TKey, TValue> value in values) { dictionary.Add(value.Key, value.Value); } return dictionary; } } public interface IParameterValue { string ID { get; } string Name { get; } ParameterBase.ParameterType Type { get; } object? Value { get; } } public class LoginRequest : SimpleJSONRequest { public string? login; public string? password; } public class MessageRequest : SimpleJSONRequest { public string? message; } public class MessageResponse : SimpleJSONResponse { public string? message; } internal static class ObjectEx { internal static T2? IfNotNull<T1, T2>(this T1? value, Func<T1, T2?> selector) where T2 : class { if (value == null) { return null; } return selector(value); } } public abstract class ParameterBase { [JsonConverter(typeof(ParameterTypeConverter))] public enum ParameterType { Options, HexColor } private class ParameterTypeConverter : JsonConverter<ParameterType> { public override void WriteJson(JsonWriter writer, ParameterType value, JsonSerializer serializer) { writer.WriteValue(value switch { ParameterType.Options => "options", ParameterType.HexColor => "hex-color", _ => throw new SerializationException("Unknown parameter type."), }); } public override ParameterType ReadJson(JsonReader reader, Type objectType, ParameterType existingValue, bool hasExistingValue, JsonSerializer serializer) { switch (reader.Value?.ToString().ToLowerInvariant()) { case "options": return ParameterType.Options; case "hexcolor": case "hex-color": return ParameterType.HexColor; default: throw new SerializationException("Unknown parameter type."); } } } [JsonIgnore] public readonly string ID; [JsonProperty(PropertyName = "title")] public readonly string Name; [JsonProperty(PropertyName = "type")] public readonly ParameterType Type; protected ParameterBase(string name, string id, ParameterType type) { ID = id; Name = name; Type = type; } } public class ParameterColor : ParameterBase, IParameterValue { [JsonProperty(PropertyName = "value")] [JsonConverter(typeof(HexColorConverter))] public ParameterColorValue Value; [JsonIgnore] string IParameterValue.ID => ID; [JsonIgnore] string IParameterValue.Name => Name; [JsonIgnore] ParameterType IParameterValue.Type => Type; [JsonIgnore] object? IParameterValue.Value => Value; [JsonConstructor] public ParameterColor(string name, string id, ParameterColorValue value) : base(name, id, ParameterType.HexColor) { Value = value; } [JsonConstructor] public ParameterColor(string name, string id, string value) : base(name, id, ParameterType.HexColor) { if (!HexColorConverter.TryParse(value, out Value)) { throw new ArgumentException("Unknown color code.", "value"); } } } [DebuggerDisplay("{NameAndARGBValue}")] public readonly struct ParameterColorValue : IEquatable<ParameterColorValue> { public static readonly ParameterColorValue Empty; private const short StateARGBValueValid = 2; private const short StateValueMask = 2; private const short StateNameValid = 8; private const long NotDefinedValue = 0L; internal const int ARGBAlphaShift = 24; internal const int ARGBRedShift = 16; internal const int ARGBGreenShift = 8; internal const int ARGBBlueShift = 0; internal const uint ARGBAlphaMask = 4278190080u; internal const uint ARGBRedMask = 16711680u; internal const uint ARGBGreenMask = 65280u; internal const uint ARGBBlueMask = 255u; private readonly long value; private readonly short state; public byte R => (byte)(Value >> 16); public byte G => (byte)(Value >> 8); public byte B => (byte)Value; public byte A => (byte)(Value >> 24); public bool IsEmpty => state == 0; private long Value { get { if ((state & 2) != 0) { return value; } return 0L; } } private ParameterColorValue(long value, short state) { this.value = value; this.state = state; } private static ParameterColorValue FromArgb(uint argb) { return new ParameterColorValue(argb, 2); } public static ParameterColorValue FromArgb(int argb) { return FromArgb((uint)argb); } public static ParameterColorValue FromArgb(byte alpha, byte red, byte green, byte blue) { return FromArgb((uint)((alpha << 24) | (red << 16) | (green << 8) | blue)); } public static ParameterColorValue FromArgb(int alpha, ParameterColorValue baseColor) { return FromArgb(checked(((uint)alpha << 24) | ((uint)baseColor.Value & 0xFFFFFF))); } public static ParameterColorValue FromArgb(byte red, byte green, byte blue) { return FromArgb(byte.MaxValue, red, green, blue); } private void GetRgbValues(out byte r, out byte g, out byte b) { checked { uint num = (uint)Value; r = (byte)((num & 0xFF0000) >> 16); g = (byte)((num & 0xFF00) >> 8); b = (byte)(num & 0xFF); } } public float GetBrightness() { GetRgbValues(out var r, out var g, out var b); int num = Math.Min(Math.Min(r, g), b); return (float)checked(Math.Max(Math.Max(r, g), b) + num) / 510f; } public float GetHue() { GetRgbValues(out var r, out var g, out var b); if (r == g && g == b) { return 0f; } int num = Math.Min(Math.Min(r, g), b); int num2 = Math.Max(Math.Max(r, g), b); checked { float num3 = num2 - num; float num4 = ((r == num2) ? ((float)(g - b) / num3) : ((g != num2) ? ((float)(r - g) / num3 + 4f) : ((float)(b - r) / num3 + 2f))); num4 *= 60f; if (num4 < 0f) { num4 += 360f; } return num4; } } public float GetSaturation() { GetRgbValues(out var r, out var g, out var b); if (r == g && g == b) { return 0f; } int num = Math.Min(Math.Min(r, g), b); int num2 = Math.Max(Math.Max(r, g), b); checked { int num3 = num2 + num; if (num3 > 255) { num3 = 510 - num2 - num; } return (float)(num2 - num) / (float)num3; } } public int ToArgb() { return (int)Value; } public override string ToString() { if ((state & 2) != 0) { return "ParameterColorValue [A=" + A + ", R=" + R + ", G=" + G + ", B=" + B + "]"; } return "ParameterColorValue [Empty]"; } public static bool operator ==(ParameterColorValue left, ParameterColorValue right) { if (left.value == right.value) { return left.state == right.state; } return false; } public static bool operator !=(ParameterColorValue left, ParameterColorValue right) { return !(left == right); } public override bool Equals(object? obj) { if (obj is ParameterColorValue other) { return Equals(other); } return false; } public bool Equals(ParameterColorValue other) { return this == other; } public override int GetHashCode() { long num = value; int num2 = num.GetHashCode() * 397; short num3 = state; return num2 ^ num3.GetHashCode(); } } public class ParameterValue<TValue> : ParameterBase, IParameterValue { [JsonProperty(PropertyName = "value")] public TValue? Value; [JsonIgnore] string IParameterValue.ID => ID; [JsonIgnore] string IParameterValue.Name => Name; [JsonIgnore] ParameterType IParameterValue.Type => Type; [JsonIgnore] object? IParameterValue.Value => Value; [JsonConstructor] public ParameterValue(string name, string id, TValue? value) : base(name, id, ParameterType.Options) { Value = value; } public override string ToString() { return Name; } } public class PlayerInfo : SimpleJSONRequest { public JObject? player; public PlayerInfo() { type = RequestType.PlayerInfo; } } [JsonConverter(typeof(Converter))] public class RequestParameters : IEnumerable<IParameterValue>, IEnumerable { private class Converter : JsonConverter<RequestParameters> { public override void WriteJson(JsonWriter writer, RequestParameters? value, JsonSerializer serializer) { serializer.Serialize(writer, (object)value?._parameters); } public override RequestParameters? ReadJson(JsonReader reader, Type objectType, RequestParameters? existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject obj = JObject.Load(reader); List<IParameterValue> list = new List<IParameterValue>(); foreach (KeyValuePair<string, JToken> item in obj) { string key = item.Key; string name = Extensions.Value<string>((IEnumerable<JToken>)item.Value[(object)"name"]); switch (Extensions.Value<ParameterBase.ParameterType>((IEnumerable<JToken>)item.Value[(object)"type"])) { case ParameterBase.ParameterType.Options: { string value = Extensions.Value<string>((IEnumerable<JToken>)item.Value[(object)"value"]); list.Add(new ParameterValue<string>(name, key, value)); break; } case ParameterBase.ParameterType.HexColor: { if (HexColorConverter.TryParse(Extensions.Value<string>((IEnumerable<JToken>)item.Value[(object)"value"]), out var color)) { list.Add(new ParameterColor(name, key, color)); } break; } default: throw new SerializationException(); } } return new RequestParameters(list); } } private readonly Dictionary<string, IParameterValue> _parameters; private readonly List<string> _parameter_list; public string this[int index] => _parameter_list[index]; public IParameterValue this[string key] => _parameters[key]; public IEnumerable<string> Keys => _parameters.Keys; public IEnumerable<IParameterValue> Values => _parameters.Values; public int Count => _parameters.Count; private RequestParameters() { _parameters = new Dictionary<string, IParameterValue>(); _parameter_list = new List<string>(); } public RequestParameters(IEnumerable<IParameterValue> parameters) { parameters = parameters.ToArray(); _parameters = parameters.ToDictionary((IParameterValue d) => d.ID); _parameter_list = parameters.Select((IParameterValue v) => v.Value.ToString()).ToList(); } public RequestParameters(IEnumerable<KeyValuePair<string, IParameterValue>> parameters) { _parameters = parameters.ToDictionary(); _parameter_list = _parameters.Values.Select((IParameterValue p) => p.Value.ToString()).ToList(); } public IEnumerator<IParameterValue> GetEnumerator() { return _parameters.Values.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public bool ContainsKey(string key) { return _parameters.ContainsKey(key); } public bool TryGetValue(string key, out IParameterValue value) { return _parameters.TryGetValue(key, out value); } public IEnumerable<string> Where(Func<string, bool> predicate) { return ((IEnumerable<string>)this).Where(predicate); } public IEnumerable<TResult> Select<TResult>(Func<string, TResult> selector) { return ((IEnumerable<string>)this).Select(selector); } public IEnumerable<TResult> SelectMany<TResult>(Func<string, IEnumerable<TResult>> selector) { return ((IEnumerable<string>)this).SelectMany(selector); } public IEnumerable<TResult> SelectMany<TResult>(Func<string, int, IEnumerable<TResult>> selector) { return ((IEnumerable<string>)this).SelectMany(selector); } public string First() { return ((IEnumerable<string>)this).First(); } public string First(Func<string, bool> predicate) { return ((IEnumerable<string>)this).First(predicate); } public string? FirstOrDefault() { return ((IEnumerable<string>)this).FirstOrDefault(); } public string FirstOrDefault(string defaultValue) { return ((IEnumerable<string>)this).FirstOrDefault() ?? defaultValue; } public string? FirstOrDefault(Func<string, bool> predicate) { return ((IEnumerable<string>)this).FirstOrDefault(predicate); } public string FirstOrDefault(Func<string, bool> predicate, string defaultValue) { return ((IEnumerable<string>)this).FirstOrDefault(predicate) ?? defaultValue; } public bool Any() { return ((IEnumerable<string>)this).Any(); } public bool Any(Func<string, bool> predicate) { return ((IEnumerable<string>)this).Any(predicate); } } public enum RequestType : byte { EffectTest = 0, EffectStart = 1, EffectStop = 2, [Obsolete("Use EffectTest instead.")] Test = 0, [Obsolete("Use EffectStart instead.")] Start = 1, [Obsolete("Use EffectStop instead.")] Stop = 2, GenericEvent = 16, DataRequest = 32, RpcResponse = 208, PlayerInfo = 224, Login = 240, Version = 252, GameUpdate = 253, KeepAlive = byte.MaxValue } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum ResponseType : byte { EffectRequest = 0, EffectStatus = 1, GenericEvent = 16, LoadEvent = 24, SaveEvent = 25, DataResponse = 32, RpcRequest = 208, Login = 240, LoginSuccess = 241, Version = 252, GameUpdate = 253, Disconnect = 254, KeepAlive = byte.MaxValue } public class RpcRequest : SimpleJSONResponse { public string? method; public object?[]? args; public RpcTarget? target; public RpcRequest() { type = ResponseType.RpcRequest; } } public class RpcResponse : SimpleJSONRequest { public object? value; [JsonProperty(/*Could not decode attribute arguments.*/)] public bool exception; public RpcResponse() { type = RequestType.RpcResponse; } } [Flags] [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum RpcTarget { Game = 1, Pack = 2, Native = 4, Client = 8, Server = 0x10 } public abstract class SimpleJSONMessage { public static readonly JsonSerializerSettings JSON_SERIALIZER_SETTINGS = new JsonSerializerSettings { NullValueHandling = (NullValueHandling)1, MissingMemberHandling = (MissingMemberHandling)0, Formatting = (Formatting)0 }; public static readonly JsonSerializer JSON_SERIALIZER = new JsonSerializer { NullValueHandling = JSON_SERIALIZER_SETTINGS.NullValueHandling, MissingMemberHandling = JSON_SERIALIZER_SETTINGS.MissingMemberHandling, Formatting = JSON_SERIALIZER_SETTINGS.Formatting }; private static int _next_id = 0; public static uint NextID { get { uint result; while ((result = (uint)Interlocked.Increment(ref _next_id)) == 0) { } return result; } } public abstract uint ID { get; } public abstract bool IsKeepAlive { get; } public string Serialize() { return JsonConvert.SerializeObject((object)this, JSON_SERIALIZER_SETTINGS); } } public class SimpleJSONRequest : SimpleJSONMessage { public uint id = SimpleJSONMessage.NextID; public RequestType type; [JsonIgnore] public override uint ID => id; [JsonIgnore] public override bool IsKeepAlive => type == RequestType.KeepAlive; public static bool TryParse(string json, out SimpleJSONRequest? request) { return TryParse(JObject.Parse(json), out request); } public static bool TryParse(JObject j, out SimpleJSONRequest? request) { try { JToken value = j.GetValue("type"); switch ((value != null) ? ((RequestType)(object)CamelCaseStringEnumConverter.ReadJToken(value, typeof(RequestType))) : RequestType.EffectTest) { case RequestType.EffectTest: case RequestType.EffectStart: request = ((JToken)j).ToObject<EffectRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.EffectStop: request = ((JToken)j).ToObject<EffectRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.DataRequest: request = ((JToken)j).ToObject<DataRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.RpcResponse: request = ((JToken)j).ToObject<RpcResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.PlayerInfo: request = ((JToken)j).ToObject<PlayerInfo>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.Login: request = ((JToken)j).ToObject<MessageRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.Version: request = ((JToken)j).ToObject<EmptyRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.GameUpdate: request = ((JToken)j).ToObject<EmptyRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case RequestType.KeepAlive: request = ((JToken)j).ToObject<EmptyRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; } } catch { } request = null; return false; } } public class SimpleJSONResponse : SimpleJSONMessage { public uint id; public ResponseType type; [JsonIgnore] public override uint ID => id; [JsonIgnore] public override bool IsKeepAlive => type == ResponseType.KeepAlive; [JsonIgnore] public static SimpleJSONResponse KeepAlive { get; } = new EmptyResponse { type = ResponseType.KeepAlive }; public static bool TryParse(string json, out SimpleJSONResponse? response) { return TryParse(JObject.Parse(json), out response); } public static bool TryParse(JObject j, out SimpleJSONResponse? response) { try { JToken value = j.GetValue("type"); ResponseType responseType = ((value != null) ? ((ResponseType)(object)CamelCaseStringEnumConverter.ReadJToken(value, typeof(ResponseType))) : ResponseType.EffectRequest); switch (responseType) { case ResponseType.EffectStatus: if (responseType != ResponseType.EffectStatus) { break; } response = ((JToken)j).ToObject<EffectUpdate>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.EffectRequest: response = ((JToken)j).ToObject<EffectResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.RpcRequest: response = ((JToken)j).ToObject<RpcRequest>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.GenericEvent: response = ((JToken)j).ToObject<GenericEventResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.DataResponse: response = ((JToken)j).ToObject<DataResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.Login: response = ((JToken)j).ToObject<EmptyResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.LoginSuccess: response = ((JToken)j).ToObject<EmptyResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.Version: response = ((JToken)j).ToObject<VersionResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.GameUpdate: response = ((JToken)j).ToObject<GameUpdate>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.Disconnect: response = ((JToken)j).ToObject<MessageResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; case ResponseType.KeepAlive: response = ((JToken)j).ToObject<EmptyResponse>(SimpleJSONMessage.JSON_SERIALIZER); return true; } } catch { } response = null; return false; } } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum StandardErrors { Unknown = 0, ExceptionThrown = 1, BadRequest = 4096, EffectUnknown = 4097, [Obsolete("Use EffectUnknown instead.")] UnknownEffect = 4097, EffectDisabled = 4098, AlreadyFailed = 4099, CannotParseNumber = 4112, UnknownSelection = 4113, ConnectorError = 8192, ConnectorReadFailure = 8193, ConnectorWriteFailure = 8194, ConnectorNotConnected = 8195, ConnectorNotSupported = 8196, NoResponse = 8448, SettingsError = 12288, CooldownPerEffect = 12545, CooldownGlobal = 12546, RetryMaxTime = 12291, RetryMaxAttempts = 12292, NoSession = 20480, SessionEnding = 20481, BadGameState = 16384, GameObjectNotFound = 16640, PlayerNotFound = 16641, CharacterNotFound = 16642, EnemyNotFound = 16643, ObjectNotFound = 16644, PrerequisiteNotFound = 16645, ObjectStateError = 16896, AlreadyInState = 16897, AlreadyAcquired = 16898, AlreadyFinished = 16899, NoEmptyContainers = 16912, PartyFull = 16913, InvalidArea = 16928, InvalidTarget = 16929, NoValidTargets = 16930, SpawnNotAllowedHere = 16932, RangeError = 17152, AlreadyMinimum = 17153, AlreadyMaximum = 17154, EffectNotImplemented = 24576, PackResourceMissing = 24577, EmulatorNotSupported = 28672, EmulatorInvalidSetting = 28673, ConflictingEffectRunning = 32768, UnqueueablePending = 32769 } internal static class StringEx { public static bool IsNullOrWhiteSpace(this string? input) { if (input == null) { return true; } for (int i = 0; i < input.Length; i = checked(i + 1)) { if (!char.IsWhiteSpace(input[i])) { return false; } } return true; } internal static string ToCamelCase(this string input) { bool flag = false; string text = ""; checked { for (int i = 0; i < input.Length; i++) { if (char.IsUpper(input[i])) { if (flag) { text += input.Substring(i); break; } text += char.ToLower(input[i]); } else { flag = true; text = ((i <= 1 || !char.IsUpper(input[i - 1]) || !char.IsUpper(input[i - 2])) ? (text + input[i]) : (text.Substring(0, text.Length - 1) + char.ToUpper(input[i - 1]) + input[i])); } } return text; } } internal unsafe static string[] Chop(this string value, int chopLength) { int length = value.Length; char* ptr = stackalloc char[chopLength]; string[] array = new string[length]; for (int i = 0; i < length; i = checked(i + chopLength)) { int j; for (j = 0; j < chopLength; j = checked(j + 1)) { int num = checked(i + j); if (num >= length) { break; } *(char*)((byte*)ptr + checked(unchecked((nint)j) * (nint)2)) = value[num]; } array[i / chopLength] = new string(ptr, 0, j); } return array; } } public static class TypeEx { public static bool IsAssignableTo(this Type? type, Type? targetType) { if ((object)type != null && (object)targetType != null) { return targetType.IsAssignableFrom(type); } return false; } } [Serializable] [JsonConverter(typeof(Converter))] public class VersionNumber : IEquatable<VersionNumber>, IComparable<VersionNumber> { private class Converter : JsonConverter<VersionNumber> { public override void WriteJson(JsonWriter writer, VersionNumber? value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); } else { writer.WriteValue((string)value); } } public override VersionNumber? ReadJson(JsonReader reader, Type objectType, VersionNumber? existingValue, bool hasExistingValue, JsonSerializer serializer) { object value = reader.Value; if (value == null) { return null; } if (!(value is string value2)) { return null; } return new VersionNumber(value2); } } public static readonly VersionNumber Zero = new VersionNumber(default(uint)); public static readonly VersionNumber One = new VersionNumber(1u); private readonly uint[] _version; public VersionNumber(string value) { _version = (from v in value.Split(new char[1] { '.' }) select uint.TryParse(Sanitize(v), out var result) ? result : 0u).ToArray(); } public VersionNumber(IEnumerable<uint> values) { _version = values.ToArray(); } public VersionNumber(VersionNumber version) { _version = version._version.ToArray(); } public VersionNumber(params uint[] values) { _version = values.ToArray(); } public static implicit operator VersionNumber(string value) { return new VersionNumber(value); } public static implicit operator VersionNumber(uint value) { return new VersionNumber(value); } public static implicit operator VersionNumber(uint[] values) { return new VersionNumber(values); } public static implicit operator VersionNumber(List<uint> values) { return new VersionNumber((IEnumerable<uint>)values); } public static implicit operator string(VersionNumber value) { return value.ToString(); } public static implicit operator uint[](VersionNumber value) { return value._version.ToArray(); } public static bool operator ==(VersionNumber? a, VersionNumber? b) { return Equals(a, b); } public static bool operator !=(VersionNumber? a, VersionNumber? b) { return !Equals(a, b); } public static bool operator <(VersionNumber? a, VersionNumber? b) { return CompareTo(a, b) < 0; } public static bool operator >(VersionNumber? a, VersionNumber? b) { return CompareTo(a, b) > 0; } public static bool operator <=(VersionNumber? a, VersionNumber? b) { return CompareTo(a, b) <= 0; } public static bool operator >=(VersionNumber? a, VersionNumber? b) { return CompareTo(a, b) >= 0; } public override string ToString() { return string.Join(".", _version.Select((uint v) => v.ToString("D")).ToArray()); } public static bool Equals(VersionNumber? a, VersionNumber? b) { return a?.Equals(b) ?? ((object)b == null); } public override bool Equals(object? obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (TypeEx.IsAssignableTo(obj.GetType(), typeof(VersionNumber))) { return false; } return Equals((VersionNumber)obj); } public override int GetHashCode() { return _version.GetHashCode(); } public bool Equals(VersionNumber? other) { if ((object)other == null) { return false; } if ((object)this == other) { return true; } int num = _version.Length; if (num != other._version.Length) { return false; } for (int i = 0; i < num; i = checked(i + 1)) { if (_version[i] != other._version[i]) { return false; } } return true; } public static int CompareTo(VersionNumber? a, VersionNumber? b) { if ((object)a == null) { if ((object)b != null) { return -1; } return 0; } return a.CompareTo(b); } public int CompareTo(VersionNumber? other) { if ((object)other == null) { return 1; } int num = _version.Length; int num2 = other._version.Length; int num3 = Math.Min(num, num2); checked { int i; for (i = 0; i < num3; i++) { uint num4 = _version[i]; uint num5 = other._version[i]; if (num4 != num5) { if (num4 > num5) { return 1; } return -1; } } if (num == num2) { return 0; } if (num > num2) { for (; i < num; i++) { if (_version[i] != 0) { return 1; } } return 0; } for (; i < num2; i++) { if (other._version[i] != 0) { return -1; } } return 0; } } private static string Sanitize(string value) { for (int i = 0; i < value.Length; i = checked(i + 1)) { if (!char.IsDigit(value[i])) { return value.Substring(0, i); } } return value; } } public class VersionResponse : SimpleJSONResponse { public VersionNumber version; [JsonConstructor] public VersionResponse(VersionNumber version) { this.version = version; type = ResponseType.Version; } public VersionResponse(uint id, VersionNumber version) { base.id = id; this.version = version; type = ResponseType.Version; } } }
BepInEx/plugins/CrowdControl/CrowdControl.EnterTheGungeon.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Brave.BulletScript; using ConnectorLib.JSON; using CrowdControl; using CrowdControl.Compat; using CrowdControl.CustomEffects; using CrowdControl.Delegates.Effects; using CrowdControl.Delegates.Metadata; using CrowdControl.UI; using Dungeonator; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Embedded] internal sealed class ParamCollectionAttribute : Attribute { } [CompilerGenerated] [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] [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] [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; } } } [HarmonyPatch(typeof(AIActor), "Update")] internal static class EnemyScalePatch { private static void Prefix(AIActor __instance) { //IL_0038: 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) if (!((Object)(object)__instance == (Object)null) && (!((Object)(object)((BraveBehaviour)__instance).healthHaver != (Object)null) || !((BraveBehaviour)__instance).healthHaver.IsBoss)) { if (Flags.GiantEnemies) { __instance.EnemyScale = new Vector2(2.2f, 2.2f); } else if (Flags.TinyEnemies) { __instance.EnemyScale = new Vector2(0.6f, 0.6f); } } } } [HarmonyPatch(typeof(HealthHaver), "ApplyDamage")] internal static class InvincibilityPatch { private static bool Prefix(HealthHaver __instance) { if (!Flags.Invincible && !Flags.InvincibleEnemies) { return true; } PlayerController? player = Gungeon.Player; HealthHaver val = ((player != null) ? ((BraveBehaviour)player).healthHaver : null); if ((Object)(object)val == (Object)null) { return true; } bool flag = __instance == val; if (Flags.Invincible && flag) { return false; } if (Flags.InvincibleEnemies && !flag) { return false; } return true; } } [HarmonyPatch(typeof(Projectile), "Update")] internal static class ProjectilePatch { private static void Postfix(Projectile __instance) { //IL_0012: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null) { return; } checked { if (Flags.VeeringBullets) { int num = (int)(__instance.Direction.x * 10f); if (num < -8) { num = -8; } if (num > 8) { num = 8; } float num2 = Gungeon.Rand.Next(num - 2, num + 3); int num3 = (int)(__instance.Direction.y * 10f); if (num3 < -8) { num3 = -8; } if (num3 > 8) { num3 = 8; } float num4 = Gungeon.Rand.Next(num3 - 2, num3 + 3); __instance.Direction = new Vector2(num2 / 10f, num4 / 10f); } if (Flags.ShiftingBullets) { __instance.baseData.range = 75f; int[,] array = new int[4, 2] { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; __instance.Direction = new Vector2((float)array[Flags.Shift, 0], (float)array[Flags.Shift, 1]); } if (Flags.FastBullets) { __instance.Speed = 50f; __instance.baseData.range = 75f; } else if (Flags.SlowBullets) { __instance.Speed = 3f; __instance.baseData.range = 75f; } } } } [HarmonyPatch(typeof(Bullet), "DoTick")] internal static class BulletScriptPatch { private static void Prefix(Bullet __instance) { if (__instance == null) { return; } if (__instance.Speed > 0f) { if (Flags.FastBullets) { __instance.Speed = 20f; } else if (Flags.SlowBullets) { __instance.Speed = 2f; } } if (Flags.VeeringBullets) { __instance.Direction = checked(Gungeon.Rand.Next((int)__instance.Direction - 10, (int)__instance.Direction + 10)); } if (Flags.ShiftingBullets) { float[] array = new float[4] { 90f, 180f, 270f, 360f }; __instance.Direction = array[Flags.Shift]; } } } [HarmonyPatch(typeof(PlayerController), "AdjustInputVector")] internal static class InvertControlsPatch { private static void Prefix(ref Vector2 rawInput) { //IL_0016: 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) if (Flags.InvertControls) { rawInput = new Vector2(0f - rawInput.x, 0f - rawInput.y); } } } [HarmonyPatch(typeof(PlayerController), "GetDodgeRollSpeed")] internal static class DodgeRollSpeedPatch { private static void Postfix(ref float __result) { if (Flags.FastRolls) { __result *= 3f; } else if (Flags.SlowRolls) { __result /= 3f; } } } [HarmonyPatch(typeof(PlayerController), "StartDodgeRoll")] internal static class DisableDodgeRollPatch { private static bool Prefix() { return !Flags.DisableRolls; } } [HarmonyPatch(typeof(CameraController), "LateUpdate")] internal static class CameraRollPatch { private static void Postfix() { if (!Overrides.CameraRoll.HasValue) { return; } try { Overrides.ReapplyCameraRoll(); } catch (Exception arg) { Overrides.EndCameraRoll(); CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Camera roll failed, reverting: {arg}"); } } } } namespace ConnectorLib.JSON { public class CustomEffectDefinition { public class Duration { public long value; [JsonProperty(/*Could not decode attribute arguments.*/)] public bool? immutable; public Duration() { } public Duration(long value, bool? immutable = null) { this.value = value; this.immutable = immutable; } } public class Range { public long min; public long max; public Range() { } public Range(long min, long max) { this.min = min; this.max = max; } } public class Alignment { public float orderliness; public float morality; public Alignment() { } public Alignment(float orderliness, float morality) { this.orderliness = orderliness; this.morality = morality; } } public class Parameter { public class Option { public string name = string.Empty; [JsonProperty(/*Could not decode attribute arguments.*/)] public float? priority; public Option() { } public Option(string name, float? priority = null) { this.name = name; this.priority = priority; } } public string name = string.Empty; public string type = "options"; [JsonProperty(/*Could not decode attribute arguments.*/)] public Dictionary<string, Option>? options; public const string TYPE_OPTIONS = "options"; public const string TYPE_HEX_COLOR = "hex-color"; } public string effectID = string.Empty; public string name = string.Empty; public long price; [JsonProperty(/*Could not decode attribute arguments.*/)] public string? description; [JsonProperty(/*Could not decode attribute arguments.*/)] public string[]? category; [JsonProperty(/*Could not decode attribute arguments.*/)] public string[]? group; [JsonProperty(/*Could not decode attribute arguments.*/)] public string[]? tags; [JsonProperty(/*Could not decode attribute arguments.*/)] public string? image; [JsonProperty(/*Could not decode attribute arguments.*/)] public Duration? duration; [JsonProperty(/*Could not decode attribute arguments.*/)] public Range? quantity; [JsonProperty(/*Could not decode attribute arguments.*/)] public Alignment? alignment; [JsonProperty(/*Could not decode attribute arguments.*/)] public float? sessionCooldown; [JsonProperty(/*Could not decode attribute arguments.*/)] public float? userCooldown; [JsonProperty(/*Could not decode attribute arguments.*/)] public Dictionary<string, Parameter>? parameters; [JsonProperty(/*Could not decode attribute arguments.*/)] public bool? hidden; [JsonProperty(/*Could not decode attribute arguments.*/)] public bool? inactive; [JsonProperty(/*Could not decode attribute arguments.*/)] public string? note; [JsonProperty(/*Could not decode attribute arguments.*/)] public string? clone; [JsonProperty(/*Could not decode attribute arguments.*/)] public Dictionary<string, object?>? args; } public static class CustomEffectsRpc { public class AddEffectsArgs { public List<CustomEffectDefinition> effects = new List<CustomEffectDefinition>(); public bool preserveExisting = true; } public class RemoveEffectsArgs { public List<string> effects = new List<string>(); } public const string METHOD_ADD = "addEffects"; public const string METHOD_REMOVE = "removeEffect"; public static RpcRequest AddEffects(IEnumerable<CustomEffectDefinition> effects, bool preserveExisting = true) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown RpcRequest val = new RpcRequest(); val.method = "addEffects"; val.target = null; val.args = new object[1] { new AddEffectsArgs { effects = effects.ToList(), preserveExisting = preserveExisting } }; return val; } public static RpcRequest RemoveEffects(IEnumerable<string> effectIDs) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown RpcRequest val = new RpcRequest(); val.method = "removeEffect"; val.target = null; val.args = new object[1] { new RemoveEffectsArgs { effects = effectIDs.ToList() } }; return val; } } } namespace CrowdControl { [BepInPlugin("WarpWorld.CrowdControl", "Crowd Control for Enter the Gungeon", "2.2.0")] public class CrowdControlMod : BaseUnityPlugin { public const string MOD_GUID = "WarpWorld.CrowdControl"; public const string MOD_NAME = "Crowd Control for Enter the Gungeon"; public const bool CUSTOM_EFFECTS_SUPPORTED = true; private readonly Harmony harmony = new Harmony("WarpWorld.CrowdControl"); private const double MANUAL_RECONNECT_COOLDOWN_SECONDS = 5.0; private DateTime m_nextManualReconnectAllowedUtc = DateTime.MinValue; private bool m_clientPresent; private float m_nextClientCheck; private const float CLIENT_CHECK_INTERVAL = 2f; private string? _modVersion; public const string MOD_VERSION = "2.2.0"; public static float DeltaTime => Time.unscaledDeltaTime; public ManualLogSource Logger => ((BaseUnityPlugin)this).Logger; internal static CrowdControlMod Instance { get; private set; } public GameStateManager GameStateManager { get; private set; } public EffectLoader EffectLoader { get; private set; } public CustomEffectManager CustomEffects { get; private set; } public bool ClientConnected => Client.Connected; public NetworkClient Client { get; private set; } public Scheduler Scheduler { get; private set; } public string Version { get { try { if (!string.IsNullOrEmpty(_modVersion)) { return _modVersion; } string text = File.ReadAllText(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "ccver")); if (string.IsNullOrEmpty(text)) { _modVersion = "2.2.0"; } else { _modVersion = text; } return _modVersion; } catch (Exception arg) { Logger.LogInfo((object)$"Error retrieving mod version: {arg}"); return "0"; } } } private void Awake() { Instance = this; Logger.LogInfo((object)"Loaded WarpWorld.CrowdControl. Patching."); harmony.PatchAll(); ModSettings.Initialize(((BaseUnityPlugin)this).Config); if (ModSettings.AlwaysAttemptConnection) { Logger.LogMessage((object)"AlwaysAttemptConnection is on - connecting without looking for a local Crowd Control app."); } Logger.LogInfo((object)"Initializing Crowd Control"); try { GameStateManager = new GameStateManager(this); Client = new NetworkClient(this); EffectLoader = new EffectLoader(this, Client); Scheduler = new Scheduler(this, Client); ConflictAudit.Run(EffectLoader); CustomEffects = new CustomEffectManager(this, Client); CustomEffects.LoadAll(); } catch (Exception arg) { Logger.LogError((object)$"Crowd Control Init Error: {arg}"); } Logger.LogInfo((object)"Crowd Control Initialized"); } private void OnApplicationQuit() { Shutdown(); } private void OnDestroy() { Shutdown(); } private void Shutdown() { try { Flags.Reset(); CustomEffects?.Dispose(); Client?.Stop(); Client?.Dispose(); } catch { } } private void Update() { if (GameStateManager != null) { GameStateManager.InvalidateStateCache(); GameStateManager.UpdateGameState(); Scheduler?.Tick(); CustomEffects?.Tick(); UpdateClientPresence(); HandleOverlayToggleHotkey(); HandleManualReconnectHotkey(); } } private void UpdateClientPresence() { float realtimeSinceStartup = Time.realtimeSinceStartup; if (realtimeSinceStartup < m_nextClientCheck) { return; } m_nextClientCheck = realtimeSinceStartup + 2f; try { m_clientPresent = Client?.CrowdControlClientFound ?? false; } catch { m_clientPresent = false; } } private void OnGUI() { try { Overlay.Draw(ClientConnected, m_clientPresent); } catch { } } private void HandleOverlayToggleHotkey() { if (Input.GetKeyDown((KeyCode)289)) { bool flag = Overlay.Toggle(); Logger.LogInfo((object)("F8 pressed - overlay " + (flag ? "shown" : "hidden") + ".")); if (flag) { Overlay.Show("Crowd Control display on (F8)", force: true); } } } private void HandleManualReconnectHotkey() { if (!Input.GetKeyDown((KeyCode)290)) { return; } DateTime utcNow = DateTime.UtcNow; if (!(utcNow < m_nextManualReconnectAllowedUtc)) { m_nextManualReconnectAllowedUtc = utcNow.AddSeconds(5.0); Logger.LogInfo((object)"F9 pressed - manual Crowd Control reconnect requested."); NetworkClient client = Client; if (client != null && client.RequestReconnect()) { Overlay.Show("Reconnecting to Crowd Control...", force: true); Logger.LogInfo((object)"Manual Crowd Control reconnect queued."); } else { Overlay.Show("Crowd Control client not found.", force: true); Logger.LogInfo((object)"Manual Crowd Control reconnect skipped because the Crowd Control client was not found."); } } } public void ShowGameUiMessage(string message) { Overlay.Show(message); } private void OnApplicationFocus(bool hasFocus) { try { GameStateManager?.InvalidateStateCache(); GameStateManager?.UpdateGameState(); } catch { } } private void OnApplicationPause(bool isPaused) { try { GameStateManager?.InvalidateStateCache(); GameStateManager?.UpdateGameState(); } catch { } } } public class DelimitedStreamReader(NetworkStream stream) : IDisposable { private readonly MemoryStream _memory_stream = new MemoryStream(); private const int MAX_MESSAGE_SIZE = 1048576; ~DelimitedStreamReader() { Dispose(disposing: false); } public void Dispose() { Dispose(disposing: true); } protected virtual void Dispose(bool disposing) { if (!disposing) { return; } try { _memory_stream.Dispose(); } catch { } } public string ReadUntilNullTerminator() { int num; while ((num = stream.ReadByte()) != -1 && num != 0) { if (_memory_stream.Length >= 1048576) { _memory_stream.SetLength(0L); throw new InvalidDataException("Message exceeded the maximum allowed size without a null terminator. Dropping the connection."); } _memory_stream.WriteByte(checked((byte)num)); } if (num == -1) { throw new EndOfStreamException("Reached end of stream without finding a null terminator."); } string result = Encoding.UTF8.GetString(_memory_stream.ToArray()); _memory_stream.SetLength(0L); return result; } } public static class EffectRequestEx { public const string DEFAULT_VIEWER_NAME = "the crowd"; public const int MAX_VIEWER_NAME_LENGTH = 32; public static string GetViewerDisplayName(this EffectRequest request, string fallback = "the crowd") { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Invalid comparison between Unknown and I4 string text = request.viewer; if (Net35.IsNullOrWhiteSpace(text) && request.viewers != null) { foreach (JToken viewer in request.viewers) { JToken obj = ((viewer is JObject) ? viewer : null); string text2 = ((obj != null) ? obj.Value<string>((object)"name") : null); if (text2 == null) { string text3 = (((int)viewer.Type != 8) ? null : Extensions.Value<string>((IEnumerable<JToken>)viewer)); text2 = text3; } text = text2; if (!Net35.IsNullOrWhiteSpace(text)) { break; } } } string text4 = SanitizeDisplayName(text); if (text4.Length <= 0) { return fallback; } return text4; } public static string SanitizeDisplayName(string? name) { if (Net35.IsNullOrWhiteSpace(name)) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(Math.Min(name.Length, 32)); bool flag = true; foreach (char c in name) { if (char.IsControl(c) || char.IsSurrogate(c) || ((c == '<' || c == '>') ? true : false)) { continue; } if (char.IsWhiteSpace(c)) { if (flag) { continue; } stringBuilder.Append(' '); flag = true; } else { stringBuilder.Append(c); flag = false; } if (stringBuilder.Length >= 32) { break; } } return stringBuilder.ToString().TrimEnd(new char[0]); } } public class GameStateManager(CrowdControlMod mod) { public const bool CARE_ABOUT_FOCUS = true; private GameState? m_cachedState; private volatile bool m_stateResendRequested; private GameState? _last_game_state; public GameState CurrentState { get { //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_002e: 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_001f: 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_002c: Unknown result type (might be due to invalid IL or missing references) GameState valueOrDefault = m_cachedState.GetValueOrDefault(); if (!m_cachedState.HasValue) { valueOrDefault = GetGameState(); m_cachedState = valueOrDefault; return valueOrDefault; } return valueOrDefault; } } public bool IsReady(string code = "") { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 return (int)CurrentState == 1; } public GameState GetGameState() { //IL_011e: 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_0121: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 //IL_0020: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Invalid comparison between Unknown and I4 //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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_00f9: Unknown result type (might be due to invalid IL or missing references) try { if (!Application.isFocused) { return (GameState)(-5); } GameManager manager = Gungeon.Manager; if ((Object)(object)manager == (Object)null) { return (GameState)(-6); } LevelOverrideState currentLevelOverrideState = manager.CurrentLevelOverrideState; if (currentLevelOverrideState - 1 > 1) { if ((int)currentLevelOverrideState == 4) { return (GameState)(-8); } if (manager.IsPaused) { return (GameState)(-7); } if (manager.IsLoadingLevel) { return (GameState)(-6); } if (GameManager.IsBossIntro) { return (GameState)(-11); } AmmonomiconController instance = AmmonomiconController.Instance; if ((Object)(object)instance != (Object)null && instance.IsOpen) { return (GameState)(-13); } if (PunchoutController.IsActive) { return (GameState)(-8); } if (PunchoutController.InTutorial) { return (GameState)(-11); } PlayerController player = Gungeon.Player; if ((Object)(object)player == (Object)null) { return (GameState)(-12); } if ((Object)(object)((BraveBehaviour)player).healthHaver == (Object)null) { return (GameState)(-12); } if (((BraveBehaviour)player).healthHaver.IsDead) { return (GameState)(-12); } if (Time.timeScale == 0f) { return (GameState)(-7); } return (GameState)1; } return (GameState)(-9); } catch (Exception arg) { CrowdControlMod.Instance.Logger.LogError((object)$"ERROR {arg}"); return (GameState)(-1); } } public void InvalidateStateCache() { m_cachedState = null; } public void RequestStateResend() { m_stateResendRequested = true; } public bool UpdateGameState(bool force = false) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return UpdateGameState(CurrentState, force); } public bool UpdateGameState(GameState newState, bool force) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return UpdateGameState(newState, null, force); } public bool UpdateGameState(GameState newState, string? message = null, bool force = false) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_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) if (m_stateResendRequested) { m_stateResendRequested = false; force = true; } if (force || _last_game_state != (GameState?)newState) { _last_game_state = newState; return mod.Client.Send((SimpleJSONResponse?)new GameUpdate(newState, message)); } return true; } } internal static class Gungeon { public static readonly Random Rand = new Random(); public static readonly string[] SpawnableEnemyGuids = new string[12] { "01972dee89fc4404a5c408d50007dad5", "88b6b6a93d4b4234a67844ef4728382c", "31a3ea0c54a745e182e22ea54844a82d", "db35531e66ce41cbb81d507a34366dfe", "128db2f0781141bcb505d8f00f9e4d47", "b54d89f9e802455cbb2b8a96a31e8259", "4db03291a12144d69fe940d5a01de376", "70216cae6c1346309d86d4a0b4603045", "4d37ce3d666b4ddda8039929225b7ede", "ed37fa13e0fa4fcf8239643957c51293", "1bc2a07ef87741be90c37096910843ab", "f905765488874846b7ff257ff81d6d0c" }; public static GameManager? Manager { get { try { return GameManager.Instance; } catch { return null; } } } public static PlayerController? Player { get { try { GameManager instance = GameManager.Instance; return (instance != null) ? instance.PrimaryPlayer : null; } catch { return null; } } } public static RoomHandler? Room { get { try { PlayerController? player = Player; return (player != null) ? player.CurrentRoom : null; } catch { return null; } } } public static LevelOverrideState LevelOverride { get { //IL_0016: 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_0019: 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) try { GameManager instance = GameManager.Instance; return (LevelOverrideState)((instance != null) ? ((int)instance.CurrentLevelOverrideState) : 0); } catch { return (LevelOverrideState)0; } } } public static CameraController? CameraController { get { try { GameManager instance = GameManager.Instance; return (instance != null) ? instance.MainCameraController : null; } catch { return null; } } } public static Camera? Camera { get { try { CameraController? cameraController = CameraController; return (cameraController != null) ? cameraController.Camera : null; } catch { return null; } } } public static bool InCharacterPast => (int)LevelOverride == 5; public static bool SpawnRandomEnemy() { RoomHandler room = Room; if (room == null) { return false; } room.AddSpecificEnemyToRoomProcedurally(SpawnableEnemyGuids[Rand.Next(0, SpawnableEnemyGuids.Length)], true, (Vector2?)null); return true; } } internal static class Flags { public static bool FastBullets; public static bool SlowBullets; public static bool VeeringBullets; public static bool ShiftingBullets; public static bool GiantBullets; public static bool TinyBullets; public static int Shift; public static bool GiantEnemies; public static bool TinyEnemies; public static bool InvincibleEnemies; public static bool Invincible; public static bool OHKO; public static bool OnFire; public static bool BlankStorm; public static bool InvertControls; public static bool DisableRolls; public static bool ForcedRolls; public static bool FastRolls; public static bool SlowRolls; public static bool ReloadSpeedOverridden; public static void Reset() { Overrides.RevertAll(); FastBullets = (SlowBullets = (VeeringBullets = (ShiftingBullets = false))); GiantBullets = (TinyBullets = false); Shift = 0; GiantEnemies = (TinyEnemies = (InvincibleEnemies = false)); Invincible = (OHKO = (OnFire = (BlankStorm = false))); InvertControls = (DisableRolls = (ForcedRolls = (FastRolls = (SlowRolls = false)))); ReloadSpeedOverridden = false; } } internal static class Overrides { private static readonly Dictionary<StatType, float> SavedStats = new Dictionary<StatType, float>(); private static Quaternion m_savedRotation; private static bool m_rotationSaved; private static float? m_savedZoom; private static Color? m_savedTint; private static bool m_timeHeld; public static float? CameraRoll { get; private set; } public static bool IsZoomHeld => m_savedZoom.HasValue; public static bool HoldStat(StatType stat, Func<float, float> value) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) PlayerController player = Gungeon.Player; if ((Object)(object)player == (Object)null || (Object)(object)player.stats == (Object)null) { return false; } try { if (!SavedStats.ContainsKey(stat)) { SavedStats[stat] = player.stats.GetBaseStatValue(stat); } player.stats.SetBaseStatValue(stat, value(SavedStats[stat]), player); return true; } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not hold stat {stat}: {arg}"); } return false; } } public static void ReleaseStat(StatType stat) { //IL_0005: 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_0061: 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) if (!SavedStats.TryGetValue(stat, out var value)) { return; } SavedStats.Remove(stat); PlayerController player = Gungeon.Player; if ((Object)(object)player == (Object)null || (Object)(object)player.stats == (Object)null) { return; } try { player.stats.SetBaseStatValue(stat, value, player); } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not release stat {stat}: {arg}"); } } } public static bool IsStatHeld(StatType stat) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return SavedStats.ContainsKey(stat); } public static bool BeginCameraRoll(float degrees) { //IL_0040: 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) //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) Camera camera = Gungeon.Camera; if ((Object)(object)camera == (Object)null) { return false; } try { if (!m_rotationSaved) { m_savedRotation = ((Component)camera).transform.rotation; m_rotationSaved = true; } CameraRoll = degrees; ((Component)camera).transform.rotation = m_savedRotation * Quaternion.Euler(0f, 0f, degrees); return true; } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not roll the camera: {arg}"); } EndCameraRoll(); return false; } } public static void ReapplyCameraRoll() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) float? cameraRoll = CameraRoll; if (cameraRoll.HasValue) { float valueOrDefault = cameraRoll.GetValueOrDefault(); Camera camera = Gungeon.Camera; if (!((Object)(object)camera == (Object)null)) { ((Component)camera).transform.rotation = m_savedRotation * Quaternion.Euler(0f, 0f, valueOrDefault); } } } public static void EndCameraRoll() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) CameraRoll = null; if (!m_rotationSaved) { return; } try { Camera camera = Gungeon.Camera; if ((Object)(object)camera != (Object)null) { ((Component)camera).transform.rotation = m_savedRotation; } } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not level the camera: {arg}"); } } finally { m_rotationSaved = false; } } public static bool HoldZoom(float zoomScale) { CameraController cameraController = Gungeon.CameraController; if ((Object)(object)cameraController == (Object)null) { return false; } try { float valueOrDefault = m_savedZoom.GetValueOrDefault(); if (!m_savedZoom.HasValue) { valueOrDefault = cameraController.OverrideZoomScale; m_savedZoom = valueOrDefault; } cameraController.OverrideZoomScale = zoomScale; return true; } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not set the camera zoom: {arg}"); } return false; } } public static void ReleaseZoom() { float? savedZoom = m_savedZoom; if (!savedZoom.HasValue) { return; } float valueOrDefault = savedZoom.GetValueOrDefault(); m_savedZoom = null; try { CameraController cameraController = Gungeon.CameraController; if ((Object)(object)cameraController != (Object)null) { cameraController.OverrideZoomScale = valueOrDefault; } } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not restore the camera zoom: {arg}"); } } } public static void HoldTint(Color tint) { //IL_0016: 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_003b: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) PlayerController player = Gungeon.Player; if ((Object)(object)player == (Object)null) { return; } try { Color valueOrDefault = m_savedTint.GetValueOrDefault(); if (!m_savedTint.HasValue) { valueOrDefault = player.baseFlatColorOverride; m_savedTint = valueOrDefault; } player.baseFlatColorOverride = tint; } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not tint the player: {arg}"); } } } public static void ReleaseTint() { //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_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) Color? savedTint = m_savedTint; if (!savedTint.HasValue) { return; } Color valueOrDefault = savedTint.GetValueOrDefault(); m_savedTint = null; try { PlayerController player = Gungeon.Player; if ((Object)(object)player != (Object)null) { player.baseFlatColorOverride = valueOrDefault; } } catch (Exception arg) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogError((object)$"Could not restore the player's colour: {arg}"); } } } public static bool HoldTimeScale(float multiplier) { CrowdControlMod instance = CrowdControlMod.Instance; GameObject val = ((instance != null) ? ((Component)instance).gameObject : null); if ((Object)(object)val == (Object)null) { return false; } try { BraveTime.SetTimeScaleMultiplier(multiplier, val); m_timeHeld = true; return true; } catch (Exception arg) { CrowdControlMod instance2 = CrowdControlMod.Instance; if (instance2 != null) { instance2.Logger.LogError((object)$"Could not set the time scale: {arg}"); } return false; } } public static void ReleaseTimeScale() { if (!m_timeHeld) { return; } m_timeHeld = false; try { CrowdControlMod instance = CrowdControlMod.Instance; GameObject val = ((instance != null) ? ((Component)instance).gameObject : null); if ((Object)(object)val != (Object)null) { BraveTime.ClearMultiplier(val); } } catch (Exception arg) { CrowdControlMod instance2 = CrowdControlMod.Instance; if (instance2 != null) { instance2.Logger.LogError((object)$"Could not restore the time scale: {arg}"); } } } public static void RevertAll() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) foreach (StatType item in new List<StatType>(SavedStats.Keys)) { try { ReleaseStat(item); } catch { } } SavedStats.Clear(); try { ReleaseTint(); } catch { } try { EndCameraRoll(); } catch { } try { ReleaseZoom(); } catch { } try { ReleaseTimeScale(); } catch { } } } public class NetworkClient : IDisposable { private const bool PROCESS_LOOKUP_FALLBACK = true; private static readonly SITimeSpan TIMEOUT_NO_PROCESS = 5.0; private static readonly SITimeSpan TIMEOUT_NO_CONNECTION = 2.0; public static readonly string CV_HOST = "127.0.0.1"; public static readonly int CV_PORT = 51337; private TcpClient? m_client; private DelimitedStreamReader? m_streamReader; private readonly CrowdControlMod m_mod; private readonly CancellationTokenSource m_quitting = new CancellationTokenSource(); private readonly object m_shutdownLock = new object(); private readonly object m_sendLock = new object(); private readonly AutoResetEvent m_reconnectRequested = new AutoResetEvent(initialState: false); private volatile bool m_disposed; private readonly Thread m_readLoop; private readonly Thread m_maintenanceLoop; private bool m_loggedNoProcess; private bool m_loggedConnectFailure; private static readonly EmptyResponse KEEPALIVE = new EmptyResponse { type = (ResponseType)255 }; public bool Connected => m_client?.Connected ?? false; public bool CrowdControlClientFound { get { if (!ModSettings.AlwaysAttemptConnection && !IsCrowdControlSemaphorePresent()) { return IsCrowdControlProcessRunning(); } return true; } } ~NetworkClient() { Dispose(disposing: false); } public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposing) { return; } lock (m_shutdownLock) { if (m_disposed) { return; } m_disposed = true; } try { m_quitting.Cancel(); } catch { } CloseConnection(); } private bool WaitForReconnectOrQuit(TimeSpan timeout) { //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) WaitHandle[] array = new WaitHandle[2]; CancellationToken token = m_quitting.Token; array[0] = ((CancellationToken)(ref token)).WaitHandle; array[1] = m_reconnectRequested; return WaitHandle.WaitAny(array, timeout) != 258; } private void CloseConnection() { lock (m_sendLock) { try { m_streamReader?.Dispose(); } catch { } finally { m_streamReader = null; } try { TcpClient? client = m_client; if (client != null && client.Connected) { m_client.Client.Shutdown(SocketShutdown.Both); } m_client?.Close(); Net35.Dispose(m_client); } catch { } finally { m_client = null; } } } private static bool IsBenignShutdownException(Exception e, bool quitting) { if (!quitting && !(e is ThreadAbortException) && !(e is ObjectDisposedException) && !(e is OperationCanceledException) && (!(e is IOException { InnerException: SocketException innerException }) || !IsBenignSocketError(innerException.SocketErrorCode))) { if (e is SocketException ex2) { return IsBenignSocketError(ex2.SocketErrorCode); } return false; } return true; } private static bool IsBenignSocketError(SocketError code) { switch (code) { case SocketError.OperationAborted: case SocketError.Interrupted: case SocketError.ConnectionAborted: case SocketError.ConnectionReset: case SocketError.Shutdown: return true; default: return false; } } public bool RequestReconnect() { if (m_disposed || m_quitting.IsCancellationRequested) { return false; } if (!CrowdControlClientFound) { return false; } CloseConnection(); m_loggedConnectFailure = false; m_reconnectRequested.Set(); return true; } public NetworkClient(CrowdControlMod mod) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown m_mod = mod; m_readLoop = new Thread(NetworkLoop) { IsBackground = true, Name = "CrowdControl.NetworkRead" }; m_maintenanceLoop = new Thread(MaintenanceLoop) { IsBackground = true, Name = "CrowdControl.NetworkMaintenance" }; m_readLoop.Start(); m_maintenanceLoop.Start(); } private void NetworkLoop() { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; while (!m_quitting.IsCancellationRequested) { if (!CrowdControlClientFound) { if (!m_loggedNoProcess) { CrowdControlMod.Instance.Logger.LogMessage((object)"No Crowd Control client found. Waiting for it to start before attempting to connect..."); m_loggedNoProcess = true; } m_loggedConnectFailure = false; WaitForReconnectOrQuit((TimeSpan)TIMEOUT_NO_PROCESS); continue; } if (m_loggedNoProcess) { CrowdControlMod.Instance.Logger.LogMessage((object)"Crowd Control client found."); m_loggedNoProcess = false; } if (!m_loggedConnectFailure) { CrowdControlMod.Instance.Logger.LogInfo((object)"Attempting to connect to Crowd Control"); } try { m_client = new TcpClient(); m_client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, optionValue: true); m_client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, optionValue: true); if (m_client.BeginConnect(CV_HOST, CV_PORT, null, null).AsyncWaitHandle.WaitOne(2000, exitContext: true) && m_client.Connected) { m_loggedConnectFailure = false; ClientLoop(); } else if (!m_loggedConnectFailure) { CrowdControlMod.Instance.Logger.LogInfo((object)"Failed to connect to Crowd Control. Retrying quietly..."); m_loggedConnectFailure = true; } } catch (Exception ex) { if (!IsBenignShutdownException(ex, m_quitting.IsCancellationRequested) && !m_loggedConnectFailure) { CrowdControlMod.Instance.Logger.LogError((object)ex); CrowdControlMod.Instance.Logger.LogError((object)"Failed to connect to Crowd Control. Retrying quietly..."); m_loggedConnectFailure = true; } } finally { CloseConnection(); } if (!m_quitting.IsCancellationRequested) { WaitForReconnectOrQuit((TimeSpan)TIMEOUT_NO_CONNECTION); continue; } break; } } private void MaintenanceLoop() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; while (!m_quitting.IsCancellationRequested) { try { if (!m_disposed) { TcpClient? client = m_client; if (client != null && client.Connected) { KeepAlive(); } } } catch { } CancellationToken token = m_quitting.Token; ((CancellationToken)(ref token)).WaitHandle.WaitOne(1000); } } private void ClientLoop() { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; try { m_streamReader = new DelimitedStreamReader(m_client.GetStream()); CrowdControlMod.Instance.Logger.LogInfo((object)"Connected to Crowd Control"); m_mod.GameStateManager?.RequestStateResend(); m_mod.CustomEffects?.RequestManifestResend(); try { while (!m_quitting.IsCancellationRequested) { string text = m_streamReader.ReadUntilNullTerminator(); OnMessage(text.Trim()); } } catch (EndOfStreamException) { if (!m_quitting.IsCancellationRequested) { CrowdControlMod.Instance.Logger.LogInfo((object)"Disconnected from Crowd Control"); } } catch (Exception ex2) { if (!IsBenignShutdownException(ex2, m_quitting.IsCancellationRequested)) { CrowdControlMod.Instance.Logger.LogError((object)ex2); CrowdControlMod.Instance.Logger.LogError((object)"Disconnected from Crowd Control"); } } } finally { CloseConnection(); } } private void OnMessage(string message) { if (m_disposed || m_quitting.IsCancellationRequested || Net35.IsNullOrWhiteSpace(message)) { return; } try { SimpleJSONRequest request = default(SimpleJSONRequest); if (SimpleJSONRequest.TryParse(message, ref request)) { m_mod.Scheduler.ProcessRequest(request); } } catch (Exception ex) { CrowdControlMod.Instance.Logger.LogError((object)ex); } } private static bool IsCrowdControlSemaphorePresent() { try { Semaphore result; return Net35.TryOpenExistingSemaphore("CrowdControl", out result); } catch { return false; } } private static bool IsCrowdControlProcessRunning() { Process[] array = null; try { array = Process.GetProcesses(); bool result = false; Process[] array2 = array; foreach (Process process in array2) { try { if (process.ProcessName.IndexOf("crowdcontrol", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } catch (InvalidOperationException) { } catch (Exception) { result = true; } } return result; } catch (Exception ex3) { CrowdControlMod.Instance.Logger.LogDebug((object)("Error checking for CrowdControl processes: " + ex3.Message)); return true; } finally { if (array != null) { Process[] array2 = array; for (int i = 0; i < array2.Length; i++) { array2[i].Dispose(); } } } } public bool Send(SimpleJSONResponse? response) { try { if (response == null || m_disposed || m_quitting.IsCancellationRequested) { return false; } byte[] bytes = Encoding.UTF8.GetBytes(((SimpleJSONMessage)response).Serialize()); int num = 0; byte[] array = new byte[1 + bytes.Length]; byte[] array2 = bytes; foreach (byte b in array2) { array[num] = b; num++; } array[num] = 0; byte[] array3 = array; lock (m_sendLock) { TcpClient? client = m_client; if (client == null || !client.Connected) { return false; } m_client.GetStream().Write(array3, 0, array3.Length); return true; } } catch (Exception ex) { if (!IsBenignShutdownException(ex, m_quitting.IsCancellationRequested)) { CrowdControlMod.Instance.Logger.LogError((object)$"Error sending a message to the Crowd Control client: {ex}"); } return false; } } public Task<bool> SendAsync(SimpleJSONResponse? response) { return Net35.Run(() => Send(response)); } public void Stop(string? message = null) { //IL_000f: 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_001a: 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_002b: Expected O, but got Unknown if (!m_disposed) { if (message != null) { Send((SimpleJSONResponse?)new MessageResponse { type = (ResponseType)254, message = message }); } try { m_quitting.Cancel(); } catch { } CloseConnection(); } } public Task StopAsync(string? message = null) { return Net35.Run(delegate { Stop(message); }); } public bool KeepAlive() { return Send((SimpleJSONResponse?)(object)KEEPALIVE); } public Task<bool> KeepAliveAsync() { return Net35.Run((Func<bool>)KeepAlive); } public void AttachMetadata(EffectResponse response) { response.metadata = new Dictionary<string, DataResponse>(); string[] commonMetadata = MetadataDelegates.CommonMetadata; foreach (string text in commonMetadata) { if (MetadataLoader.Metadata.TryGetValue(text, out MetadataDelegate value)) { response.metadata.Add(text, value(m_mod)); } else { CrowdControlMod.Instance.Logger.LogError((object)("Metadata delegate \"" + text + "\" could not be found. Available delegates: " + Net35.Join(", ", MetadataLoader.Metadata.Keys))); } } } public bool ShowEffects(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)128, (string)null)); } public bool ShowEffects([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)128, (string)null)); } public Task<bool> ShowEffectsAsync(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)128, (string)null)); } public Task<bool> ShowEffectsAsync([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)128, (string)null)); } public bool ShowAllEffects() { return ShowEffects(m_mod.EffectLoader.Effects.Keys); } public Task<bool> ShowAllEffectsAsync() { return ShowEffectsAsync(m_mod.EffectLoader.Effects.Keys); } public bool HideEffects(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)129, (string)null)); } public bool HideEffects([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)129, (string)null)); } public bool HideEffects(IEnumerable<string> codes, string? message) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)129, message)); } public Task<bool> HideEffectsAsync(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)129, (string)null)); } public Task<bool> HideEffectsAsync([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)129, (string)null)); } public bool HideEffectGroups(params string[] groups) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(groups, (IdentifierType)1, (EffectStatus)129, (string)null)); } public bool ShowEffectGroups(params string[] groups) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(groups, (IdentifierType)1, (EffectStatus)128, (string)null)); } public bool HideAllEffects() { return HideEffects(m_mod.EffectLoader.Effects.Keys); } public Task<bool> HideAllEffectsAsync() { return HideEffectsAsync(m_mod.EffectLoader.Effects.Keys); } public bool EnableEffects(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)130, (string)null)); } public bool EnableEffects([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)130, (string)null)); } public bool EnableEffects(IEnumerable<string> codes, string? message) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)130, message)); } public Task<bool> EnableEffectsAsync(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)130, (string)null)); } public Task<bool> EnableEffectsAsync([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)130, (string)null)); } public bool EnableAllEffects() { return EnableEffects(m_mod.EffectLoader.Effects.Keys); } public Task<bool> EnableAllEffectsAsync() { return EnableEffectsAsync(m_mod.EffectLoader.Effects.Keys); } public bool DisableEffects(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)131, (string)null)); } public bool DisableEffects([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)131, (string)null)); } public bool DisableEffects(IEnumerable<string> codes, string? message) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)131, message)); } public Task<bool> DisableEffectsAsync(params string[] codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)131, (string)null)); } public Task<bool> DisableEffectsAsync([ParamCollection] IEnumerable<string> codes) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return SendAsync((SimpleJSONResponse?)new EffectUpdate(codes, (EffectStatus)131, (string)null)); } public bool DisableAllEffects(string? message = null) { return DisableEffects(m_mod.EffectLoader.Effects.Keys, message); } public Task<bool> DisableAllEffectsAsync() { return DisableEffectsAsync(m_mod.EffectLoader.Effects.Keys); } } internal static class ReflectionEx { private const BindingFlags BINDING_FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; public static void SetField(this object obj, string prop, object val) { obj.GetType().GetField(prop, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).SetValue(obj, val); } public static T GetField<T>(this object obj, string prop) { return (T)obj.GetType().GetField(prop, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(obj); } public static void SetProperty(this object obj, string prop, object val) { obj.GetType().GetField(prop, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).SetValue(obj, val); } public static T GetProperty<T>(this object obj, string prop) { return (T)obj.GetType().GetField(prop, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(obj); } public static void CallMethod(this object obj, string methodName, params object[] vals) { obj.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).Invoke(obj, vals); } public static T CallMethod<T>(this object obj, string methodName, params object[] vals) { return (T)obj.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).Invoke(obj, vals); } } public class Scheduler(CrowdControlMod mod, NetworkClient networkClient) { private class RequestState { private IEnumerator? m_enumerator; public EffectRequest Request { get; } public Effect Effect { get; } public TimedEffectState? TimedEffectState { get; } public bool MoveNext() { if (m_enumerator != null) { if (m_enumerator.MoveNext()) { return true; } (m_enumerator as IDisposable)?.Dispose(); m_enumerator = null; } switch (TimedEffectState?.State) { case CrowdControl.Delegates.Effects.TimedEffectState.EffectState.NotStarted: if (m_enumerator == null) { m_enumerator = TimedEffectState.Start(); } m_enumerator.MoveNext(); return true; case CrowdControl.Delegates.Effects.TimedEffectState.EffectState.Running: case CrowdControl.Delegates.Effects.TimedEffectState.EffectState.Paused: if (m_enumerator == null) { m_enumerator = TimedEffectState.Tick(); } m_enumerator.MoveNext(); return true; default: return false; } } public void Pause() { (m_enumerator as IDisposable)?.Dispose(); m_enumerator = null; TimedEffectState.EffectState? effectState = TimedEffectState?.State; if (effectState.HasValue && effectState == CrowdControl.Delegates.Effects.TimedEffectState.EffectState.Running) { m_enumerator = TimedEffectState.Pause(); } } public void Resume() { (m_enumerator as IDisposable)?.Dispose(); m_enumerator = null; TimedEffectState.EffectState? effectState = TimedEffectState?.State; if (effectState.HasValue && effectState == CrowdControl.Delegates.Effects.TimedEffectState.EffectState.Paused) { m_enumerator = TimedEffectState.Resume(); } } public void Stop() { (m_enumerator as IDisposable)?.Dispose(); m_enumerator = null; TimedEffectState.EffectState? effectState = TimedEffectState?.State; if (effectState.HasValue) { TimedEffectState.EffectState valueOrDefault = effectState.GetValueOrDefault(); if ((uint)valueOrDefault <= 2u) { m_enumerator = TimedEffectState.Stop(); } } } public RequestState(EffectRequest request, Effect effect) { Request = request; Effect = effect; if (Effect.IsTimed) { TimedEffectState = new TimedEffectState(effect, request, SITimeSpan.FromMilliseconds(request.duration.GetValueOrDefault())); } } } private readonly CrowdControlMod m_mod = mod; private readonly NetworkClient m_networkClient = networkClient; private readonly ConcurrentQueue<SimpleJSONRequest> m_messageQueue = new ConcurrentQueue<SimpleJSONRequest>(); private readonly ConcurrentQueue<RequestState> m_requestQueue = new ConcurrentQueue<RequestState>(); private readonly ConcurrentDictionary<uint, RequestState> m_runningEffects = new ConcurrentDictionary<uint, RequestState>(); public bool IsRunning(string id) { if (!m_runningEffects.Values.Any((RequestState r) => r.Effect.EffectAttribute.IDs.Contains(id))) { return ((IEnumerable<RequestState>)m_requestQueue).Any((RequestState r) => r.Effect.EffectAttribute.IDs.Contains(id)); } return true; } private bool HasConflict(Effect effect) { EffectAttribute effectAttribute = effect.EffectAttribute; foreach (RequestState value in m_runningEffects.Values) { EffectAttribute effectAttribute2 = value.Effect.EffectAttribute; if (effectAttribute.Conflicts.Intersect(effectAttribute2.IDs).Any()) { return true; } if (effectAttribute2.Conflicts.Intersect(effectAttribute.IDs).Any()) { return true; } } return false; } public void ProcessRequest(SimpleJSONRequest? request) { if (request != null) { m_messageQueue.Enqueue(request); } } private void HandleMessage(SimpleJSONRequest request) { //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_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_028b: 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) //IL_0032: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected I4, but got Unknown //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Invalid comparison between Unknown and I4 //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected O, but got Unknown //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Expected O, but got Unknown RequestType type = request.type; if ((int)type <= 32) { switch ((int)type) { case 0: { EffectRequest val4 = (EffectRequest)(object)((request is EffectRequest) ? request : null); if (val4 != null) { EffectRequest val3 = val4; if (val3.code == null) { val3.code = string.Empty; } if (!mod.EffectLoader.TryResolve(val4, out Effect _)) { networkClient.Send((SimpleJSONResponse?)new EffectResponse(((SimpleJSONRequest)val4).id, (EffectStatus)2, (StandardErrors)4097, (string)null)); mod.Logger.LogError((object)("Effect test requested for unknown effect \"" + val4.code + "\".")); } else { networkClient.Send((SimpleJSONResponse?)new EffectResponse(((SimpleJSONRequest)val4).id, (EffectStatus)((!mod.GameStateManager.IsReady(val4.code)) ? 3 : 0))); } } return; } case 1: { EffectRequest val2 = (EffectRequest)(object)((request is EffectRequest) ? request : null); if (val2 != null) { EffectRequest val3 = val2; if (val3.code == null) { val3.code = string.Empty; } if (!mod.EffectLoader.TryResolve(val2, out Effect effect)) { networkClient.Send((SimpleJSONResponse?)new EffectResponse(((SimpleJSONRequest)val2).id, (EffectStatus)2, (StandardErrors)4097, (string)null)); mod.Logger.LogError((object)("Effect start requested for unknown effect \"" + val2.code + "\".")); } else { m_requestQueue.Enqueue(new RequestState(val2, effect)); } } return; } case 2: { EffectRequest val = (EffectRequest)(object)((request is EffectRequest) ? request : null); if (val == null) { return; } bool flag = false; foreach (RequestState value2 in m_runningEffects.Values) { if (((SimpleJSONRequest)value2.Request).id == ((SimpleJSONRequest)val).id || (val.code != null && value2.Effect.EffectAttribute.IDs.Contains(val.code))) { value2.Stop(); flag = true; } } if (!flag) { networkClient.Send((SimpleJSONResponse?)new EffectResponse(((SimpleJSONRequest)val).id, (EffectStatus)1, (StandardErrors)16899, (string)null)); } return; } } if ((int)type != 32) { return; } DataRequest val5 = (DataRequest)(object)((request is DataRequest) ? request : null); if (val5 == null) { return; } DataResponse val6; if (val5.key != null && MetadataLoader.Metadata.TryGetValue(val5.key, out MetadataDelegate value)) { try { val6 = value(mod); } catch (Exception ex) { mod.Logger.LogError((object)ex); val6 = DataResponse.Failure(val5.key, ((object)(StandardErrors)1/*cast due to .constrained prefix*/).ToString()); } } else { val6 = DataResponse.Failure(val5.key ?? string.Empty, "Unknown metadata key."); } ((SimpleJSONResponse)val6).id = ((SimpleJSONRequest)val5).id; networkClient.Send((SimpleJSONResponse?)(object)val6); } else if ((int)type != 252) { if ((int)type == 253) { mod.GameStateManager.UpdateGameState(force: true); } } else { networkClient.Send((SimpleJSONResponse?)new VersionResponse(request.id, VersionNumber.op_Implicit(mod.Version))); } } public void Enqueue(EffectRequest request, Effect effect) { m_requestQueue.Enqueue(new RequestState(request, effect)); } public static Overlay.ActiveEffect[] ActiveTimedEffects() { Scheduler scheduler = CrowdControlMod.Instance?.Scheduler; if (scheduler == null) { return Net35.Empty<Overlay.ActiveEffect>(); } try { List<Overlay.ActiveEffect> list = new List<Overlay.ActiveEffect>(); foreach (RequestState value in scheduler.m_runningEffects.Values) { TimedEffectState timedEffectState = value.TimedEffectState; if (timedEffectState == null) { continue; } TimedEffectState.EffectState state = timedEffectState.State; if ((uint)(state - 1) <= 1u) { CustomEffectManager customEffectManager = CrowdControlMod.Instance?.CustomEffects; if (customEffectManager == null || !customEffectManager.TryGetDisplayName(value.Request, out string name)) { name = EffectNames.Pretty(value.Request.code); } list.Add(new Overlay.ActiveEffect(name, (float)timedEffectState.TimeRemaining, (float)timedEffectState.Duration, timedEffectState.State == TimedEffectState.EffectState.Paused)); } } return list.ToArray(); } catch { return Net35.Empty<Overlay.ActiveEffect>(); } } public void PauseAll() { foreach (KeyValuePair<uint, RequestState> runningEffect in m_runningEffects) { runningEffect.Value.Pause(); } } public void ResumeAll() { foreach (KeyValuePair<uint, RequestState> runningEffect in m_runningEffects) { runningEffect.Value.Resume(); } } public void Tick() { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown SimpleJSONRequest request = default(SimpleJSONRequest); while (m_messageQueue.TryDequeue(ref request)) { try { HandleMessage(request); } catch (Exception ex) { mod.Logger.LogError((object)ex); } } RequestState requestState = default(RequestState); while (m_requestQueue.TryDequeue(ref requestState)) { if (!mod.GameStateManager.IsReady(requestState.Request.code)) { ((Task)(object)networkClient.SendAsync((SimpleJSONResponse?)new EffectResponse(((SimpleJSONRequest)requestState.Request).id, (EffectStatus)3))).Forget(); continue; } if (HasConflict(requestState.Effect)) { ((Task)(object)networkClient.SendAsync((SimpleJSONResponse?)new EffectResponse(((SimpleJSONRequest)requestState.Request).id, (EffectStatus)3, (StandardErrors)32768, (string)null))).Forget(); continue; } if (requestState.TimedEffectState != null) { m_runningEffects.TryAdd(((SimpleJSONRequest)requestState.Request).id, requestState); continue; } EffectResponse response; try { response = requestState.Effect.Start(requestState.Request); } catch (Exception ex2) { response = EffectResponse.Failure(((SimpleJSONRequest)requestState.Request).id, (StandardErrors)1, (string)null); mod.Logger.LogError((object)ex2); } networkClient.AttachMetadata(response); ((Task)(object)networkClient.SendAsync((SimpleJSONResponse?)(object)response)).Forget(); } ConsumeEnumerators(); } private void ConsumeEnumerators() { RequestState requestState = default(RequestState); foreach (KeyValuePair<uint, RequestState> runningEffect in m_runningEffects) { if (!runningEffect.Value.MoveNext()) { m_runningEffects.TryRemove(runningEffect.Key, ref requestState); } } } } [Serializable] [JsonConverter(typeof(Converter))] public struct SITimeSpan : IEquatable<SITimeSpan>, IEquatable<TimeSpan>, IEquatable<double>, IComparable<SITimeSpan>, IComparable<TimeSpan>, IComparable<double>, IFormattable { private class Converter : JsonConverter<SITimeSpan> { public override void WriteJson(JsonWriter writer, SITimeSpan value, JsonSerializer serializer) { TimeSpan value2 = value._value; writer.WriteValue(value2.TotalSeconds); } public override SITimeSpan ReadJson(JsonReader reader, Type objectType, SITimeSpan existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.Value is TimeSpan timeSpan) { return timeSpan; } if (reader.Value is string s) { if (TimeSpan.TryParse(s, out var result)) { return result; } if (double.TryParse(s, out var result2)) { return result2; } } return Convert.ToDouble(reader.Value); } } public static readonly SITimeSpan Zero = new SITimeSpan(TimeSpan.Zero); public static readonly SITimeSpan MinValue = new SITimeSpan(TimeSpan.MinValue); public static readonly SITimeSpan MaxValue = new SITimeSpan(TimeSpan.MaxValue); private readonly TimeSpan _value; public long Ticks { get { TimeSpan value = _value; return value.Ticks; } } public int Milliseconds { get { TimeSpan value = _value; return value.Milliseconds; } } public int Seconds { get { TimeSpan value = _value; return value.Seconds; } } public int Minutes { get { TimeSpan value = _value; return value.Minutes; } } public int Hours { get { TimeSpan value = _value; return value.Hours; } } public int Days { get { TimeSpan value = _value; return value.Days; } } public double TotalMilliseconds { get { TimeSpan value = _value; return value.TotalMilliseconds; } } public double TotalSeconds { get { TimeSpan value = _value; return value.TotalSeconds; } } public double TotalMinutes { get { TimeSpan value = _value; return value.TotalMinutes; } } public double TotalHours { get { TimeSpan value = _value; return value.TotalHours; } } public double TotalDays { get { TimeSpan value = _value; return value.TotalDays; } } public override string ToString() { return _value.ToString(); } public string ToString(string? format) { return Net35.Format(_value, format); } public string ToString(string? format, IFormatProvider? formatProvider) { return Net35.Format(_value, format, formatProvider); } public static SITimeSpan Parse(string input) { if (Enumerable.Contains(input, '.')) { return new SITimeSpan(Net35.ParseExact(input, "mm\\:ss\\.fff")); } return new SITimeSpan(TimeSpan.Parse(input)); } public static bool TryParse(string s, out SITimeSpan result) { TimeSpan result3; bool result2 = TimeSpan.TryParse(s, out result3); result = new SITimeSpan(result3); return result2; } public static int Compare(SITimeSpan t1, SITimeSpan t2) { return TimeSpan.Compare(t1._value, t2._value); } public static int Compare(TimeSpan t1, SITimeSpan t2) { return TimeSpan.Compare(t1, t2._value); } public static int Compare(SITimeSpan t1, TimeSpan t2) { return TimeSpan.Compare(t1._value, t2); } public static int Compare(double t1, SITimeSpan t2) { if (t1 > t2.TotalSeconds) { return 1; } if (!(t1 < t2.TotalSeconds)) { return 0; } return -1; } public static int Compare(SITimeSpan t1, double t2) { if (t1.TotalSeconds > t2) { return 1; } if (!(t1.TotalSeconds < t2)) { return 0; } return -1; } public static bool Equals(SITimeSpan t1, SITimeSpan t2) { return TimeSpan.Equals(t1._value, t2._value); } public static bool Equals(TimeSpan t1, SITimeSpan t2) { return TimeSpan.Equals(t1, t2._value); } public static bool Equals(SITimeSpan t1, TimeSpan t2) { return TimeSpan.Equals(t1._value, t2); } public static bool Equals(double t1, SITimeSpan t2) { return object.Equals(t1, (double)t2); } public static bool Equals(SITimeSpan t1, double t2) { return object.Equals((double)t1, t2); } public static SITimeSpan FromTicks(long value) { return new SITimeSpan(TimeSpan.FromTicks(value)); } public static SITimeSpan FromMilliseconds(double value) { return new SITimeSpan(TimeSpan.FromMilliseconds(value)); } public static SITimeSpan FromSeconds(double value) { return new SITimeSpan(TimeSpan.FromSeconds(value)); } public static SITimeSpan FromMinutes(double value) { return new SITimeSpan(TimeSpan.FromMinutes(value)); } public static SITimeSpan FromHours(double value) { return new SITimeSpan(TimeSpan.FromHours(value)); } public static SITimeSpan FromDays(double value) { return new SITimeSpan(TimeSpan.FromDays(value)); } public SITimeSpan Duration() { TimeSpan value = _value; return new SITimeSpan(value.Duration()); } public SITimeSpan Add(SITimeSpan other) { TimeSpan value = _value; return new SITimeSpan(value.Add(other._value)); } public SITimeSpan Subtract(SITimeSpan other) { TimeSpan value = _value; return new SITimeSpan(value.Subtract(other._value)); } public SITimeSpan Negate() { TimeSpan value = _value; return new SITimeSpan(value.Negate()); } private SITimeSpan(TimeSpan value) { _value = value; } private SITimeSpan(double value) { _value = TimeSpan.FromSeconds(value); } private SITimeSpan(long value) { _value = TimeSpan.FromSeconds(value); } public SITimeSpan? NullIfZero() { if (!(_value == TimeSpan.Zero)) { return this; } return null; } public static implicit operator SITimeSpan(double value) { return new SITimeSpan(value); } public static implicit operator SITimeSpan?(double? value) { if (!value.HasValue) { return null; } return new SITimeSpan(value.Value); } public static implicit operator SITimeSpan(TimeSpan value) { return new SITimeSpan(value); } public static implicit operator SITimeSpan?(TimeSpan? value) { if (!value.HasValue) { return null; } return new SITimeSpan(value.Value); } public static implicit operator SITimeSpan(Func<TimeSpan> value) { return new SITimeSpan(value()); } public static implicit operator SITimeSpan?(Func<TimeSpan>? value) { if (value == null) { return null; } return new SITimeSpan(value()); } public static implicit operator SITimeSpan(Func<SITimeSpan> value) { return new SITimeSpan(value()._value); } public static implicit operator SITimeSpan?(Func<SITimeSpan>? value) { if (value == null) { return null; } return new SITimeSpan(value()._value); } public static explicit operator double(SITimeSpan value) { TimeSpan value2 = value._value; return value2.TotalSeconds; } public static explicit operator double?(SITimeSpan? value) { if (!value.HasValue) { return null; } TimeSpan value2 = value.GetValueOrDefault()._value; return value2.TotalSeconds; } public static explicit operator float(SITimeSpan value) { TimeSpan value2 = value._value; return (float)value2.TotalSeconds; } public static explicit operator float?(SITimeSpan? value) { double? obj; if (!value.HasValue) { obj = null; } else { TimeSpan value2 = value.GetValueOrDefault()._value; obj = value2.TotalSeconds; } return (float?)obj; } public static explicit operator long(SITimeSpan value) { TimeSpan value2 = value._value; return checked((long)value2.TotalSeconds); } public static explicit operator long?(SITimeSpan? value) { double? obj; if (!value.HasValue) { obj = null; } else { TimeSpan value2 = value.GetValueOrDefault()._value; obj = value2.TotalSeconds; } return checked((long?)obj); } public static explicit operator TimeSpan(SITimeSpan value) { return value._value; } public static explicit operator TimeSpan?(SITimeSpan? value) { return value?._value; } public static explicit operator Func<TimeSpan>(SITimeSpan value) { return () => value._value; } public static explicit operator Func<TimeSpan?>(SITimeSpan? value) { return () => value?._value; } public static explicit operator Func<SITimeSpan>(SITimeSpan value) { return () => value; } public static explicit operator Func<SITimeSpan?>(SITimeSpan? value) { return () => value; } public override bool Equals(object? obj) { if (obj is SITimeSpan other) { return Equals(other); } if (obj is TimeSpan other2) { return Equals(other2); } if (obj is double other3) { return Equals(other3); } return false; } public override int GetHashCode() { return _value.GetHashCode(); } public bool Equals(SITimeSpan other) { TimeSpan value = _value; return value.Equals(other._value); } public int CompareTo(SITimeSpan other) { TimeSpan value = _value; return value.CompareTo(other._value); } public static bool operator ==(SITimeSpan a, SITimeSpan b) { TimeSpan value = a._value; return value.Equals(b._value); } public static bool operator !=(SITimeSpan a, SITimeSpan b) { TimeSpan value = a._value; return !value.Equals(b._value); } public static bool operator <(SITimeSpan a, SITimeSpan b) { return a._value < b._value; } public static bool operator <=(SITimeSpan a, SITimeSpan b) { return a._value <= b._value; } public static bool operator >(SITimeSpan a, SITimeSpan b) { return a._value > b._value; } public static bool operator >=(SITimeSpan a, SITimeSpan b) { return a._value >= b._value; } public bool Equals(TimeSpan other) { TimeSpan value = _value; return value.Equals(other); } public int CompareTo(TimeSpan other) { TimeSpan value = _value; return value.CompareTo(other); } public static bool operator ==(SITimeSpan a, TimeSpan b) { return a.Equals(b); } public static bool operator ==(TimeSpan a, SITimeSpan b) { return b.Equals(a); } public static bool operator !=(SITimeSpan a, TimeSpan b) { return !a.Equals(b); } public static bool operator !=(TimeSpan a, SITimeSpan b) { return !b.Equals(a); } public static bool operator <(SITimeSpan a, TimeSpan b) { return a._value < b; } public static bool operator <(TimeSpan a, SITimeSpan b) { return a < b._value; } public static bool operator <=(SITimeSpan a, TimeSpan b) { return a._value <= b; } public static bool operator <=(TimeSpan a, SITimeSpan b) { return a <= b._value; } public static bool operator >(SITimeSpan a, TimeSpan b) { return a._value > b; } public static bool operator >(TimeSpan a, SITimeSpan b) { return a > b._value; } public static bool operator >=(SITimeSpan a, TimeSpan b) { return a._value >= b; } public static bool operator >=(TimeSpan a, SITimeSpan b) { return a >= b._value; } public static SITimeSpan operator -(SITimeSpan a) { return -a._value; } public static SITimeSpan operator +(TimeSpan a, SITimeSpan b) { return a + b._value; } public static SITimeSpan operator -(TimeSpan a, SITimeSpan b) { return a - b._value; } public static SITimeSpan operator +(SITimeSpan a, TimeSpan b) { return a._value + b; } public static SITimeSpan operator -(SITimeSpan a, TimeSpan b) { return a._value - b; } public static SITimeSpan operator +(SITimeSpan a, SITimeSpan b) { return a._value + b._value; } public static SITimeSpan operator -(SITimeSpan a, SITimeSpan b) { return a._value - b._value; } public static DateTime operator +(DateTime a, SITimeSpan b) { return a + b._value; } public static DateTime operator -(DateTime a, SITimeSpan b) { return a - b._value; } public static DateTimeOffset operator +(DateTimeOffset a, SITimeSpan b) { return a + b._value; } public static DateTimeOffset operator -(DateTimeOffset a, SITimeSpan b) { return a - b._value; } public static SITimeSpan operator +(double a, SITimeSpan b) { TimeSpan value = b._value; return a + value.TotalSeconds; } public static SITimeSpan operator -(double a, SITimeSpan b) { TimeSpan value = b._value; return a - value.TotalSeconds; } public static SITimeSpan operator *(double a, SITimeSpan b) { TimeSpan value = b._value; return a * value.TotalSeconds; } public static SITimeSpan operator +(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds + b; } public static SITimeSpan operator -(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds - b; } public static SITimeSpan operator *(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds * b; } public static SITimeSpan operator /(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds / b; } public static SITimeSpan operator %(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds % b; } public bool Equals(double other) { TimeSpan value = _value; return value.TotalSeconds.Equals(other); } public int CompareTo(double other) { TimeSpan value = _value; return value.TotalSeconds.CompareTo(other); } public static bool operator ==(SITimeSpan a, double b) { return a.Equals(b); } public static bool operator ==(double a, SITimeSpan b) { return b.Equals(a); } public static bool operator !=(SITimeSpan a, double b) { return !a.Equals(b); } public static bool operator !=(double a, SITimeSpan b) { return !b.Equals(a); } public static bool operator <(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds < b; } public static bool operator <(double a, SITimeSpan b) { TimeSpan value = b._value; return a < value.TotalSeconds; } public static bool operator <=(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds <= b; } public static bool operator >=(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds >= b; } public static bool operator >(SITimeSpan a, double b) { TimeSpan value = a._value; return value.TotalSeconds > b; } public static bool operator >(double a, SITimeSpan b) { TimeSpan value = b._value; return a > value.TotalSeconds; } public static bool operator <=(double a, SITimeSpan b) { TimeSpan value = b._value; return a <= value.TotalSeconds; } public static bool operator >=(double a, SITimeSpan b) { TimeSpan value = b._value; return a >= value.TotalSeconds; } } public static class TaskEx { public static async void Forget(this Task task) { try { await AsyncCompatLibExtensions.ConfigureAwait(task, false); } catch (Exception ex) { CrowdControlMod.Instance.Logger.LogError((object)ex); } } public static async void Forget(this Task task, bool silent) { try { await AsyncCompatLibExtensions.ConfigureAwait(task, false); } catch (Exception ex) { if (!silent) { CrowdControlMod.Instance.Logger.LogError((object)ex); } } } } } namespace CrowdControl.UI { public static class CcTheme { public static readonly Color Slate800 = Hex(1709866); public static readonly Color Slate700 = Hex(2171190); public static readonly Color Slate600 = Hex(2632003); public static readonly Color Slate500 = Hex(2961485); public static readonly Color Slate400 = Hex(3289939); public static readonly Color Royal50 = Hex(7764980); public static readonly Color Royal100 = Hex(5984960); public static readonly Color Royal200 = Hex(3352434); public static readonly Color White100 = Hex(16448250); public static readonly Color White200 = Hex(13487593); public static readonly Color White300 = Hex(11184845); public static readonly Color Teal200 = Hex(2024093); public static readonly Color Red200 = Hex(15351146); public static readonly Color Yellow300 = Hex(16754437); public static readonly Color Blurple200 = Hex(4239863); private static Color Hex(int rgb, float a = 1f) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) return new Color((float)((rgb >> 16) & 0xFF) / 255f, (float)((rgb >> 8) & 0xFF) / 255f, (float)(rgb & 0xFF) / 255f, a); } public static Color Fade(this Color c, float alpha) { //IL_0000: 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_0012: 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) return new Color(c.r, c.g, c.b, c.a * alpha); } } public static class EffectNames { private static readonly Dictionary<string, string> Names = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) { { "BlankStorm", "Blank Storm" }, { "DamagePlayer", "Damage Player" }, { "DisableRolls", "Disable Rolls" }, { "DropCurrentGun", "Drop Current Gun" }, { "EscapeRoom", "Escape Room" }, { "FastBullets", "Fast Bullets" }, { "FastReload", "Fast Reload" }, { "FastDodgeRolls", "Fast Dodge Rolls" }, { "ForcedRolls", "Forced Rolls" }, { "GiantBullets", "Giant Bullets" }, { "GiantEnemies", "Giant Enemies" }, { "GiveArmor", "Give Armor" }, { "GiveBlank", "Give Blank" }, { "GiveKey", "Give a Key" }, { "GiveMoneyLarge", "Give Money (Large)" }, { "GiveMoneySmall", "Give Money (Small)" }, { "HealPlayer", "Heal Player" }, { "InfiniteAmmo", "Infinite Ammo" }, { "InvertControls", "Invert Controls" }, { "Invincibility", "Invincibility" }, { "InvincibleEnemies", "Invincible Enemies" }, { "KillPlayer", "Kill Player" }, { "LowAccuracy", "Low Accuracy" }, { "OHKO", "OHKO" }, { "RerollGuns", "Reroll Guns" }, { "PlayerOnFire", "Set Player on Fire" }, { "ShiftingBullets", "Shifting Bullets" }, { "SlowBullets", "Slow Bullets" }, { "ShowReload", "Slow Reload" }, { "SlowRolls", "Slow Dodge Rolls" }, { "SpawnChest", "Spawn a Chest" }, { "SpawnEnemy", "Spawn an Enemy" }, { "SpawnEnemyWave", "Spawn Enemy Wave" }, { "TakeArmor", "Take Armor" }, { "TakeBlank", "Take Blank" }, { "TakeaKey", "Take a Key" }, { "TakeMoneyLarge", "Take Money (large)" }, { "TakeMoneySmall", "Take Money (small)" }, { "TinyBullets", "Tiny Bullets" }, { "TinyEnemies", "Tiny Enemies" }, { "UseBlank", "Use Blank" }, { "VeeringBullets", "Veering Bullets" }, { "UpsideDown", "Upside Down" }, { "ZoomOut", "Zoom Out" }, { "ZoomIn", "Zoom In" }, { "Earthquake", "Earthquake" }, { "SlowMotion", "Slow Motion" }, { "SpeedUp", "Speed Up" }, { "SlowDown", "Slow Down" }, { "Cursed", "Cursed" }, { "TriggerHappy", "Trigger Happy" }, { "GiveRandomGun", "Give a Random Gun" }, { "Ricochet", "Ricochet Rounds" }, { "PiercingShots", "Piercing Shots" }, { "GlassCannon", "Glass Cannon" }, { "HypeTrain", "Hype Train" } }; public static string Pretty(string code) { if (Net35.IsNullOrWhiteSpace(code)) { return "Effect"; } if (Names.TryGetValue(code, out string value)) { return value; } StringBuilder stringBuilder = new StringBuilder(checked(code.Length + 4)); bool flag = true; foreach (char c in code) { if ((c == '-' || c == '_') ? true : false) { stringBuilder.Append(' '); flag = true; continue; } if (!flag && char.IsUpper(c)) { stringBuilder.Append(' '); } stringBuilder.Append(flag ? char.ToUpperInvariant(c) : c); flag = false; } return stringBuilder.ToString(); } } public static class ModSettings { private const string SECTION = "Overlay"; private const string SECTION_CUSTOM_EFFECTS = "CustomEffects"; private const string SECTION_ADVANCED = "Advanced"; private static ConfigEntry<bool> _showMessages; private static ConfigEntry<bool> _showIndicator; private static ConfigEntry<float> _messageSeconds; private static ConfigEntry<bool> _allowCustomEffects; private static ConfigEntry<bool> _customEffectDevReload; private static ConfigEntry<bool> _alwaysAttemptConnection; public static bool ShowMessages => _showMessages?.Value ?? true; public static bool ShowIndicator => _showIndicator?.Value ?? true; public static float MessageSeconds => _messageSeconds?.Value ?? 4f; public static bool AllowCustomEffects => _allowCustomEffects?.Value ?? true; public static bool CustomEffectDevReload => _customEffectDevReload?.Value ?? false; public static bool AlwaysAttemptConnection => _alwaysAttemptConnection?.Value ?? false; public static void Initialize(ConfigFile config) { try { _alwaysAttemptConnection = config.Bind<bool>("Advanced", "AlwaysAttemptConnection", false, "Connect to the Crowd Control port even if no Crowd Control app is found on this machine. For running the app on another machine with the port forwarded, or for testing."); _showMessages = config.Bind<bool>("Overlay", "ShowMessages", true, "Displays a short line when an effect fires. Turn off for a clean capture."); _showIndicator = config.Bind<bool>("Overlay", "ShowConnectionIndicator", true, "Small dot showing whether the mod is connected to the Crowd Control app. Green connected, red not."); _messageSeconds = config.Bind<float>("Overlay", "MessageSeconds", 4f, "How long an on-screen effect message stays visible, in seconds."); _allowCustomEffects = config.Bind<bool>("CustomEffects", "AllowCustomEffects", true, "Load community-written effects from %APPDATA%\\CrowdControl-Apps\\CustomEffects\\<game>. Effects in that folder run as part of the game, so only put things there that you trust. Turn this off to ignore the folder entirely."); _customEffectDevReload = config.Bind<bool>("CustomEffects", "DevReload", false, "Reload a custom effect as soon as its file changes, rather than at the next restart. For writing effects: the old version stays in memory, so leave this off while streaming."); } catch (Exception ex) { CrowdControlMod instance = CrowdControlMod.Instance; if (instance != null) { instance.Logger.LogWarning((object)("Could not create settings: " + ex.Message)); } } } } public static class Overlay { private readonly struct Line { public readonly string Text; public readonly float Expires; public readonly float Born; public Line(string text, float born, float expires) { Text = text; Born = born; Expires = expires; } } public readonly struct ActiveEffect { public readonly string Label; public readonly float Remaining; public readonly float Duration; public readonly bool Paused; public ActiveEffect(string label, float remaining, float duration, bool paused) { Label = label; Remaining = remaining; Duration = duration; Paused = paused; } } private const float MARGIN = 14f; private const float WIDTH = 240f; private const float PAD = 7f; private const float ACCENT = 2f; private const float RADIUS = 5f; private const float HEADER = 16f; private const float ROW = 15f; private const float BAR = 3f; private const float GAP = 3f; private const int MAX_TEXT = 34; private const int MAX_LINES = 4; private static readonly List<Line> Lines = new List<Line>(); private static bool _hidden; private static Texture2D _pixel; private static Texture2D _panel; private static int _panelW; private static int _panelH; private static GUIStyle _name; private static GUIStyle _meta; private static GUIStyle _metaRight; private static GUIStyle _msg; public static bool Toggle() { _hidden = !_hidden; return !_hidden; } public static void Show(string text, bool force = false) { if (Net35.IsNullOrWhiteSpace(text) || (!force && (!ModSettings.ShowMessages || _hidden))) { return; } if (force) { _hidden = false; } float num = Now(); lock (Lines) { Lines.Add(new Line(Trim(text), num, num + ModSettings.MessageSeconds)); while (Lines.Count > 4) { Lines.RemoveAt(0); } } } public static void Clear() { lock (Lines) { Lines.Clear(); } } public static void Draw(bool connected, bool clientPresent) { //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) try { if (_hidden) { return; } EnsureStyles(); ActiveEffect[] array = Scheduler.ActiveTimedEffects(); Line[] array2 = TakeLines(); bool flag = clientPresent || connected; bool flag2 = ModSettings.ShowIndicator && flag; if (!flag2 && array.Length == 0 && array2.Length == 0) { return; } float num = 7f; if (flag2) { num += 19f; } if (array.Length != 0) { num += (float)array.Length * 21f - 3f; } if (array2.Length != 0) { if (array.Length != 0) { num += 7f; } num += (float)array2.Length * 15f; } num += 7f; Rect card = default(Rect); ((Rect)(ref card))..ctor((float)Screen.width - 240f - 14f, 14f, 240f, num); DrawCard(card); float num2 = ((Rect)(ref card)).x + 2f + 7f; float num3 = 224f; float num4 = ((Rect)(ref card)).y + 7f; if (flag2) { DrawHeader(num2, num4, num3, connected); num4 += 19f; } for (int i = 0; i < array.Length; i = checked(i + 1)) { DrawEffect(num2, num4, num3, array[i]); num4 += 21f; } if (array2.Length != 0) { if (array.Length != 0) { Fill(new Rect(num2, num4, num3, 1f), CcTheme.Slate500); num4 += 4f; } float num5 = Now(); Line[] array3 = array2; for (int j = 0; j < array3.Length; j++) { Line line = array3[j]; float num6 = Mathf.Clamp01((num5 - line.Born) / 0.15f); float num7 = Mathf.Clamp01(line.Expires - num5); float alpha = Mathf.Min(n
BepInEx/plugins/CrowdControl/Newtonsoft.Json.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Xml; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Bson; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq.JsonPath; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Utilities.LinqBridge; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AllowPartiallyTrustedCallers] [assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] [assembly: CLSCompliant(true)] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © James Newton-King 2008")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyFileVersion("13.0.4.30916")] [assembly: AssemblyInformationalVersion("13.0.4+4e13299d4b0ec96bd4df9954ef646bd2d1b5bf2a")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyTitle("Json.NET .NET 2.0")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyVersion("13.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [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] [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; } } [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] internal sealed class ExtensionAttribute : Attribute { } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, Inherited = false)] internal sealed class DynamicallyAccessedMembersAttribute : Attribute { public DynamicallyAccessedMemberTypes MemberTypes { get; } public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes) { MemberTypes = memberTypes; } } [Flags] internal enum DynamicallyAccessedMemberTypes { None = 0, PublicParameterlessConstructor = 1, PublicConstructors = 3, NonPublicConstructors = 4, PublicMethods = 8, NonPublicMethods = 0x10, PublicFields = 0x20, NonPublicFields = 0x40, PublicNestedTypes = 0x80, NonPublicNestedTypes = 0x100, PublicProperties = 0x200, NonPublicProperties = 0x400, PublicEvents = 0x800, NonPublicEvents = 0x1000, Interfaces = 0x2000, All = -1 } [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class FeatureGuardAttribute : Attribute { public Type FeatureType { get; } public FeatureGuardAttribute(Type featureType) { FeatureType = featureType; } } [AttributeUsage(AttributeTargets.Property, Inherited = false)] internal sealed class FeatureSwitchDefinitionAttribute : Attribute { public string SwitchName { get; } public FeatureSwitchDefinitionAttribute(string switchName) { SwitchName = switchName; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)] internal sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal class DoesNotReturnIfAttribute : Attribute { public bool ParameterValue { get; } public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)] internal sealed class RequiresDynamicCodeAttribute : Attribute { public string Message { get; } public string? Url { get; set; } public RequiresDynamicCodeAttribute(string message) { Message = message; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)] internal sealed class RequiresUnreferencedCodeAttribute : Attribute { public string Message { get; } public string? Url { get; set; } public RequiresUnreferencedCodeAttribute(string message) { Message = message; } } [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] internal sealed class UnconditionalSuppressMessageAttribute : Attribute { public string Category { get; } public string CheckId { get; } public string? Scope { get; set; } public string? Target { get; set; } public string? MessageId { get; set; } public string? Justification { get; set; } public UnconditionalSuppressMessageAttribute(string category, string checkId) { Category = category; CheckId = checkId; } } } namespace Newtonsoft.Json { public enum ConstructorHandling { Default, AllowNonPublicDefaultConstructor } public enum DateFormatHandling { IsoDateFormat, MicrosoftDateFormat } public enum DateParseHandling { None, DateTime } public enum DateTimeZoneHandling { Local, Utc, Unspecified, RoundtripKind } public class DefaultJsonNameTable : JsonNameTable { private class Entry { internal readonly string Value; internal readonly int HashCode; internal Entry Next; internal Entry(string value, int hashCode, Entry next) { Value = value; HashCode = hashCode; Next = next; } } private static readonly int HashCodeRandomizer; private int _count; private Entry[] _entries; private int _mask = 31; static DefaultJsonNameTable() { HashCodeRandomizer = Environment.TickCount; } public DefaultJsonNameTable() { _entries = new Entry[_mask + 1]; } public override string? Get(char[] key, int start, int length) { if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; num += (num << 7) ^ key[start]; int num2 = start + length; for (int i = start + 1; i < num2; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; int num3 = Thread.VolatileRead(ref _mask); int num4 = num & num3; for (Entry entry = _entries[num4]; entry != null; entry = entry.Next) { if (entry.HashCode == num && TextEquals(entry.Value, key, start, length)) { return entry.Value; } } return null; } public string Add(string key) { if (key == null) { throw new ArgumentNullException("key"); } int length = key.Length; if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; for (int i = 0; i < key.Length; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next) { if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal)) { return entry.Value; } } return AddEntry(key, num); } private string AddEntry(string str, int hashCode) { int num = hashCode & _mask; Entry entry = new Entry(str, hashCode, _entries[num]); _entries[num] = entry; if (_count++ == _mask) { Grow(); } return entry.Value; } private void Grow() { Entry[] entries = _entries; int num = _mask * 2 + 1; Entry[] array = new Entry[num + 1]; for (int i = 0; i < entries.Length; i++) { Entry entry = entries[i]; while (entry != null) { int num2 = entry.HashCode & num; Entry next = entry.Next; entry.Next = array[num2]; array[num2] = entry; entry = next; } } _entries = array; Thread.VolatileWrite(ref _mask, num); } private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) { if (str1.Length != str2Length) { return false; } for (int i = 0; i < str1.Length; i++) { if (str1[i] != str2[str2Start + i]) { return false; } } return true; } } [Flags] public enum DefaultValueHandling { Include = 0, Ignore = 1, Populate = 2, IgnoreAndPopulate = 3 } public enum FloatFormatHandling { String, Symbol, DefaultValue } public enum FloatParseHandling { Double, Decimal } public enum Formatting { None, Indented } public interface IArrayPool<T> { T[] Rent(int minimumLength); void Return(T[]? array); } public interface IJsonLineInfo { int LineNumber { get; } int LinePosition { get; } bool HasLineInfo(); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } public JsonArrayAttribute() { } public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } public JsonArrayAttribute(string id) : base(id) { } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type? _namingStrategyType; private object[]? _namingStrategyParameters; public string? Id { get; set; } public string? Title { get; set; } public string? Description { get; set; } public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get { return _namingStrategyType; } set { _namingStrategyType = value; NamingStrategyInstance = null; } } public object[]? NamingStrategyParameters { get { return _namingStrategyParameters; } set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy? NamingStrategyInstance { get; set; } public bool IsReference { get { return _isReference == true; } set { _isReference = value; } } public bool ItemIsReference { get { return _itemIsReference == true; } set { _itemIsReference = value; } } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } protected JsonContainerAttribute() { } protected JsonContainerAttribute(string id) { Id = id; } } public static class JsonConvert { public static readonly string True = "true"; public static readonly string False = "false"; public static readonly string Null = "null"; public static readonly string Undefined = "undefined"; public static readonly string PositiveInfinity = "Infinity"; public static readonly string NegativeInfinity = "-Infinity"; public static readonly string NaN = "NaN"; public static Newtonsoft.Json.Serialization.Func<JsonSerializerSettings>? DefaultSettings { get; set; } public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(bool value) { if (!value) { return False; } return True; } public static string ToString(char value) { return ToString(char.ToString(value)); } public static string ToString(Enum value) { return value.ToString("D"); } public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value))) { return text; } if (floatFormatHandling == FloatFormatHandling.DefaultValue) { if (nullable) { return Null; } return "0.0"; } return quoteChar + text + quoteChar; } public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || StringUtils.IndexOf(text, '.') != -1 || StringUtils.IndexOf(text, 'E') != -1 || StringUtils.IndexOf(text, 'e') != -1) { return text; } return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (StringUtils.IndexOf(text, '.') != -1) { return text; } return text + ".0"; } public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } public static string ToString(Guid value) { return ToString(value, '"'); } internal static string ToString(Guid value, char quoteChar) { string text = value.ToString("D", CultureInfo.InvariantCulture); string text2 = quoteChar.ToString(CultureInfo.InvariantCulture); return text2 + text + text2; } public static string ToString(TimeSpan value) { return ToString(value, '"'); } internal static string ToString(TimeSpan value, char quoteChar) { return ToString(value.ToString(), quoteChar); } public static string ToString(Uri? value) { if (value == null) { return Null; } return ToString(value, '"'); } internal static string ToString(Uri value, char quoteChar) { return ToString(value.OriginalString, quoteChar); } public static string ToString(string? value) { return ToString(value, '"'); } public static string ToString(string? value, char delimiter) { return ToString(value, delimiter, StringEscapeHandling.Default); } public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') { throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter"); } return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling); } public static string ToString(object? value) { if (value == null) { return Null; } return ConvertUtils.GetTypeCode(value.GetType()) switch { PrimitiveTypeCode.String => ToString((string)value), PrimitiveTypeCode.Char => ToString((char)value), PrimitiveTypeCode.Boolean => ToString((bool)value), PrimitiveTypeCode.SByte => ToString((sbyte)value), PrimitiveTypeCode.Int16 => ToString((short)value), PrimitiveTypeCode.UInt16 => ToString((ushort)value), PrimitiveTypeCode.Int32 => ToString((int)value), PrimitiveTypeCode.Byte => ToString((byte)value), PrimitiveTypeCode.UInt32 => ToString((uint)value), PrimitiveTypeCode.Int64 => ToString((long)value), PrimitiveTypeCode.UInt64 => ToString((ulong)value), PrimitiveTypeCode.Single => ToString((float)value), PrimitiveTypeCode.Double => ToString((double)value), PrimitiveTypeCode.DateTime => ToString((DateTime)value), PrimitiveTypeCode.Decimal => ToString((decimal)value), PrimitiveTypeCode.DBNull => Null, PrimitiveTypeCode.Guid => ToString((Guid)value), PrimitiveTypeCode.Uri => ToString((Uri)value), PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), _ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), }; } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value) { return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings?)null); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, JsonSerializerSettings? settings) { return SerializeObject(value, null, settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); return SerializeObjectInternal(value, type, jsonSerializer); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings) { return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); jsonSerializer.Formatting = formatting; return SerializeObjectInternal(value, type, jsonSerializer); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer) { StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture); using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter)) { jsonTextWriter.Formatting = jsonSerializer.Formatting; jsonSerializer.Serialize(jsonTextWriter, value, type); } return stringWriter.ToString(); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static object? DeserializeObject(string value) { return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static object? DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static object? DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings?)null); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static T? DeserializeObject<T>(string value) { return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject) { return DeserializeObject<T>(value); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings) { return DeserializeObject<T>(value, settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static T? DeserializeObject<T>(string value, params JsonConverter[] converters) { return (T)DeserializeObject(value, typeof(T), converters); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings) { return (T)DeserializeObject(value, typeof(T), settings); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return DeserializeObject(value, type, settings); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings) { ValidationUtils.ArgumentNotNull(value, "value"); JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); if (!jsonSerializer.IsCheckAdditionalContentSet()) { jsonSerializer.CheckAdditionalContent = true; } using JsonTextReader reader = new JsonTextReader(new StringReader(value)); return jsonSerializer.Deserialize(reader, type); } [DebuggerStepThrough] [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static void PopulateObject(string value, object target, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); using JsonReader jsonReader = new JsonTextReader(new StringReader(value)); jsonSerializer.Populate(jsonReader, target); if (settings == null || !settings.CheckAdditionalContent) { return; } while (jsonReader.Read()) { if (jsonReader.TokenType != JsonToken.Comment) { throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object."); } } } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeXmlNode(XmlNode? node) { return SerializeXmlNode(node, Formatting.None); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeXmlNode(XmlNode? node, Formatting formatting) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); return SerializeObject(node, formatting, xmlNodeConverter); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static XmlDocument? DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter); } } public abstract class JsonConverter { public virtual bool CanRead => true; public virtual bool CanWrite => true; public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer); public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer); public abstract bool CanConvert(Type objectType); } public abstract class JsonConverter<T> : JsonConverter { public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T)))) { throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } WriteJson(writer, (T)value, serializer); } public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer); public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { bool flag = existingValue == null; if (!flag && !(existingValue is T)) { throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer); } public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer); public sealed override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; public Type ConverterType => _converterType; public object[]? ConverterParameters { get; } public JsonConverterAttribute(Type converterType) { if ((object)converterType == null) { throw new ArgumentNullException("converterType"); } _converterType = converterType; } public JsonConverterAttribute(Type converterType, params object[] converterParameters) : this(converterType) { ConverterParameters = converterParameters; } } public class JsonConverterCollection : Collection<JsonConverter> { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { public JsonDictionaryAttribute() { } public JsonDictionaryAttribute(string id) : base(id) { } } [Serializable] public class JsonException : Exception { public JsonException() { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception? innerException) : base(message, innerException) { } public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) { message = JsonPosition.FormatMessage(lineInfo, path, message); return new JsonException(message); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class JsonExtensionDataAttribute : Attribute { public bool WriteData { get; set; } public bool ReadData { get; set; } public JsonExtensionDataAttribute() { WriteData = true; ReadData = true; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } public abstract class JsonNameTable { public abstract string? Get(char[] key, int start, int length); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization; internal MissingMemberHandling? _missingMemberHandling; internal Required? _itemRequired; internal NullValueHandling? _itemNullValueHandling; public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public NullValueHandling ItemNullValueHandling { get { return _itemNullValueHandling.GetValueOrDefault(); } set { _itemNullValueHandling = value; } } public Required ItemRequired { get { return _itemRequired.GetValueOrDefault(); } set { _itemRequired = value; } } public JsonObjectAttribute() { } public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } public JsonObjectAttribute(string id) : base(id) { } } internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { private static readonly char[] SpecialCharacters = new char[18] { '.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t', '\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029' }; internal JsonContainerType Type; internal int Position; internal string? PropertyName; internal bool HasIndex; public JsonPosition(JsonContainerType type) { Type = type; HasIndex = TypeHasIndex(type); Position = -1; PropertyName = null; } internal int CalculateLength() { switch (Type) { case JsonContainerType.Object: return PropertyName.Length + 5; case JsonContainerType.Array: case JsonContainerType.Constructor: return MathUtils.IntLength((ulong)Position) + 2; default: throw new ArgumentOutOfRangeException("Type"); } } internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer) { switch (Type) { case JsonContainerType.Object: { string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { sb.Append("['"); if (writer == null) { writer = new StringWriter(sb); } JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer); sb.Append("']"); } else { if (sb.Length > 0) { sb.Append('.'); } sb.Append(propertyName); } break; } case JsonContainerType.Array: case JsonContainerType.Constructor: sb.Append('['); sb.Append(Position); sb.Append(']'); break; } } internal static bool TypeHasIndex(JsonContainerType type) { if (type != JsonContainerType.Array) { return type == JsonContainerType.Constructor; } return true; } internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition) { int num = 0; if (positions != null) { for (int i = 0; i < positions.Count; i++) { num += positions[i].CalculateLength(); } } if (currentPosition.HasValue) { num += currentPosition.GetValueOrDefault().CalculateLength(); } StringBuilder stringBuilder = new StringBuilder(num); StringWriter writer = null; char[] buffer = null; if (positions != null) { foreach (JsonPosition position in positions) { position.WriteTo(stringBuilder, ref writer, ref buffer); } } currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer); return stringBuilder.ToString(); } internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message) { if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) { message = message.Trim(); if (!StringUtils.EndsWith(message, '.')) { message += "."; } message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) { message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); } message += "."; return message; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get; set; } public object[]? NamingStrategyParameters { get; set; } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public bool IsReference { get { return _isReference == true; } set { _isReference = value; } } public int Order { get { return _order.GetValueOrDefault(); } set { _order = value; } } public Required Required { get { return _required.GetValueOrDefault(); } set { _required = value; } } public string? PropertyName { get; set; } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } public bool ItemIsReference { get { return _itemIsReference == true; } set { _itemIsReference = value; } } public JsonPropertyAttribute() { } public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } public abstract class JsonReader : IDisposable { protected internal enum State { Start, Complete, Property, ObjectStart, Object, ArrayStart, Array, Closed, PostValue, ConstructorStart, Constructor, Error, Finished } private JsonToken _tokenType; private object? _value; internal char _quoteChar; internal State _currentState; private JsonPosition _currentPosition; private CultureInfo? _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; internal FloatParseHandling _floatParseHandling; private string? _dateFormatString; private List<JsonPosition>? _stack; protected State CurrentState => _currentState; public bool CloseInput { get; set; } public bool SupportMultipleContent { get; set; } public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) { throw new ArgumentOutOfRangeException("value"); } _dateTimeZoneHandling = value; } } public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { if (value < DateParseHandling.None || value > DateParseHandling.DateTime) { throw new ArgumentOutOfRangeException("value"); } _dateParseHandling = value; } } public FloatParseHandling FloatParseHandling { get { return _floatParseHandling; } set { if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) { throw new ArgumentOutOfRangeException("value"); } _floatParseHandling = value; } } public string? DateFormatString { get { return _dateFormatString; } set { _dateFormatString = value; } } public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; } } public virtual JsonToken TokenType => _tokenType; public virtual object? Value => _value; public virtual Type? ValueType => _value?.GetType(); public virtual int Depth { get { int num = _stack?.Count ?? 0; if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) { return num; } return num + 1; } } public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) { return string.Empty; } JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : ((JsonPosition?)null)); return JsonPosition.BuildPath(_stack, currentPosition); } } public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } internal JsonPosition GetPosition(int depth) { if (_stack != null && depth < _stack.Count) { return _stack[depth]; } return _currentPosition; } protected JsonReader() { _currentState = State.Start; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; _floatParseHandling = FloatParseHandling.Double; _maxDepth = 64; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition = new JsonPosition(value); return; } if (_stack == null) { _stack = new List<JsonPosition>(); } _stack.Add(_currentPosition); _currentPosition = new JsonPosition(value); if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth) { return; } _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } private JsonContainerType Pop() { JsonPosition currentPosition; if (_stack != null && _stack.Count > 0) { currentPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { currentPosition = _currentPosition; _currentPosition = default(JsonPosition); } if (_maxDepth.HasValue && Depth <= _maxDepth) { _hasExceededMaxDepth = false; } return currentPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } public abstract bool Read(); public virtual int? ReadAsInt32() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is int) { return (int)value; } int num; try { num = Convert.ToInt32(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } SetToken(JsonToken.Integer, num, updateIndex: false); return num; } case JsonToken.String: { string s = (string)Value; return ReadInt32String(s); } default: throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal int? ReadInt32String(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (int.TryParse(s, NumberStyles.Integer, Culture, out var result)) { SetToken(JsonToken.Integer, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual string? ReadAsString() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.String: return (string)Value; default: if (JsonTokenUtils.IsPrimitiveToken(contentToken)) { object value = Value; if (value != null) { string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture)); SetToken(JsonToken.String, text, updateIndex: false); return text; } } throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } public virtual byte[]? ReadAsBytes() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.StartObject: { ReadIntoWrappedTypeObject(); byte[] array2 = ReadAsBytes(); ReaderReadAndAssert(); if (TokenType != JsonToken.EndObject) { throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } SetToken(JsonToken.Bytes, array2, updateIndex: false); return array2; } case JsonToken.String: { string text = (string)Value; Guid g; byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray())); SetToken(JsonToken.Bytes, array3, updateIndex: false); return array3; } case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Bytes: if (Value is Guid guid) { byte[] array = guid.ToByteArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } return (byte[])Value; case JsonToken.StartArray: return ReadArrayIntoByteArray(); default: throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal byte[] ReadArrayIntoByteArray() { List<byte> list = new List<byte>(); do { if (!Read()) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(list)); byte[] array = list.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer) { switch (TokenType) { case JsonToken.None: throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); case JsonToken.Integer: buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); return false; case JsonToken.EndArray: return true; case JsonToken.Comment: return false; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } public virtual double? ReadAsDouble() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is double) { return (double)value; } double num = Convert.ToDouble(value, CultureInfo.InvariantCulture); SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDoubleString((string)Value); default: throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal double? ReadDoubleString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual bool? ReadAsBoolean() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { bool flag = Convert.ToBoolean(Value, CultureInfo.InvariantCulture); SetToken(JsonToken.Boolean, flag, updateIndex: false); return flag; } case JsonToken.String: return ReadBooleanString((string)Value); case JsonToken.Boolean: return (bool)Value; default: throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal bool? ReadBooleanString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (bool.TryParse(s, out var result)) { SetToken(JsonToken.Boolean, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual decimal? ReadAsDecimal() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is decimal) { return (decimal)value; } decimal num; try { num = Convert.ToDecimal(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDecimalString((string)Value); default: throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal decimal? ReadDecimalString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTime? ReadAsDateTime() { switch (GetContentToken()) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: return (DateTime)Value; case JsonToken.String: return ReadDateTimeString((string)Value); default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } internal DateTime? ReadDateTimeString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } internal void ReaderReadAndAssert() { if (!Read()) { throw CreateUnexpectedEndException(); } } internal JsonReaderException CreateUnexpectedEndException() { return JsonReaderException.Create(this, "Unexpected end when reading JSON."); } internal void ReadIntoWrappedTypeObject() { ReaderReadAndAssert(); if (Value != null && Value.ToString() == "$type") { ReaderReadAndAssert(); if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) { ReaderReadAndAssert(); if (Value.ToString() == "$value") { return; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } public void Skip() { if (TokenType == JsonToken.PropertyName) { Read(); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (Read() && depth < Depth) { } } } protected void SetToken(JsonToken newToken) { SetToken(newToken, null, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value) { SetToken(newToken, value, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string)value; break; case JsonToken.Raw: case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: SetPostValueState(updateIndex); break; case JsonToken.Comment: break; } } internal void SetPostValueState(bool updateIndex) { if (Peek() != JsonContainerType.None || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } if (updateIndex) { UpdateScopeWithFinishedValue(); } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.HasIndex) { _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType jsonContainerType = Pop(); if (GetTypeForCloseToken(endToken) != jsonContainerType) { throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType)); } if (Peek() != JsonContainerType.None || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } } protected void SetStateBasedOnCurrent() { JsonContainerType jsonContainerType = Peek(); switch (jsonContainerType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: SetFinished(); break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType)); } } private void SetFinished() { _currentState = ((!SupportMultipleContent) ? State.Finished : State.Start); } private JsonContainerType GetTypeForCloseToken(JsonToken token) { return token switch { JsonToken.EndObject => JsonContainerType.Object, JsonToken.EndArray => JsonContainerType.Array, JsonToken.EndConstructor => JsonContainerType.Constructor, _ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), }; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) { Close(); } } public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } internal void ReadAndAssert() { if (!Read()) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter) { if (!ReadForType(contract, hasConverter)) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal bool ReadForType(JsonContract? contract, bool hasConverter) { if (hasConverter) { return Read(); } switch (contract?.InternalReadType ?? ReadType.Read) { case ReadType.Read: return ReadAndMoveToContent(); case ReadType.ReadAsInt32: ReadAsInt32(); break; case ReadType.ReadAsInt64: { bool result = ReadAndMoveToContent(); if (TokenType == JsonToken.Undefined) { throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long))); } return result; } case ReadType.ReadAsDecimal: ReadAsDecimal(); break; case ReadType.ReadAsDouble: ReadAsDouble(); break; case ReadType.ReadAsBytes: ReadAsBytes(); break; case ReadType.ReadAsBoolean: ReadAsBoolean(); break; case ReadType.ReadAsString: ReadAsString(); break; case ReadType.ReadAsDateTime: ReadAsDateTime(); break; default: throw new ArgumentOutOfRangeException(); } return TokenType != JsonToken.None; } internal bool ReadAndMoveToContent() { if (Read()) { return MoveToContent(); } return false; } internal bool MoveToContent() { JsonToken tokenType = TokenType; while (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { if (!Read()) { return false; } tokenType = TokenType; } return true; } private JsonToken GetContentToken() { JsonToken tokenType; do { if (!Read()) { SetToken(JsonToken.None); return JsonToken.None; } tokenType = TokenType; } while (tokenType == JsonToken.Comment); return tokenType; } } [Serializable] public class JsonReaderException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonReaderException() { } public JsonReaderException(string message) : base(message) { } public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, path, lineNumber, linePosition, ex); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonRequiredAttribute : Attribute { } [Serializable] public class JsonSerializationException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonSerializationException() { } public JsonSerializationException(string message) : base(message) { } public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonSerializationException(message, path, lineNumber, linePosition, ex); } } [RequiresUnreferencedCode("Newtonsoft.Json relies on reflection over types that may be removed when trimming.")] [RequiresDynamicCode("Newtonsoft.Json relies on dynamically creating types that may not be available with Ahead of Time compilation.")] public class JsonSerializer { internal TypeNameHandling _typeNameHandling; internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling; internal PreserveReferencesHandling _preserveReferencesHandling; internal ReferenceLoopHandling _referenceLoopHandling; internal MissingMemberHandling _missingMemberHandling; internal ObjectCreationHandling _objectCreationHandling; internal NullValueHandling _nullValueHandling; internal DefaultValueHandling _defaultValueHandling; internal ConstructorHandling _constructorHandling; internal MetadataPropertyHandling _metadataPropertyHandling; internal JsonConverterCollection? _converters; internal IContractResolver _contractResolver; internal ITraceWriter? _traceWriter; internal IEqualityComparer? _equalityComparer; internal ISerializationBinder _serializationBinder; internal StreamingContext _context; private IReferenceResolver? _referenceResolver; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private FloatFormatHandling? _floatFormatHandling; private FloatParseHandling? _floatParseHandling; private StringEscapeHandling? _stringEscapeHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; private string? _dateFormatString; private bool _dateFormatStringSet; public virtual IReferenceResolver? ReferenceResolver { get { return GetReferenceResolver(); } set { if (value == null) { throw new ArgumentNullException("value", "Reference resolver cannot be null."); } _referenceResolver = value; } } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public virtual SerializationBinder Binder { get { if (_serializationBinder is SerializationBinder result) { return result; } if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value); } } public virtual ISerializationBinder SerializationBinder { get { return _serializationBinder; } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = value; } } public virtual ITraceWriter? TraceWriter { get { return _traceWriter; } set { _traceWriter = value; } } public virtual IEqualityComparer? EqualityComparer { get { return _equalityComparer; } set { _equalityComparer = value; } } public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) { throw new ArgumentOutOfRangeException("value"); } _typeNameHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling; } set { if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = value; } } public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) { throw new ArgumentOutOfRangeException("value"); } _preserveReferencesHandling = value; } } public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) { throw new ArgumentOutOfRangeException("value"); } _referenceLoopHandling = value; } } public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) { throw new ArgumentOutOfRangeException("value"); } _missingMemberHandling = value; } } public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _nullValueHandling = value; } } public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) { throw new ArgumentOutOfRangeException("value"); } _defaultValueHandling = value; } } public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) { throw new ArgumentOutOfRangeException("value"); } _objectCreationHandling = value; } } public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) { throw new ArgumentOutOfRangeException("value"); } _constructorHandling = value; } } public virtual MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling; } set { if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _metadataPropertyHandling = value; } } public virtual JsonConverterCollection Converters { get { if (_converters == null) { _converters = new JsonConverterCollection(); } return _converters; } } public virtual IContractResolver ContractResolver { get { return _contractResolver; } set { _contractResolver = value ?? DefaultContractResolver.Instance; } } public virtual StreamingContext Context { get { return _context; } set { _context = value; } } public virtual Formatting Formatting { get { return _formatting.GetValueOrDefault(); } set { _formatting = value; } } public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling.GetValueOrDefault(); } set { _dateFormatHandling = value; } } public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind; } set { _dateTimeZoneHandling = value; } } public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DateParseHandling.DateTime; } set { _dateParseHandling = value; } } public virtual FloatParseHandling FloatParseHandling { get { return _floatParseHandling.GetValueOrDefault(); } set { _floatParseHandling = value; } } public virtual FloatFormatHandling FloatFormatHandling { get { return _floatFormatHandling.GetValueOrDefault(); } set { _floatFormatHandling = value; } } public virtual StringEscapeHandling StringEscapeHandling { get { return _stringEscapeHandling.GetValueOrDefault(); } set { _stringEscapeHandling = value; } } public virtual string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFormatStringSet = true; } } public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; _maxDepthSet = true; } } public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent == true; } set { _checkAdditionalContent = value; } } public virtual event EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs>? Error; internal bool IsCheckAdditionalContentSet() { return _checkAdditionalContent.HasValue; } public JsonSerializer() { _referenceLoopHandling = ReferenceLoopHandling.Error; _missingMemberHandling = MissingMemberHandling.Ignore; _nullValueHandling = NullValueHandling.Include; _defaultValueHandling = DefaultValueHandling.Include; _objectCreationHandling = ObjectCreationHandling.Auto; _preserveReferencesHandling = PreserveReferencesHandling.None; _constructorHandling = ConstructorHandling.Default; _typeNameHandling = TypeNameHandling.None; _metadataPropertyHandling = MetadataPropertyHandling.Default; _context = JsonSerializerSettings.DefaultContext; _serializationBinder = DefaultSerializationBinder.Instance; _culture = JsonSerializerSettings.DefaultCulture; _contractResolver = DefaultContractResolver.Instance; } public static JsonSerializer Create() { return new JsonSerializer(); } public static JsonSerializer Create(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = Create(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } public static JsonSerializer CreateDefault() { return Create(JsonConvert.DefaultSettings?.Invoke()); } public static JsonSerializer CreateDefault(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = CreateDefault(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) { for (int i = 0; i < settings.Converters.Count; i++) { serializer.Converters.Insert(i, settings.Converters[i]); } } if (settings._typeNameHandling.HasValue) { serializer.TypeNameHandling = settings.TypeNameHandling; } if (settings._metadataPropertyHandling.HasValue) { serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; } if (settings._typeNameAssemblyFormatHandling.HasValue) { serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling; } if (settings._preserveReferencesHandling.HasValue) { serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; } if (settings._referenceLoopHandling.HasValue) { serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; } if (settings._missingMemberHandling.HasValue) { serializer.MissingMemberHandling = settings.MissingMemberHandling; } if (settings._objectCreationHandling.HasValue) { serializer.ObjectCreationHandling = settings.ObjectCreationHandling; } if (settings._nullValueHandling.HasValue) { serializer.NullValueHandling = settings.NullValueHandling; } if (settings._defaultValueHandling.HasValue) { serializer.DefaultValueHandling = settings.DefaultValueHandling; } if (settings._constructorHandling.HasValue) { serializer.ConstructorHandling = settings.ConstructorHandling; } if (settings._context.HasValue) { serializer.Context = settings.Context; } if (settings._checkAdditionalContent.HasValue) { serializer._checkAdditionalContent = settings._checkAdditionalContent; } if (settings.Error != null) { serializer.Error += settings.Error; } if (settings.ContractResolver != null) { serializer.ContractResolver = settings.ContractResolver; } if (settings.ReferenceResolverProvider != null) { serializer.ReferenceResolver = settings.ReferenceResolverProvider(); } if (settings.TraceWriter != null) { serializer.TraceWriter = settings.TraceWriter; } if (settings.EqualityComparer != null) { serializer.EqualityComparer = settings.EqualityComparer; } if (settings.SerializationBinder != null) { serializer.SerializationBinder = settings.SerializationBinder; } if (settings._formatting.HasValue) { serializer._formatting = settings._formatting; } if (settings._dateFormatHandling.HasValue) { serializer._dateFormatHandling = settings._dateFormatHandling; } if (settings._dateTimeZoneHandling.HasValue) { serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; } if (settings._dateParseHandling.HasValue) { serializer._dateParseHandling = settings._dateParseHandling; } if (settings._dateFormatStringSet) { serializer._dateFormatString = settings._dateFormatString; serializer._dateFormatStringSet = settings._dateFormatStringSet; } if (settings._floatFormatHandling.HasValue) { serializer._floatFormatHandling = settings._floatFormatHandling; } if (settings._floatParseHandling.HasValue) { serializer._floatParseHandling = settings._floatParseHandling; } if (settings._stringEscapeHandling.HasValue) { serializer._stringEscapeHandling = settings._stringEscapeHandling; } if (settings._culture != null) { serializer._culture = settings._culture; } if (settings._maxDepthSet) { serializer._maxDepth = settings._maxDepth; serializer._maxDepthSet = settings._maxDepthSet; } } [DebuggerStepThrough] public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } [DebuggerStepThrough] public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader) { return Deserialize(reader, null); } [DebuggerStepThrough] public object? Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } [DebuggerStepThrough] public T? Deserialize<T>(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader, Type? objectType) { return DeserializeInternal(reader, objectType); } internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); object? result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); return result; } internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString) { if (_culture != null && !_culture.Equals(reader.Culture)) { previousCulture = reader.Culture; reader.Culture = _culture; } else { previousCulture = null; } if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } else { previousDateTimeZoneHandling = null; } if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); } else { previousDateParseHandling = null; } if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling) { previousFloatParseHandling = reader.FloatParseHandling; reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); } else { previousFloatParseHandling = null; } if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } else { previousMaxDepth = null; } if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) { previousDateFormatString = reader.DateFormatString; reader.DateFormatString = _dateFormatString; } else { previousDateFormatString = null; } if (reader is JsonTextReader { PropertyNameTable: null } jsonTextReader && _contractResolver is DefaultContractResolver defaultContractResolver) { jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable(); } } private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString) { if (previousCulture != null) { reader.Culture = previousCulture; } if (previousDateTimeZoneHandling.HasValue) { reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); } if (previousDateParseHandling.HasValue) { reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); } if (previousFloatParseHandling.HasValue) { reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); } if (_maxDepthSet) { reader.MaxDepth = previousMaxDepth; } if (_dateFormatStringSet) { reader.DateFormatString = previousDateFormatString; } if (reader is JsonTextReader { PropertyNameTable: not null } jsonTextReader && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable()) { jsonTextReader.PropertyNameTable = null; } } public void Serialize(TextWriter textWriter, object? value) { Serialize(new JsonTextWriter(textWriter), value); } public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType) { SerializeInternal(jsonWriter, value, objectType); } public void Serialize(TextWriter textWriter, object? value, Type objectType) { Serialize(new JsonTextWriter(textWriter), value, objectType); } public void Serialize(JsonWriter jsonWriter, object? value) { SerializeInternal(jsonWriter, value, null); } private TraceJsonReader CreateTraceJsonReader(JsonReader reader) { TraceJsonReader traceJsonReader = new TraceJsonReader(reader); if (reader.TokenType != JsonToken.None) { traceJsonReader.WriteCurrentToken(); } return traceJsonReader; } internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); Formatting? formatting = null; if (_formatting.HasValue && jsonWriter.Formatting != _formatting) { formatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.GetValueOrDefault(); } DateFormatHandling? dateFormatHandling = null; if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling) { dateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); } DateTimeZoneHandling? dateTimeZoneHandling = null; if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } FloatFormatHandling? floatFormatHandling = null; if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling) { floatFormatHandling = jsonWriter.FloatFormatHandling; jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); } StringEscapeHandling? stringEscapeHandling = null; if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling) { stringEscapeHandling = jsonWriter.StringEscapeHandling; jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); } CultureInfo cultureInfo = null; if (_culture != null && !_culture.Equals(jsonWriter.Culture)) { cultureInfo = jsonWriter.Culture; jsonWriter.Culture = _culture; } string dateFormatString = null; if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) { dateFormatString = jsonWriter.DateFormatString; jsonWriter.DateFormatString = _dateFormatString; } TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null); new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType); if (traceJsonWriter != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); } if (formatting.HasValue) { jsonWriter.Formatting = formatting.GetValueOrDefault(); } if (dateFormatHandling.HasValue) { jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault(); } if (dateTimeZoneHandling.HasValue) { jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault(); } if (floatFormatHandling.HasValue) { jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault(); } if (stringEscapeHandling.HasValue) { jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault(); } if (_dateFormatStringSet) { jsonWriter.DateFormatString = dateFormatString; } if (cultureInfo != null) { jsonWriter.Culture = cultureInfo; } } internal IReferenceResolver GetReferenceResolver() { if (_referenceResolver == null) { _referenceResolver = new DefaultReferenceResolver(); } return _referenceResolver; } internal JsonConverter? GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType) { if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter jsonConverter = converters[i]; if (jsonConverter.CanConvert(objectType)) { return jsonConverter; } } } return null; } internal void OnError(Newtonsoft.Json.Serialization.ErrorEventArgs e) { this.Error?.Invoke(this, e); } } public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; internal const int DefaultMaxDepth = 64; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal FloatFormatHandling? _floatFormatHandling; internal FloatParseHandling? _floatParseHandling; internal StringEscapeHandling? _stringEscapeHandling; internal CultureInfo? _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; internal string? _dateFormatString; internal bool _dateFormatStringSet; internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling; internal DefaultValueHandling? _defaultValueHandling; internal PreserveReferencesHandling? _preserveReferencesHandling; internal NullValueHandling? _nullValueHandling; internal ObjectCreationHandling? _objectCreationHandling; internal MissingMemberHandling? _missingMemberHandling; internal ReferenceLoopHandling? _referenceLoopH
BepInEx/plugins/CrowdControl/System.Data.dll
Decompiled 2 weeks agousing System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyVersion("0.0.0.0")] namespace System.Data { public class InternalDataCollectionBase { } public class DataSet { } public class DataTable { } public class DataColumn { } public class DataRow { } public class DataTableCollection : InternalDataCollectionBase { } public class DataColumnCollection : InternalDataCollectionBase { } public class DataRowCollection : InternalDataCollectionBase { } } namespace System.Data.SqlTypes { [StructLayout(LayoutKind.Sequential, Size = 1)] public struct SqlBinary { } }
BepInEx/plugins/CrowdControl/System.Threading.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.Linq.Parallel; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Security; using System.Security.Permissions; using System.Threading; using System.Threading.Tasks; [assembly: InternalsVisibleTo("PlinqTest, PublicKey=0024000004800000940000000602000000240000525341310004000001000100CB7351F3887F5CB603C8CFBCA50868570B5BBECB60106DCBBDC4E18A20D5F84A64294699284628A768130175AF63C391C5E0D7FF19F05AF5FD4BC9641391293E094F92CCFF19234F3284DB149AFAE9F604A9A34FA7203549D2D4AD5CD80088682E0C137BCE1C38400955CB7CEDF5E9F532852F9C06AB50FCAA036216A95DE0CE")] [assembly: CompilationRelaxations(8)] [assembly: AssemblyFileVersion("1.0.2856.0")] [assembly: CLSCompliant(true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("plinq_devtests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100CB7351F3887F5CB603C8CFBCA50868570B5BBECB60106DCBBDC4E18A20D5F84A64294699284628A768130175AF63C391C5E0D7FF19F05AF5FD4BC9641391293E094F92CCFF19234F3284DB149AFAE9F604A9A34FA7203549D2D4AD5CD80088682E0C137BCE1C38400955CB7CEDF5E9F532852F9C06AB50FCAA036216A95DE0CE")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyCopyright("Copyright © Microsoft Corporation 2011")] [assembly: AssemblyTitle("System.Threading")] [assembly: AssemblyProduct("Reactive Extensions Core Library")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.2856.102")] [module: UnverifiableCode] namespace System.Diagnostics.Contracts { internal static class Contract { [Conditional("DEBUG")] internal static void Assert(bool condition) { } [Conditional("DEBUG")] internal static void Assert(bool condition, string message) { } [Conditional("DEBUG")] internal static void Ensures(bool condition) { } [Conditional("DEBUG")] internal static void EndContractBlock() { } } } namespace System { internal static class Environment2 { internal static string GetResourceString(string key) { if (key == "AggregateException_ToString") { return "{0}{1}---> (Inner Exception #{2}) {3}{4}{5}"; } return key; } } } namespace System.Threading.Tasks { internal interface IThreadPoolWorkItem { void ExecuteWorkItem(); void MarkAborted(ThreadAbortException tae); } } namespace System.Threading { internal class Monitor2 { internal static void Enter(object obj, ref bool taken) { Monitor.Enter(obj); taken = true; } internal static bool TryEnter(object obj) { return Monitor.TryEnter(obj); } internal static void TryEnter(object obj, ref bool taken) { taken = Monitor.TryEnter(obj); } internal static bool TryEnter(object obj, int millisecondsTimeout) { return Monitor.TryEnter(obj, millisecondsTimeout); } internal static bool TryEnter(object obj, TimeSpan timeout) { return Monitor.TryEnter(obj, timeout); } internal static void TryEnter(object obj, int millisecondsTimeout, ref bool taken) { taken = Monitor.TryEnter(obj, millisecondsTimeout); } } } namespace System.Collections.Generic { internal sealed class Mscorlib_DictionaryDebugView<K, V> { private IDictionary<K, V> dict; [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] internal KeyValuePair<K, V>[] Items { get { KeyValuePair<K, V>[] array = new KeyValuePair<K, V>[dict.Count]; dict.CopyTo(array, 0); return array; } } internal Mscorlib_DictionaryDebugView(IDictionary<K, V> dictionary) { if (dictionary == null) { throw new ArgumentNullException("dictionary"); } dict = dictionary; } } } namespace System { [Serializable] [ComVisible(true)] internal class OperationCanceledException2 : OperationCanceledException { [NonSerialized] private CancellationToken _cancellationToken; public new CancellationToken CancellationToken { get { return _cancellationToken; } private set { _cancellationToken = value; } } public OperationCanceledException2() : base(Environment2.GetResourceString("OperationCanceled")) { } public OperationCanceledException2(string message) : base(message) { } public OperationCanceledException2(string message, Exception innerException) : base(message, innerException) { } public OperationCanceledException2(CancellationToken token) : this() { CancellationToken = token; } public OperationCanceledException2(string message, CancellationToken token) : this(message) { CancellationToken = token; } public OperationCanceledException2(string message, Exception innerException, CancellationToken token) : this(message, innerException) { CancellationToken = token; } protected OperationCanceledException2(SerializationInfo info, StreamingContext context) : base(info, context) { } } } namespace System.Threading { internal static class Platform { internal static int ProcessorCount => Environment.ProcessorCount; internal static bool IsSingleProcessor => ProcessorCount == 1; [DllImport("kernel32.dll")] private static extern int SwitchToThread(); internal static void Yield() { SwitchToThread(); } } } namespace System { internal class SecuritySafeCriticalAttribute : Attribute { } } namespace System.Threading { [StructLayout(LayoutKind.Sequential, Size = 1)] internal struct StackCrawlMark2 { internal static StackCrawlMark2 LookForMyCaller => default(StackCrawlMark2); } } namespace System.Collections.Concurrent { [Serializable] [DebuggerTypeProxy(typeof(Mscorlib_DictionaryDebugView<, >))] [DebuggerDisplay("Count = {Count}")] [ComVisible(false)] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable { private class Node { internal TKey m_key; internal TValue m_value; internal volatile Node m_next; internal int m_hashcode; internal Node(TKey key, TValue value, int hashcode) : this(key, value, hashcode, (Node)null) { } internal Node(TKey key, TValue value, int hashcode, Node next) { m_key = key; m_value = value; m_next = next; m_hashcode = hashcode; } } private class DictionaryEnumerator : IDictionaryEnumerator, IEnumerator { private IEnumerator<KeyValuePair<TKey, TValue>> m_enumerator; public DictionaryEntry Entry => new DictionaryEntry(m_enumerator.Current.Key, m_enumerator.Current.Value); public object Key => m_enumerator.Current.Key; public object Value => m_enumerator.Current.Value; public object Current => Entry; internal DictionaryEnumerator(ConcurrentDictionary<TKey, TValue> dictionary) { m_enumerator = dictionary.GetEnumerator(); } public bool MoveNext() { return m_enumerator.MoveNext(); } public void Reset() { m_enumerator.Reset(); } } private const int DEFAULT_CONCURRENCY_MULTIPLIER = 4; private const int DEFAULT_CAPACITY = 31; [NonSerialized] private volatile Node[] m_buckets; [NonSerialized] private object[] m_locks; [NonSerialized] private volatile int[] m_countPerLock; private IEqualityComparer<TKey> m_comparer; private KeyValuePair<TKey, TValue>[] m_serializationArray; private int m_serializationConcurrencyLevel; private int m_serializationCapacity; public TValue this[TKey key] { get { if (!TryGetValue(key, out var value)) { throw new KeyNotFoundException(); } return value; } set { if (key == null) { throw new ArgumentNullException("key"); } TryAddInternal(key, value, updateIfExists: true, acquireLock: true, out var _); } } public int Count { get { int num = 0; int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); for (int i = 0; i < m_countPerLock.Length; i++) { num += m_countPerLock[i]; } return num; } finally { ReleaseLocks(0, locksAcquired); } } } public bool IsEmpty { get { int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); for (int i = 0; i < m_countPerLock.Length; i++) { if (m_countPerLock[i] != 0) { return false; } } } finally { ReleaseLocks(0, locksAcquired); } return true; } } public ICollection<TKey> Keys => GetKeys(); public ICollection<TValue> Values => GetValues(); bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => false; bool IDictionary.IsFixedSize => false; bool IDictionary.IsReadOnly => false; ICollection IDictionary.Keys => GetKeys(); ICollection IDictionary.Values => GetValues(); object IDictionary.this[object key] { get { if (key == null) { throw new ArgumentNullException("key"); } if (key is TKey && TryGetValue((TKey)key, out var value)) { return value; } return null; } set { if (key == null) { throw new ArgumentNullException("key"); } if (!(key is TKey)) { throw new ArgumentException(GetResource("ConcurrentDictionary_TypeOfKeyIncorrect")); } if (!(value is TValue)) { throw new ArgumentException(GetResource("ConcurrentDictionary_TypeOfValueIncorrect")); } this[(TKey)key] = (TValue)value; } } bool ICollection.IsSynchronized => false; object ICollection.SyncRoot { get { throw new NotSupportedException(Environment2.GetResourceString("ConcurrentCollection_SyncRoot_NotSupported")); } } private static int DefaultConcurrencyLevel => 4 * Environment.ProcessorCount; public ConcurrentDictionary() : this(DefaultConcurrencyLevel, 31) { } public ConcurrentDictionary(int concurrencyLevel, int capacity) : this(concurrencyLevel, capacity, (IEqualityComparer<TKey>)EqualityComparer<TKey>.Default) { } public ConcurrentDictionary(IEnumerable<KeyValuePair<TKey, TValue>> collection) : this(collection, (IEqualityComparer<TKey>)EqualityComparer<TKey>.Default) { } public ConcurrentDictionary(IEqualityComparer<TKey> comparer) : this(DefaultConcurrencyLevel, 31, comparer) { } public ConcurrentDictionary(IEnumerable<KeyValuePair<TKey, TValue>> collection, IEqualityComparer<TKey> comparer) : this(DefaultConcurrencyLevel, collection, comparer) { } public ConcurrentDictionary(int concurrencyLevel, IEnumerable<KeyValuePair<TKey, TValue>> collection, IEqualityComparer<TKey> comparer) : this(concurrencyLevel, 31, comparer) { if (collection == null) { throw new ArgumentNullException("collection"); } if (comparer == null) { throw new ArgumentNullException("comparer"); } InitializeFromCollection(collection); } private void InitializeFromCollection(IEnumerable<KeyValuePair<TKey, TValue>> collection) { foreach (KeyValuePair<TKey, TValue> item in collection) { if (item.Key == null) { throw new ArgumentNullException("key"); } if (!TryAddInternal(item.Key, item.Value, updateIfExists: false, acquireLock: false, out var _)) { throw new ArgumentException(GetResource("ConcurrentDictionary_SourceContainsDuplicateKeys")); } } } public ConcurrentDictionary(int concurrencyLevel, int capacity, IEqualityComparer<TKey> comparer) { if (concurrencyLevel < 1) { throw new ArgumentOutOfRangeException("concurrencyLevel", GetResource("ConcurrentDictionary_ConcurrencyLevelMustBePositive")); } if (capacity < 0) { throw new ArgumentOutOfRangeException("capacity", GetResource("ConcurrentDictionary_CapacityMustNotBeNegative")); } if (comparer == null) { throw new ArgumentNullException("comparer"); } if (capacity < concurrencyLevel) { capacity = concurrencyLevel; } m_locks = new object[concurrencyLevel]; for (int i = 0; i < m_locks.Length; i++) { m_locks[i] = new object(); } m_countPerLock = new int[m_locks.Length]; m_buckets = new Node[capacity]; m_comparer = comparer; } public bool TryAdd(TKey key, TValue value) { if (key == null) { throw new ArgumentNullException("key"); } TValue resultingValue; return TryAddInternal(key, value, updateIfExists: false, acquireLock: true, out resultingValue); } public bool ContainsKey(TKey key) { if (key == null) { throw new ArgumentNullException("key"); } TValue value; return TryGetValue(key, out value); } public bool TryRemove(TKey key, out TValue value) { if (key == null) { throw new ArgumentNullException("key"); } return TryRemoveInternal(key, out value, matchValue: false, default(TValue)); } private bool TryRemoveInternal(TKey key, out TValue value, bool matchValue, TValue oldValue) { while (true) { Node[] buckets = m_buckets; GetBucketAndLockNo(m_comparer.GetHashCode(key), out var bucketNo, out var lockNo, buckets.Length); lock (m_locks[lockNo]) { if (buckets != m_buckets) { continue; } Node node = null; for (Node node2 = m_buckets[bucketNo]; node2 != null; node2 = node2.m_next) { if (m_comparer.Equals(node2.m_key, key)) { if (matchValue && !EqualityComparer<TValue>.Default.Equals(oldValue, node2.m_value)) { value = default(TValue); return false; } if (node == null) { m_buckets[bucketNo] = node2.m_next; } else { node.m_next = node2.m_next; } value = node2.m_value; m_countPerLock[lockNo]--; return true; } node = node2; } break; } } value = default(TValue); return false; } public bool TryGetValue(TKey key, out TValue value) { if (key == null) { throw new ArgumentNullException("key"); } Node[] buckets = m_buckets; GetBucketAndLockNo(m_comparer.GetHashCode(key), out var bucketNo, out var _, buckets.Length); Node node = buckets[bucketNo]; Thread.MemoryBarrier(); while (node != null) { if (m_comparer.Equals(node.m_key, key)) { value = node.m_value; return true; } node = node.m_next; } value = default(TValue); return false; } public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue) { if (key == null) { throw new ArgumentNullException("key"); } int hashCode = m_comparer.GetHashCode(key); IEqualityComparer<TValue> @default = EqualityComparer<TValue>.Default; while (true) { Node[] buckets = m_buckets; GetBucketAndLockNo(hashCode, out var bucketNo, out var lockNo, buckets.Length); lock (m_locks[lockNo]) { if (buckets != m_buckets) { continue; } Node node = null; for (Node node2 = buckets[bucketNo]; node2 != null; node2 = node2.m_next) { if (m_comparer.Equals(node2.m_key, key)) { if (@default.Equals(node2.m_value, comparisonValue)) { Node node3 = new Node(node2.m_key, newValue, hashCode, node2.m_next); if (node == null) { buckets[bucketNo] = node3; } else { node.m_next = node3; } return true; } return false; } node = node2; } return false; } } } public void Clear() { int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); m_buckets = new Node[31]; Array.Clear(m_countPerLock, 0, m_countPerLock.Length); } finally { ReleaseLocks(0, locksAcquired); } } void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int index) { if (array == null) { throw new ArgumentNullException("array"); } if (index < 0) { throw new ArgumentOutOfRangeException("index", GetResource("ConcurrentDictionary_IndexIsNegative")); } int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); int num = 0; for (int i = 0; i < m_locks.Length; i++) { num += m_countPerLock[i]; } if (array.Length - num < index || num < 0) { throw new ArgumentException(GetResource("ConcurrentDictionary_ArrayNotLargeEnough")); } CopyToPairs(array, index); } finally { ReleaseLocks(0, locksAcquired); } } public KeyValuePair<TKey, TValue>[] ToArray() { int locksAcquired = 0; checked { try { AcquireAllLocks(ref locksAcquired); int num = 0; for (int i = 0; i < m_locks.Length; i++) { num += m_countPerLock[i]; } KeyValuePair<TKey, TValue>[] array = new KeyValuePair<TKey, TValue>[num]; CopyToPairs(array, 0); return array; } finally { ReleaseLocks(0, locksAcquired); } } } private void CopyToPairs(KeyValuePair<TKey, TValue>[] array, int index) { Node[] buckets = m_buckets; for (int i = 0; i < buckets.Length; i++) { for (Node node = buckets[i]; node != null; node = node.m_next) { ref KeyValuePair<TKey, TValue> reference = ref array[index]; reference = new KeyValuePair<TKey, TValue>(node.m_key, node.m_value); index++; } } } private void CopyToEntries(DictionaryEntry[] array, int index) { Node[] buckets = m_buckets; for (int i = 0; i < buckets.Length; i++) { for (Node node = buckets[i]; node != null; node = node.m_next) { ref DictionaryEntry reference = ref array[index]; reference = new DictionaryEntry(node.m_key, node.m_value); index++; } } } private void CopyToObjects(object[] array, int index) { Node[] buckets = m_buckets; for (int i = 0; i < buckets.Length; i++) { for (Node node = buckets[i]; node != null; node = node.m_next) { array[index] = new KeyValuePair<TKey, TValue>(node.m_key, node.m_value); index++; } } } public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { Node[] buckets = m_buckets; for (int i = 0; i < buckets.Length; i++) { Node current = buckets[i]; Thread.MemoryBarrier(); while (current != null) { yield return new KeyValuePair<TKey, TValue>(current.m_key, current.m_value); current = current.m_next; } } } private bool TryAddInternal(TKey key, TValue value, bool updateIfExists, bool acquireLock, out TValue resultingValue) { int hashCode = m_comparer.GetHashCode(key); Node[] buckets; bool flag; while (true) { buckets = m_buckets; GetBucketAndLockNo(hashCode, out var bucketNo, out var lockNo, buckets.Length); flag = false; bool taken = false; try { if (acquireLock) { Monitor2.Enter(m_locks[lockNo], ref taken); } if (buckets != m_buckets) { continue; } Node node = null; for (Node node2 = buckets[bucketNo]; node2 != null; node2 = node2.m_next) { if (m_comparer.Equals(node2.m_key, key)) { if (updateIfExists) { Node node3 = new Node(node2.m_key, value, hashCode, node2.m_next); if (node == null) { buckets[bucketNo] = node3; } else { node.m_next = node3; } resultingValue = value; } else { resultingValue = node2.m_value; } return false; } node = node2; } buckets[bucketNo] = new Node(key, value, hashCode, buckets[bucketNo]); checked { m_countPerLock[lockNo]++; } if (m_countPerLock[lockNo] > buckets.Length / m_locks.Length) { flag = true; } break; } finally { if (taken) { Monitor.Exit(m_locks[lockNo]); } } } if (flag) { GrowTable(buckets); } resultingValue = value; return true; } public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory) { if (key == null) { throw new ArgumentNullException("key"); } if (valueFactory == null) { throw new ArgumentNullException("valueFactory"); } if (TryGetValue(key, out var value)) { return value; } TryAddInternal(key, valueFactory(key), updateIfExists: false, acquireLock: true, out value); return value; } public TValue GetOrAdd(TKey key, TValue value) { if (key == null) { throw new ArgumentNullException("key"); } TryAddInternal(key, value, updateIfExists: false, acquireLock: true, out var resultingValue); return resultingValue; } public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory) { if (key == null) { throw new ArgumentNullException("key"); } if (addValueFactory == null) { throw new ArgumentNullException("addValueFactory"); } if (updateValueFactory == null) { throw new ArgumentNullException("updateValueFactory"); } TValue resultingValue; while (true) { if (TryGetValue(key, out var value)) { TValue val = updateValueFactory(key, value); if (TryUpdate(key, val, value)) { return val; } } else { TValue val = addValueFactory(key); if (TryAddInternal(key, val, updateIfExists: false, acquireLock: true, out resultingValue)) { break; } } } return resultingValue; } public TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory) { if (key == null) { throw new ArgumentNullException("key"); } if (updateValueFactory == null) { throw new ArgumentNullException("updateValueFactory"); } TValue resultingValue; while (true) { if (TryGetValue(key, out var value)) { TValue val = updateValueFactory(key, value); if (TryUpdate(key, val, value)) { return val; } } else if (TryAddInternal(key, addValue, updateIfExists: false, acquireLock: true, out resultingValue)) { break; } } return resultingValue; } void IDictionary<TKey, TValue>.Add(TKey key, TValue value) { if (!TryAdd(key, value)) { throw new ArgumentException(GetResource("ConcurrentDictionary_KeyAlreadyExisted")); } } bool IDictionary<TKey, TValue>.Remove(TKey key) { TValue value; return TryRemove(key, out value); } void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> keyValuePair) { ((IDictionary<TKey, TValue>)this).Add(keyValuePair.Key, keyValuePair.Value); } bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> keyValuePair) { if (!TryGetValue(keyValuePair.Key, out var value)) { return false; } return EqualityComparer<TValue>.Default.Equals(value, keyValuePair.Value); } bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> keyValuePair) { if (keyValuePair.Key == null) { throw new ArgumentNullException(GetResource("ConcurrentDictionary_ItemKeyIsNull")); } TValue value; return TryRemoveInternal(keyValuePair.Key, out value, matchValue: true, keyValuePair.Value); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } void IDictionary.Add(object key, object value) { if (key == null) { throw new ArgumentNullException("key"); } if (!(key is TKey)) { throw new ArgumentException(GetResource("ConcurrentDictionary_TypeOfKeyIncorrect")); } TValue value2; try { value2 = (TValue)value; } catch (InvalidCastException) { throw new ArgumentException(GetResource("ConcurrentDictionary_TypeOfValueIncorrect")); } ((IDictionary<TKey, TValue>)this).Add((TKey)key, value2); } bool IDictionary.Contains(object key) { if (key == null) { throw new ArgumentNullException("key"); } if (key is TKey) { return ContainsKey((TKey)key); } return false; } IDictionaryEnumerator IDictionary.GetEnumerator() { return new DictionaryEnumerator(this); } void IDictionary.Remove(object key) { if (key == null) { throw new ArgumentNullException("key"); } if (key is TKey) { TryRemove((TKey)key, out var _); } } void ICollection.CopyTo(Array array, int index) { if (array == null) { throw new ArgumentNullException("array"); } if (index < 0) { throw new ArgumentOutOfRangeException("index", GetResource("ConcurrentDictionary_IndexIsNegative")); } int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); int num = 0; for (int i = 0; i < m_locks.Length; i++) { num += m_countPerLock[i]; } if (array.Length - num < index || num < 0) { throw new ArgumentException(GetResource("ConcurrentDictionary_ArrayNotLargeEnough")); } if (array is KeyValuePair<TKey, TValue>[] array2) { CopyToPairs(array2, index); return; } if (array is DictionaryEntry[] array3) { CopyToEntries(array3, index); return; } if (array is object[] array4) { CopyToObjects(array4, index); return; } throw new ArgumentException(GetResource("ConcurrentDictionary_ArrayIncorrectType"), "array"); } finally { ReleaseLocks(0, locksAcquired); } } private void GrowTable(Node[] buckets) { int locksAcquired = 0; checked { try { AcquireLocks(0, 1, ref locksAcquired); if (buckets != m_buckets) { return; } int i; try { for (i = buckets.Length * 2 + 1; unchecked(i % 3 == 0 || i % 5 == 0 || i % 7 == 0); i += 2) { } } catch (OverflowException) { return; } Node[] array = new Node[i]; int[] array2 = new int[m_locks.Length]; AcquireLocks(1, m_locks.Length, ref locksAcquired); for (int j = 0; j < buckets.Length; j = unchecked(j + 1)) { Node node = buckets[j]; while (node != null) { Node next = node.m_next; GetBucketAndLockNo(node.m_hashcode, out var bucketNo, out var lockNo, array.Length); array[bucketNo] = new Node(node.m_key, node.m_value, node.m_hashcode, array[bucketNo]); array2[lockNo]++; node = next; } } m_buckets = array; m_countPerLock = array2; } finally { ReleaseLocks(0, locksAcquired); } } } private void GetBucketAndLockNo(int hashcode, out int bucketNo, out int lockNo, int bucketCount) { bucketNo = (hashcode & 0x7FFFFFFF) % bucketCount; lockNo = bucketNo % m_locks.Length; } private void AcquireAllLocks(ref int locksAcquired) { AcquireLocks(0, m_locks.Length, ref locksAcquired); } private void AcquireLocks(int fromInclusive, int toExclusive, ref int locksAcquired) { for (int i = fromInclusive; i < toExclusive; i++) { bool taken = false; try { Monitor2.Enter(m_locks[i], ref taken); } finally { if (taken) { locksAcquired++; } } } } private void ReleaseLocks(int fromInclusive, int toExclusive) { for (int i = fromInclusive; i < toExclusive; i++) { Monitor.Exit(m_locks[i]); } } private ReadOnlyCollection<TKey> GetKeys() { int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); List<TKey> list = new List<TKey>(); for (int i = 0; i < m_buckets.Length; i++) { for (Node node = m_buckets[i]; node != null; node = node.m_next) { list.Add(node.m_key); } } return new ReadOnlyCollection<TKey>(list); } finally { ReleaseLocks(0, locksAcquired); } } private ReadOnlyCollection<TValue> GetValues() { int locksAcquired = 0; try { AcquireAllLocks(ref locksAcquired); List<TValue> list = new List<TValue>(); for (int i = 0; i < m_buckets.Length; i++) { for (Node node = m_buckets[i]; node != null; node = node.m_next) { list.Add(node.m_value); } } return new ReadOnlyCollection<TValue>(list); } finally { ReleaseLocks(0, locksAcquired); } } [Conditional("DEBUG")] private void Assert(bool condition) { } private string GetResource(string key) { return Environment2.GetResourceString(key); } [OnSerializing] private void OnSerializing(StreamingContext context) { m_serializationArray = ToArray(); m_serializationConcurrencyLevel = m_locks.Length; m_serializationCapacity = m_buckets.Length; } [OnDeserialized] private void OnDeserialized(StreamingContext context) { KeyValuePair<TKey, TValue>[] serializationArray = m_serializationArray; m_buckets = new Node[m_serializationCapacity]; m_countPerLock = new int[m_serializationConcurrencyLevel]; m_locks = new object[m_serializationConcurrencyLevel]; for (int i = 0; i < m_locks.Length; i++) { m_locks[i] = new object(); } InitializeFromCollection(serializationArray); m_serializationArray = null; } } public interface IProducerConsumerCollection<T> : IEnumerable<T>, ICollection, IEnumerable { void CopyTo(T[] array, int index); bool TryAdd(T item); bool TryTake(out T item); T[] ToArray(); } [Serializable] [DebuggerDisplay("Count = {Count}")] [ComVisible(false)] [DebuggerTypeProxy(typeof(SystemCollectionsConcurrent_ProducerConsumerCollectionDebugView<>))] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public class ConcurrentQueue<T> : IProducerConsumerCollection<T>, IEnumerable<T>, ICollection, IEnumerable { private class Segment { internal volatile T[] m_array; private volatile int[] m_state; private volatile Segment m_next; internal readonly long m_index; private volatile int m_low; private volatile int m_high; internal Segment Next => m_next; internal bool IsEmpty => Low > High; internal int Low => Math.Min(m_low, 32); internal int High => Math.Min(m_high, 31); internal Segment(long index) { m_array = new T[32]; m_state = new int[32]; m_high = -1; m_index = index; } internal void UnsafeAdd(T value) { m_high++; m_array[m_high] = value; m_state[m_high] = 1; } internal Segment UnsafeGrow() { return m_next = new Segment(m_index + 1); } internal void Grow(ref Segment tail) { Segment next = new Segment(m_index + 1); m_next = next; tail = m_next; } internal bool TryAppend(T value, ref Segment tail) { if (m_high >= 31) { return false; } int num = 32; try { } finally { num = Interlocked.Increment(ref m_high); if (num <= 31) { m_array[num] = value; m_state[num] = 1; } if (num == 31) { Grow(ref tail); } } return num <= 31; } internal bool TryRemove(out T result, ref Segment head) { SpinWait spinWait = default(SpinWait); int low = Low; int high = High; while (low <= high) { if (Interlocked.CompareExchange(ref m_low, low + 1, low) == low) { SpinWait spinWait2 = default(SpinWait); while (m_state[low] == 0) { spinWait2.SpinOnce(); } result = m_array[low]; if (low + 1 >= 32) { spinWait2 = default(SpinWait); while (m_next == null) { spinWait2.SpinOnce(); } head = m_next; } return true; } spinWait.SpinOnce(); low = Low; high = High; } result = default(T); return false; } internal bool TryPeek(out T result) { result = default(T); int low = Low; if (low > High) { return false; } SpinWait spinWait = default(SpinWait); while (m_state[low] == 0) { spinWait.SpinOnce(); } result = m_array[low]; return true; } internal List<T> ToList(int start, int end) { List<T> list = new List<T>(); for (int i = start; i <= end; i++) { SpinWait spinWait = default(SpinWait); while (m_state[i] == 0) { spinWait.SpinOnce(); } list.Add(m_array[i]); } return list; } } private const int SEGMENT_SIZE = 32; [NonSerialized] private volatile Segment m_head; [NonSerialized] private volatile Segment m_tail; private T[] m_serializationArray; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot { get { throw new NotSupportedException(Environment2.GetResourceString("ConcurrentCollection_SyncRoot_NotSupported")); } } public bool IsEmpty { get { Segment head = m_head; if (!head.IsEmpty) { return false; } if (head.Next == null) { return true; } SpinWait spinWait = default(SpinWait); while (head.IsEmpty) { if (head.Next == null) { return true; } spinWait.SpinOnce(); head = m_head; } return false; } } public int Count { get { GetHeadTailPositions(out var head, out var tail, out var headLow, out var tailHigh); if (head == tail) { return tailHigh - headLow + 1; } int num = 32 - headLow; num += 32 * (int)(tail.m_index - head.m_index - 1); return num + (tailHigh + 1); } } public ConcurrentQueue() { m_head = (m_tail = new Segment(0L)); } private void InitializeFromCollection(IEnumerable<T> collection) { m_head = (m_tail = new Segment(0L)); int num = 0; foreach (T item in collection) { m_tail.UnsafeAdd(item); num++; if (num >= 32) { m_tail = m_tail.UnsafeGrow(); num = 0; } } } public ConcurrentQueue(IEnumerable<T> collection) { if (collection == null) { throw new ArgumentNullException("collection"); } InitializeFromCollection(collection); } [OnSerializing] private void OnSerializing(StreamingContext context) { m_serializationArray = ToArray(); } [OnDeserialized] private void OnDeserialized(StreamingContext context) { InitializeFromCollection(m_serializationArray); m_serializationArray = null; } void ICollection.CopyTo(Array array, int index) { if (array == null) { throw new ArgumentNullException("array"); } ((ICollection)ToList()).CopyTo(array, index); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<T>)this).GetEnumerator(); } bool IProducerConsumerCollection<T>.TryAdd(T item) { Enqueue(item); return true; } bool IProducerConsumerCollection<T>.TryTake(out T item) { return TryDequeue(out item); } public T[] ToArray() { return ToList().ToArray(); } private List<T> ToList() { GetHeadTailPositions(out var head, out var tail, out var headLow, out var tailHigh); if (head == tail) { return head.ToList(headLow, tailHigh); } List<T> list = new List<T>(head.ToList(headLow, 31)); for (Segment next = head.Next; next != tail; next = next.Next) { list.AddRange(next.ToList(0, 31)); } list.AddRange(tail.ToList(0, tailHigh)); return list; } private void GetHeadTailPositions(out Segment head, out Segment tail, out int headLow, out int tailHigh) { head = m_head; tail = m_tail; headLow = head.Low; tailHigh = tail.High; SpinWait spinWait = default(SpinWait); while (head != m_head || tail != m_tail || headLow != head.Low || tailHigh != tail.High || head.m_index > tail.m_index) { spinWait.SpinOnce(); head = m_head; tail = m_tail; headLow = head.Low; tailHigh = tail.High; } } public void CopyTo(T[] array, int index) { if (array == null) { throw new ArgumentNullException("array"); } ToList().CopyTo(array, index); } public IEnumerator<T> GetEnumerator() { return ToList().GetEnumerator(); } public void Enqueue(T item) { SpinWait spinWait = default(SpinWait); while (true) { Segment tail = m_tail; if (tail.TryAppend(item, ref m_tail)) { break; } spinWait.SpinOnce(); } } public bool TryDequeue(out T result) { while (!IsEmpty) { Segment head = m_head; if (head.TryRemove(out result, ref m_head)) { return true; } } result = default(T); return false; } public bool TryPeek(out T result) { while (!IsEmpty) { Segment head = m_head; if (head.TryPeek(out result)) { return true; } } result = default(T); return false; } } [Serializable] [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(SystemCollectionsConcurrent_ProducerConsumerCollectionDebugView<>))] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public class ConcurrentStack<T> : IProducerConsumerCollection<T>, IEnumerable<T>, ICollection, IEnumerable { private class Node { internal T m_value; internal Node m_next; internal Node(T value) { m_value = value; m_next = null; } } private const int BACKOFF_MAX_YIELDS = 8; [NonSerialized] private volatile Node m_head; private T[] m_serializationArray; public bool IsEmpty => m_head == null; public int Count { get { int num = 0; for (Node node = m_head; node != null; node = node.m_next) { num++; } return num; } } bool ICollection.IsSynchronized => false; object ICollection.SyncRoot { get { throw new NotSupportedException(Environment2.GetResourceString("ConcurrentCollection_SyncRoot_NotSupported")); } } public ConcurrentStack() { } public ConcurrentStack(IEnumerable<T> collection) { if (collection == null) { throw new ArgumentNullException("collection"); } InitializeFromCollection(collection); } private void InitializeFromCollection(IEnumerable<T> collection) { Node node = null; foreach (T item in collection) { Node node2 = new Node(item); node2.m_next = node; node = node2; } m_head = node; } [OnSerializing] private void OnSerializing(StreamingContext context) { m_serializationArray = ToArray(); } [OnDeserialized] private void OnDeserialized(StreamingContext context) { Node node = null; Node head = null; for (int i = 0; i < m_serializationArray.Length; i++) { Node node2 = new Node(m_serializationArray[i]); if (node == null) { head = node2; } else { node.m_next = node2; } node = node2; } m_head = head; m_serializationArray = null; } public void Clear() { m_head = null; } void ICollection.CopyTo(Array array, int index) { if (array == null) { throw new ArgumentNullException("array"); } ((ICollection)ToList()).CopyTo(array, index); } public void CopyTo(T[] array, int index) { if (array == null) { throw new ArgumentNullException("array"); } ToList().CopyTo(array, index); } public void Push(T item) { Node node = new Node(item); node.m_next = m_head; if (Interlocked.CompareExchange(ref m_head, node, node.m_next) != node.m_next) { PushCore(node, node); } } public void PushRange(T[] items) { if (items == null) { throw new ArgumentNullException("items"); } PushRange(items, 0, items.Length); } public void PushRange(T[] items, int startIndex, int count) { ValidatePushPopRangeInput(items, startIndex, count); if (count != 0) { Node node; Node node2 = (node = new Node(items[startIndex])); for (int i = startIndex + 1; i < startIndex + count; i++) { Node node3 = new Node(items[i]); node3.m_next = node2; node2 = node3; } node.m_next = m_head; if (Interlocked.CompareExchange(ref m_head, node2, node.m_next) != node.m_next) { PushCore(node2, node); } } } private void PushCore(Node head, Node tail) { SpinWait spinWait = default(SpinWait); do { spinWait.SpinOnce(); tail.m_next = m_head; } while (Interlocked.CompareExchange(ref m_head, head, tail.m_next) != tail.m_next); } private void ValidatePushPopRangeInput(T[] items, int startIndex, int count) { if (items == null) { throw new ArgumentNullException("items"); } if (count < 0) { throw new ArgumentOutOfRangeException("count", Environment2.GetResourceString("ConcurrentStack_PushPopRange_CountOutOfRange")); } int num = items.Length; if (startIndex >= num || startIndex < 0) { throw new ArgumentOutOfRangeException("startIndex", Environment2.GetResourceString("ConcurrentStack_PushPopRange_StartOutOfRange")); } if (num - count < startIndex) { throw new ArgumentException(Environment2.GetResourceString("ConcurrentStack_PushPopRange_InvalidCount")); } } bool IProducerConsumerCollection<T>.TryAdd(T item) { Push(item); return true; } public bool TryPeek(out T result) { Node head = m_head; if (head == null) { result = default(T); return false; } result = head.m_value; return true; } public bool TryPop(out T result) { Node head = m_head; if (head == null) { result = default(T); return false; } if (Interlocked.CompareExchange(ref m_head, head.m_next, head) == head) { result = head.m_value; return true; } return TryPopCore(out result); } public int TryPopRange(T[] items) { if (items == null) { throw new ArgumentNullException("items"); } return TryPopRange(items, 0, items.Length); } public int TryPopRange(T[] items, int startIndex, int count) { ValidatePushPopRangeInput(items, startIndex, count); if (count == 0) { return 0; } Node poppedHead; int num = TryPopCore(count, out poppedHead); if (num > 0) { CopyRemovedItems(poppedHead, items, startIndex, num); } return num; } private bool TryPopCore(out T result) { if (TryPopCore(1, out var poppedHead) == 1) { result = poppedHead.m_value; return true; } result = default(T); return false; } private int TryPopCore(int count, out Node poppedHead) { SpinWait spinWait = default(SpinWait); int num = 1; Random random = new Random(Environment.TickCount & 0x7FFFFFFF); Node head; int i; while (true) { head = m_head; if (head == null) { poppedHead = null; return 0; } Node node = head; for (i = 1; i < count; i++) { if (node.m_next == null) { break; } node = node.m_next; } if (Interlocked.CompareExchange(ref m_head, node.m_next, head) == head) { break; } for (int j = 0; j < num; j++) { spinWait.SpinOnce(); } num = (spinWait.NextSpinWillYield ? random.Next(1, 8) : (num * 2)); } poppedHead = head; return i; } private void CopyRemovedItems(Node head, T[] collection, int startIndex, int nodesCount) { Node node = head; for (int i = startIndex; i < startIndex + nodesCount; i++) { collection[i] = node.m_value; node = node.m_next; } } bool IProducerConsumerCollection<T>.TryTake(out T item) { return TryPop(out item); } public T[] ToArray() { return ToList().ToArray(); } private List<T> ToList() { List<T> list = new List<T>(); for (Node node = m_head; node != null; node = node.m_next) { list.Add(node.m_value); } return list; } public IEnumerator<T> GetEnumerator() { return GetEnumerator(m_head); } private IEnumerator<T> GetEnumerator(Node head) { for (Node current = head; current != null; current = current.m_next) { yield return current.m_value; } } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<T>)this).GetEnumerator(); } } internal sealed class SystemCollectionsConcurrent_ProducerConsumerCollectionDebugView<T> { private IProducerConsumerCollection<T> m_collection; [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public T[] Items => m_collection.ToArray(); public SystemCollectionsConcurrent_ProducerConsumerCollectionDebugView(IProducerConsumerCollection<T> collection) { if (collection == null) { throw new ArgumentNullException("collection"); } m_collection = collection; } } [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public abstract class Partitioner<TSource> { public virtual bool SupportsDynamicPartitions => false; public abstract IList<IEnumerator<TSource>> GetPartitions(int partitionCount); public virtual IEnumerable<TSource> GetDynamicPartitions() { throw new NotSupportedException(Environment2.GetResourceString("Partitioner_DynamicPartitionsNotSupported")); } } [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public abstract class OrderablePartitioner<TSource> : Partitioner<TSource> { private class EnumerableDropIndices : IEnumerable<TSource>, IEnumerable, IDisposable { private readonly IEnumerable<KeyValuePair<long, TSource>> m_source; public EnumerableDropIndices(IEnumerable<KeyValuePair<long, TSource>> source) { m_source = source; } public IEnumerator<TSource> GetEnumerator() { return new EnumeratorDropIndices(m_source.GetEnumerator()); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Dispose() { if (m_source is IDisposable disposable) { disposable.Dispose(); } } } private class EnumeratorDropIndices : IEnumerator<TSource>, IDisposable, IEnumerator { private readonly IEnumerator<KeyValuePair<long, TSource>> m_source; public TSource Current => m_source.Current.Value; object IEnumerator.Current => Current; public EnumeratorDropIndices(IEnumerator<KeyValuePair<long, TSource>> source) { m_source = source; } public bool MoveNext() { return m_source.MoveNext(); } public void Dispose() { m_source.Dispose(); } public void Reset() { m_source.Reset(); } } public bool KeysOrderedInEachPartition { get; private set; } public bool KeysOrderedAcrossPartitions { get; private set; } public bool KeysNormalized { get; private set; } protected OrderablePartitioner(bool keysOrderedInEachPartition, bool keysOrderedAcrossPartitions, bool keysNormalized) { KeysOrderedInEachPartition = keysOrderedInEachPartition; KeysOrderedAcrossPartitions = keysOrderedAcrossPartitions; KeysNormalized = keysNormalized; } public abstract IList<IEnumerator<KeyValuePair<long, TSource>>> GetOrderablePartitions(int partitionCount); public virtual IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions() { throw new NotSupportedException(Environment2.GetResourceString("Partitioner_DynamicPartitionsNotSupported")); } public override IList<IEnumerator<TSource>> GetPartitions(int partitionCount) { IList<IEnumerator<KeyValuePair<long, TSource>>> orderablePartitions = GetOrderablePartitions(partitionCount); if (orderablePartitions.Count != partitionCount) { throw new InvalidOperationException("OrderablePartitioner_GetPartitions_WrongNumberOfPartitions"); } IEnumerator<TSource>[] array = new IEnumerator<TSource>[partitionCount]; for (int i = 0; i < partitionCount; i++) { array[i] = new EnumeratorDropIndices(orderablePartitions[i]); } return array; } public override IEnumerable<TSource> GetDynamicPartitions() { IEnumerable<KeyValuePair<long, TSource>> orderableDynamicPartitions = GetOrderableDynamicPartitions(); return new EnumerableDropIndices(orderableDynamicPartitions); } } [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public static class Partitioner { private abstract class DynamicPartitionEnumerator_Abstract<TSource, TSourceReader> : IEnumerator<KeyValuePair<long, TSource>>, IDisposable, IEnumerator { private const int CHUNK_DOUBLING_RATE = 3; protected readonly TSourceReader m_sharedReader; protected static int s_defaultMaxChunkSize = GetDefaultChunkSize<TSource>(); protected Shared<int> m_currentChunkSize; protected Shared<int> m_localOffset; private int m_doublingCountdown; protected readonly int m_maxChunkSize; protected readonly Shared<long> m_sharedIndex; protected abstract bool HasNoElementsLeft { get; set; } public abstract KeyValuePair<long, TSource> Current { get; } object IEnumerator.Current => Current; protected DynamicPartitionEnumerator_Abstract(TSourceReader sharedReader, Shared<long> sharedIndex) : this(sharedReader, sharedIndex, -1) { } protected DynamicPartitionEnumerator_Abstract(TSourceReader sharedReader, Shared<long> sharedIndex, int maxChunkSize) { m_sharedReader = sharedReader; m_sharedIndex = sharedIndex; if (maxChunkSize == -1) { m_maxChunkSize = s_defaultMaxChunkSize; } else { m_maxChunkSize = maxChunkSize; } } protected abstract bool GrabNextChunk(int requestedChunkSize); public abstract void Dispose(); public void Reset() { throw new NotSupportedException(); } public bool MoveNext() { if (m_localOffset == null) { m_localOffset = new Shared<int>(-1); m_currentChunkSize = new Shared<int>(0); m_doublingCountdown = 3; } if (m_localOffset.Value < m_currentChunkSize.Value - 1) { m_localOffset.Value++; return true; } int requestedChunkSize; if (m_currentChunkSize.Value == 0) { requestedChunkSize = 1; } else if (m_doublingCountdown > 0) { requestedChunkSize = m_currentChunkSize.Value; } else { requestedChunkSize = Math.Min(m_currentChunkSize.Value * 2, m_maxChunkSize); m_doublingCountdown = 3; } m_doublingCountdown--; if (GrabNextChunk(requestedChunkSize)) { m_localOffset.Value = 0; return true; } return false; } } private class DynamicPartitionerForIEnumerable<TSource> : OrderablePartitioner<TSource> { private class InternalPartitionEnumerable : IEnumerable<KeyValuePair<long, TSource>>, IEnumerable, IDisposable { private readonly IEnumerator<TSource> m_sharedReader; private Shared<long> m_sharedIndex; private Shared<bool> m_hasNoElementsLeft; private object m_sharedLock; private bool m_disposed; private Shared<int> m_activePartitionCount; private readonly int m_maxChunkSize; internal InternalPartitionEnumerable(IEnumerator<TSource> sharedReader, int maxChunkSize) { m_sharedReader = sharedReader; m_sharedIndex = new Shared<long>(-1L); m_hasNoElementsLeft = new Shared<bool>(value: false); m_sharedLock = new object(); m_activePartitionCount = new Shared<int>(0); m_maxChunkSize = maxChunkSize; } public IEnumerator<KeyValuePair<long, TSource>> GetEnumerator() { if (m_disposed) { throw new ObjectDisposedException(Environment2.GetResourceString("PartitionerStatic_CanNotCallGetEnumeratorAfterSourceHasBeenDisposed")); } return new InternalPartitionEnumerator(m_sharedReader, m_sharedIndex, m_hasNoElementsLeft, m_sharedLock, m_activePartitionCount, this, m_maxChunkSize); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Dispose() { if (!m_disposed) { m_disposed = true; m_sharedReader.Dispose(); } } } private class InternalPartitionEnumerator : DynamicPartitionEnumerator_Abstract<TSource, IEnumerator<TSource>> { private KeyValuePair<long, TSource>[] m_localList; private readonly Shared<bool> m_hasNoElementsLeft; private readonly object m_sharedLock; private readonly Shared<int> m_activePartitionCount; private InternalPartitionEnumerable m_enumerable; protected override bool HasNoElementsLeft { get { return m_hasNoElementsLeft.Value; } set { m_hasNoElementsLeft.Value = true; } } public override KeyValuePair<long, TSource> Current { get { if (m_currentChunkSize == null) { throw new InvalidOperationException(Environment2.GetResourceString("PartitionerStatic_CurrentCalledBeforeMoveNext")); } return m_localList[m_localOffset.Value]; } } internal InternalPartitionEnumerator(IEnumerator<TSource> sharedReader, Shared<long> sharedIndex, Shared<bool> hasNoElementsLeft, object sharedLock, Shared<int> activePartitionCount, InternalPartitionEnumerable enumerable, int maxChunkSize) : base(sharedReader, sharedIndex, maxChunkSize) { m_hasNoElementsLeft = hasNoElementsLeft; m_sharedLock = sharedLock; m_enumerable = enumerable; m_activePartitionCount = activePartitionCount; Interlocked.Increment(ref m_activePartitionCount.Value); } protected override bool GrabNextChunk(int requestedChunkSize) { if (HasNoElementsLeft) { return false; } lock (m_sharedLock) { if (HasNoElementsLeft) { return false; } try { int i; for (i = 0; i < requestedChunkSize; i++) { if (m_sharedReader.MoveNext()) { if (m_localList == null) { m_localList = new KeyValuePair<long, TSource>[m_maxChunkSize]; } m_sharedIndex.Value = checked(m_sharedIndex.Value + 1); ref KeyValuePair<long, TSource> reference = ref m_localList[i]; reference = new KeyValuePair<long, TSource>(m_sharedIndex.Value, m_sharedReader.Current); continue; } HasNoElementsLeft = true; break; } if (i > 0) { m_currentChunkSize.Value = i; return true; } return false; } catch { HasNoElementsLeft = true; throw; } } } public override void Dispose() { if (Interlocked.Decrement(ref m_activePartitionCount.Value) == 0) { m_enumerable.Dispose(); } } } private IEnumerable<TSource> m_source; private int m_maxChunkSize; public override bool SupportsDynamicPartitions => true; internal DynamicPartitionerForIEnumerable(IEnumerable<TSource> source, int maxChunkSize) : base(keysOrderedInEachPartition: true, keysOrderedAcrossPartitions: false, keysNormalized: true) { m_source = source; m_maxChunkSize = maxChunkSize; } public override IList<IEnumerator<KeyValuePair<long, TSource>>> GetOrderablePartitions(int partitionCount) { if (partitionCount <= 0) { throw new ArgumentOutOfRangeException("partitionCount"); } IEnumerator<KeyValuePair<long, TSource>>[] array = new IEnumerator<KeyValuePair<long, TSource>>[partitionCount]; IEnumerable<KeyValuePair<long, TSource>> enumerable = new InternalPartitionEnumerable(m_source.GetEnumerator(), m_maxChunkSize); for (int i = 0; i < partitionCount; i++) { array[i] = enumerable.GetEnumerator(); } return array; } public override IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions() { return new InternalPartitionEnumerable(m_source.GetEnumerator(), m_maxChunkSize); } } private abstract class DynamicPartitionerForIndexRange_Abstract<TSource, TCollection> : OrderablePartitioner<TSource> { private TCollection m_data; public override bool SupportsDynamicPartitions => true; protected DynamicPartitionerForIndexRange_Abstract(TCollection data) : base(keysOrderedInEachPartition: true, keysOrderedAcrossPartitions: false, keysNormalized: true) { m_data = data; } protected abstract IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions_Factory(TCollection data); public override IList<IEnumerator<KeyValuePair<long, TSource>>> GetOrderablePartitions(int partitionCount) { if (partitionCount <= 0) { throw new ArgumentOutOfRangeException("partitionCount"); } IEnumerator<KeyValuePair<long, TSource>>[] array = new IEnumerator<KeyValuePair<long, TSource>>[partitionCount]; IEnumerable<KeyValuePair<long, TSource>> orderableDynamicPartitions_Factory = GetOrderableDynamicPartitions_Factory(m_data); for (int i = 0; i < partitionCount; i++) { array[i] = orderableDynamicPartitions_Factory.GetEnumerator(); } return array; } public override IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions() { return GetOrderableDynamicPartitions_Factory(m_data); } } private abstract class DynamicPartitionEnumeratorForIndexRange_Abstract<TSource, TSourceReader> : DynamicPartitionEnumerator_Abstract<TSource, TSourceReader> { protected int m_startIndex; protected abstract int SourceCount { get; } protected override bool HasNoElementsLeft { get { return m_sharedIndex.Value >= SourceCount - 1; } set { } } protected DynamicPartitionEnumeratorForIndexRange_Abstract(TSourceReader sharedReader, Shared<long> sharedIndex) : base(sharedReader, sharedIndex) { } protected override bool GrabNextChunk(int requestedChunkSize) { while (!HasNoElementsLeft) { long value = m_sharedIndex.Value; if (HasNoElementsLeft) { return false; } long num = Math.Min(SourceCount - 1, value + requestedChunkSize); if (Interlocked.CompareExchange(ref m_sharedIndex.Value, num, value) == value) { m_currentChunkSize.Value = (int)(num - value); m_localOffset.Value = -1; m_startIndex = (int)(value + 1); return true; } } return false; } public override void Dispose() { } } private class DynamicPartitionerForIList<TSource> : DynamicPartitionerForIndexRange_Abstract<TSource, IList<TSource>> { private class InternalPartitionEnumerable : IEnumerable<KeyValuePair<long, TSource>>, IEnumerable { private readonly IList<TSource> m_sharedReader; private Shared<long> m_sharedIndex; internal InternalPartitionEnumerable(IList<TSource> sharedReader) { m_sharedReader = sharedReader; m_sharedIndex = new Shared<long>(-1L); } public IEnumerator<KeyValuePair<long, TSource>> GetEnumerator() { return new InternalPartitionEnumerator(m_sharedReader, m_sharedIndex); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } private class InternalPartitionEnumerator : DynamicPartitionEnumeratorForIndexRange_Abstract<TSource, IList<TSource>> { protected override int SourceCount => m_sharedReader.Count; public override KeyValuePair<long, TSource> Current { get { if (m_currentChunkSize == null) { throw new InvalidOperationException(Environment2.GetResourceString("PartitionerStatic_CurrentCalledBeforeMoveNext")); } return new KeyValuePair<long, TSource>(m_startIndex + m_localOffset.Value, m_sharedReader[m_startIndex + m_localOffset.Value]); } } internal InternalPartitionEnumerator(IList<TSource> sharedReader, Shared<long> sharedIndex) : base(sharedReader, sharedIndex) { } } internal DynamicPartitionerForIList(IList<TSource> source) : base(source) { } protected override IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions_Factory(IList<TSource> m_data) { return new InternalPartitionEnumerable(m_data); } } private class DynamicPartitionerForArray<TSource> : DynamicPartitionerForIndexRange_Abstract<TSource, TSource[]> { private class InternalPartitionEnumerable : IEnumerable<KeyValuePair<long, TSource>>, IEnumerable { private readonly TSource[] m_sharedReader; private Shared<long> m_sharedIndex; internal InternalPartitionEnumerable(TSource[] sharedReader) { m_sharedReader = sharedReader; m_sharedIndex = new Shared<long>(-1L); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator<KeyValuePair<long, TSource>> GetEnumerator() { return new InternalPartitionEnumerator(m_sharedReader, m_sharedIndex); } } private class InternalPartitionEnumerator : DynamicPartitionEnumeratorForIndexRange_Abstract<TSource, TSource[]> { protected override int SourceCount => m_sharedReader.Length; public override KeyValuePair<long, TSource> Current { get { if (m_currentChunkSize == null) { throw new InvalidOperationException(Environment2.GetResourceString("PartitionerStatic_CurrentCalledBeforeMoveNext")); } return new KeyValuePair<long, TSource>(m_startIndex + m_localOffset.Value, m_sharedReader[m_startIndex + m_localOffset.Value]); } } internal InternalPartitionEnumerator(TSource[] sharedReader, Shared<long> sharedIndex) : base(sharedReader, sharedIndex) { } } internal DynamicPartitionerForArray(TSource[] source) : base(source) { } protected override IEnumerable<KeyValuePair<long, TSource>> GetOrderableDynamicPartitions_Factory(TSource[] m_data) { return new InternalPartitionEnumerable(m_data); } } private abstract class StaticIndexRangePartitioner<TSource, TCollection> : OrderablePartitioner<TSource> { protected abstract int SourceCount { get; } protected StaticIndexRangePartitioner() : base(keysOrderedInEachPartition: true, keysOrderedAcrossPartitions: true, keysNormalized: true) { } protected abstract IEnumerator<KeyValuePair<long, TSource>> CreatePartition(int startIndex, int endIndex); public override IList<IEnumerator<KeyValuePair<long, TSource>>> GetOrderablePartitions(int partitionCount) { if (partitionCount <= 0) { throw new ArgumentOutOfRangeException("partitionCount"); } int result; int num = Math.DivRem(SourceCount, partitionCount, out result); IEnumerator<KeyValuePair<long, TSource>>[] array = new IEnumerator<KeyValuePair<long, TSource>>[partitionCount]; int num2 = -1; for (int i = 0; i < partitionCount; i++) { int num3 = num2 + 1; num2 = ((i >= result) ? (num3 + num - 1) : (num3 + num)); array[i] = CreatePartition(num3, num2); } return array; } } private abstract class StaticIndexRangePartition<TSource> : IEnumerator<KeyValuePair<long, TSource>>, IDisposable, IEnumerator { protected readonly int m_startIndex; protected readonly int m_endIndex; protected volatile int m_offset; public abstract KeyValuePair<long, TSource> Current { get; } object IEnumerator.Current => Current; protected StaticIndexRangePartition(int startIndex, int endIndex) { m_startIndex = startIndex; m_endIndex = endIndex; m_offset = startIndex - 1; } public void Dispose() { } public void Reset() { throw new NotSupportedException(); } public bool MoveNext() { if (m_offset < m_endIndex) { m_offset++; return true; } m_offset = m_endIndex + 1; return false; } } private class StaticIndexRangePartitionerForIList<TSource> : StaticIndexRangePartitioner<TSource, IList<TSource>> { private IList<TSource> m_list; protected override int SourceCount => m_list.Count; internal StaticIndexRangePartitionerForIList(IList<TSource> list) { m_list = list; } protected override IEnumerator<KeyValuePair<long, TSource>> CreatePartition(int startIndex, int endIndex) { return new StaticIndexRangePartitionForIList<TSource>(m_list, startIndex, endIndex); } } private class StaticIndexRangePartitionForIList<TSource> : StaticIndexRangePartition<TSource> { private volatile IList<TSource> m_list; public override KeyValuePair<long, TSource> Current { get { if (m_offset < m_startIndex) { throw new InvalidOperationException(Environment2.GetResourceString("PartitionerStatic_CurrentCalledBeforeMoveNext")); } return new KeyValuePair<long, TSource>(m_offset, m_list[m_offset]); } } internal StaticIndexRangePartitionForIList(IList<TSource> list, int startIndex, int endIndex) : base(startIndex, endIndex) { m_list = list; } } private class StaticIndexRangePartitionerForArray<TSource> : StaticIndexRangePartitioner<TSource, TSource[]> { private TSource[] m_array; protected override int SourceCount => m_array.Length; internal StaticIndexRangePartitionerForArray(TSource[] array) { m_array = array; } protected override IEnumerator<KeyValuePair<long, TSource>> CreatePartition(int startIndex, int endIndex) { return new StaticIndexRangePartitionForArray<TSource>(m_array, startIndex, endIndex); } } private class StaticIndexRangePartitionForArray<TSource> : StaticIndexRangePartition<TSource> { private volatile TSource[] m_array; public override KeyValuePair<long, TSource> Current { get { if (m_offset < m_startIndex) { throw new InvalidOperationException(Environment2.GetResourceString("PartitionerStatic_CurrentCalledBeforeMoveNext")); } return new KeyValuePair<long, TSource>(m_offset, m_array[m_offset]); } } internal StaticIndexRangePartitionForArray(TSource[] array, int startIndex, int endIndex) : base(startIndex, endIndex) { m_array = array; } } private class Shared<TSource> { internal TSource Value; internal Shared(TSource value) { Value = value; } } private const int DEFAULT_BYTES_PER_CHUNK = 512; public static OrderablePartitioner<TSource> Create<TSource>(IList<TSource> list, bool loadBalance) { if (list == null) { throw new ArgumentNullException("list"); } if (loadBalance) { return new DynamicPartitionerForIList<TSource>(list); } return new StaticIndexRangePartitionerForIList<TSource>(list); } public static OrderablePartitioner<TSource> Create<TSource>(TSource[] array, bool loadBalance) { if (array == null) { throw new ArgumentNullException("array"); } if (loadBalance) { return new DynamicPartitionerForArray<TSource>(array); } return new StaticIndexRangePartitionerForArray<TSource>(array); } public static OrderablePartitioner<TSource> Create<TSource>(IEnumerable<TSource> source) { return Create(source, -1); } internal static OrderablePartitioner<TSource> Create<TSource>(IEnumerable<TSource> source, int maxChunkSize) { if (source == null) { throw new ArgumentNullException("source"); } return new DynamicPartitionerForIEnumerable<TSource>(source, maxChunkSize); } private static int GetDefaultChunkSize<TSource>() { if (typeof(TSource).IsValueType) { if (typeof(TSource).StructLayoutAttribute.Value == LayoutKind.Explicit) { return Math.Max(1, 512 / Marshal.SizeOf(typeof(TSource))); } return 128; } return 512 / IntPtr.Size; } } } namespace System { [Serializable] [DebuggerDisplay("Count = {InnerExceptions.Count}")] public class AggregateException : Exception { private ReadOnlyCollection<Exception> m_innerExceptions; public ReadOnlyCollection<Exception> InnerExceptions => m_innerExceptions; public AggregateException() : base(Environment2.GetResourceString("AggregateException_ctor_DefaultMessage")) { m_innerExceptions = new ReadOnlyCollection<Exception>(new Exception[0]); } public AggregateException(string message) : base(message) { m_innerExceptions = new ReadOnlyCollection<Exception>(new Exception[0]); } public AggregateException(string message, Exception innerException) : base(message, innerException) { if (innerException == null) { throw new ArgumentNullException("innerException"); } m_innerExceptions = new ReadOnlyCollection<Exception>(new Exception[1] { innerException }); } public AggregateException(IEnumerable<Exception> innerExceptions) : this(Environment2.GetResourceString("AggregateException_ctor_DefaultMessage"), innerExceptions) { } public AggregateException(params Exception[] innerExceptions) : this(Environment2.GetResourceString("AggregateException_ctor_DefaultMessage"), innerExceptions) { } public AggregateException(string message, IEnumerable<Exception> innerExceptions) : this(message, (innerExceptions == null) ? null : new List<Exception>(innerExceptions)) { } public AggregateException(string message, params Exception[] innerExceptions) : this(message, (IList<Exception>)innerExceptions) { } private AggregateException(string message, IList<Exception> innerExceptions) : base(message, (innerExceptions != null && innerExceptions.Count > 0) ? innerExceptions[0] : null) { if (innerExceptions == null) { throw new ArgumentNullException("innerExceptions"); } Exception[] array = new Exception[innerExceptions.Count]; for (int i = 0; i < array.Length; i++) { array[i] = innerExceptions[i]; if (array[i] == null) { throw new ArgumentException(Environment2.GetResourceString("AggregateException_ctor_InnerExceptionNull")); } } m_innerExceptions = new ReadOnlyCollection<Exception>(array); } [SecurityCritical] protected AggregateException(SerializationInfo info, StreamingContext context) : base(info, context) { if (info == null) { throw new ArgumentNullException("info"); } if (!(info.GetValue("InnerExceptions", typeof(Exception[])) is Exception[] list)) { throw new SerializationException(Environment2.GetResourceString("AggregateException_DeserializationFailure")); } m_innerExceptions = new ReadOnlyCollection<Exception>(list); } [SecurityCritical] public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) { throw new ArgumentNullException("info"); } base.GetObjectData(info, context); Exception[] array = new Exception[m_innerExceptions.Count]; m_innerExceptions.CopyTo(array, 0); info.AddValue("InnerExceptions", array, typeof(Exception[])); } public override Exception GetBaseException() { Exception ex = this; AggregateException ex2 = this; while (ex2 != null && ex2.InnerExceptions.Count == 1) { ex = ex.InnerException; ex2 = ex as AggregateException; } return ex; } public void Handle(Func<Exception, bool> predicate) { if (predicate == null) { throw new ArgumentNullException("predicate"); } List<Exception> list = null; for (int i = 0; i < m_innerExceptions.Count; i++) { if (!predicate(m_innerExceptions[i])) { if (list == null) { list = new List<Exception>(); } list.Add(m_innerExceptions[i]); } } if (list != null) { throw new AggregateException(Message, list); } } public AggregateException Flatten() { List<Exception> list = new List<Exception>(); List<AggregateException> list2 = new List<AggregateException>(); list2.Add(this); int num = 0; while (list2.Count > num) { IList<Exception> innerExceptions = list2[num++].InnerExceptions; for (int i = 0; i < innerExceptions.Count; i++) { Exception ex = innerExceptions[i]; if (ex != null) { if (ex is AggregateException item) { list2.Add(item); } else { list.Add(ex); } } } } return new AggregateException(Message, list); } public override string ToString() { string text = base.ToString(); for (int i = 0; i < m_innerExceptions.Count; i++) { text = string.Format(CultureInfo.InvariantCulture, Environment2.GetResourceString("AggregateException_ToString"), text, Environment.NewLine, i, m_innerExceptions[i].ToString(), "<---", Environment.NewLine); } return text; } } public delegate TResult Func_<T1, T2, T3, T4, T5, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); } namespace System.Threading { [ComVisible(false)] [DebuggerDisplay("IsCancellationRequested = {IsCancellationRequested}")] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public struct CancellationToken { private CancellationTokenSource m_source; private static Action<object> s_ActionToActionObjShunt = ActionToActionObjShunt; public static CancellationToken None => default(CancellationToken); public bool IsCancellationRequested { get { if (m_source != null) { return m_source.IsCancellationRequested; } return false; } } public bool CanBeCanceled { get { if (m_source != null) { return m_source.CanBeCanceled; } return false; } } public WaitHandle WaitHandle { get { if (m_source == null) { InitializeDefaultSource(); } return m_source.WaitHandle; } } internal CancellationToken(CancellationTokenSource source) { m_source = source; } public CancellationToken(bool canceled) { this = default(CancellationToken); if (canceled) { m_source = CancellationTokenSource.InternalGetStaticSource(canceled); } } private static void ActionToActionObjShunt(object obj) { Action action = obj as Action; action(); } public CancellationTokenRegistration Register(Action callback) { if (callback == null) { throw new ArgumentNullException("callback"); } return Register(s_ActionToActionObjShunt, callback, useSynchronizationContext: false, useExecutionContext: true); } public CancellationTokenRegistration Register(Action callback, bool useSynchronizationContext) { if (callback == null) { throw new ArgumentNullException("callback"); } return Register(s_ActionToActionObjShunt, callback, useSynchronizationContext, useExecutionContext: true); } public CancellationTokenRegistration Register(Action<object> callback, object state) { if (callback == null) { throw new ArgumentNullException("callback"); } return Register(callback, state, useSynchronizationContext: false, useExecutionContext: true); } public CancellationTokenRegistration Register(Action<object> callback, object state, bool useSynchronizationContext) { return Register(callback, state, useSynchronizationContext, useExecutionContext: true); } internal CancellationTokenRegistration InternalRegisterWithoutEC(Action<object> callback, object state) { return Register(callback, state, useSynchronizationContext: false, useExecutionContext: false); } private CancellationTokenRegistration Register(Action<object> callback, object state, bool useSynchronizationContext, bool useExecutionContext) { if (callback == null) { throw new ArgumentNullException("callback"); } if (!CanBeCanceled) { return default(CancellationTokenRegistration); } SynchronizationContext targetSyncContext = null; if (!IsCancellationRequested && useSynchronizationContext) { targetSyncContext = SynchronizationContext.Current; } ExecutionContext executionContext = null; if (!IsCancellationRequested && useExecutionContext) { executionContext = ExecutionContext.Capture(); } return m_source.InternalRegister(callback, state, targetSyncContext, executionContext); } public bool Equals(CancellationToken other) { if (m_source == null && other.m_source == null) { return true; } if (m_source == null) { return other.m_source == CancellationTokenSource.InternalGetStaticSource(set: false); } if (other.m_source == null) { return m_source == CancellationTokenSource.InternalGetStaticSource(set: false); } return m_source == other.m_source; } public override bool Equals(object other) { if (other is CancellationToken) { return Equals((CancellationToken)other); } return false; } public override int GetHashCode() { if (m_source == null) { return CancellationTokenSource.InternalGetStaticSource(set: false).GetHashCode(); } return m_source.GetHashCode(); } public static bool operator ==(CancellationToken left, CancellationToken right) { return left.Equals(right); } public static bool operator !=(CancellationToken left, CancellationToken right) { return !left.Equals(right); } public void ThrowIfCancellationRequested() { if (IsCancellationRequested) { throw new OperationCanceledException2(Environment2.GetResourceString("OperationCanceled"), this); } } internal void ThrowIfSourceDisposed() { if (m_source != null && m_source.IsDisposed) { throw new ObjectDisposedException(null, Environment2.GetResourceString("CancellationToken_SourceDisposed")); } } private void InitializeDefaultSource() { m_source = CancellationTokenSource.InternalGetStaticSource(set: false); } } [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public struct CancellationTokenRegistration : IEquatable<CancellationTokenRegistration>, IDisposable { private readonly CancellationTokenSource m_tokenSource; private readonly CancellationCallbackInfo m_callbackInfo; private readonly SparselyPopulatedArrayAddInfo<CancellationCallbackInfo> m_registrationInfo; internal CancellationTokenRegistration(CancellationTokenSource tokenSource, CancellationCallbackInfo callbackInfo, SparselyPopulatedArrayAddInfo<CancellationCallbackInfo> registrationInfo) { m_tokenSource = tokenSource; m_callbackInfo = callbackInfo; m_registrationInfo = registrationInfo; } internal bool TryDeregister() { if (m_registrationInfo.Source == null) { return false; } CancellationCallbackInfo cancellationCallbackInfo = m_registrationInfo.Source.SafeAtomicRemove(m_registrationInfo.Index, m_callbackInfo); if (cancellationCallbackInfo != m_callbackInfo) { return false; } return true; } public void Dispose() { if (m_tokenSource != null) { m_tokenSource.ThrowIfDisposed(); } bool flag = TryDeregister(); if (m_tokenSource != null && m_tokenSource.IsCancellationRequested && !m_tokenSource.IsCancellationCompleted && !flag && m_tokenSource.ThreadIDExecutingCallbacks != Thread.CurrentThread.ManagedThreadId) { m_tokenSource.WaitForCallbackToComplete(m_callbackInfo); } } public static bool operator ==(CancellationTokenRegistration left, CancellationTokenRegistration right) { return left.Equals(right); } public static bool operator !=(CancellationTokenRegistration left, CancellationTokenRegistration right) { return !left.Equals(right); } public override bool Equals(object obj) { if (obj is CancellationTokenRegistration) { return Equals((CancellationTokenRegistration)obj); } return false; } public bool Equals(CancellationTokenRegistration other) { if (m_tokenSource == other.m_tokenSource && m_callbackInfo == other.m_callbackInfo && m_registrationInfo.Source == other.m_registrationInfo.Source) { return m_registrationInfo.Index == other.m_registrationInfo.Index; } return false; } public override int GetHashCode() { if (m_registrationInfo.Source != null) { return m_registrationInfo.Source.GetHashCode() ^ m_registrationInfo.Index.GetHashCode(); } return m_registrationInfo.Index.GetHashCode(); } } [ComVisible(false)] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public sealed class CancellationTokenSource : IDisposable { private const int CANNOT_BE_CANCELED = 0; private const int NOT_CANCELED = 1; private const int NOTIFYING = 2; private const int NOTIFYINGCOMPLETE = 3; private static readonly CancellationTokenSource _staticSource_Set = new CancellationTokenSource(set: true); private static readonly CancellationTokenSource _staticSource_NotCancelable = new CancellationTokenSource(set: false); private static readonly int s_nLists = ((PlatformHelper.ProcessorCount > 24) ? 24 : PlatformHelper.ProcessorCount); private volatile ManualResetEvent m_kernelEvent; private volatile SparselyPopulatedArray<CancellationCallbackInfo>[] m_registeredCallbacksLists; private volatile int m_state; private volatile int m_threadIDExecutingCallbacks = -1; private bool m_disposed; private List<CancellationTokenRegistration> m_linkingRegistrations; private static readonly Action<object> s_LinkedTokenCancelDelegate = LinkedTokenCancelDelegate; private volatile CancellationCallbackInfo m_executingCallback; public bool IsCancellationRequested => m_state >= 2; internal bool IsCancellationCompleted => m_state == 3; internal bool IsDisposed => m_disposed; internal int ThreadIDExecutingCallbacks { get { return m_threadIDExecutingCallbacks; } set { m_threadIDExecutingCallbacks = value; } } public CancellationToken Token { get { ThrowIfDisposed(); return new CancellationToken(this); } } internal bool CanBeCanceled => m_state != 0; internal WaitHandle WaitHandle { get { ThrowIfDisposed(); if (m_kernelEvent != null) { return m_kernelEvent; } ManualResetEvent manualResetEvent = new ManualResetEvent(initialState: false); if (Interlocked.CompareExchange(ref m_kernelEvent, manualResetEvent, null) != null) { ((IDisposable)manualResetEvent).Dispose(); } if (IsCancellationRequested) { m_kernelEvent.Set(); } return m_kernelEvent; } } internal CancellationCallbackInfo ExecutingCallback => m_executingCallback; private static void LinkedTokenCancelDelegate(object source) { CancellationTokenSource cancellationTokenSource = source as CancellationTokenSource; cancellationTokenSource.Cancel(); } public CancellationTokenSource() { m_state = 1; } private CancellationTokenSource(bool set) { m_state = (set ? 3 : 0); } public void Cancel() { Cancel(throwOnFirstException: false); } public void Cancel(bool throwOnFirstException) { ThrowIfDisposed(); NotifyCancellation(throwOnFirstException); } public void Dispose() { if (m_disposed) { return; } if (m_linkingRegistrations != null) { foreach (CancellationTokenRegistration linkingRegistration in m_linkingRegistrations) { linkingRegistration.Dispose(); } m_linkingRegistrations = null; } m_registeredCallbacksLists = null; if (m_kernelEvent != null) { m_kernelEvent.Close(); m_kernelEvent = null; } m_disposed = true; } internal void ThrowIfDisposed() { if (m_disposed) { throw new ObjectDisposedException(null, Environment2.GetResourceString("CancellationTokenSource_Disposed")); } } internal static CancellationTokenSource InternalGetStaticSource(bool set) { if (!set) { return _staticSource_NotCancelable; } return _staticSource_Set; } internal CancellationTokenRegistration InternalRegister(Action<object> callback, object stateForCallback, SynchronizationContext targetSyncContext, ExecutionContext executionContext) { ThrowIfDisposed(); if (!IsCancellationRequested) { int num = Thread.CurrentThread.ManagedThreadId % s_nLists; CancellationCallbackInfo cancellationCallbackInfo = new CancellationCallbackInfo(callback, stateForCallback, targetSyncContext, executionContext, this); if (m_registeredCallbacksLists == null) { SparselyPopulatedArray<CancellationCallbackInfo>[] value = new SparselyPopulatedArray<CancellationCallbackInfo>[s_nLists]; Interlocked.CompareExchange(ref m_registeredCallbacksLists, value, null); } if (m_registeredCallbacksLists[num] == null) { SparselyPopulatedArray<CancellationCallbackInfo> value2 = new SparselyPopulatedArray<CancellationCallbackInfo>(4); Interlocked.CompareExchange(ref m_registeredCallbacksLists[num], value2, null); } SparselyPopulatedArray<CancellationCallbackInfo> sparselyPopulatedArray = m_registeredCallbacksLists[num]; SparselyPopulatedArrayAddInfo<CancellationCallbackInfo> registrationInfo = sparselyPopulatedArray.Add(cancellationCallbackInfo); CancellationTokenRegistration result = new CancellationTokenRegistration(this, cancellationCallbackInfo, registrationInfo); if (!IsCancellationRequested) { return result; } if (!result.TryDeregister()) { WaitForCallbackToComplete(cancellationCallbackInfo); return default(CancellationTokenRegistration); } } callback(stateForCallback); return default(CancellationTokenRegistration); } private void NotifyCancellation(bool throwOnFirstException) { if (!IsCancellationRequested && Interlocked.CompareExchange(ref m_state, 2, 1) == 1) { ThreadIDExecutingCallbacks = Thread.CurrentThread.ManagedThreadId; if (m_kernelEvent != null) { m_kernelEvent.Set(); } ExecuteCallbackHandlers(throwOnFirstException); } } private void ExecuteCallbackHandlers(bool throwOnFirstException) { List<Exception> list = null; SparselyPopulatedArray<CancellationCallbackInfo>[] registeredCallbacksLists = m_registeredCallbacksLists; if (registeredCallbacksLists == null) { Interlocked.Exchange(ref m_state, 3); return; } try { foreach (SparselyPopulatedArray<CancellationCallbackInfo> sparselyPopulatedArray in registeredCallbacksLists) { if (sparselyPopulatedArray == null) { continue; } for (SparselyPopulatedArrayFragment<CancellationCallbackInfo> sparselyPopulatedArrayFragment = sparselyPopulatedArray.Tail; sparselyPopulatedArrayFragment != null; sparselyPopulatedArrayFragment = sparselyPopulatedArrayFragment.Prev) { for (int num = sparselyPopulatedArrayFragment.Length - 1; num >= 0; num--) { m_executingCallback = sparselyPopulatedArrayFragment[num]; if (m_executingCallback != null) { CancellationCallbackCoreWorkArguments cancellationCallbackCoreWorkArguments = new CancellationCallbackCoreWorkArguments(sparselyPopulatedArrayFragment, num); try { if (m_executingCallback.TargetSyncContext != null) { m_executingCallback.TargetSyncContext.Send(CancellationCallbackCoreWork_OnSyncContext, cancellationCallbackCoreWorkArguments); ThreadIDExecutingCallbacks = Thread.CurrentThread.ManagedThreadId; } else { CancellationCallbackCoreWork_OnSyncContext(cancellationCallbackCoreWorkArguments); } } catch (Exception item) { if (throwOnFirstException) { throw; } if (list == null) { list = new List<Exception>(); } list.Add(item); } } } } } } finally { m_state = 3; m_executingCallback = null; Thread.MemoryBarrier(); } if (list == null) { return; } throw new AggregateException(list); } private void CancellationCallbackCoreWork_OnSyncContext(object obj) { CancellationCallbackCoreWorkArguments cancellationCallbackCoreWorkArguments = (CancellationCallbackCoreWorkArguments)obj; CancellationCallbackInfo cancellationCallbackInfo = cancellationCallbackCoreWorkArguments.m_currArrayFragment.SafeAtomicRemove(cancellationCallbackCoreWorkArguments.m_currArrayIndex, m_executingCallback); if (cancellationCallbackInfo == m_executingCallback) { if (cancellationCallbackInfo.TargetExecutionContext != null) { cancellationCallbackInfo.CancellationTokenSource.ThreadIDExecutingCallbacks = Thread.CurrentThread.ManagedThreadId; } cancellationCallbackInfo.ExecuteCallback(); } } public static CancellationTokenSource CreateLinkedTokenSource(CancellationToken token1, CancellationToken token2) { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); if (token1.CanBeCanceled) { cancellationTokenSource.m_linkingRegistrations = new List<CancellationTokenRegistration>(); cancellationTokenSource.m_linkingRegistrations.Add(token1.InternalRegisterWithoutEC(s_LinkedTokenCancelDelegate, cancellationTokenSource)); } if (token2.CanBeCanceled) { if (cancellationTokenSource.m_linkingRegistrations == null) { cancellationTokenSource.m_linkingRegistrations = new List<CancellationTokenRegistration>(); } cancellationTokenSource.m_linkingRegistrations.Add(token2.InternalRegisterWithoutEC(s_LinkedTokenCancelDelegate, cancellationTokenSource)); } return cancellationTokenSource; } public static CancellationTokenSource CreateLinkedTokenSource(params CancellationToken[] tokens) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (tokens.Length == 0) { throw new ArgumentException(Environment2.GetResourceString("CancellationToken_CreateLinkedToken_TokensIsEmpty")); } CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.m_linkingRegistrations = new List<CancellationTokenRegistration>(); for (int i = 0; i < tokens.Length; i++) { if (tokens[i].CanBeCanceled) { cancellationTokenSource.m_linkingRegistrations.Add(tokens[i].InternalRegisterWithoutEC(s_LinkedTokenCancelDelegate, cancellationTokenSource)); } } return cancellationTokenSource; } internal void WaitForCallbackToComplete(CancellationCallbackInfo callbackInfo) { SpinWait spinWait = default(SpinWait); while (ExecutingCallback == callbackInfo) { spinWait.SpinOnce(); } } } internal struct CancellationCallbackCoreWorkArguments { internal SparselyPopulatedArrayFragment<CancellationCallbackInfo> m_currArrayFragment; internal int m_currArrayIndex; public CancellationCallbackCoreWorkArguments(SparselyPopulatedArrayFragment<CancellationCallbackInfo> currArrayFragment, int currArrayIndex) { m_currArrayFragment = currArrayFragment; m_currArrayIndex = currArrayIndex; } } internal class CancellationCallbackInfo { internal readonly Action<object> Callback; internal readonly object StateForCallback; internal readonly SynchronizationContext TargetSyncContext; internal readonly ExecutionContext TargetExecutionContext; internal readonly CancellationTokenSource CancellationTokenSource; internal CancellationCallbackInfo(Action<object> callback, object stateForCallback, SynchronizationContext targetSyncContext, ExecutionContext targetExecutionContext, CancellationTokenSource cancellationTokenSource) { Callback = callback; StateForCallback = stateForCallback; TargetSyncContext = targetSyncContext; TargetExecutionContext = targetExecutionContext; CancellationTokenSource = cancellationTokenSource; } [SecuritySafeCritical] internal void ExecuteCallback() { if (TargetExecutionContext != null) { ExecutionContext.Run(TargetExecutionContext, ExecutionContextCallback, this); } else { ExecutionContextCallback(this); } } private static void ExecutionContextCallback(object obj) { CancellationCallbackInfo cancellationCallbackInfo = obj as CancellationCallbackInfo; cancellationCallbackInfo.Callback(cancellationCallbackInfo.StateForCallback); } } internal class SparselyPopulatedArray<T> where T : class { private readonly SparselyPopulatedArrayFragment<T> m_head; private volatile SparselyPopulatedArrayFragment<T> m_tail; internal SparselyPopulatedArrayFragment<T> Head => m_head; internal SparselyPopulatedArrayFragment<T> Tail => m_tail; internal SparselyPopulatedArray(int initialSize) { m_head = (m_tail = new SparselyPopulatedArrayFragment<T>(initialSize)); } internal SparselyPopulatedArrayAddInfo<T> Add(T element) { while (true) { SparselyPopulatedArrayFragment<T> sparselyPopulatedArrayFragment = m_tail; while (sparselyPopulatedArrayFragment.m_next != null) { sparselyPopulatedArrayFragment = (m_tail = sparselyPopulatedArrayFragment.m_next); } for (SparselyPopulatedArrayFragment<T> sparselyPopulatedArrayFragment2 = sparselyPopulatedArrayFragment; sparselyPopulatedArrayFragment2 != null; sparselyPopulatedArrayFragment2 = sparselyPopulatedArrayFragment2.m_prev) { if (sparselyPopulatedArrayFragment2.m_freeCount < 1) { sparselyPopulatedArrayFragment2.m_freeCount--; } if (sparselyPopulatedArrayFragment2.m_freeCount > 0 || sparselyPopulatedArrayFragment2.m_freeCount < -10) { int length = sparselyPopulatedArrayFragment2.Length; int num = (length - sparselyPopulatedArrayFragment2.m_freeCount) % length; if (num < 0) { num = 0; sparselyPopulatedArrayFragment2.m_freeCount--; } for (int i = 0; i < length; i++) { int num2 = (num + i) % length; if (sparselyPopulatedArrayFragment2.m_elements[num2] == null && Interlocked.CompareExchange(ref sparselyPopulatedArrayFragment2.m_elements[num2], element, null) == null) { int num3 = sparselyPopulatedArrayFragment2.m_freeCount - 1; sparselyPopulatedArrayFragment2.m_freeCount = ((num3 > 0) ? num3 : 0); return new SparselyPopulatedArrayAddInfo<T>(sparselyPopulatedArrayFragment2, num2); } } } } SparselyPopulatedArrayFragment<T> sparselyPopulatedArrayFragment3 = new SparselyPopulatedArrayFragment<T>((sparselyPopulatedArrayFragment.m_elements.Length == 4096) ? 4096 : (sparselyPopulatedArrayFragment.m_elements.Length * 2), sparselyPopulatedArrayFragment); if (Interlocked.CompareExchange(ref sparselyPopulatedArrayFragment.m_next, sparselyPopulatedArrayFragment3, null) == null) { m_tail = sparselyPopulatedArrayFragment3; } } } } internal struct SparselyPopulatedArrayAddInfo<T> where T : class { private SparselyPopulatedArrayFragment<T> m_source; private int m_index; internal SparselyPopulatedArrayFragment<T> Source => m_source; internal int Index => m_index; internal SparselyPopulatedArrayAddInfo(SparselyPopulatedArrayFragment<T> source, int index) { m_source = source; m_index = index; } } internal class SparselyPopulatedArrayFragment<T> where T : class { internal readonly T[] m_elements; internal volatile int m_freeCount; internal volatile SparselyPopulatedArrayFragment<T> m_next; internal volatile SparselyPopulatedArrayFragment<T> m_prev; internal T this[int index] => m_elements[index]; internal int Length => m_elements.Length; internal SparselyPopulatedArrayFragment<T> Next => m_next; internal SparselyPopulatedArrayFragment<T> Prev => m_prev; internal SparselyPopulatedArrayFragment(int size) : this(size, (SparselyPopulatedArrayFragment<T>)null) { } internal SparselyPopulatedArrayFragment(int size, SparselyPopulatedArrayFragment<T> prev) { m_elements = new T[size]; m_freeCount = size; m_prev = prev; } internal T SafeAtomicRemove(int index, T expectedElement) { T val = Interlocked.CompareExchange(ref m_elements[index], null, expectedElement); if (val != null) { m_freeCount++; } return val; } } [DebuggerDisplay("Initial Count={InitialCount}, Current Count={CurrentCount}")] [ComVisible(false)] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public class CountdownEvent : IDisposable { private int m_initialCount; private volatile int m_currentCount; private ManualResetEventSlim m_event; private volatile bool m_disposed; public int CurrentCount => m_currentCount; public int InitialCount => m_initialCount; public bool IsSet => m_currentCount == 0; public WaitHandle WaitHandle { get { ThrowIfDisposed(); return m_event.WaitHandle; } } public CountdownEvent(int initialCount) { if (initialCount < 0) { throw new ArgumentOutOfRangeException("initialCount"); } m_initialCount = initialCount; m_currentCount = initialCount; m_event = new ManualResetEventSlim(); if (initialCount == 0) { m_event.Set(); } } public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { m_event.Dispose(); m_disposed = true; } } public bool Signal() { return Signal(1); } public bool Signal(int signalCount) { if (signalCount <= 0) { throw new ArgumentOutOfRangeException("signalCount"); } ThrowIfDisposed(); SpinWait spinWait = default(SpinWait); int currentCount; while (true) { currentCount = m_currentCount; if (currentCount < signalCount) { throw new InvalidOperationException(Environment2.GetResourceString("CountdownEvent_Decrement_BelowZero")); } if (Interlocked.CompareExchange(ref m_currentCount, currentCount - signalCount, currentCount) == currentCount) { break; } spinWait.SpinOnce(); } if (currentCount == signalCount) { m_event.Set(); return true; } return false; } public void AddCount() { AddCount(1); } public bool TryAddCount() { return TryAddCount(1); } public void AddCount(int signalCount) { if (!TryAddCount(signalCount)) { throw new InvalidOperationException(Environment2.GetResourceString("CountdownEvent_Increment_AlreadyZero")); } } public bool TryAddCount(int signalCount) { if (signalCount <= 0) { throw new ArgumentOutOfRangeException("signalCount"); } ThrowIfDisposed(); SpinWait spinWait = default(SpinWait); while (true) { int currentCount = m_currentCount; if (currentCount == 0) { return false; } if (currentCount > int.MaxValue - signalCount) { throw new InvalidOperationException(Environment2.GetResourceString("CountdownEvent_Increment_AlreadyMax")); } if (Interlocked.CompareExchange(ref m_currentCount, currentCount + signalCount, currentCount) == currentCount) { break; } spinWait.SpinOnce(); } return true; } public void Reset() { Reset(m_initialCount); } public void Reset(int count) { ThrowIfDisposed(); if (count < 0) { throw new ArgumentOutOfRangeException("count"); } m_currentCount = count; m_initialCount = count; if (count == 0) { m_event.Set(); } else { m_event.Reset(); } } public void Wait() { Wait(-1, default(CancellationToken)); } public void Wait(CancellationToken cancellationToken) { Wait(-1, cancellationToken); } public bool Wait(TimeSpan timeout) { long num = (long)timeout.TotalMilliseconds; if (num < -1 || num > int.MaxValue) { throw new ArgumentOutOfRangeException("timeout"); } return Wait((int)num, default(CancellationToken)); } public bool Wait(TimeSpan timeout, CancellationToken cancellationToken) { long num = (long)timeout.TotalMilliseconds; if (num < -1 || num > int.MaxValue) { throw new ArgumentOutOfRangeException("timeout"); } return Wait((int)num, cancellationToken); } public bool Wait(int millisecondsTimeout) { return Wait(millisecondsTimeout, default(CancellationToken)); } public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken) { if (millisecondsTimeout < -1) { throw new ArgumentOutOfRangeException("millisecondsTimeout"); } ThrowIfDisposed(); cancellationToken.ThrowIfCancellationRequested(); bool flag = IsSet; if (!flag) { flag = m_event.Wait(millisecondsTimeout, cancellationToken); } return flag; } private void ThrowIfDisposed() { if (m_disposed) { throw new ObjectDisposedException("CountdownEvent"); } } } [ComVisible(false)] [DebuggerDisplay("Set = {IsSet}")] [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public class ManualResetEventSlim : IDisposable { private const int DEFAULT_SPIN_SP = 1; private const int DEFAULT_SPIN_MP = 10; private const int SignalledState_BitMask = int.MinValue; private const int SignalledState_ShiftCount = 31; private const int Dispose_BitMask = 1073741824; private const int SpinCountState_BitMask = 1073217536; private const int SpinCountState_ShiftCount = 19; private const int SpinCountState_MaxValue = 2047; private const int NumWaitersState_BitMask = 524287; private const int NumWaitersState_ShiftCount = 0; private const int NumWaitersState_MaxValue = 524287; private object m_lock; private ManualResetEvent m_eventObj; private volatile int m_combinedState; private static Action<object> s_cancellationTokenCallback = CancellationTokenCallback; public WaitHandle WaitHandle { get { ThrowIfDisposed(); if (m_eventObj == null) { LazyInitializeEvent(); } return m_eventObj; } } public bool IsSet { get { return 0 != ExtractStatePortion(m_combinedState, int.MinValue); } private set { UpdateStateAtomically((value ? 1 : 0) << 31, int.MinValue); } } public int SpinCount { get { return ExtractStatePortionAndShiftRight(m_combinedState, 1073217536, 19); } private set { m_combinedState = (m_combinedState & -1073217537) | (value << 19); } } private int Waiter