Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TextureSwapper v1.2.0
Microsoft.CSharp.dll
Decompiled 4 months 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.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Dynamic; using System.Globalization; using System.Linq; using System.Linq.Expressions; using System.Numerics.Hashing; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Security; using System.Text; using System.Threading; using FxResources.Microsoft.CSharp; using Microsoft.CSharp.RuntimeBinder.Errors; using Microsoft.CSharp.RuntimeBinder.Semantics; using Microsoft.CSharp.RuntimeBinder.Syntax; using Microsoft.CodeAnalysis; [assembly: DefaultDllImportSearchPaths(DllImportSearchPath.System32 | DllImportSearchPath.AssemblyDirectory)] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyDefaultAlias("Microsoft.CSharp")] [assembly: AssemblyMetadata(".NETFrameworkAssembly", "")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("PreferInbox", "True")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyDescription("Microsoft.CSharp")] [assembly: AssemblyFileVersion("4.700.19.56404")] [assembly: AssemblyInformationalVersion("3.1.0+0f7f38c4fd323b26da10cce95f857f77f0f09b48")] [assembly: AssemblyProduct("Microsoft® .NET Core")] [assembly: AssemblyTitle("Microsoft.CSharp")] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: CLSCompliant(true)] [assembly: AssemblyVersion("4.0.5.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] internal sealed class IsReadOnlyAttribute : Attribute { } } namespace FxResources.Microsoft.CSharp { internal static class SR { } } namespace System { internal static class SR { private static ResourceManager s_resourceManager; internal static ResourceManager ResourceManager => s_resourceManager ?? (s_resourceManager = new ResourceManager(typeof(SR))); internal static string InternalCompilerError => GetResourceString("InternalCompilerError"); internal static string BindPropertyFailedMethodGroup => GetResourceString("BindPropertyFailedMethodGroup"); internal static string BindPropertyFailedEvent => GetResourceString("BindPropertyFailedEvent"); internal static string BindInvokeFailedNonDelegate => GetResourceString("BindInvokeFailedNonDelegate"); internal static string NullReferenceOnMemberException => GetResourceString("NullReferenceOnMemberException"); internal static string BindCallToConditionalMethod => GetResourceString("BindCallToConditionalMethod"); internal static string BindToVoidMethodButExpectResult => GetResourceString("BindToVoidMethodButExpectResult"); internal static string EmptyDynamicView => GetResourceString("EmptyDynamicView"); internal static string GetValueonWriteOnlyProperty => GetResourceString("GetValueonWriteOnlyProperty"); internal static string BadBinaryOps => GetResourceString("BadBinaryOps"); internal static string BadIndexLHS => GetResourceString("BadIndexLHS"); internal static string BadIndexCount => GetResourceString("BadIndexCount"); internal static string BadUnaryOp => GetResourceString("BadUnaryOp"); internal static string NoImplicitConv => GetResourceString("NoImplicitConv"); internal static string NoExplicitConv => GetResourceString("NoExplicitConv"); internal static string ConstOutOfRange => GetResourceString("ConstOutOfRange"); internal static string AmbigBinaryOps => GetResourceString("AmbigBinaryOps"); internal static string AmbigUnaryOp => GetResourceString("AmbigUnaryOp"); internal static string ValueCantBeNull => GetResourceString("ValueCantBeNull"); internal static string NoSuchMember => GetResourceString("NoSuchMember"); internal static string ObjectRequired => GetResourceString("ObjectRequired"); internal static string AmbigCall => GetResourceString("AmbigCall"); internal static string BadAccess => GetResourceString("BadAccess"); internal static string AssgLvalueExpected => GetResourceString("AssgLvalueExpected"); internal static string NoConstructors => GetResourceString("NoConstructors"); internal static string PropertyLacksGet => GetResourceString("PropertyLacksGet"); internal static string ObjectProhibited => GetResourceString("ObjectProhibited"); internal static string AssgReadonly => GetResourceString("AssgReadonly"); internal static string AssgReadonlyStatic => GetResourceString("AssgReadonlyStatic"); internal static string AssgReadonlyProp => GetResourceString("AssgReadonlyProp"); internal static string UnsafeNeeded => GetResourceString("UnsafeNeeded"); internal static string BadBoolOp => GetResourceString("BadBoolOp"); internal static string MustHaveOpTF => GetResourceString("MustHaveOpTF"); internal static string ConstOutOfRangeChecked => GetResourceString("ConstOutOfRangeChecked"); internal static string AmbigMember => GetResourceString("AmbigMember"); internal static string NoImplicitConvCast => GetResourceString("NoImplicitConvCast"); internal static string InaccessibleGetter => GetResourceString("InaccessibleGetter"); internal static string InaccessibleSetter => GetResourceString("InaccessibleSetter"); internal static string BadArity => GetResourceString("BadArity"); internal static string TypeArgsNotAllowed => GetResourceString("TypeArgsNotAllowed"); internal static string HasNoTypeVars => GetResourceString("HasNoTypeVars"); internal static string NewConstraintNotSatisfied => GetResourceString("NewConstraintNotSatisfied"); internal static string GenericConstraintNotSatisfiedRefType => GetResourceString("GenericConstraintNotSatisfiedRefType"); internal static string GenericConstraintNotSatisfiedNullableEnum => GetResourceString("GenericConstraintNotSatisfiedNullableEnum"); internal static string GenericConstraintNotSatisfiedNullableInterface => GetResourceString("GenericConstraintNotSatisfiedNullableInterface"); internal static string GenericConstraintNotSatisfiedValType => GetResourceString("GenericConstraintNotSatisfiedValType"); internal static string CantInferMethTypeArgs => GetResourceString("CantInferMethTypeArgs"); internal static string RefConstraintNotSatisfied => GetResourceString("RefConstraintNotSatisfied"); internal static string ValConstraintNotSatisfied => GetResourceString("ValConstraintNotSatisfied"); internal static string AmbigUDConv => GetResourceString("AmbigUDConv"); internal static string BindToBogus => GetResourceString("BindToBogus"); internal static string CantCallSpecialMethod => GetResourceString("CantCallSpecialMethod"); internal static string ConvertToStaticClass => GetResourceString("ConvertToStaticClass"); internal static string IncrementLvalueExpected => GetResourceString("IncrementLvalueExpected"); internal static string BadArgCount => GetResourceString("BadArgCount"); internal static string BadArgTypes => GetResourceString("BadArgTypes"); internal static string BadProtectedAccess => GetResourceString("BadProtectedAccess"); internal static string BindToBogusProp2 => GetResourceString("BindToBogusProp2"); internal static string BindToBogusProp1 => GetResourceString("BindToBogusProp1"); internal static string BadDelArgCount => GetResourceString("BadDelArgCount"); internal static string BadDelArgTypes => GetResourceString("BadDelArgTypes"); internal static string BadCtorArgCount => GetResourceString("BadCtorArgCount"); internal static string NonInvocableMemberCalled => GetResourceString("NonInvocableMemberCalled"); internal static string BadNamedArgument => GetResourceString("BadNamedArgument"); internal static string BadNamedArgumentForDelegateInvoke => GetResourceString("BadNamedArgumentForDelegateInvoke"); internal static string DuplicateNamedArgument => GetResourceString("DuplicateNamedArgument"); internal static string NamedArgumentUsedInPositional => GetResourceString("NamedArgumentUsedInPositional"); internal static string TypeArgumentRequiredForStaticCall => GetResourceString("TypeArgumentRequiredForStaticCall"); internal static string DynamicArgumentNeedsValue => GetResourceString("DynamicArgumentNeedsValue"); internal static string BadNonTrailingNamedArgument => GetResourceString("BadNonTrailingNamedArgument"); [MethodImpl(MethodImplOptions.NoInlining)] private static bool UsingResourceKeys() { return false; } internal static string GetResourceString(string resourceKey, string defaultString = null) { if (UsingResourceKeys()) { return defaultString ?? resourceKey; } string text = null; try { text = ResourceManager.GetString(resourceKey); } catch (MissingManifestResourceException) { } if (defaultString != null && resourceKey.Equals(text)) { return defaultString; } return text; } internal static string Format(string resourceFormat, object p1) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1); } return string.Format(resourceFormat, p1); } } } namespace System.Numerics.Hashing { internal static class HashHelpers { public static readonly int RandomSeed = new Random().Next(int.MinValue, int.MaxValue); public static int Combine(int h1, int h2) { uint num = (uint)(h1 << 5) | ((uint)h1 >> 27); return ((int)num + h1) ^ h2; } } } namespace Microsoft.CSharp.RuntimeBinder { internal readonly struct ArgumentObject { internal readonly object Value; internal readonly CSharpArgumentInfo Info; internal readonly Type Type; public ArgumentObject(object value, CSharpArgumentInfo info, Type type) { Value = value; Info = info; Type = type; } } [EditorBrowsable(EditorBrowsableState.Never)] public static class Binder { public static CallSiteBinder BinaryOperation(CSharpBinderFlags flags, ExpressionType operation, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool isChecked = (flags & CSharpBinderFlags.CheckedContext) != 0; bool flag = (flags & CSharpBinderFlags.BinaryOperationLogical) != 0; CSharpBinaryOperationFlags cSharpBinaryOperationFlags = CSharpBinaryOperationFlags.None; if (flag) { cSharpBinaryOperationFlags |= CSharpBinaryOperationFlags.LogicalOperation; } return new CSharpBinaryOperationBinder(operation, isChecked, cSharpBinaryOperationFlags, context, argumentInfo).TryGetExisting(); } public static CallSiteBinder Convert(CSharpBinderFlags flags, Type type, Type context) { CSharpConversionKind conversionKind = (((flags & CSharpBinderFlags.ConvertExplicit) != 0) ? CSharpConversionKind.ExplicitConversion : (((flags & CSharpBinderFlags.ConvertArrayIndex) != 0) ? CSharpConversionKind.ArrayCreationConversion : CSharpConversionKind.ImplicitConversion)); bool isChecked = (flags & CSharpBinderFlags.CheckedContext) != 0; return new CSharpConvertBinder(type, conversionKind, isChecked, context).TryGetExisting(); } public static CallSiteBinder GetIndex(CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { return new CSharpGetIndexBinder(context, argumentInfo).TryGetExisting(); } public static CallSiteBinder GetMember(CSharpBinderFlags flags, string name, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool resultIndexed = (flags & CSharpBinderFlags.ResultIndexed) != 0; return new CSharpGetMemberBinder(name, resultIndexed, context, argumentInfo).TryGetExisting(); } public static CallSiteBinder Invoke(CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool flag = (flags & CSharpBinderFlags.ResultDiscarded) != 0; CSharpCallFlags cSharpCallFlags = CSharpCallFlags.None; if (flag) { cSharpCallFlags |= CSharpCallFlags.ResultDiscarded; } return new CSharpInvokeBinder(cSharpCallFlags, context, argumentInfo).TryGetExisting(); } public static CallSiteBinder InvokeMember(CSharpBinderFlags flags, string name, IEnumerable<Type> typeArguments, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool flag = (flags & CSharpBinderFlags.InvokeSimpleName) != 0; bool flag2 = (flags & CSharpBinderFlags.InvokeSpecialName) != 0; bool flag3 = (flags & CSharpBinderFlags.ResultDiscarded) != 0; CSharpCallFlags cSharpCallFlags = CSharpCallFlags.None; if (flag) { cSharpCallFlags |= CSharpCallFlags.SimpleNameCall; } if (flag2) { cSharpCallFlags |= CSharpCallFlags.EventHookup; } if (flag3) { cSharpCallFlags |= CSharpCallFlags.ResultDiscarded; } return new CSharpInvokeMemberBinder(cSharpCallFlags, name, context, typeArguments, argumentInfo).TryGetExisting(); } public static CallSiteBinder InvokeConstructor(CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { return new CSharpInvokeConstructorBinder(CSharpCallFlags.None, context, argumentInfo).TryGetExisting(); } public static CallSiteBinder IsEvent(CSharpBinderFlags flags, string name, Type context) { return new CSharpIsEventBinder(name, context).TryGetExisting(); } public static CallSiteBinder SetIndex(CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool isCompoundAssignment = (flags & CSharpBinderFlags.ValueFromCompoundAssignment) != 0; bool isChecked = (flags & CSharpBinderFlags.CheckedContext) != 0; return new CSharpSetIndexBinder(isCompoundAssignment, isChecked, context, argumentInfo).TryGetExisting(); } public static CallSiteBinder SetMember(CSharpBinderFlags flags, string name, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool isCompoundAssignment = (flags & CSharpBinderFlags.ValueFromCompoundAssignment) != 0; bool isChecked = (flags & CSharpBinderFlags.CheckedContext) != 0; return new CSharpSetMemberBinder(name, isCompoundAssignment, isChecked, context, argumentInfo).TryGetExisting(); } public static CallSiteBinder UnaryOperation(CSharpBinderFlags flags, ExpressionType operation, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo) { bool isChecked = (flags & CSharpBinderFlags.CheckedContext) != 0; return new CSharpUnaryOperationBinder(operation, isChecked, context, argumentInfo).TryGetExisting(); } } internal static class BinderEquivalence { internal class BinderEqualityComparer : IEqualityComparer<ICSharpBinder> { public bool Equals(ICSharpBinder x, ICSharpBinder y) { return x.IsEquivalentTo(y); } public int GetHashCode(ICSharpBinder obj) { return obj.GetGetBinderEquivalenceHash(); } } private static int cachedBinderCount; private static readonly ConcurrentDictionary<ICSharpBinder, ICSharpBinder> binderEquivalenceCache = new ConcurrentDictionary<ICSharpBinder, ICSharpBinder>(2, 32, new BinderEqualityComparer()); internal static T TryGetExisting<T>(this T binder) where T : ICSharpBinder { ICSharpBinder orAdd = binderEquivalenceCache.GetOrAdd(binder, binder); if (orAdd == (object)binder) { int num = Interlocked.Increment(ref cachedBinderCount); if ((uint)num > 4096u) { binderEquivalenceCache.Clear(); cachedBinderCount = 0; } } return (T)orAdd; } } internal static class BinderHelper { private static MethodInfo s_DoubleIsNaN; private static MethodInfo s_SingleIsNaN; internal static DynamicMetaObject Bind(ICSharpBinder action, RuntimeBinder binder, DynamicMetaObject[] args, IEnumerable<CSharpArgumentInfo> arginfos, DynamicMetaObject onBindingError) { Expression[] array = new Expression[args.Length]; BindingRestrictions bindingRestrictions = BindingRestrictions.Empty; ICSharpInvokeOrInvokeMemberBinder callPayload = action as ICSharpInvokeOrInvokeMemberBinder; ParameterExpression parameterExpression = null; IEnumerator<CSharpArgumentInfo> enumerator = (arginfos ?? Array.Empty<CSharpArgumentInfo>()).GetEnumerator(); for (int i = 0; i < args.Length; i++) { DynamicMetaObject dynamicMetaObject = args[i]; CSharpArgumentInfo cSharpArgumentInfo = (enumerator.MoveNext() ? enumerator.Current : null); if (i == 0 && IsIncrementOrDecrementActionOnLocal(action)) { object value = dynamicMetaObject.Value; parameterExpression = (ParameterExpression)(array[0] = Expression.Variable((value != null) ? value.GetType() : typeof(object), "t0")); } else { array[i] = dynamicMetaObject.Expression; } BindingRestrictions restrictions = DeduceArgumentRestriction(i, callPayload, dynamicMetaObject, cSharpArgumentInfo); bindingRestrictions = bindingRestrictions.Merge(restrictions); if (cSharpArgumentInfo != null && cSharpArgumentInfo.LiteralConstant) { if (dynamicMetaObject.Value is double && double.IsNaN((double)dynamicMetaObject.Value)) { MethodInfo method = s_DoubleIsNaN ?? (s_DoubleIsNaN = typeof(double).GetMethod("IsNaN")); Expression expression = Expression.Call(null, method, dynamicMetaObject.Expression); bindingRestrictions = bindingRestrictions.Merge(BindingRestrictions.GetExpressionRestriction(expression)); } else if (dynamicMetaObject.Value is float && float.IsNaN((float)dynamicMetaObject.Value)) { MethodInfo method2 = s_SingleIsNaN ?? (s_SingleIsNaN = typeof(float).GetMethod("IsNaN")); Expression expression2 = Expression.Call(null, method2, dynamicMetaObject.Expression); bindingRestrictions = bindingRestrictions.Merge(BindingRestrictions.GetExpressionRestriction(expression2)); } else { Expression expression3 = Expression.Equal(dynamicMetaObject.Expression, Expression.Constant(dynamicMetaObject.Value, dynamicMetaObject.Expression.Type)); restrictions = BindingRestrictions.GetExpressionRestriction(expression3); bindingRestrictions = bindingRestrictions.Merge(restrictions); } } } try { Expression expression4 = binder.Bind(action, array, args, out var deferredBinding); if (deferredBinding != null) { expression4 = ConvertResult(deferredBinding.Expression, action); bindingRestrictions = deferredBinding.Restrictions.Merge(bindingRestrictions); return new DynamicMetaObject(expression4, bindingRestrictions); } if (parameterExpression != null) { DynamicMetaObject dynamicMetaObject2 = args[0]; expression4 = Expression.Block(new ParameterExpression[1] { parameterExpression }, Expression.Assign(parameterExpression, Expression.Convert(dynamicMetaObject2.Expression, dynamicMetaObject2.Value.GetType())), expression4, Expression.Assign(dynamicMetaObject2.Expression, Expression.Convert(parameterExpression, dynamicMetaObject2.Expression.Type))); } expression4 = ConvertResult(expression4, action); return new DynamicMetaObject(expression4, bindingRestrictions); } catch (RuntimeBinderException ex) { if (onBindingError != null) { return onBindingError; } return new DynamicMetaObject(Expression.Throw(Expression.New(typeof(RuntimeBinderException).GetConstructor(new Type[1] { typeof(string) }), Expression.Constant(ex.Message)), GetTypeForErrorMetaObject(action, args)), bindingRestrictions); } } public static void ValidateBindArgument(DynamicMetaObject argument, string paramName) { if (argument == null) { throw Error.ArgumentNull(paramName); } if (!argument.HasValue) { throw Error.DynamicArgumentNeedsValue(paramName); } } public static void ValidateBindArgument(DynamicMetaObject[] arguments, string paramName) { if (arguments != null) { for (int i = 0; i != arguments.Length; i++) { ValidateBindArgument(arguments[i], $"{paramName}[{i}]"); } } } private static bool IsTypeOfStaticCall(int parameterIndex, ICSharpInvokeOrInvokeMemberBinder callPayload) { if (parameterIndex == 0 && callPayload != null) { return callPayload.StaticCall; } return false; } private static bool IsComObject(object obj) { if (obj != null) { return Marshal.IsComObject(obj); } return false; } private static bool IsTransparentProxy(object obj) { return false; } private static bool IsDynamicallyTypedRuntimeProxy(DynamicMetaObject argument, CSharpArgumentInfo info) { return info != null && !info.UseCompileTimeType && (IsComObject(argument.Value) || IsTransparentProxy(argument.Value)); } private static BindingRestrictions DeduceArgumentRestriction(int parameterIndex, ICSharpInvokeOrInvokeMemberBinder callPayload, DynamicMetaObject argument, CSharpArgumentInfo info) { if (argument.Value != null && !IsTypeOfStaticCall(parameterIndex, callPayload) && !IsDynamicallyTypedRuntimeProxy(argument, info)) { return BindingRestrictions.GetTypeRestriction(argument.Expression, argument.RuntimeType); } return BindingRestrictions.GetInstanceRestriction(argument.Expression, argument.Value); } private static Expression ConvertResult(Expression binding, ICSharpBinder action) { if (action is CSharpInvokeConstructorBinder) { return binding; } if (binding.Type == typeof(void)) { if (action is ICSharpInvokeOrInvokeMemberBinder iCSharpInvokeOrInvokeMemberBinder && iCSharpInvokeOrInvokeMemberBinder.ResultDiscarded) { return Expression.Block(binding, Expression.Default(action.ReturnType)); } throw Error.BindToVoidMethodButExpectResult(); } if (binding.Type.IsValueType && !action.ReturnType.IsValueType) { return Expression.Convert(binding, action.ReturnType); } return binding; } private static Type GetTypeForErrorMetaObject(ICSharpBinder action, DynamicMetaObject[] args) { if (action is CSharpInvokeConstructorBinder) { return args[0].Value as Type; } return action.ReturnType; } private static bool IsIncrementOrDecrementActionOnLocal(ICSharpBinder action) { if (action is CSharpUnaryOperationBinder cSharpUnaryOperationBinder) { if (cSharpUnaryOperationBinder.Operation != ExpressionType.Increment) { return cSharpUnaryOperationBinder.Operation == ExpressionType.Decrement; } return true; } return false; } internal static T[] Cons<T>(T sourceHead, T[] sourceTail) { if (sourceTail == null || sourceTail.Length != 0) { T[] array = new T[sourceTail.Length + 1]; array[0] = sourceHead; sourceTail.CopyTo(array, 1); return array; } return new T[1] { sourceHead }; } internal static T[] Cons<T>(T sourceHead, T[] sourceMiddle, T sourceLast) { if (sourceMiddle == null || sourceMiddle.Length != 0) { T[] array = new T[sourceMiddle.Length + 2]; array[0] = sourceHead; array[^1] = sourceLast; sourceMiddle.CopyTo(array, 1); return array; } return new T[2] { sourceHead, sourceLast }; } internal static T[] ToArray<T>(IEnumerable<T> source) { if (source != null) { return source.ToArray(); } return Array.Empty<T>(); } internal static CallInfo CreateCallInfo(ref IEnumerable<CSharpArgumentInfo> argInfos, int discard) { int num = 0; List<string> list = new List<string>(); CSharpArgumentInfo[] array = (CSharpArgumentInfo[])(argInfos = ToArray(argInfos)); foreach (CSharpArgumentInfo cSharpArgumentInfo in array) { if (cSharpArgumentInfo.NamedArgument) { list.Add(cSharpArgumentInfo.Name); } num++; } return new CallInfo(num - discard, list); } internal static string GetCLROperatorName(this ExpressionType p) { return p switch { ExpressionType.Add => "op_Addition", ExpressionType.Subtract => "op_Subtraction", ExpressionType.Multiply => "op_Multiply", ExpressionType.Divide => "op_Division", ExpressionType.Modulo => "op_Modulus", ExpressionType.LeftShift => "op_LeftShift", ExpressionType.RightShift => "op_RightShift", ExpressionType.LessThan => "op_LessThan", ExpressionType.GreaterThan => "op_GreaterThan", ExpressionType.LessThanOrEqual => "op_LessThanOrEqual", ExpressionType.GreaterThanOrEqual => "op_GreaterThanOrEqual", ExpressionType.Equal => "op_Equality", ExpressionType.NotEqual => "op_Inequality", ExpressionType.And => "op_BitwiseAnd", ExpressionType.ExclusiveOr => "op_ExclusiveOr", ExpressionType.Or => "op_BitwiseOr", ExpressionType.AddAssign => "op_Addition", ExpressionType.SubtractAssign => "op_Subtraction", ExpressionType.MultiplyAssign => "op_Multiply", ExpressionType.DivideAssign => "op_Division", ExpressionType.ModuloAssign => "op_Modulus", ExpressionType.AndAssign => "op_BitwiseAnd", ExpressionType.ExclusiveOrAssign => "op_ExclusiveOr", ExpressionType.OrAssign => "op_BitwiseOr", ExpressionType.LeftShiftAssign => "op_LeftShift", ExpressionType.RightShiftAssign => "op_RightShift", ExpressionType.Negate => "op_UnaryNegation", ExpressionType.UnaryPlus => "op_UnaryPlus", ExpressionType.Not => "op_LogicalNot", ExpressionType.OnesComplement => "op_OnesComplement", ExpressionType.IsTrue => "op_True", ExpressionType.IsFalse => "op_False", ExpressionType.Increment => "op_Increment", ExpressionType.Decrement => "op_Decrement", _ => null, }; } internal static int AddArgHashes(int hash, Type[] typeArguments, CSharpArgumentInfo[] argInfos) { foreach (Type type in typeArguments) { hash = HashHelpers.Combine(hash, type.GetHashCode()); } return AddArgHashes(hash, argInfos); } internal static int AddArgHashes(int hash, CSharpArgumentInfo[] argInfos) { foreach (CSharpArgumentInfo cSharpArgumentInfo in argInfos) { hash = HashHelpers.Combine(hash, (int)cSharpArgumentInfo.Flags); string name = cSharpArgumentInfo.Name; if (!string.IsNullOrEmpty(name)) { hash = HashHelpers.Combine(hash, name.GetHashCode()); } } return hash; } internal static bool CompareArgInfos(Type[] typeArgs, Type[] otherTypeArgs, CSharpArgumentInfo[] argInfos, CSharpArgumentInfo[] otherArgInfos) { for (int i = 0; i < typeArgs.Length; i++) { if (typeArgs[i] != otherTypeArgs[i]) { return false; } } return CompareArgInfos(argInfos, otherArgInfos); } internal static bool CompareArgInfos(CSharpArgumentInfo[] argInfos, CSharpArgumentInfo[] otherArgInfos) { for (int i = 0; i < argInfos.Length; i++) { CSharpArgumentInfo cSharpArgumentInfo = argInfos[i]; CSharpArgumentInfo cSharpArgumentInfo2 = otherArgInfos[i]; if (cSharpArgumentInfo.Flags != cSharpArgumentInfo2.Flags || cSharpArgumentInfo.Name != cSharpArgumentInfo2.Name) { return false; } } return true; } } [EditorBrowsable(EditorBrowsableState.Never)] public sealed class CSharpArgumentInfo { internal static readonly CSharpArgumentInfo None = new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null); internal CSharpArgumentInfoFlags Flags { get; } internal string Name { get; } internal bool UseCompileTimeType => (Flags & CSharpArgumentInfoFlags.UseCompileTimeType) != 0; internal bool LiteralConstant => (Flags & CSharpArgumentInfoFlags.Constant) != 0; internal bool NamedArgument => (Flags & CSharpArgumentInfoFlags.NamedArgument) != 0; internal bool IsByRefOrOut => (Flags & (CSharpArgumentInfoFlags.IsRef | CSharpArgumentInfoFlags.IsOut)) != 0; internal bool IsOut => (Flags & CSharpArgumentInfoFlags.IsOut) != 0; internal bool IsStaticType => (Flags & CSharpArgumentInfoFlags.IsStaticType) != 0; private CSharpArgumentInfo(CSharpArgumentInfoFlags flags, string name) { Flags = flags; Name = name; } public static CSharpArgumentInfo Create(CSharpArgumentInfoFlags flags, string name) { return new CSharpArgumentInfo(flags, name); } } [EditorBrowsable(EditorBrowsableState.Never)] [Flags] public enum CSharpArgumentInfoFlags { None = 0, UseCompileTimeType = 1, Constant = 2, NamedArgument = 4, IsRef = 8, IsOut = 0x10, IsStaticType = 0x20 } internal sealed class CSharpBinaryOperationBinder : BinaryOperationBinder, ICSharpBinder { private readonly CSharpBinaryOperationFlags _binopFlags; private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; [ExcludeFromCodeCoverage] public string Name => null; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => false; internal bool IsLogicalOperation => (_binopFlags & CSharpBinaryOperationFlags.LogicalOperation) != 0; private bool IsChecked => _binder.IsChecked; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.BindBinaryOperation(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { string cLROperatorName = base.Operation.GetCLROperatorName(); SymbolTable.PopulateSymbolTableWithName(cLROperatorName, null, arguments[0].Type); SymbolTable.PopulateSymbolTableWithName(cLROperatorName, null, arguments[1].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpBinaryOperationBinder(ExpressionType operation, bool isChecked, CSharpBinaryOperationFlags binaryOperationFlags, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(operation) { _binopFlags = binaryOperationFlags; _callingContext = callingContext; _argumentInfo = BinderHelper.ToArray(argumentInfo); _binder = new RuntimeBinder(callingContext, isChecked); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; h = HashHelpers.Combine(h, (int)_binopFlags); if (IsChecked) { h = HashHelpers.Combine(h, 1); } h = HashHelpers.Combine(h, (int)base.Operation); return BinderHelper.AddArgHashes(h, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpBinaryOperationBinder cSharpBinaryOperationBinder)) { return false; } if (_binopFlags != cSharpBinaryOperationBinder._binopFlags || base.Operation != cSharpBinaryOperationBinder.Operation || IsChecked != cSharpBinaryOperationBinder.IsChecked || _callingContext != cSharpBinaryOperationBinder._callingContext) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpBinaryOperationBinder._argumentInfo); } public override DynamicMetaObject FallbackBinaryOperation(DynamicMetaObject target, DynamicMetaObject arg, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(arg, "arg"); return BinderHelper.Bind(this, _binder, new DynamicMetaObject[2] { target, arg }, _argumentInfo, errorSuggestion); } } [Flags] internal enum CSharpBinaryOperationFlags { None = 0, MemberAccess = 1, LogicalOperation = 2 } [Flags] [EditorBrowsable(EditorBrowsableState.Never)] public enum CSharpBinderFlags { None = 0, CheckedContext = 1, InvokeSimpleName = 2, InvokeSpecialName = 4, BinaryOperationLogical = 8, ConvertExplicit = 0x10, ConvertArrayIndex = 0x20, ResultIndexed = 0x40, ValueFromCompoundAssignment = 0x80, ResultDiscarded = 0x100 } [Flags] internal enum CSharpCallFlags { None = 0, SimpleNameCall = 1, EventHookup = 2, ResultDiscarded = 4 } internal enum CSharpConversionKind { ImplicitConversion, ExplicitConversion, ArrayCreationConversion } internal sealed class CSharpConvertBinder : ConvertBinder, ICSharpBinder { private readonly RuntimeBinder _binder; private readonly Type _callingContext; [ExcludeFromCodeCoverage] public string Name => null; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => false; private CSharpConversionKind ConversionKind { get; } private bool IsChecked => _binder.IsChecked; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { if (!base.Explicit) { return runtimeBinder.BindImplicitConversion(arguments, base.Type, locals, ConversionKind == CSharpConversionKind.ArrayCreationConversion); } return runtimeBinder.BindExplicitConversion(arguments, base.Type, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return CSharpArgumentInfo.None; } public CSharpConvertBinder(Type type, CSharpConversionKind conversionKind, bool isChecked, Type callingContext) : base(type, conversionKind == CSharpConversionKind.ExplicitConversion) { ConversionKind = conversionKind; _callingContext = callingContext; _binder = new RuntimeBinder(callingContext, isChecked); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; h = HashHelpers.Combine(h, (int)ConversionKind); if (IsChecked) { h = HashHelpers.Combine(h, 1); } return HashHelpers.Combine(h, base.Type.GetHashCode()); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpConvertBinder cSharpConvertBinder)) { return false; } if (ConversionKind != cSharpConvertBinder.ConversionKind || IsChecked != cSharpConvertBinder.IsChecked || _callingContext != cSharpConvertBinder._callingContext || base.Type != cSharpConvertBinder.Type) { return false; } return true; } public override DynamicMetaObject FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); return BinderHelper.Bind(this, _binder, new DynamicMetaObject[1] { target }, null, errorSuggestion); } } internal sealed class CSharpGetIndexBinder : GetIndexBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; public string Name => "$Item$"; public BindingFlag BindingFlags => BindingFlag.BIND_RVALUEREQUIRED; public bool IsBinderThatCanHaveRefReceiver => true; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { Expr optionalIndexerArguments = runtimeBinder.CreateArgumentListEXPR(arguments, locals, 1, arguments.Length); return runtimeBinder.BindProperty(this, arguments[0], locals[0], optionalIndexerArguments); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { SymbolTable.PopulateSymbolTableWithName("$Item$", null, arguments[0].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpGetIndexBinder(Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(BinderHelper.CreateCallInfo(ref argumentInfo, 1)) { _argumentInfo = argumentInfo as CSharpArgumentInfo[]; _callingContext = callingContext; _binder = new RuntimeBinder(callingContext); } public int GetGetBinderEquivalenceHash() { int hash = _callingContext?.GetHashCode() ?? 0; return BinderHelper.AddArgHashes(hash, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpGetIndexBinder cSharpGetIndexBinder)) { return false; } if (_callingContext != cSharpGetIndexBinder._callingContext || _argumentInfo.Length != cSharpGetIndexBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpGetIndexBinder._argumentInfo); } public override DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(indexes, "indexes"); return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, indexes), _argumentInfo, errorSuggestion); } } internal sealed class CSharpGetMemberBinder : GetMemberBinder, IInvokeOnGetBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; public BindingFlag BindingFlags => BindingFlag.BIND_RVALUEREQUIRED; public bool IsBinderThatCanHaveRefReceiver => false; bool IInvokeOnGetBinder.InvokeOnGet => !ResultIndexed; private bool ResultIndexed { get; } public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.BindProperty(this, arguments[0], locals[0], null); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { SymbolTable.PopulateSymbolTableWithName(base.Name, null, arguments[0].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpGetMemberBinder(string name, bool resultIndexed, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(name, ignoreCase: false) { ResultIndexed = resultIndexed; _argumentInfo = BinderHelper.ToArray(argumentInfo); _callingContext = callingContext; _binder = new RuntimeBinder(callingContext); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; if (ResultIndexed) { h = HashHelpers.Combine(h, 1); } h = HashHelpers.Combine(h, base.Name.GetHashCode()); return BinderHelper.AddArgHashes(h, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpGetMemberBinder cSharpGetMemberBinder)) { return false; } if (base.Name != cSharpGetMemberBinder.Name || ResultIndexed != cSharpGetMemberBinder.ResultIndexed || _callingContext != cSharpGetMemberBinder._callingContext || _argumentInfo.Length != cSharpGetMemberBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpGetMemberBinder._argumentInfo); } public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); return BinderHelper.Bind(this, _binder, new DynamicMetaObject[1] { target }, _argumentInfo, errorSuggestion); } [SpecialName] string ICSharpBinder.get_Name() { return base.Name; } } internal sealed class CSharpInvokeBinder : InvokeBinder, ICSharpInvokeOrInvokeMemberBinder, ICSharpBinder { private readonly CSharpCallFlags _flags; private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => true; bool ICSharpInvokeOrInvokeMemberBinder.StaticCall { get { if (_argumentInfo[0] != null) { return _argumentInfo[0].IsStaticType; } return false; } } string ICSharpBinder.Name => "Invoke"; Type[] ICSharpInvokeOrInvokeMemberBinder.TypeArguments => Array.Empty<Type>(); CSharpCallFlags ICSharpInvokeOrInvokeMemberBinder.Flags => _flags; bool ICSharpInvokeOrInvokeMemberBinder.ResultDiscarded => (_flags & CSharpCallFlags.ResultDiscarded) != 0; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.DispatchPayload(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { RuntimeBinder.PopulateSymbolTableWithPayloadInformation(this, callingType, arguments); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpInvokeBinder(CSharpCallFlags flags, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(BinderHelper.CreateCallInfo(ref argumentInfo, 1)) { _flags = flags; _callingContext = callingContext; _argumentInfo = argumentInfo as CSharpArgumentInfo[]; _binder = new RuntimeBinder(callingContext); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; h = HashHelpers.Combine(h, (int)_flags); return BinderHelper.AddArgHashes(h, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpInvokeBinder cSharpInvokeBinder)) { return false; } if (_flags != cSharpInvokeBinder._flags || _callingContext != cSharpInvokeBinder._callingContext || _argumentInfo.Length != cSharpInvokeBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpInvokeBinder._argumentInfo); } public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(args, "args"); return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, args), _argumentInfo, errorSuggestion); } } internal sealed class CSharpInvokeConstructorBinder : DynamicMetaObjectBinder, ICSharpInvokeOrInvokeMemberBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => true; public CSharpCallFlags Flags { get; } public bool StaticCall => true; public Type[] TypeArguments => Array.Empty<Type>(); public string Name => ".ctor"; bool ICSharpInvokeOrInvokeMemberBinder.ResultDiscarded => false; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.DispatchPayload(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { RuntimeBinder.PopulateSymbolTableWithPayloadInformation(this, callingType, arguments); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpInvokeConstructorBinder(CSharpCallFlags flags, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) { Flags = flags; _callingContext = callingContext; _argumentInfo = BinderHelper.ToArray(argumentInfo); _binder = new RuntimeBinder(callingContext); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; h = HashHelpers.Combine(h, (int)Flags); h = HashHelpers.Combine(h, Name.GetHashCode()); return BinderHelper.AddArgHashes(h, TypeArguments, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpInvokeConstructorBinder cSharpInvokeConstructorBinder)) { return false; } if (Flags != cSharpInvokeConstructorBinder.Flags || _callingContext != cSharpInvokeConstructorBinder._callingContext || Name != cSharpInvokeConstructorBinder.Name || TypeArguments.Length != cSharpInvokeConstructorBinder.TypeArguments.Length || _argumentInfo.Length != cSharpInvokeConstructorBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(TypeArguments, cSharpInvokeConstructorBinder.TypeArguments, _argumentInfo, cSharpInvokeConstructorBinder._argumentInfo); } public override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(args, "args"); return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, args), _argumentInfo, null); } } internal sealed class CSharpInvokeMemberBinder : InvokeMemberBinder, ICSharpInvokeOrInvokeMemberBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => true; bool ICSharpInvokeOrInvokeMemberBinder.StaticCall => _argumentInfo[0]?.IsStaticType ?? false; public CSharpCallFlags Flags { get; } public Type CallingContext { get; } public Type[] TypeArguments { get; } bool ICSharpInvokeOrInvokeMemberBinder.ResultDiscarded => (Flags & CSharpCallFlags.ResultDiscarded) != 0; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.DispatchPayload(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { RuntimeBinder.PopulateSymbolTableWithPayloadInformation(this, callingType, arguments); } public CSharpArgumentInfo GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpArgumentInfo[] ArgumentInfoArray() { CSharpArgumentInfo[] array = new CSharpArgumentInfo[_argumentInfo.Length]; _argumentInfo.CopyTo(array, 0); return array; } public CSharpInvokeMemberBinder(CSharpCallFlags flags, string name, Type callingContext, IEnumerable<Type> typeArguments, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(name, ignoreCase: false, BinderHelper.CreateCallInfo(ref argumentInfo, 1)) { Flags = flags; CallingContext = callingContext; TypeArguments = BinderHelper.ToArray(typeArguments); _argumentInfo = BinderHelper.ToArray(argumentInfo); _binder = new RuntimeBinder(callingContext); } public int GetGetBinderEquivalenceHash() { int h = CallingContext?.GetHashCode() ?? 0; h = HashHelpers.Combine(h, (int)Flags); h = HashHelpers.Combine(h, base.Name.GetHashCode()); return BinderHelper.AddArgHashes(h, TypeArguments, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpInvokeMemberBinder cSharpInvokeMemberBinder)) { return false; } if (Flags != cSharpInvokeMemberBinder.Flags || CallingContext != cSharpInvokeMemberBinder.CallingContext || base.Name != cSharpInvokeMemberBinder.Name || TypeArguments.Length != cSharpInvokeMemberBinder.TypeArguments.Length || _argumentInfo.Length != cSharpInvokeMemberBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(TypeArguments, cSharpInvokeMemberBinder.TypeArguments, _argumentInfo, cSharpInvokeMemberBinder._argumentInfo); } public override DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(args, "args"); return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, args), _argumentInfo, errorSuggestion); } public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { CSharpInvokeBinder cSharpInvokeBinder = new CSharpInvokeBinder(Flags, CallingContext, _argumentInfo).TryGetExisting(); return cSharpInvokeBinder.Defer(target, args); } [SpecialName] string ICSharpBinder.get_Name() { return base.Name; } } internal sealed class CSharpIsEventBinder : DynamicMetaObjectBinder, ICSharpBinder { private readonly RuntimeBinder _binder; private readonly Type _callingContext; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => false; public string Name { get; } public override Type ReturnType => typeof(bool); public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.BindIsEvent(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { SymbolTable.PopulateSymbolTableWithName(Name, null, arguments[0].Info.IsStaticType ? (arguments[0].Value as Type) : arguments[0].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return CSharpArgumentInfo.None; } public CSharpIsEventBinder(string name, Type callingContext) { Name = name; _callingContext = callingContext; _binder = new RuntimeBinder(callingContext); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; return HashHelpers.Combine(h, Name.GetHashCode()); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpIsEventBinder cSharpIsEventBinder)) { return false; } if (_callingContext != cSharpIsEventBinder._callingContext || Name != cSharpIsEventBinder.Name) { return false; } return true; } public override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { BinderHelper.ValidateBindArgument(target, "target"); return BinderHelper.Bind(this, _binder, new DynamicMetaObject[1] { target }, null, null); } } internal sealed class CSharpSetIndexBinder : SetIndexBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; public string Name => "$Item$"; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => true; internal bool IsCompoundAssignment { get; } private bool IsChecked => _binder.IsChecked; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.BindAssignment(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { SymbolTable.PopulateSymbolTableWithName("$Item$", null, arguments[0].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpSetIndexBinder(bool isCompoundAssignment, bool isChecked, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(BinderHelper.CreateCallInfo(ref argumentInfo, 2)) { IsCompoundAssignment = isCompoundAssignment; _argumentInfo = argumentInfo as CSharpArgumentInfo[]; _callingContext = callingContext; _binder = new RuntimeBinder(callingContext, isChecked); } public int GetGetBinderEquivalenceHash() { int num = _callingContext?.GetHashCode() ?? 0; if (IsChecked) { num = HashHelpers.Combine(num, 1); } if (IsCompoundAssignment) { num = HashHelpers.Combine(num, 1); } return BinderHelper.AddArgHashes(num, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpSetIndexBinder cSharpSetIndexBinder)) { return false; } if (_callingContext != cSharpSetIndexBinder._callingContext || IsChecked != cSharpSetIndexBinder.IsChecked || IsCompoundAssignment != cSharpSetIndexBinder.IsCompoundAssignment || _argumentInfo.Length != cSharpSetIndexBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpSetIndexBinder._argumentInfo); } public override DynamicMetaObject FallbackSetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(indexes, "indexes"); BinderHelper.ValidateBindArgument(value, "value"); return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, indexes, value), _argumentInfo, errorSuggestion); } } internal sealed class CSharpSetMemberBinder : SetMemberBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => false; internal bool IsCompoundAssignment { get; } private bool IsChecked => _binder.IsChecked; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.BindAssignment(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { SymbolTable.PopulateSymbolTableWithName(base.Name, null, arguments[0].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpSetMemberBinder(string name, bool isCompoundAssignment, bool isChecked, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(name, ignoreCase: false) { IsCompoundAssignment = isCompoundAssignment; _argumentInfo = BinderHelper.ToArray(argumentInfo); _callingContext = callingContext; _binder = new RuntimeBinder(callingContext, isChecked); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; if (IsChecked) { h = HashHelpers.Combine(h, 1); } if (IsCompoundAssignment) { h = HashHelpers.Combine(h, 1); } h = HashHelpers.Combine(h, base.Name.GetHashCode()); return BinderHelper.AddArgHashes(h, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpSetMemberBinder cSharpSetMemberBinder)) { return false; } if (base.Name != cSharpSetMemberBinder.Name || _callingContext != cSharpSetMemberBinder._callingContext || IsChecked != cSharpSetMemberBinder.IsChecked || IsCompoundAssignment != cSharpSetMemberBinder.IsCompoundAssignment || _argumentInfo.Length != cSharpSetMemberBinder._argumentInfo.Length) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpSetMemberBinder._argumentInfo); } public override DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); BinderHelper.ValidateBindArgument(value, "value"); return BinderHelper.Bind(this, _binder, new DynamicMetaObject[2] { target, value }, _argumentInfo, errorSuggestion); } [SpecialName] string ICSharpBinder.get_Name() { return base.Name; } } internal sealed class CSharpUnaryOperationBinder : UnaryOperationBinder, ICSharpBinder { private readonly CSharpArgumentInfo[] _argumentInfo; private readonly RuntimeBinder _binder; private readonly Type _callingContext; [ExcludeFromCodeCoverage] public string Name => null; public BindingFlag BindingFlags => (BindingFlag)0; public bool IsBinderThatCanHaveRefReceiver => false; private bool IsChecked => _binder.IsChecked; public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return runtimeBinder.BindUnaryOperation(this, arguments, locals); } public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments) { SymbolTable.PopulateSymbolTableWithName(base.Operation.GetCLROperatorName(), null, arguments[0].Type); } CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index) { return _argumentInfo[index]; } public CSharpUnaryOperationBinder(ExpressionType operation, bool isChecked, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo) : base(operation) { _argumentInfo = BinderHelper.ToArray(argumentInfo); _callingContext = callingContext; _binder = new RuntimeBinder(callingContext, isChecked); } public int GetGetBinderEquivalenceHash() { int h = _callingContext?.GetHashCode() ?? 0; h = HashHelpers.Combine(h, (int)base.Operation); if (IsChecked) { h = HashHelpers.Combine(h, 1); } return BinderHelper.AddArgHashes(h, _argumentInfo); } public bool IsEquivalentTo(ICSharpBinder other) { if (!(other is CSharpUnaryOperationBinder cSharpUnaryOperationBinder)) { return false; } if (base.Operation != cSharpUnaryOperationBinder.Operation || IsChecked != cSharpUnaryOperationBinder.IsChecked || _callingContext != cSharpUnaryOperationBinder._callingContext) { return false; } return BinderHelper.CompareArgInfos(_argumentInfo, cSharpUnaryOperationBinder._argumentInfo); } public override DynamicMetaObject FallbackUnaryOperation(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { BinderHelper.ValidateBindArgument(target, "target"); return BinderHelper.Bind(this, _binder, new DynamicMetaObject[1] { target }, _argumentInfo, errorSuggestion); } } [Serializable] [EditorBrowsable(EditorBrowsableState.Never)] internal sealed class DynamicBindingFailedException : Exception { public DynamicBindingFailedException() { } private DynamicBindingFailedException(SerializationInfo info, StreamingContext context) : base(info, context) { } } internal sealed class GetMemberValueBinder : GetMemberBinder { public GetMemberValueBinder(string name, bool ignoreCase) : base(name, ignoreCase) { } public override DynamicMetaObject FallbackGetMember(DynamicMetaObject self, DynamicMetaObject onBindingError) { if (onBindingError == null) { List<DynamicMetaObject> contributingObjects = new List<DynamicMetaObject> { self }; return new DynamicMetaObject(Expression.Throw(Expression.Constant(new DynamicBindingFailedException(), typeof(Exception)), typeof(object)), BindingRestrictions.Combine(contributingObjects)); } return onBindingError; } } internal sealed class DynamicMetaObjectProviderDebugView { [DebuggerDisplay("{value}", Name = "{name, nq}", Type = "{type, nq}")] internal class DynamicProperty { [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly string name; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly object value; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly string type; public DynamicProperty(string name, object value) { this.name = name; this.value = value; type = ((value == null) ? "<null>" : value.GetType().ToString()); } } [Serializable] internal class DynamicDebugViewEmptyException : Exception { public string Empty => System.SR.EmptyDynamicView; public DynamicDebugViewEmptyException() { } protected DynamicDebugViewEmptyException(SerializationInfo info, StreamingContext context) : base(info, context) { } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] private IList<KeyValuePair<string, object>> results; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private object obj; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private static readonly ParameterExpression parameter = Expression.Parameter(typeof(object), "debug"); [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] internal DynamicProperty[] Items { get { if (results == null || results.Count == 0) { results = QueryDynamicObject(obj); if (results == null || results.Count == 0) { throw new DynamicDebugViewEmptyException(); } } DynamicProperty[] array = new DynamicProperty[results.Count]; for (int i = 0; i < results.Count; i++) { array[i] = new DynamicProperty(results[i].Key, results[i].Value); } return array; } } public DynamicMetaObjectProviderDebugView(object arg) { obj = arg; } public static object TryEvalBinaryOperators<T1, T2>(T1 arg1, T2 arg2, CSharpArgumentInfoFlags arg1Flags, CSharpArgumentInfoFlags arg2Flags, ExpressionType opKind, Type accessibilityContext) { CSharpArgumentInfo cSharpArgumentInfo = CSharpArgumentInfo.Create(arg1Flags, null); CSharpArgumentInfo cSharpArgumentInfo2 = CSharpArgumentInfo.Create(arg2Flags, null); CSharpBinaryOperationBinder binder = new CSharpBinaryOperationBinder(opKind, isChecked: false, CSharpBinaryOperationFlags.None, accessibilityContext, new CSharpArgumentInfo[2] { cSharpArgumentInfo, cSharpArgumentInfo2 }); CallSite<Func<CallSite, T1, T2, object>> callSite = CallSite<Func<CallSite, T1, T2, object>>.Create(binder); return callSite.Target(callSite, arg1, arg2); } public static object TryEvalUnaryOperators<T>(T obj, ExpressionType oper, Type accessibilityContext) { if (oper == ExpressionType.IsTrue || oper == ExpressionType.IsFalse) { CallSite<Func<CallSite, T, bool>> callSite = CallSite<Func<CallSite, T, bool>>.Create(new CSharpUnaryOperationBinder(oper, isChecked: false, accessibilityContext, new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); return callSite.Target(callSite, obj); } CallSite<Func<CallSite, T, object>> callSite2 = CallSite<Func<CallSite, T, object>>.Create(new CSharpUnaryOperationBinder(oper, isChecked: false, accessibilityContext, new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); return callSite2.Target(callSite2, obj); } public static K TryEvalCast<T, K>(T obj, Type type, CSharpBinderFlags kind, Type accessibilityContext) { CallSite<Func<CallSite, T, K>> callSite = CallSite<Func<CallSite, T, K>>.Create(Binder.Convert(kind, type, accessibilityContext)); return callSite.Target(callSite, obj); } private static void CreateDelegateSignatureAndArgumentInfos(object[] args, Type[] argTypes, CSharpArgumentInfoFlags[] argFlags, out Type[] delegateSignatureTypes, out CSharpArgumentInfo[] argInfos) { int num = args.Length; delegateSignatureTypes = new Type[num + 2]; delegateSignatureTypes[0] = typeof(CallSite); argInfos = new CSharpArgumentInfo[num]; for (int i = 0; i < num; i++) { if (argTypes[i] != null) { delegateSignatureTypes[i + 1] = argTypes[i]; } else if (args[i] != null) { delegateSignatureTypes[i + 1] = args[i].GetType(); } else { delegateSignatureTypes[i + 1] = typeof(object); } argInfos[i] = CSharpArgumentInfo.Create(argFlags[i], null); } delegateSignatureTypes[num + 1] = typeof(object); } private static object CreateDelegateAndInvoke(Type[] delegateSignatureTypes, CallSiteBinder binder, object[] args) { Type delegateType = Expression.GetDelegateType(delegateSignatureTypes); CallSite callSite = CallSite.Create(delegateType, binder); Delegate @delegate = (Delegate)callSite.GetType().GetField("Target").GetValue(callSite); object[] array = new object[args.Length + 1]; array[0] = callSite; args.CopyTo(array, 1); return @delegate.DynamicInvoke(array); } public static object TryEvalMethodVarArgs(object[] methodArgs, Type[] argTypes, CSharpArgumentInfoFlags[] argFlags, string methodName, Type accessibilityContext, Type[] typeArguments) { Type[] delegateSignatureTypes = null; CSharpArgumentInfo[] argInfos = null; CreateDelegateSignatureAndArgumentInfos(methodArgs, argTypes, argFlags, out delegateSignatureTypes, out argInfos); return CreateDelegateAndInvoke(binder: (!string.IsNullOrEmpty(methodName)) ? ((CallSiteBinder)new CSharpInvokeMemberBinder(CSharpCallFlags.ResultDiscarded, methodName, accessibilityContext, typeArguments, argInfos)) : ((CallSiteBinder)new CSharpInvokeBinder(CSharpCallFlags.ResultDiscarded, accessibilityContext, argInfos)), delegateSignatureTypes: delegateSignatureTypes, args: methodArgs); } public static object TryGetMemberValue<T>(T obj, string propName, Type accessibilityContext, bool isResultIndexed) { CSharpGetMemberBinder binder = new CSharpGetMemberBinder(propName, isResultIndexed, accessibilityContext, new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }); CallSite<Func<CallSite, T, object>> callSite = CallSite<Func<CallSite, T, object>>.Create(binder); return callSite.Target(callSite, obj); } public static object TryGetMemberValueVarArgs(object[] propArgs, Type[] argTypes, CSharpArgumentInfoFlags[] argFlags, Type accessibilityContext) { Type[] delegateSignatureTypes = null; CSharpArgumentInfo[] argInfos = null; CreateDelegateSignatureAndArgumentInfos(propArgs, argTypes, argFlags, out delegateSignatureTypes, out argInfos); CallSiteBinder binder = new CSharpGetIndexBinder(accessibilityContext, argInfos); return CreateDelegateAndInvoke(delegateSignatureTypes, binder, propArgs); } public static object TrySetMemberValue<TObject, TValue>(TObject obj, string propName, TValue value, CSharpArgumentInfoFlags valueFlags, Type accessibilityContext) { CSharpArgumentInfo cSharpArgumentInfo = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null); CSharpArgumentInfo cSharpArgumentInfo2 = CSharpArgumentInfo.Create(valueFlags, null); CSharpSetMemberBinder binder = new CSharpSetMemberBinder(propName, isCompoundAssignment: false, isChecked: false, accessibilityContext, new CSharpArgumentInfo[2] { cSharpArgumentInfo, cSharpArgumentInfo2 }); CallSite<Func<CallSite, TObject, TValue, object>> callSite = CallSite<Func<CallSite, TObject, TValue, object>>.Create(binder); return callSite.Target(callSite, obj, value); } public static object TrySetMemberValueVarArgs(object[] propArgs, Type[] argTypes, CSharpArgumentInfoFlags[] argFlags, Type accessibilityContext) { Type[] delegateSignatureTypes = null; CSharpArgumentInfo[] argInfos = null; CreateDelegateSignatureAndArgumentInfos(propArgs, argTypes, argFlags, out delegateSignatureTypes, out argInfos); CallSiteBinder binder = new CSharpSetIndexBinder(isCompoundAssignment: false, isChecked: false, accessibilityContext, argInfos); return CreateDelegateAndInvoke(delegateSignatureTypes, binder, propArgs); } internal static object TryGetMemberValue(object obj, string name, bool ignoreException) { bool ignoreCase = false; object obj2 = null; CallSite<Func<CallSite, object, object>> callSite = CallSite<Func<CallSite, object, object>>.Create(new GetMemberValueBinder(name, ignoreCase)); try { return callSite.Target(callSite, obj); } catch (DynamicBindingFailedException ex) { if (ignoreException) { return null; } throw ex; } catch (MissingMemberException ex2) { if (ignoreException) { return System.SR.GetValueonWriteOnlyProperty; } throw ex2; } } private static IList<KeyValuePair<string, object>> QueryDynamicObject(object obj) { if (obj is IDynamicMetaObjectProvider dynamicMetaObjectProvider) { DynamicMetaObject metaObject = dynamicMetaObjectProvider.GetMetaObject(parameter); List<string> list = new List<string>(metaObject.GetDynamicMemberNames()); list.Sort(); if (list != null) { List<KeyValuePair<string, object>> list2 = new List<KeyValuePair<string, object>>(); { foreach (string item in list) { object value; if ((value = TryGetMemberValue(obj, item, ignoreException: true)) != null) { list2.Add(new KeyValuePair<string, object>(item, value)); } } return list2; } } } return new KeyValuePair<string, object>[0]; } } internal static class Error { internal static Exception InternalCompilerError() { return new RuntimeBinderInternalCompilerException(System.SR.InternalCompilerError); } internal static Exception BindPropertyFailedMethodGroup(object p0) { return new RuntimeBinderException(System.SR.Format(System.SR.BindPropertyFailedMethodGroup, p0)); } internal static Exception BindPropertyFailedEvent(object p0) { return new RuntimeBinderException(System.SR.Format(System.SR.BindPropertyFailedEvent, p0)); } internal static Exception BindInvokeFailedNonDelegate() { return new RuntimeBinderException(System.SR.BindInvokeFailedNonDelegate); } internal static Exception BindStaticRequiresType(string paramName) { return new ArgumentException(System.SR.TypeArgumentRequiredForStaticCall, paramName); } internal static Exception NullReferenceOnMemberException() { return new RuntimeBinderException(System.SR.NullReferenceOnMemberException); } internal static Exception BindCallToConditionalMethod(object p0) { return new RuntimeBinderException(System.SR.Format(System.SR.BindCallToConditionalMethod, p0)); } internal static Exception BindToVoidMethodButExpectResult() { return new RuntimeBinderException(System.SR.BindToVoidMethodButExpectResult); } internal static Exception ArgumentNull(string paramName) { return new ArgumentNullException(paramName); } internal static Exception DynamicArgumentNeedsValue(string paramName) { return new ArgumentException(System.SR.DynamicArgumentNeedsValue, paramName); } } internal sealed class ExpressionTreeCallRewriter : ExprVisitorBase { private sealed class ExpressionExpr : Expr { public readonly Expression Expression; public ExpressionExpr(Expression e) : base(ExpressionKind.NoOp) { Expression = e; } } private readonly Dictionary<ExprCall, Expression> _DictionaryOfParameters; private readonly Expression[] _ListOfParameters; private int _currentParameterIndex; private ExpressionTreeCallRewriter(Expression[] listOfParameters) { _DictionaryOfParameters = new Dictionary<ExprCall, Expression>(); _ListOfParameters = listOfParameters; } public static Expression Rewrite(ExprBinOp binOp, Expression[] listOfParameters) { ExpressionTreeCallRewriter expressionTreeCallRewriter = new ExpressionTreeCallRewriter(listOfParameters); expressionTreeCallRewriter.Visit(binOp.OptionalLeftChild); ExprCall pExpr = (ExprCall)binOp.OptionalRightChild; ExpressionExpr expressionExpr = expressionTreeCallRewriter.Visit(pExpr) as ExpressionExpr; return expressionExpr.Expression; } protected override Expr VisitSAVE(ExprBinOp pExpr) { ExprCall key = (ExprCall)pExpr.OptionalLeftChild; Expression value = _ListOfParameters[_currentParameterIndex++]; _DictionaryOfParameters.Add(key, value); return null; } protected override Expr VisitCALL(ExprCall pExpr) { if (pExpr.PredefinedMethod == PREDEFMETH.PM_COUNT) { return pExpr; } Expression e; switch (pExpr.PredefinedMethod) { case PREDEFMETH.PM_EXPRESSION_LAMBDA: return GenerateLambda(pExpr); case PREDEFMETH.PM_EXPRESSION_CALL: e = GenerateCall(pExpr); break; case PREDEFMETH.PM_EXPRESSION_ARRAYINDEX: case PREDEFMETH.PM_EXPRESSION_ARRAYINDEX2: e = GenerateArrayIndex(pExpr); break; case PREDEFMETH.PM_EXPRESSION_CONVERT: case PREDEFMETH.PM_EXPRESSION_CONVERT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_CONVERTCHECKED: case PREDEFMETH.PM_EXPRESSION_CONVERTCHECKED_USER_DEFINED: e = GenerateConvert(pExpr); break; case PREDEFMETH.PM_EXPRESSION_PROPERTY: e = GenerateProperty(pExpr); break; case PREDEFMETH.PM_EXPRESSION_FIELD: e = GenerateField(pExpr); break; case PREDEFMETH.PM_EXPRESSION_INVOKE: e = GenerateInvoke(pExpr); break; case PREDEFMETH.PM_EXPRESSION_NEW: e = GenerateNew(pExpr); break; case PREDEFMETH.PM_EXPRESSION_ADD: case PREDEFMETH.PM_EXPRESSION_ADDCHECKED: case PREDEFMETH.PM_EXPRESSION_AND: case PREDEFMETH.PM_EXPRESSION_ANDALSO: case PREDEFMETH.PM_EXPRESSION_DIVIDE: case PREDEFMETH.PM_EXPRESSION_EQUAL: case PREDEFMETH.PM_EXPRESSION_EXCLUSIVEOR: case PREDEFMETH.PM_EXPRESSION_GREATERTHAN: case PREDEFMETH.PM_EXPRESSION_GREATERTHANOREQUAL: case PREDEFMETH.PM_EXPRESSION_LEFTSHIFT: case PREDEFMETH.PM_EXPRESSION_LESSTHAN: case PREDEFMETH.PM_EXPRESSION_LESSTHANOREQUAL: case PREDEFMETH.PM_EXPRESSION_MODULO: case PREDEFMETH.PM_EXPRESSION_MULTIPLY: case PREDEFMETH.PM_EXPRESSION_MULTIPLYCHECKED: case PREDEFMETH.PM_EXPRESSION_NOTEQUAL: case PREDEFMETH.PM_EXPRESSION_OR: case PREDEFMETH.PM_EXPRESSION_ORELSE: case PREDEFMETH.PM_EXPRESSION_RIGHTSHIFT: case PREDEFMETH.PM_EXPRESSION_SUBTRACT: case PREDEFMETH.PM_EXPRESSION_SUBTRACTCHECKED: e = GenerateBinaryOperator(pExpr); break; case PREDEFMETH.PM_EXPRESSION_ADD_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_ADDCHECKED_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_AND_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_ANDALSO_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_DIVIDE_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_EQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_EXCLUSIVEOR_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_GREATERTHAN_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_GREATERTHANOREQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_LEFTSHIFT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_LESSTHAN_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_LESSTHANOREQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_MODULO_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_MULTIPLY_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_MULTIPLYCHECKED_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NOTEQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_OR_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_ORELSE_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_RIGHTSHIFT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_SUBTRACT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_SUBTRACTCHECKED_USER_DEFINED: e = GenerateUserDefinedBinaryOperator(pExpr); break; case PREDEFMETH.PM_EXPRESSION_NEGATE: case PREDEFMETH.PM_EXPRESSION_NEGATECHECKED: case PREDEFMETH.PM_EXPRESSION_NOT: e = GenerateUnaryOperator(pExpr); break; case PREDEFMETH.PM_EXPRESSION_UNARYPLUS_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NEGATE_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NEGATECHECKED_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NOT_USER_DEFINED: e = GenerateUserDefinedUnaryOperator(pExpr); break; case PREDEFMETH.PM_EXPRESSION_CONSTANT_OBJECT_TYPE: e = GenerateConstantType(pExpr); break; case PREDEFMETH.PM_EXPRESSION_ASSIGN: e = GenerateAssignment(pExpr); break; default: throw Error.InternalCompilerError(); } return new ExpressionExpr(e); } protected override Expr VisitWRAP(ExprWrap pExpr) { return new ExpressionExpr(GetExpression(pExpr)); } private Expr GenerateLambda(ExprCall pExpr) { return Visit(((ExprList)pExpr.OptionalArguments).OptionalElement); } private Expression GenerateCall(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; ExprMethodInfo exprMethodInfo; ExprArrayInit arrinit; if (exprList.OptionalNextListNode is ExprList exprList2) { exprMethodInfo = (ExprMethodInfo)exprList2.OptionalElement; arrinit = (ExprArrayInit)exprList2.OptionalNextListNode; } else { exprMethodInfo = (ExprMethodInfo)exprList.OptionalNextListNode; arrinit = null; } Expression instance = null; MethodInfo methodInfo = exprMethodInfo.MethodInfo; Expression[] argumentsFromArrayInit = GetArgumentsFromArrayInit(arrinit); if (methodInfo == null) { throw Error.InternalCompilerError(); } if (!methodInfo.IsStatic) { instance = GetExpression(((ExprList)pExpr.OptionalArguments).OptionalElement); } return Expression.Call(instance, methodInfo, argumentsFromArrayInit); } private Expression GenerateArrayIndex(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; Expression expression = GetExpression(exprList.OptionalElement); Expression[] indexes = ((pExpr.PredefinedMethod != PREDEFMETH.PM_EXPRESSION_ARRAYINDEX) ? GetArgumentsFromArrayInit((ExprArrayInit)exprList.OptionalNextListNode) : new Expression[1] { GetExpression(exprList.OptionalNextListNode) }); return Expression.ArrayAccess(expression, indexes); } private Expression GenerateConvert(ExprCall pExpr) { PREDEFMETH predefinedMethod = pExpr.PredefinedMethod; Expression expression; Type associatedSystemType; if (predefinedMethod == PREDEFMETH.PM_EXPRESSION_CONVERT_USER_DEFINED || predefinedMethod == PREDEFMETH.PM_EXPRESSION_CONVERTCHECKED_USER_DEFINED) { ExprList exprList = (ExprList)pExpr.OptionalArguments; ExprList exprList2 = (ExprList)exprList.OptionalNextListNode; expression = GetExpression(exprList.OptionalElement); associatedSystemType = ((ExprTypeOf)exprList2.OptionalElement).SourceType.AssociatedSystemType; if (expression.Type.MakeByRefType() == associatedSystemType) { return expression; } MethodInfo methodInfo = ((ExprMethodInfo)exprList2.OptionalNextListNode).MethodInfo; if (predefinedMethod == PREDEFMETH.PM_EXPRESSION_CONVERT_USER_DEFINED) { return Expression.Convert(expression, associatedSystemType, methodInfo); } return Expression.ConvertChecked(expression, associatedSystemType, methodInfo); } ExprList exprList3 = (ExprList)pExpr.OptionalArguments; expression = GetExpression(exprList3.OptionalElement); associatedSystemType = ((ExprTypeOf)exprList3.OptionalNextListNode).SourceType.AssociatedSystemType; if (expression.Type.MakeByRefType() == associatedSystemType) { return expression; } if ((pExpr.Flags & EXPRFLAG.EXF_USERCALLABLE) != 0) { return Expression.Unbox(expression, associatedSystemType); } if (predefinedMethod == PREDEFMETH.PM_EXPRESSION_CONVERT) { return Expression.Convert(expression, associatedSystemType); } return Expression.ConvertChecked(expression, associatedSystemType); } private Expression GenerateProperty(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; Expr optionalElement = exprList.OptionalElement; Expr optionalNextListNode = exprList.OptionalNextListNode; ExprPropertyInfo exprPropertyInfo; ExprArrayInit exprArrayInit; if (optionalNextListNode is ExprList exprList2) { exprPropertyInfo = exprList2.OptionalElement as ExprPropertyInfo; exprArrayInit = exprList2.OptionalNextListNode as ExprArrayInit; } else { exprPropertyInfo = optionalNextListNode as ExprPropertyInfo; exprArrayInit = null; } PropertyInfo propertyInfo = exprPropertyInfo.PropertyInfo; if (propertyInfo == null) { throw Error.InternalCompilerError(); } if (exprArrayInit == null) { return Expression.Property(GetExpression(optionalElement), propertyInfo); } return Expression.Property(GetExpression(optionalElement), propertyInfo, GetArgumentsFromArrayInit(exprArrayInit)); } private Expression GenerateField(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; ExprFieldInfo exprFieldInfo = (ExprFieldInfo)exprList.OptionalNextListNode; Type type = exprFieldInfo.FieldType.AssociatedSystemType; FieldInfo fieldInfo = exprFieldInfo.Field.AssociatedFieldInfo; if (!type.IsGenericType && !type.IsNested) { type = fieldInfo.DeclaringType; } if (type.IsGenericType) { fieldInfo = type.GetField(fieldInfo.Name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); } return Expression.Field(GetExpression(exprList.OptionalElement), fieldInfo); } private Expression GenerateInvoke(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; return Expression.Invoke(GetExpression(exprList.OptionalElement), GetArgumentsFromArrayInit(exprList.OptionalNextListNode as ExprArrayInit)); } private Expression GenerateNew(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; ConstructorInfo constructorInfo = ((ExprMethodInfo)exprList.OptionalElement).ConstructorInfo; Expression[] argumentsFromArrayInit = GetArgumentsFromArrayInit(exprList.OptionalNextListNode as ExprArrayInit); return Expression.New(constructorInfo, argumentsFromArrayInit); } private static Expression GenerateConstantType(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; return Expression.Constant(exprList.OptionalElement.Object, ((ExprTypeOf)exprList.OptionalNextListNode).SourceType.AssociatedSystemType); } private Expression GenerateAssignment(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; return Expression.Assign(GetExpression(exprList.OptionalElement), GetExpression(exprList.OptionalNextListNode)); } private Expression GenerateBinaryOperator(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; Expression expression = GetExpression(exprList.OptionalElement); Expression expression2 = GetExpression(exprList.OptionalNextListNode); return pExpr.PredefinedMethod switch { PREDEFMETH.PM_EXPRESSION_ADD => Expression.Add(expression, expression2), PREDEFMETH.PM_EXPRESSION_AND => Expression.And(expression, expression2), PREDEFMETH.PM_EXPRESSION_DIVIDE => Expression.Divide(expression, expression2), PREDEFMETH.PM_EXPRESSION_EQUAL => Expression.Equal(expression, expression2), PREDEFMETH.PM_EXPRESSION_EXCLUSIVEOR => Expression.ExclusiveOr(expression, expression2), PREDEFMETH.PM_EXPRESSION_GREATERTHAN => Expression.GreaterThan(expression, expression2), PREDEFMETH.PM_EXPRESSION_GREATERTHANOREQUAL => Expression.GreaterThanOrEqual(expression, expression2), PREDEFMETH.PM_EXPRESSION_LEFTSHIFT => Expression.LeftShift(expression, expression2), PREDEFMETH.PM_EXPRESSION_LESSTHAN => Expression.LessThan(expression, expression2), PREDEFMETH.PM_EXPRESSION_LESSTHANOREQUAL => Expression.LessThanOrEqual(expression, expression2), PREDEFMETH.PM_EXPRESSION_MODULO => Expression.Modulo(expression, expression2), PREDEFMETH.PM_EXPRESSION_MULTIPLY => Expression.Multiply(expression, expression2), PREDEFMETH.PM_EXPRESSION_NOTEQUAL => Expression.NotEqual(expression, expression2), PREDEFMETH.PM_EXPRESSION_OR => Expression.Or(expression, expression2), PREDEFMETH.PM_EXPRESSION_RIGHTSHIFT => Expression.RightShift(expression, expression2), PREDEFMETH.PM_EXPRESSION_SUBTRACT => Expression.Subtract(expression, expression2), PREDEFMETH.PM_EXPRESSION_ORELSE => Expression.OrElse(expression, expression2), PREDEFMETH.PM_EXPRESSION_ANDALSO => Expression.AndAlso(expression, expression2), PREDEFMETH.PM_EXPRESSION_ADDCHECKED => Expression.AddChecked(expression, expression2), PREDEFMETH.PM_EXPRESSION_MULTIPLYCHECKED => Expression.MultiplyChecked(expression, expression2), PREDEFMETH.PM_EXPRESSION_SUBTRACTCHECKED => Expression.SubtractChecked(expression, expression2), _ => throw Error.InternalCompilerError(), }; } private Expression GenerateUserDefinedBinaryOperator(ExprCall pExpr) { ExprList exprList = (ExprList)pExpr.OptionalArguments; Expression expression = GetExpression(exprList.OptionalElement); Expression expression2 = GetExpression(((ExprList)exprList.OptionalNextListNode).OptionalElement); exprList = (ExprList)exprList.OptionalNextListNode; bool liftToNull = false; MethodInfo methodInfo; if (exprList.OptionalNextListNode is ExprList exprList2) { ExprConstant exprConstant = (ExprConstant)exprList2.OptionalElement; liftToNull = exprConstant.Val.Int32Val == 1; methodInfo = ((ExprMethodInfo)exprList2.OptionalNextListNode).MethodInfo; } else { methodInfo = ((ExprMethodInfo)exprList.OptionalNextListNode).MethodInfo; } return pExpr.PredefinedMethod switch { PREDEFMETH.PM_EXPRESSION_ADD_USER_DEFINED => Expression.Add(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_AND_USER_DEFINED => Expression.And(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_DIVIDE_USER_DEFINED => Expression.Divide(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_EQUAL_USER_DEFINED => Expression.Equal(expression, expression2, liftToNull, methodInfo), PREDEFMETH.PM_EXPRESSION_EXCLUSIVEOR_USER_DEFINED => Expression.ExclusiveOr(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_GREATERTHAN_USER_DEFINED => Expression.GreaterThan(expression, expression2, liftToNull, methodInfo), PREDEFMETH.PM_EXPRESSION_GREATERTHANOREQUAL_USER_DEFINED => Expression.GreaterThanOrEqual(expression, expression2, liftToNull, methodInfo), PREDEFMETH.PM_EXPRESSION_LEFTSHIFT_USER_DEFINED => Expression.LeftShift(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_LESSTHAN_USER_DEFINED => Expression.LessThan(expression, expression2, liftToNull, methodInfo), PREDEFMETH.PM_EXPRESSION_LESSTHANOREQUAL_USER_DEFINED => Expression.LessThanOrEqual(expression, expression2, liftToNull, methodInfo), PREDEFMETH.PM_EXPRESSION_MODULO_USER_DEFINED => Expression.Modulo(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_MULTIPLY_USER_DEFINED => Expression.Multiply(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_NOTEQUAL_USER_DEFINED => Expression.NotEqual(expression, expression2, liftToNull, methodInfo), PREDEFMETH.PM_EXPRESSION_OR_USER_DEFINED => Expression.Or(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_RIGHTSHIFT_USER_DEFINED => Expression.RightShift(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_SUBTRACT_USER_DEFINED => Expression.Subtract(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_ORELSE_USER_DEFINED => Expression.OrElse(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_ANDALSO_USER_DEFINED => Expression.AndAlso(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_ADDCHECKED_USER_DEFINED => Expression.AddChecked(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_MULTIPLYCHECKED_USER_DEFINED => Expression.MultiplyChecked(expression, expression2, methodInfo), PREDEFMETH.PM_EXPRESSION_SUBTRACTCHECKED_USER_DEFINED => Expression.SubtractChecked(expression, expression2, methodInfo), _ => throw Error.InternalCompilerError(), }; } private Expression GenerateUnaryOperator(ExprCall pExpr) { PREDEFMETH predefinedMethod = pExpr.PredefinedMethod; Expression expression = GetExpression(pExpr.OptionalArguments); return predefinedMethod switch { PREDEFMETH.PM_EXPRESSION_NOT => Expression.Not(expression), PREDEFMETH.PM_EXPRESSION_NEGATE => Expression.Negate(expression), PREDEFMETH.PM_EXPRESSION_NEGATECHECKED => Expression.NegateChecked(expression), _ => throw Error.InternalCompilerError(), }; } private Expression GenerateUserDefinedUnaryOperator(ExprCall pExpr) { PREDEFMETH predefinedMethod = pExpr.PredefinedMethod; ExprList exprList = (ExprList)pExpr.OptionalArguments; Expression expression = GetExpression(exprList.OptionalElement); MethodInfo methodInfo = ((ExprMethodInfo)exprList.OptionalNextListNode).MethodInfo; return predefinedMethod switch { PREDEFMETH.PM_EXPRESSION_NOT_USER_DEFINED => Expression.Not(expression, methodInfo), PREDEFMETH.PM_EXPRESSION_NEGATE_USER_DEFINED => Expression.Negate(expression, methodInfo), PREDEFMETH.PM_EXPRESSION_UNARYPLUS_USER_DEFINED => Expression.UnaryPlus(expression, methodInfo), PREDEFMETH.PM_EXPRESSION_NEGATECHECKED_USER_DEFINED => Expression.NegateChecked(expression, methodInfo), _ => throw Error.InternalCompilerError(), }; } private Expression GetExpression(Expr pExpr) { if (pExpr is ExprWrap exprWrap) { return _DictionaryOfParameters[(ExprCall)exprWrap.OptionalExpression]; } if (pExpr is ExprConstant) { return null; } ExprCall exprCall = (ExprCall)pExpr; switch (exprCall.PredefinedMethod) { case PREDEFMETH.PM_EXPRESSION_CALL: return GenerateCall(exprCall); case PREDEFMETH.PM_EXPRESSION_CONVERT: case PREDEFMETH.PM_EXPRESSION_CONVERT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_CONVERTCHECKED: case PREDEFMETH.PM_EXPRESSION_CONVERTCHECKED_USER_DEFINED: return GenerateConvert(exprCall); case PREDEFMETH.PM_EXPRESSION_NEWARRAYINIT: { ExprList exprList = (ExprList)exprCall.OptionalArguments; return Expression.NewArrayInit(((ExprTypeOf)exprList.OptionalElement).SourceType.AssociatedSystemType, GetArgumentsFromArrayInit((ExprArrayInit)exprList.OptionalNextListNode)); } case PREDEFMETH.PM_EXPRESSION_ARRAYINDEX: case PREDEFMETH.PM_EXPRESSION_ARRAYINDEX2: return GenerateArrayIndex(exprCall); case PREDEFMETH.PM_EXPRESSION_NEW: return GenerateNew(exprCall); case PREDEFMETH.PM_EXPRESSION_PROPERTY: return GenerateProperty(exprCall); case PREDEFMETH.PM_EXPRESSION_FIELD: return GenerateField(exprCall); case PREDEFMETH.PM_EXPRESSION_CONSTANT_OBJECT_TYPE: return GenerateConstantType(exprCall); case PREDEFMETH.PM_EXPRESSION_ASSIGN: return GenerateAssignment(exprCall); case PREDEFMETH.PM_EXPRESSION_ADD: case PREDEFMETH.PM_EXPRESSION_ADDCHECKED: case PREDEFMETH.PM_EXPRESSION_AND: case PREDEFMETH.PM_EXPRESSION_ANDALSO: case PREDEFMETH.PM_EXPRESSION_DIVIDE: case PREDEFMETH.PM_EXPRESSION_EQUAL: case PREDEFMETH.PM_EXPRESSION_EXCLUSIVEOR: case PREDEFMETH.PM_EXPRESSION_GREATERTHAN: case PREDEFMETH.PM_EXPRESSION_GREATERTHANOREQUAL: case PREDEFMETH.PM_EXPRESSION_LEFTSHIFT: case PREDEFMETH.PM_EXPRESSION_LESSTHAN: case PREDEFMETH.PM_EXPRESSION_LESSTHANOREQUAL: case PREDEFMETH.PM_EXPRESSION_MODULO: case PREDEFMETH.PM_EXPRESSION_MULTIPLY: case PREDEFMETH.PM_EXPRESSION_MULTIPLYCHECKED: case PREDEFMETH.PM_EXPRESSION_NOTEQUAL: case PREDEFMETH.PM_EXPRESSION_OR: case PREDEFMETH.PM_EXPRESSION_ORELSE: case PREDEFMETH.PM_EXPRESSION_RIGHTSHIFT: case PREDEFMETH.PM_EXPRESSION_SUBTRACT: case PREDEFMETH.PM_EXPRESSION_SUBTRACTCHECKED: return GenerateBinaryOperator(exprCall); case PREDEFMETH.PM_EXPRESSION_ADD_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_ADDCHECKED_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_AND_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_ANDALSO_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_DIVIDE_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_EQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_EXCLUSIVEOR_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_GREATERTHAN_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_GREATERTHANOREQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_LEFTSHIFT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_LESSTHAN_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_LESSTHANOREQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_MODULO_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_MULTIPLY_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_MULTIPLYCHECKED_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NOTEQUAL_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_OR_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_ORELSE_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_RIGHTSHIFT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_SUBTRACT_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_SUBTRACTCHECKED_USER_DEFINED: return GenerateUserDefinedBinaryOperator(exprCall); case PREDEFMETH.PM_EXPRESSION_NEGATE: case PREDEFMETH.PM_EXPRESSION_NEGATECHECKED: case PREDEFMETH.PM_EXPRESSION_NOT: return GenerateUnaryOperator(exprCall); case PREDEFMETH.PM_EXPRESSION_UNARYPLUS_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NEGATE_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NEGATECHECKED_USER_DEFINED: case PREDEFMETH.PM_EXPRESSION_NOT_USER_DEFINED: return GenerateUserDefinedUnaryOperator(exprCall); default: throw Error.InternalCompilerError(); } } private Expression[] GetArgumentsFromArrayInit(ExprArrayInit arrinit) { List<Expression> list = new List<Expression>(); if (arrinit != null) { Expr expr = arrinit.OptionalArguments; while (expr != null) { Expr pExpr; if (expr is ExprList exprList) { pExpr = exprList.OptionalElement; expr = exprList.OptionalNextListNode; } else { pExpr = expr; expr = null; } list.Add(GetExpression(pExpr)); } } return list.ToArray(); } } internal interface ICSharpBinder { bool IsBinderThatCanHaveRefReceiver { get; } BindingFlag BindingFlags { get; } string Name { get; } Type ReturnType { get; } CSharpArgumentInfo GetArgumentInfo(int index); void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments); Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals); int GetGetBinderEquivalenceHash(); bool IsEquivalentTo(ICSharpBinder other); } internal interface ICSharpInvokeOrInvokeMemberBinder : ICSharpBinder { bool StaticCall { get; } bool ResultDiscarded { get; } CSharpCallFlags Flags { get; } Type[] TypeArguments { get; } } internal readonly struct RuntimeBinder { private static readonly object s_bindLock = new object(); private readonly ExpressionBinder _binder; internal bool IsChecked => _binder.Context.Checked; public RuntimeBinder(Type contextType, bool isChecked = false) { AggregateSymbol context; if (contextType != null) { lock (s_bindLock) { context = ((AggregateType)SymbolTable.GetCTypeFromType(contextType)).OwningAggregate; } } else { context = null; } _binder = new ExpressionBinder(new BindingContext(context, isChecked)); } public Expression Bind(ICSharpBinder payload, Expression[] parameters, DynamicMetaObject[] args, out DynamicMetaObject deferredBinding) { lock (s_bindLock) { return BindCore(payload, parameters, args, out deferredBinding); } } private Expression BindCore(ICSharpBinder payload, Expression[] parameters, DynamicMetaObject[] args, out DynamicMetaObject deferredBinding) { ArgumentObject[] array = CreateArgumentArray(payload, parameters, args); payload.PopulateSymbolTableWithName(array[0].Type, array); AddConversionsForArguments(array); Scope pScope = SymFactory.CreateScope(); LocalVariableSymbol[] locals = PopulateLocalScope(payload, pScope, array, parameters); if (DeferBinding(payload, array, args, locals, out deferredBinding)) { return null; } Expr pResult = payload.DispatchPayload(this, array, locals); return CreateExpressionTreeFromResult(parameters, pScope, pResult); } private bool DeferBinding(ICSharpBinder payload, ArgumentObject[] arguments, DynamicMetaObject[] args, LocalVariableSymbol[] locals, out DynamicMetaObject deferredBinding) { if (payload is CSharpInvokeMemberBinder cSharpInvokeMemberBinder) { Type[] typeArguments = cSharpInvokeMemberBinder.TypeArguments; int arity = ((typeArguments != null) ? typeArguments.Length : 0); MemberLookup mem = new MemberLookup(); Expr callingObject = CreateCallingObjectForCall(cSharpInvokeMemberBinder, arguments, locals); SymWithType symWithType = SymbolTable.LookupMember(cSharpInvokeMemberBinder.Name, callingObject, _binder.Context.ContextForMemberLookup, arity, mem, (cSharpInvokeMemberBinder.Flags & CSharpCallFlags.EventHookup) != 0, requireInvocable: true); if (symWithType != null && symWithType.Sym.getKind() != SYMKIND.SK_MethodSymbol) { CSharpGetMemberBinder cSharpGetMemberBinder = new CSharpGetMemberBinder(cSharpInvokeMemberBinder.Name, resultIndexed: false, cSharpInvokeMemberBinder.CallingContext, new CSharpArgumentInfo[1] { cSharpInvokeMemberBinder.GetArgumentInfo(0) }).TryGetExisting(); CSharpArgumentInfo[] array = cSharpInvokeMemberBinder.ArgumentInfoArray(); array[0] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null); CSharpInvokeBinder cSharpInvokeBinder = new CSharpInvokeBinder(cSharpInvokeMemberBinder.Flags, cSharpInvokeMemberBinder.CallingContext, array).TryGetExisting(); DynamicMetaObject[] array2 = new DynamicMetaObject[args.Length - 1]; Array.Copy(args, 1, array2, 0, args.Length - 1); deferredBinding = cSharpInvokeBinder.Defer(cSharpGetMemberBinder.Defer(args[0]), array2); return true; } } deferredBinding = null; return false; } private static Expression CreateExpressionTreeFromResult(Expression[] parameters, Scope pScope, Expr pResult) { ExprBoundLambda expr = GenerateBoundLambda(pScope, pResult); ExprBinOp binOp = ExpressionTreeRewriter.Rewrite(expr); return ExpressionTreeCallRewriter.Rewrite(binOp, parameters); } private Type GetArgumentType(ICSharpBinder p, CSharpArgumentInfo argInfo, Expression param, DynamicMetaObject arg, int index) { Type type = (argInfo.UseCompileTimeType ? param.Type : arg.LimitType); if (argInfo.IsByRefOrOut) { if (index != 0 || !p.IsBinderThatCanHaveRefReceiver) { type = type.MakeByRefType(); } } else if (!argInfo.UseCompileTimeType) { CType cTypeFromType = SymbolTable.GetCTypeFromType(type); CType bestAccessibleType = TypeManager.GetBestAccessibleType(_binder.Context.ContextForMemberLookup, cTypeFromType); type = bestAccessibleType.AssociatedSystemType; } return type; } private ArgumentObject[] CreateArgumentArray(ICSharpBinder payload, Expression[] parameters, DynamicMetaObject[] args) { ArgumentObject[] array = new ArgumentObject[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { CSharpArgumentInfo argumentInfo = payload.GetArgumentInfo(i); array[i] = new ArgumentObject(args[i].Value, argumentInfo, GetArgumentType(payload, argumentInfo, parameters[i], args[i], i)); } return array; } internal static void PopulateSymbolTableWithPayloadInformation(ICSharpInvokeOrInvokeMemberBinder callOrInvoke, Type callingType, ArgumentObject[] arguments) { Type type; if (callOrInvoke.StaticCall) { type = arguments[0].Value as Type; if (type == null) { throw Error.BindStaticRequiresType(arguments[0].Info.Name); } } else { type = callingType; } SymbolTable.PopulateSymbolTableWithName(callOrInvoke.Name, callOrInvoke.TypeArguments, type); if (callOrInvoke.Name.StartsWith("set_", StringComparison.Ordinal) || callOrInvoke.Name.StartsWith("get_", StringComparison.Ordinal)) { SymbolTable.PopulateSymbolTableWithName(callOrInvoke.Name.Substring(4), callOrInvoke.TypeArguments, type); } } private static void AddConversionsForArguments(ArgumentObject[] arguments) { for (int i = 0; i < arguments.Length; i++) { ArgumentObject argumentObject = arguments[i]; SymbolTable.AddConversionsForType(argumentObject.Type); } } internal ExprWithArgs DispatchPayload(ICSharpInvokeOrInvokeMemberBinder payload, ArgumentObject[] arguments, LocalVariableSymbol[] locals) { return BindCall(payload, CreateCallingObjectForCall(payload, arguments, locals), arguments, locals); } private static LocalVariableSymbol[] PopulateLocalScope(ICSharpBinder payload, Scope pScope, ArgumentObject[] arguments, Expression[] parameterExpressions) { LocalVariableSymbol[] array = new LocalVariableSymbol[parameterExpressions.Length]; for (int i = 0; i < parameterExpressions.Length; i++) { Expression expression = parameterExpressions[i]; CType cType = SymbolTable.GetCTypeFromType(expression.Type); if ((i != 0 || !payload.IsBinderThatCanHaveRefReceiver) && expression is ParameterExpression parameterExpression && parameterExpression.IsByRef) { CSharpArgumentInfo info = arguments[i].Info; if (info.IsByRefOrOut) { cType = TypeManager.GetParameterModifier(cType, info.IsOut); } } LocalVariableSymbol localVariableSymbol = SymFactory.CreateLocalVar(NameManager.Add("p" + i), pScope, cType); array[i] = localVariableSymbol; } return array; } private static ExprBoundLambda GenerateBoundLambda(Scope pScope, Expr call) { AggregateType predefindType = SymbolLoader.GetPredefindType(PredefinedType.PT_FUNC); return ExprFactory.CreateAnonymousMethod(predefindType, pScope, call); } private Expr CreateLocal(Type type, bool isOut, LocalVariableSymbol local) { CType dest = ((!isOut) ? SymbolTable.GetCTypeFromType(type) : TypeManager.GetParameterModifier(SymbolTable.GetCTypeFromType(type.GetElementType()), isOut: true)); ExprLocal expr = ExprFactory.CreateLocal(local); Expr expr2 = _binder.tryConvert(expr, dest) ?? _binder.mustCast(expr, dest); expr2.Flags |= EXPRFLAG.EXF_LVALUE; return expr2; } internal Expr CreateArgumentListEXPR(ArgumentObject[] arguments, LocalVariableSymbol[] locals, int startIndex, int endIndex) { Expr first = null; Expr last = null; if (arguments != null) { for (int i = startIndex; i < endIndex; i++) { ArgumentObject argument = arguments[i]; Expr expr = CreateArgumentEXPR(argument, locals[i]); if (first == null) { first = expr; last = first; } else { ExprFactory.AppendItemToList(expr, ref first, ref last); } } } return first; } private Expr CreateArgumentEXPR(ArgumentObject argument, LocalVariableSymbol local) { Expr expr = (argument.Info.LiteralConstant ? ((argument.Value != null) ? ExprFactory.CreateConstant(SymbolTable.GetCTypeFromType(argument.Type), ConstVal.Get(argument.Value)) : ((!argument.Info.UseCompileTimeType) ? ExprFactory.CreateNull() : ExprFactory.CreateConstant(SymbolTable.GetCTypeFromType(argument.Type), default(ConstVal)))) : ((argument.Info.UseCompileTimeType || argument.Value != null) ? CreateLocal(argument.Type, argument.Info.IsOut, local) : ExprFactory.CreateNull())); if (argument.Info.NamedArgument) { expr = ExprFactory.CreateNamedArgumentSpecification(NameManager.Add(argument.Info.Name), expr); } if (!argument.Info.UseCompileTimeType && argument.Value != null) { expr.RuntimeObject = argument.Value;
TextureSwapper.dll
Decompiled 4 months 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.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Security; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Web; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ExitGames.Client.Photon.StructWrapping; using FFMpegCore; using FFMpegCore.Enums; using HarmonyLib; using ImageMagick; using ImageMagick.Formats; using KeybindLib.Classes; using Microsoft.CodeAnalysis; using NAudio.Wave; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Photon.Pun; using REPOLib.Modules; using Sirenix.Utilities; using Steamworks; using TMPro; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityEngine.Video; using io.wispforest.endec; using io.wispforest.endec.format.binary; using io.wispforest.endec.format.newtonsoft; using io.wispforest.endec.impl; using io.wispforest.endec.util; using io.wispforest.textureswapper.api; using io.wispforest.textureswapper.api.components; using io.wispforest.textureswapper.api.components.holders; using io.wispforest.textureswapper.api.config; using io.wispforest.textureswapper.api.core; using io.wispforest.textureswapper.api.query; using io.wispforest.textureswapper.api.query.impl; using io.wispforest.textureswapper.api.tooltip; using io.wispforest.textureswapper.patches; using io.wispforest.textureswapper.patches.ui; using io.wispforest.textureswapper.utils; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TextureSwapper")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: AssemblyInformationalVersion("1.2.0+aff31c16e96127ad6e487f441af26a7c219986c6")] [assembly: AssemblyProduct("Texture Swapper")] [assembly: AssemblyTitle("TextureSwapper")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace System.Runtime.Versioning { [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class RequiresPreviewFeaturesAttribute : Attribute { public string? Message { get; } public string? Url { get; set; } public RequiresPreviewFeaturesAttribute() { } public RequiresPreviewFeaturesAttribute(string? message) { Message = message; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CallerArgumentExpressionAttribute : Attribute { public string ParameterName { get; } public CallerArgumentExpressionAttribute(string parameterName) { ParameterName = parameterName; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CollectionBuilderAttribute : Attribute { public Type BuilderType { get; } public string MethodName { get; } public CollectionBuilderAttribute(Type builderType, string methodName) { BuilderType = builderType; MethodName = methodName; } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CompilerFeatureRequiredAttribute : Attribute { public const string RefStructs = "RefStructs"; public const string RequiredMembers = "RequiredMembers"; public string FeatureName { get; } public bool IsOptional { get; set; } public CompilerFeatureRequiredAttribute(string featureName) { FeatureName = featureName; } } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute { public string[] Arguments { get; } public InterpolatedStringHandlerArgumentAttribute(string argument) { Arguments = new string[1] { argument }; } public InterpolatedStringHandlerArgumentAttribute(params string[] arguments) { Arguments = arguments; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class InterpolatedStringHandlerAttribute : Attribute { } [EditorBrowsable(EditorBrowsableState.Never)] [ExcludeFromCodeCoverage] internal static class IsExternalInit { } [AttributeUsage(AttributeTargets.Method, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ModuleInitializerAttribute : Attribute { } [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class OverloadResolutionPriorityAttribute : Attribute { public int Priority { get; } public OverloadResolutionPriorityAttribute(int priority) { Priority = priority; } } [AttributeUsage(AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)] [ExcludeFromCodeCoverage] internal sealed class ParamCollectionAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class RequiredMemberAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] [EditorBrowsable(EditorBrowsableState.Never)] [ExcludeFromCodeCoverage] internal sealed class RequiresLocationAttribute : Attribute { } [AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class SkipLocalsInitAttribute : Attribute { } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ConstantExpectedAttribute : Attribute { public object? Min { get; set; } public object? Max { get; set; } } [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ExperimentalAttribute : Attribute { public string DiagnosticId { get; } public string? UrlFormat { get; set; } public ExperimentalAttribute(string diagnosticId) { DiagnosticId = diagnosticId; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class SetsRequiredMembersAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class StringSyntaxAttribute : Attribute { public const string CompositeFormat = "CompositeFormat"; public const string DateOnlyFormat = "DateOnlyFormat"; public const string DateTimeFormat = "DateTimeFormat"; public const string EnumFormat = "EnumFormat"; public const string GuidFormat = "GuidFormat"; public const string Json = "Json"; public const string NumericFormat = "NumericFormat"; public const string Regex = "Regex"; public const string TimeOnlyFormat = "TimeOnlyFormat"; public const string TimeSpanFormat = "TimeSpanFormat"; public const string Uri = "Uri"; public const string Xml = "Xml"; public string Syntax { get; } public object?[] Arguments { get; } public StringSyntaxAttribute(string syntax) { Syntax = syntax; Arguments = new object[0]; } public StringSyntaxAttribute(string syntax, params object?[] arguments) { Syntax = syntax; Arguments = arguments; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class UnscopedRefAttribute : Attribute { } } namespace io.wispforest.textureswapper { public delegate bool LevelPredicate(RunManager manager, Level currentLevel); public delegate Level LevelGetter(RunManager manager); public enum Operation { ANY, NONE } public static class LevelUtils { public static readonly LevelGetter[] INVALID_LEVELS = new LevelGetter[5] { (RunManager m) => m.levelLobby, (RunManager m) => m.levelLobbyMenu, (RunManager m) => m.levelMainMenu, (RunManager m) => m.levelSplashScreen, (RunManager m) => m.levelTutorial }; public static readonly LevelPredicate GENERAL_VALID_PREDICATE = of(Operation.NONE, INVALID_LEVELS); public static LevelPredicate and(this LevelPredicate predicate1, LevelPredicate predicate2) { LevelPredicate predicate3 = predicate1; LevelPredicate predicate4 = predicate2; return (RunManager manager, Level level) => predicate3(manager, level) && predicate4(manager, level); } public static LevelPredicate or(this LevelPredicate predicate1, LevelPredicate predicate2) { LevelPredicate predicate3 = predicate1; LevelPredicate predicate4 = predicate2; return (RunManager manager, Level level) => predicate3(manager, level) || predicate4(manager, level); } public static bool isValid(this LevelPredicate predicate) { RunManager instance = RunManager.instance; if ((Object)(object)instance == (Object)null) { return false; } Level levelCurrent = instance.levelCurrent; if ((Object)(object)levelCurrent == (Object)null) { return false; } return predicate(instance, levelCurrent); } public static bool isCurrentLevel(this RunManager manager, Level otherLevel) { if ((Object)(object)otherLevel == (Object)null) { return false; } Level levelCurrent = manager.levelCurrent; return (Object)(object)levelCurrent != (Object)null && (Object)(object)levelCurrent == (Object)(object)otherLevel; } public static LevelPredicate of(Operation operation, params LevelGetter[] getters) { LevelGetter[] getters2 = getters; if (1 == 0) { } LevelPredicate result = operation switch { Operation.ANY => delegate(RunManager manager, Level _) { RunManager manager3 = manager; return getters2.Select((LevelGetter getter) => getter(manager3)).Any(manager3.isCurrentLevel); }, Operation.NONE => delegate(RunManager manager, Level _) { RunManager manager2 = manager; return getters2.Select((LevelGetter getter) => getter(manager2)).Any((Level level) => !manager2.isCurrentLevel(level)); }, _ => throw new ArgumentOutOfRangeException("operation", operation, "Invalid operation based when creating level predicate"), }; if (1 == 0) { } return result; } public static LevelGetter ofName(string name) { string name2 = name; return of((string s) => s == name2); } public static LevelGetter of(Predicate<string> namePredicate) { Predicate<string> namePredicate2 = namePredicate; return (RunManager manager) => manager.levels.Find((Level level) => namePredicate2(((Object)level).name)); } } public class TooltipUI : SemiUI { private enum ChangingState { HIDDEN, SHOWING, SHOWN } private TextMeshProUGUI Text; private SemiUI parentUi; private string dumpedText = "None"; private RectTransform baseRect; private RectTransform textRect; private RectTransform panelRect; private float xAxis; private float yAxis; private float width; private float height; private float xPivot; private float yPivot; private float fontSize; private SortedDictionary<TooltipKey, string> messageParts = new SortedDictionary<TooltipKey, string>(); private string? message; private bool hasMessageChanged = false; private ChangingState state = ChangingState.SHOWN; public static readonly TooltipKey BASIC = new TooltipKey(0, "Basic"); public static readonly TooltipKey DEBUG = new TooltipKey(100, "Debug Info", showName: true, (RunManager _, Level _) => true); public static TooltipUI? instance { get; private set; } public static void setupTooltipUI(SemiUI parent) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) try { Transform parent2 = ((Component)parent).transform.parent; if ((Object)(object)parent2 == (Object)null) { return; } GameObject orAddChild = parent2.getOrAddChild("TextureSwapperTooltip"); TooltipUI tooltipUI = orAddChild.GetComponent<TooltipUI>(); GameObject orAddChild2 = orAddChild.getOrAddChild("Panel"); GameObject orAddChild3 = orAddChild.getOrAddChild("Tooltip"); if ((Object)(object)tooltipUI == (Object)null) { tooltipUI = orAddChild.AddComponent<TooltipUI>(); ((SemiUI)tooltipUI).textRectTransform = (Transform)(object)ComponentHolderProtocol.GetOrAddComponent<RectTransform>((Object)(object)orAddChild); ((SemiUI)tooltipUI).uiText = orAddChild3.AddComponent<TextMeshProUGUI>(); ((SemiUI)tooltipUI).showPosition = new Vector2(135f, 105f); ((SemiUI)tooltipUI).hidePosition = new Vector2(500f, 105f); RectTransform orAddComponent = ComponentHolderProtocol.GetOrAddComponent<RectTransform>((Object)(object)orAddChild2); Image orAddComponent2 = ComponentHolderProtocol.GetOrAddComponent<Image>((Object)(object)orAddChild2); ((Graphic)orAddComponent2).color = new Color(0f, 0f, 0f, 0.5765f); orAddComponent.anchorMin = Vector2.zero; orAddComponent.anchorMax = Vector2.one; orAddComponent.pivot = new Vector2(0.5f, 0.5f); orAddComponent.offsetMin = Vector2.zero; orAddComponent.offsetMax = Vector2.zero; if ((Object)(object)instance != (Object)null) { Object.Destroy((Object)(object)instance); } } tooltipUI.setParentUI(parent); instance = tooltipUI; } catch (Exception ex) { Plugin.Logger.LogError((object)"Unable to handle creating TooltipUI due to an error"); Plugin.Logger.LogError((object)ex); } } private void setParentUI(SemiUI parent) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) parentUi = parent; TextMeshProUGUI uiText = parent.uiText; if ((Object)(object)uiText != (Object)null) { ((TMP_Text)Text).font = ((TMP_Text)uiText).font; ((TMP_Text)Text).fontMaterial = ((TMP_Text)uiText).fontMaterial; ((TMP_Text)Text).fontMaterials = ((TMP_Text)uiText).fontMaterials; ((TMP_Text)Text).fontStyle = ((TMP_Text)uiText).fontStyle; ((TMP_Text)Text).fontSharedMaterial = ((TMP_Text)uiText).fontSharedMaterial; ((TMP_Text)Text).fontSharedMaterials = ((TMP_Text)uiText).fontSharedMaterials; ((Graphic)Text).material = ((Graphic)uiText).material; } } protected override void Start() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) instance = this; ((SemiUI)this).Start(); Text = base.uiText; ref RectTransform reference = ref baseRect; Transform textRectTransform = base.textRectTransform; reference = (RectTransform)(object)((textRectTransform is RectTransform) ? textRectTransform : null); textRect = ((Component)Text).gameObject.GetComponent<RectTransform>(); panelRect = ((Component)baseRect).gameObject.getOrAddChild("Panel").GetComponent<RectTransform>(); ((TMP_Text)Text).text = ""; setupTransform(textRect, new Vector2(300f, 300f)); setupTransform(baseRect, new Vector2(300f, 300f)); ((TMP_Text)Text).fontSize = 6f; ((TMP_Text)Text).enableAutoSizing = false; ((TMP_Text)Text).enableWordWrapping = false; ((TMP_Text)Text).richText = false; xAxis = textRect.anchoredPosition.x; yAxis = textRect.anchoredPosition.y; width = textRect.sizeDelta.x; height = textRect.sizeDelta.y; xPivot = textRect.pivot.x; yPivot = textRect.pivot.y; fontSize = ((TMP_Text)Text).fontSize; } private void setSize(Vector2 size) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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) ((Vector2)(ref size))..ctor(Math.Max(size.x, 200f), Math.Max(size.y, 0f)); textRect.sizeDelta = size; baseRect.sizeDelta = size; } private static void setupTransform(RectTransform rectTransform, Vector2 size) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) rectTransform.anchoredPosition = new Vector2(0f, 0f); rectTransform.anchorMin = new Vector2(0f, 1f); rectTransform.anchorMax = new Vector2(0f, 1f); rectTransform.pivot = new Vector2(0f, 1f); rectTransform.sizeDelta = size; } public void clearMessage(ICollection<TooltipKey> keys) { if (messageParts.isEmpty()) { return; } foreach (TooltipKey key in keys) { messageParts.Remove(key); } hasMessageChanged = true; } public void clearMessage() { if (!messageParts.isEmpty()) { messageParts.Clear(); hasMessageChanged = true; } } public void removeMessage(TooltipKey key) { setMessage(key, null); } public void setMessage(TooltipKey key, string? message) { if (!messageParts.ContainsKey(key)) { if (message == null) { return; } } else { string text = messageParts[key]; if (text == message) { if (text == null) { messageParts.Remove(key); } return; } } if (message == null) { messageParts.Remove(key); } else { messageParts[key] = message; } hasMessageChanged = true; } public ICollection<TooltipKey> getInvalidKeys() { if (messageParts.isEmpty()) { return new List<TooltipKey>(); } SortedDictionary<TooltipKey, string>.KeyCollection keys = messageParts.Keys; RunManager val = RunManager.instance; if ((Object)(object)val == (Object)null) { return keys; } Level levelCurrent = val.levelCurrent; if ((Object)(object)levelCurrent == (Object)null) { return keys; } List<TooltipKey> list = new List<TooltipKey>(); foreach (TooltipKey item in keys) { if (!item.predicate(val, levelCurrent)) { list.Add(item); } } return list; } protected override void Update() { //IL_011c: Unknown result type (might be due to invalid IL or missing references) if (messageParts.isEmpty()) { if (state != 0) { ((SemiUI)this).Hide(); state = ChangingState.HIDDEN; } } else if (state == ChangingState.HIDDEN) { ((SemiUI)this).Show(); state = ChangingState.SHOWING; } else if (!base.isHidden) { state = ChangingState.SHOWN; } ((SemiUI)this).Update(); ICollection<TooltipKey> invalidKeys = getInvalidKeys(); if (invalidKeys.isNotEmpty()) { clearMessage(invalidKeys); } else if (hasMessageChanged) { string text = ((!messageParts.isNotEmpty()) ? "" : string.Join("\n", messageParts.Select<KeyValuePair<TooltipKey, string>, string>(delegate(KeyValuePair<TooltipKey, string> pair) { pair.Deconstruct(out var key, out var value); return string.Join("\n", key.name, value); }))); ((TMP_Text)Text).text = text; hasMessageChanged = false; } setSize(new Vector2(((TMP_Text)Text).preferredWidth, ((TMP_Text)Text).preferredHeight)); } } public class TooltipKey : IComparable<TooltipKey> { public readonly bool showName; public readonly LevelPredicate predicate; public int index { get; } public string name { get; } public TooltipKey(int index, string name, bool showName = false, LevelPredicate? predicate = null) { this.index = index; this.name = name; this.showName = showName; this.predicate = predicate ?? LevelUtils.GENERAL_VALID_PREDICATE; base..ctor(); } public int CompareTo(TooltipKey? other) { if (this == other) { return 0; } return (other == null) ? 1 : index.CompareTo(other.index); } public override bool Equals(object? obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (!(obj is TooltipKey tooltipKey)) { return false; } return index == tooltipKey.index && name == tooltipKey.name; } public override int GetHashCode() { return (index * 397) ^ name.GetHashCode(); } } public class ConfigInstance : LayeredConfigFile { public readonly Getter<bool> enableDebugLogging; public readonly Getter<bool> clientSideMode; public readonly Getter<IList<string>> textureSwapTargets; public readonly Getter<bool> shouldRestrictQueries; public readonly Getter<float> tooltipRange; public readonly Getter<float> tooltipWaitTime; public readonly Getter<bool> showBasicTooltipInfo; public readonly Getter<bool> showDescriptionInTooltipInfo; public readonly Getter<bool> showTagsInTooltipInfo; public readonly Getter<bool> showDebugTooltipInfo; public readonly Getter<bool> sendTooltipInfoToLog; public readonly Getter<int> infoUnpackingAmount; public readonly Getter<float> targetDebugRendererLifeSpan; public readonly Getter<bool> showTargetDebugRenderer; public readonly Getter<int> dynamicQueriesLevelCount; public readonly Getter<bool> onlyFirstAnimationFrame; public readonly Getter<bool> allowTranscodingVideos; public readonly Getter<bool> prioritizeNewPictures; public readonly Getter<bool> prioritizeNewPicturesAcrossLevels; public readonly Getter<float> minAudioDistance; public readonly Getter<float> maxAudioDistance; public readonly Getter<IList<string>> directoryLocations; public readonly Getter<IList<string>> staticWebMedia; public readonly Getter<bool> funny; public readonly Getter<IList<string>> blacklistedTags; public readonly Getter<bool> enableGlobalBlacklist; public readonly Getter<IList<string>> whitelistedTags; private readonly ConfigFile primaryConfigFile; private readonly ConfigFile userSettingsConfigFile; private static readonly IList<string> DEFAULT_TEXTURE_TARGETS = new List<string>(4) { "\"^(?=.*painting.*)((?!.*frame.*)).*$\"mi", "\"^(magazine\\d*) \\(Instance\\)$\"mi", "\"(magazine stack)\"mi", "\"(Graffiti)\"mi" }; public ConfigInstance(BaseUnityPlugin plugin, ConfigFile primaryConfigFile) : base(plugin) { this.primaryConfigFile = primaryConfigFile; userSettingsConfigFile = (ConfigFile)(object)new DummyConfigFile("user_settings", MetadataHelper.GetMetadata((object)plugin)); configFileOrder.Add(primaryConfigFile); configFileOrder.Add(userSettingsConfigFile); io.wispforest.textureswapper.utils.Converter<string, IList<string>> converter = Converter.COMMA_SEPARATED_LIST.xmap((IList<string> input) => input.Where((string s) => !Utility.IsNullOrWhiteSpace(s) && s.Length > 0).ToList(), (IList<string> input) => input); primaryConfigFile.section("Common").bind("ClientSideMode", "Enables the ability to use a client based random value that pseudo syncs if the photos are the same on all clients", defaultValue: false, out clientSideMode, (Builder<bool, bool>?)null).bind<string, IList<string>>("TextureTargets", "All texture targets to replace with custom images, Seperated by commas (,) without any spaces", DEFAULT_TEXTURE_TARGETS, out textureSwapTargets, converter) .bind<string, IList<string>>("DisallowedTags", "A list of tags that are disallowed from being shown, Seperated by commas (,) without any spaces", new List<string>(), out blacklistedTags, converter) .bind("EnableGlobalBlacklist", "Enables the Global Blacklist for generally unsafe queries, disable at your own risk when allowing Restrictive Queries", defaultValue: false, out enableGlobalBlacklist, (Builder<bool, bool>?)null) .bind<string, IList<string>>("AllowedTags", "A list of tags that are allowed to be shown, Seperated by commas (,) without any spaces", new List<string>(), out whitelistedTags, converter); userSettingsConfigFile.section("Tooltip").bind("WaitTime", "Adjust the time between checking for a tooltip object the player is looking at", UserSettings.property((UserSettings.SettingsData data) => data.tooltipWaitTime, (UserSettings.SettingsData data, float v) => data.tooltipWaitTime = v).setGetter(out tooltipWaitTime)).bind("Range", "Adjust how far a given tooltip object may be picked up", UserSettings.property((UserSettings.SettingsData data) => data.tooltipRange, (UserSettings.SettingsData data, float v) => data.tooltipRange = v).setGetter(out tooltipRange)) .bind("ShowBasicInfoInTooltip", "Adjust if the basic info should show within the tooltip", UserSettings.property((UserSettings.SettingsData data) => data.showBasicTooltipInfo, (UserSettings.SettingsData data, bool v) => data.showBasicTooltipInfo = v).setGetter(out showBasicTooltipInfo)) .bind("ShowDebugInfoInTooltip", "Toggles if debug info will show within tooltip info", UserSettings.property((UserSettings.SettingsData data) => data.showDebugTooltipInfo, (UserSettings.SettingsData data, bool v) => data.showDebugTooltipInfo = v).setGetter(out showDebugTooltipInfo)) .bind("ShowTagsInTooltipInfo", "Toggles if tag information will show up in tooltip info", UserSettings.property((UserSettings.SettingsData data) => data.showTagsInTooltipInfo, (UserSettings.SettingsData data, bool v) => data.showTagsInTooltipInfo = v).setGetter(out showTagsInTooltipInfo)) .bind("ShowDescriptionInTooltipInfo", "Toggles if description information will show up in tooltip info", UserSettings.property((UserSettings.SettingsData data) => data.showDescriptionInTooltipInfo, (UserSettings.SettingsData data, bool v) => data.showDescriptionInTooltipInfo = v).setGetter(out showDescriptionInTooltipInfo)) .bind("SendTooltipInfoToLog", "Attempt to send tooltip info to log", UserSettings.property((UserSettings.SettingsData data) => data.sendTooltipInfoToLog, (UserSettings.SettingsData data, bool v) => data.sendTooltipInfoToLog = v).setGetter(out sendTooltipInfoToLog)); primaryConfigFile.section("DebugInfo").bind("UnpackingAmount", "Adjust how many parents will be unpacked before getting the info from the given targeted object", 1, out infoUnpackingAmount, (Builder<int, int>?)null).bind("ShowTargetDebugRenderer", "When enabled, will add a line renderer to the targeted object when ray casting", defaultValue: false, out showTargetDebugRenderer, (Builder<bool, bool>?)null) .bind("TargetDebugRendererLifeSpan", "Adjust the amount of time the given targeted objects debug renderer will persist for", 6f, out targetDebugRendererLifeSpan, (Builder<float, float>?)null); primaryConfigFile.section("SwapperSettings").bind("DynamicQueriesLevelCount", "Max levels required to complete before dynamic queries are reloaded for new entries", 4, out dynamicQueriesLevelCount, (Builder<int, int>?)null).bind("OnlyFirstAnimationFrame", "Only uses the first frame of animation instead of all frames", defaultValue: false, out onlyFirstAnimationFrame, (Builder<bool, bool>?)null) .bind("AllowTranscodingVideos", "Allows for the ability to transcode video if codec or format is not directly support by unity", defaultValue: false, out allowTranscodingVideos, (Builder<bool, bool>?)null) .bind("PrioritizeNewPictures", "Attempts to place newer pictures first over already existing pictures", defaultValue: true, out prioritizeNewPictures, (Builder<bool, bool>?)null) .bind("PrioritizeNewPicturesAcrossLevels", "Transfers PrioritizeNewPictures data across levels to fully place newer pictures first over already existing pictures", defaultValue: true, out prioritizeNewPicturesAcrossLevels, (Builder<bool, bool>?)null) .bind("MinAudioDistance", "Minimum distance from the swapped asset in which audio will stay at maximum", 0.5f, out minAudioDistance, (Builder<float, float>?)null) .bind("MaxAudioDistance", "Maximum distance from the swapped asset in which audio can be heard", 6.5f, out maxAudioDistance, (Builder<float, float>?)null); primaryConfigFile.section("BuiltinQuerySettings").bind<string, IList<string>>("DirectoryLocations", "Location of all directories to be looked at for images, Seperated by commas (,) without any spaces", new List<string>(), out directoryLocations, converter).bind<string, IList<string>>("StaticWebMedia", "Location of all photos to be downloaded, Seperated by commas (,) without any spaces", new List<string>(), out staticWebMedia, converter) .bind("Funny", "Its funny", defaultValue: true, out funny, (Builder<bool, bool>?)null); System.Converter<TagFilteringData, IList<string>> converter2 = (TagFilteringData input) => input.tags; io.wispforest.textureswapper.utils.Converter<string, TagFilteringData> converter3 = converter.xmap((IList<string> input) => new TagFilteringData(input), converter2); userSettingsConfigFile.section("User Specific").bind("DebugLogging", "Enables some useful debug logging to check and or validate if things are going properly", UserSettings.property((UserSettings.SettingsData data) => data.debugLogging, (UserSettings.SettingsData data, bool v) => data.debugLogging = v).setGetter(out enableDebugLogging)).bind("RestrictiveQueries", "Will attempt to restrict the queries allowed as an attempt to be safer with image content that is requested", UserSettings.property((UserSettings.SettingsData data) => data.restrictiveQueries, (UserSettings.SettingsData data, bool v) => data.restrictiveQueries = v).setGetter(out shouldRestrictQueries)) .bind("DisallowedTags", "A list of tags that are disallowed from being shown, Seperated by commas (,) without any spaces", UserSettings.property((UserSettings.SettingsData data) => data.blackListData, (UserSettings.SettingsData data, TagFilteringData v) => data.blackListData = v).setGetter(out blacklistedTags, converter2), converter3) .bind("AllowedTags", "A list of tags that are allowed to be shown, Seperated by commas (,) without any spaces", UserSettings.property((UserSettings.SettingsData data) => data.whiteListData, (UserSettings.SettingsData data, TagFilteringData v) => data.whiteListData = v).setGetter(out whitelistedTags, converter2), converter3); } public void reloadPrimaryConfig() { primaryConfigFile.Reload(); } } public static class PropertyExt { public static Property<T> setGetter<T>(this Property<T> property, out Getter<T> getter) { getter = property.asGetter(); return property; } public static Property<T> setGetter<T, R>(this Property<T> property, out Getter<R> getter, System.Converter<T, R> converter) { System.Converter<T, R> converter2 = converter; Property<T> property2 = property; getter = () => converter2(property2.get()); return property2; } public static Getter<T> asGetter<T>(this Property<T> property) { return property.get; } } public class PhotonEndecAddon { private static bool hasTypeBeenRegistered; internal static void init() { if (!hasTypeBeenRegistered) { hasTypeBeenRegistered = true; } } static PhotonEndecAddon() { hasTypeBeenRegistered = false; init(); } } public static class PhotonStreamExtensions { static PhotonStreamExtensions() { PhotonEndecAddon.init(); } public static PhotonStreamOperation handleObject<T>(this PhotonStream stream, Func<T> encodeGetter, Action<T> decodeHandler) where T : EndecGetter<T> { if (stream.IsWriting) { stream.addObject<T>(encodeGetter()); return PhotonStreamOperation.ENCODE; } decodeHandler(stream.getObject<T>()); return PhotonStreamOperation.DECODE; } public static PhotonStreamOperation handleObject<T>(this PhotonStream stream, ref T t) where T : EndecGetter<T> { if (stream.IsWriting) { stream.addObject<T>(t); return PhotonStreamOperation.ENCODE; } t = stream.getObject<T>(); return PhotonStreamOperation.DECODE; } public static void addObject<T>(this PhotonStream stream, T data) where T : EndecGetter<T> { if (!stream.IsWriting) { throw new Exception("You can not write a object to a PhotonStream that is currently reading!"); } stream.SendNext((object)new EndecedStructWrapper<T>(data).getBytes()); } public static T getObject<T>(this PhotonStream stream) where T : EndecGetter<T> { if (!stream.IsReading) { throw new Exception("You can not read an object from a PhotonStream that is currently writting!"); } object obj = stream.PeekNext(); if (obj is byte[] bytes) { stream.ReceiveNext(); return ByteDataAccess.decodeFromBytes<T>(EndecGetter.Endec<T>(), bytes); } throw new Exception($"Unable to use the current peeked object from a PhotonStream due to the type mismatch! [Type: {obj.GetType()}, Required Type: PhotonEndecHolder]"); } public static void dumpPhotonStreamToLog(this PhotonStream stream, Action<Action<Action<string>>> logActionCallback) { Type type2 = ((object)stream).GetType(); FieldInfo field = type2.GetField("currentItem", BindingFlags.Instance); List<object> list = new List<object>(); int currentIndex = (field?.GetValue(stream) as int?).GetValueOrDefault(-1); list.AddRange(stream.ToArray()); logActionCallback(delegate(Action<string> logAction) { logAction("Dumping the given PhotonStream Data: "); }); for (int i = 0; i < list.Count; i++) { object obj = list[i]; Type type = obj.GetType(); logActionCallback(delegate(Action<string> logAction) { logAction(string.Format(" [{0}, {1}]: Type=({2}), Object:({3})", i, (currentIndex == i) ? "X" : "O", type.FullName, obj)); }); } } } public enum PhotonStreamOperation { ENCODE, DECODE } public class ByteDataHolder : ByteDataAccess { private byte[] bytes = new byte[0]; public ByteDataAccess setBytes(byte[] bytes) { this.bytes = bytes; return this; } public byte[] getBytes() { return bytes; } public override bool Equals(object? obj) { if (this == obj) { return true; } if (this != null) { return getBytes().Equals(((ByteDataAccess)this).getBytes()); } return false; } public override int GetHashCode() { return bytes.GetHashCode(); } } public interface ByteDataAccess { byte[] getBytes(); static byte[] encodeAsBytes<T>(Endec<T> endec, T data) { MemoryStream stream = new MemoryStream(); ((Endec<BinaryWriter>)(object)endec).encodeFully<BinaryWriter>((Func<Serializer<BinaryWriter>>)(() => (Serializer<BinaryWriter>)(object)BinaryWriterSerializer.of(new BinaryWriter(stream))), (BinaryWriter)data); return stream.GetBuffer(); } static T decodeFromBytes<T>(Endec<T> endec, byte[] bytes) { return ((Endec<BinaryReader>)(object)endec).decodeFully<BinaryReader>((Func<BinaryReader, Deserializer<BinaryReader>>)((BinaryReader reader) => (Deserializer<BinaryReader>)(object)BinaryReaderDeserializer.of(reader)), new BinaryReader(new MemoryStream(bytes))); } } internal sealed class EndecedStructWrapper<T> : StructWrapper, ByteDataAccess where T : EndecGetter<T> { public readonly T data; public EndecedStructWrapper(T data) : base(typeof(ByteDataAccess), (WrappedType)0) { this.data = data; } public static EndecedStructWrapper<T> of<T>(object obj) where T : EndecGetter<T> { if (!(obj is T val) || 1 == 0) { throw new Exception($"Unable to create EndecedStructWrapper as the object is not the correct type! [Type: {typeof(object)}, Obj: {obj}]"); } return new EndecedStructWrapper<T>(val); } public byte[] getBytes() { return ByteDataAccess.encodeAsBytes(EndecGetter.Endec<T>(), data); } public override bool Equals(object? obj) { if (this == obj) { return true; } if (obj is EndecedStructWrapper<T> endecedStructWrapper) { return ((object)data).Equals((object?)endecedStructWrapper.data); } return false; } public override int GetHashCode() { return ((object)data).GetHashCode(); } public override object Box() { return data; } public override void DisconnectFromPool() { } public override void Dispose() { } public override string ToString() { return ((object)StructWrapperUtility.Unwrap<T>((object)this)).ToString(); } public override string ToString(bool writeTypeInfo) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return writeTypeInfo ? $"(EndecedStructWrapper<{base.wrappedType}>){((object)StructWrapperUtility.Unwrap<T>((object)this)).ToString()}" : ((object)this).ToString(); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("TextureSwapper", "Texture Swapper", "1.2.0")] public class Plugin : BaseUnityPlugin { public delegate void AdditionalQueryLookup(Action<Identifier, IList<MediaQuery>> addCallback); internal static readonly List<string> RAW_NAMES = new List<string>(4) { "texture_swapper_queries", "painting_swapper_images", "RandomPaintingSwap_Images", "CustomPaintings" }; private static Plugin? _INSTANCE = null; private static ManualLogSource? _LOGGER = null; private static ConfigInstance? _CONFIG_ACCESS = null; private static Thread? _MAIN_THREAD = null; private readonly Harmony _harmony = new Harmony("TextureSwapper"); internal static string id = "texture_swapper"; private static MonoEvent _EVENTS; private static bool? _IS_FUNNY_PERSON; private List<string> directoriesToBeLoaded = new List<string>(); internal static Identifier funnyId = Identifier.ofUri("https://i.imgur.com/0GTrjm7.jpeg"); private bool hasLoadedQueries = false; private readonly Dictionary<Identifier, IList<MediaQuery>> dynamicTypeToQueries = new Dictionary<Identifier, IList<MediaQuery>>(); private int pastLevelsCompleted = 0; private ISet<Guid> oldDynamicQueries = new HashSet<Guid>(); private bool mustLoadQueriesFirst = true; internal static int funnyChance = 3; internal static Plugin Instance => getOrThrow(_INSTANCE, "Texture Swapper _instance"); internal static ManualLogSource Logger => getOrThrow<ManualLogSource>(_LOGGER, "Texture Swapper _logger"); internal static ConfigInstance config => getOrThrow(_CONFIG_ACCESS, "Texture Swapper _config_access"); internal static ActiveSwapperStats? prevHolder { get; set; } = null; internal static string TempStoragePath => Path.Combine(Application.temporaryCachePath, "painting_swapper"); internal static string TempVideoStoragePath => Path.Combine(TempStoragePath, "videos"); internal static string TempImageStoragePath => Path.Combine(TempStoragePath, "images"); internal static string TempAudioStoragePath => Path.Combine(TempStoragePath, "audio"); internal static MonoEvent Events => getOrThrow(_EVENTS, "Texture Swapper _instance"); public static bool isFunnyPerson { get { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) if (!config.funny()) { return false; } if (!_IS_FUNNY_PERSON.HasValue && SteamClient.IsValid) { _IS_FUNNY_PERSON = SteamClient.SteamId.Value == 76561198385078416L; Logger.LogInfo((object)$"Current User SteamID: {SteamClient.SteamId.Value}"); } return _IS_FUNNY_PERSON.GetValueOrDefault(); } } public static Keybind refreshClientData { get; private set; } public static event AdditionalQueryLookup ADDITIONAL_QUERY_LOOKUP; private static T getOrThrow<T>(T? value, string fieldName) { if (value != null) { return value; } throw new NullReferenceException("Unable to get " + fieldName + " as it has not been initialized yet."); } public static void logIfDebugging(Action<ManualLogSource> logAction, Func<bool>? predicate = null) { if (config.enableDebugLogging() && (predicate == null || predicate())) { logAction(Logger); } } public static void logIfDebugging(Func<string> message, Func<bool>? predicate = null) { if (config.enableDebugLogging() && (predicate == null || predicate())) { Logger.LogInfo((object)message()); } } public static bool isMainThread() { return Thread.CurrentThread == _MAIN_THREAD; } private void Awake() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown _LOGGER = ((BaseUnityPlugin)this).Logger; _INSTANCE = this; GameObject val = new GameObject("TextureSwapperEventHolder"); ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)val); _EVENTS = val.AddComponent<MonoEvent>(); Events.onUpdateCallback += delegate { onUpdate(); }; _CONFIG_ACCESS = new ConfigInstance((BaseUnityPlugin)(object)this, ((BaseUnityPlugin)this).Config); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Texture Swapper has begun setup..."); logIfDebugging(delegate(ManualLogSource source) { source.LogError((object)("Using the following path to store files temporarily: " + TempStoragePath)); }); FileUtils.deleteOldFiles(TempStoragePath, 2); string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); if (_MAIN_THREAD == null) { _MAIN_THREAD = Thread.CurrentThread; } LocalFiles.init(); MediaIdentifiers.initErrorImages(directoryName); _harmony.PatchAll(typeof(SemiFuncPatch)); _harmony.PatchAll(typeof(RunManagerPatch)); _harmony.PatchAll(typeof(DefaultPoolPatch)); _harmony.PatchAll(typeof(UnityEngineObjectPatch)); _harmony.PatchAll(typeof(EnergyUIPatch)); _harmony.PatchAll(typeof(HealthUIPatch)); if (Chainloader.PluginInfos.ContainsKey("bulletbot.keybindlib")) { _harmony.PatchAll(typeof(KeybindsPatch)); } PhotonEndecAddon.init(); PrefabInstantiationEvent.onPrefabInstantiation += delegate(GameObject gameObject, string _, Vector3 _, Quaternion _) { SwapperComponentSetupUtils.commonSide(gameObject); }; ObjectInstantiateEvent.onObjectInstantiation += delegate(Object o, Vector3? position, Quaternion? rotation) { GameObject val2 = (GameObject)(object)((o is GameObject) ? o : null); if (val2 != null) { if (!SemiFunc.IsMultiplayer() && hasLoadedQueries) { SwapperComponentSetupUtils.commonSide(val2); } MeshRenderer[] componentsInChildren = val2.GetComponentsInChildren<MeshRenderer>(); if (componentsInChildren != null) { MeshRendererCache.getOrCreate().addRenderers(new List<MeshRenderer>(componentsInChildren)); } } else { MeshRenderer val3 = (MeshRenderer)(object)((o is MeshRenderer) ? o : null); if (val3 != null) { MeshRendererCache.getOrCreate().addRenderer(val3); } } }; SceneManager.sceneLoaded += delegate { MeshRendererCache.getOrCreate().getRenderers(refreshRenderers: true); }; LevelEvents.ON_CHANGE += handleDynamicQueries; BasicTooltipInfo.init(); DebugTooltipInfo.init(); refreshClientData = Keybinds.Bind("Refresh", "Refresh Client Side Data", "<No Binding>"); DebugErrors.decodeErrorHook = delegate(object o, Exception exception) { object o2 = o; Exception exception2 = exception; logIfDebugging(delegate(ManualLogSource logger) { logger.LogError((object)"Error occured within endec when decoding object: "); logger.LogError((object)("Object: " + o2.ToString())); logger.LogError((object)exception2); }); }; Logger.LogInfo((object)"Plugin Texture Swapper loaded Successfully!"); } public void Start() { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); Logger.LogInfo((object)"Plugin Texture Swapper starting!"); List<string> list = new List<string>(); list.Add(Path.Combine(directoryName, RAW_NAMES[0])); list.AddRange(config.directoryLocations()); list.Add(Path.Combine(Paths.ConfigPath, "texture_swapper_queries")); foreach (string directory in list) { try { if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)("Folder " + directory + " created successfully!")); }); } else { logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)("Folder " + directory + " detected!)")); }); } } catch (Exception ex) { Exception ex2 = ex; Exception e = ex2; logIfDebugging(delegate(ManualLogSource source) { source.LogError((object)("Unable to create directory [" + directory + "]:")); source.LogError((object)e); }); } } string directoryName2 = Path.GetDirectoryName(directoryName); string[] directories = Directory.GetDirectories(directoryName2); foreach (string text in directories) { foreach (string rAW_NAME in RAW_NAMES) { string item = Path.Combine(text, rAW_NAME); if (Directory.Exists(text)) { list.Add(item); } } } directoriesToBeLoaded = list; hasLoadedQueries = false; if (config.funny()) { ADDITIONAL_QUERY_LOOKUP += delegate(Action<Identifier, IList<MediaQuery>> callback) { callback(StaticWebQueryType.ID, new List<MediaQuery>(1) { StaticWebQuery.of(new List<string>(1) { "https://i.imgur.com/0GTrjm7.jpeg" }) }); }; } Logger.LogInfo((object)"Plugin Texture Swapper started Successfully!"); } internal void loadQueries(string? levelName = null) { if (hasLoadedQueries) { return; } if (levelName != null) { RunManager instance = RunManager.instance; if (levelName.Equals(((Object)instance.levelMainMenu).name) || levelName.Equals(((Object)instance.levelSplashScreen).name) || levelName.Equals(((Object)instance.levelTutorial).name)) { return; } } Logger.LogInfo((object)"Attempting Texture Swapper Loading!"); Dictionary<Identifier, IList<MediaQuery>> typeToQueries = new Dictionary<Identifier, IList<MediaQuery>>(); Plugin.ADDITIONAL_QUERY_LOOKUP?.Invoke(delegate(Identifier identifier, IList<MediaQuery> list) { typeToQueries.computeIfAbsent(identifier, (Identifier _) => new List<MediaQuery>()).addAll(list); }); StructEndec<QueryEntries> queryEntriesEndec = StructEndecBuilder.of<QueryEntries, IDictionary<Identifier, IList<MediaQuery>>, IDictionary<Identifier, IList<MediaQuery>>>(MediaQueryTypeRegistry.GROUPED_QUERY_DATA.optionalFieldOf<QueryEntries>("query_entries", (Func<QueryEntries, IDictionary<Identifier, IList<MediaQuery>>>)((QueryEntries pair) => pair.queries), (Func<IDictionary<Identifier, IList<MediaQuery>>>)(() => new Dictionary<Identifier, IList<MediaQuery>>())), MediaQueryTypeRegistry.GROUPED_QUERY_DATA.optionalFieldOf<QueryEntries>("dynamic_query_entries", (Func<QueryEntries, IDictionary<Identifier, IList<MediaQuery>>>)((QueryEntries pair) => pair.queries), (Func<IDictionary<Identifier, IList<MediaQuery>>>)(() => new Dictionary<Identifier, IList<MediaQuery>>())), (Func<IDictionary<Identifier, IList<MediaQuery>>, IDictionary<Identifier, IList<MediaQuery>>, QueryEntries>)((IDictionary<Identifier, IList<MediaQuery>> queries, IDictionary<Identifier, IList<MediaQuery>> dynamicQueries) => new QueryEntries(queries, dynamicQueries))); Task.Run(delegate { foreach (string item in directoriesToBeLoaded) { try { typeToQueries.computeIfAbsent(LocalMediaQueryType.ID, (Identifier _) => new List<MediaQuery>()).Add(LocalMediaQuery.ofDirectory(item)); } catch (Exception arg) { Logger.LogError((object)$"Unable to query local directory: {arg}"); } if (Directory.Exists(item)) { string[] files = Directory.GetFiles(item, "*.json"); string[] array = files; foreach (string text in array) { try { QueryEntries queryEntries = JsonUtils.parseFromFile<QueryEntries>(text, (Endec<QueryEntries>)(object)queryEntriesEndec); if (queryEntries != null) { typeToQueries.merge(queryEntries.queries); dynamicTypeToQueries.merge(queryEntries.dynamicQueries); } } catch (Exception arg2) { Logger.LogError((object)$"Unable to parse the given file [{text}] as MediaQueries: {arg2}"); } } } } runQueries("alternative_censor_images", UserSettings.data.alternativeCensorImages); runQueries("static_queries", typeToQueries); runQueries("dynamic_queries", dynamicTypeToQueries); }); Logger.LogInfo((object)"Queued up all loading for Texture Swapper!"); hasLoadedQueries = true; } private void handleDynamicQueries(int levelsCompleted, string level) { int num = config.dynamicQueriesLevelCount(); funnyChance = Math.Min(100, funnyChance * 2); if (levelsCompleted == 0) { foreach (Guid oldDynamicQuery in oldDynamicQueries) { MediaSwapperStorage.removeMediaWithGuid(oldDynamicQuery); } oldDynamicQueries.Clear(); return; } int num2 = levelsCompleted - pastLevelsCompleted; if (num2 >= num - 1 && mustLoadQueriesFirst) { Dictionary<Identifier, IList<MediaQuery>> newDynamicTypeToQueries = new Dictionary<Identifier, IList<MediaQuery>>(); dynamicTypeToQueries.forEach<Identifier, IList<MediaQuery>>(delegate(Identifier identifier, IList<MediaQuery> list) { newDynamicTypeToQueries[identifier] = list.Select(delegate(MediaQuery query) { oldDynamicQueries.Add(query.guid); return query.createFrom(); }).ToList(); }); runQueries("dynamic_queries", newDynamicTypeToQueries); mustLoadQueriesFirst = false; } else if (num2 >= num) { MediaSwapperStorage.removeMediaWithGuids(oldDynamicQueries); oldDynamicQueries.Clear(); mustLoadQueriesFirst = true; pastLevelsCompleted = levelsCompleted; } } internal static void runQueries(string entryName, IDictionary<Identifier, IList<MediaQuery>> typeToQueries) { string entryName2 = entryName; IDictionary<Identifier, IList<MediaQuery>> typeToQueries2 = typeToQueries; if (typeToQueries2.Count <= 0) { return; } Task.Run(delegate { Logger.LogInfo((object)("Running Media Queries in Texture Swapper [" + entryName2 + "]")); foreach (KeyValuePair<Identifier, IList<MediaQuery>> entry in typeToQueries2) { Identifier key = entry.Key; SemaphoreIdentifier semaphoreIdentifier = MediaQueryTypeRegistry.getTypeDyn(key).createSemaphoreIdentifier(true); MultiThreadHelper.run(semaphoreIdentifier, delegate { foreach (MediaQuery item in entry.Value) { if (!MediaQueryTypeRegistry.attemptToHandleQuery(item)) { Logger.LogError((object)$"Unable to handle the given query: [Id: {entry.Key}]"); } } }); } Logger.LogInfo((object)"Ran all queries, results are to be appearing within the future"); }); } private void onUpdate() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) MediaSwapperStorage.handleToBeStoredHandlers(); MainThreadHelper.handleActionsOnMainThread(); ImageSequenceHolder.actIfPresent(delegate(ImageSequenceHolder holder) { holder.checkIfMaterialsLoaded(); }); MultiThreadHelper.INSTANCE.pruneTasks(); DebugTooltipInfo.update(); BasicTooltipInfo.update(); if (!SemiFunc.InputDown(refreshClientData.inputKey)) { return; } config.reloadPrimaryConfig(); Scene activeScene = SceneManager.GetActiveScene(); GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects(); GameObject[] array = rootGameObjects; foreach (GameObject val in array) { if (((Object)val).name.Equals("Level Generator")) { SwapperComponentSetupUtils.unswapScene(val); ActiveSwapperStats.getOrCreate().reset(); SwapperComponentSetupUtils.commonSide(val); } } } } public class QueryEntries { public IDictionary<Identifier, IList<MediaQuery>> queries { get; } public IDictionary<Identifier, IList<MediaQuery>> dynamicQueries { get; } public QueryEntries(IDictionary<Identifier, IList<MediaQuery>> queries, IDictionary<Identifier, IList<MediaQuery>> dynamicQueries) { this.queries = queries; this.dynamicQueries = dynamicQueries; base..ctor(); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "TextureSwapper"; public const string PLUGIN_NAME = "Texture Swapper"; public const string PLUGIN_VERSION = "1.2.0"; } } namespace io.wispforest.textureswapper.patches { [HarmonyPatch(typeof(DefaultPool))] public class DefaultPoolPatch { [HarmonyPatch("Instantiate")] [HarmonyPostfix] [HarmonyPriority(0)] private static void AwakePatch(string prefabId, Vector3 position, Quaternion rotation, ref GameObject __result) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) PrefabInstantiationEvent.onInstantiation(__result, prefabId, position, rotation); } } [HarmonyPatch(typeof(Keybinds))] public class KeybindsPatch { [HarmonyPatch("GetPluginByCallingAssembly")] [HarmonyPostfix] [HarmonyPriority(0)] private static void AlterAssemblyCheck(Assembly assembly, ref BepInPlugin __result) { if (__result == null) { __result = (from x in assembly.GetTypes() select ((MemberInfo)x).GetCustomAttribute<BepInPlugin>()).selectNonNull().FirstOrDefault() ?? (from x in assembly.GetExportedTypes() select ((MemberInfo)x).GetCustomAttribute<BepInPlugin>()).selectNonNull().FirstOrDefault(); } } } [HarmonyPatch(typeof(RunManager))] internal static class RunManagerPatch { [HarmonyPatch("RestartScene")] [HarmonyPrefix] [HarmonyPriority(0)] private static void RestartScenePatch() { RunManager instance = RunManager.instance; LevelEvents.onLevelChange(instance.levelsCompleted, ((Object)instance.levelCurrent).name); } } [HarmonyPatch(typeof(SemiFunc))] public class SemiFuncPatch { [HarmonyPatch("MenuActionSingleplayerGame")] [HarmonyPrefix] [HarmonyPriority(0)] private static void singlePlayerStart() { Plugin.logIfDebugging(() => "Starting SinglePlayer!"); Plugin.Instance.loadQueries(); } [HarmonyPatch("MenuActionHostGame")] [HarmonyPrefix] [HarmonyPriority(0)] private static void multiplayerStart() { Plugin.logIfDebugging(() => "Starting MultiPlayer!"); Plugin.Instance.loadQueries(); } [HarmonyPatch("OnSceneSwitch")] [HarmonyPrefix] [HarmonyPriority(0)] private static void onSceneSwitch(bool _gameOver, bool _leaveGame) { string levelName = ((Object)RunManager.instance.levelCurrent).name; Plugin.logIfDebugging(() => "Switching scene! Level: " + levelName); Plugin.Instance.loadQueries(levelName); } } [HarmonyPatch(typeof(Object))] public class UnityEngineObjectPatch { [CompilerGenerated] private sealed class <TargetMethods>d__0 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IEnumerator, IDisposable { private int <>1__state; private MethodBase <>2__current; private int <>l__initialThreadId; private IEnumerable<MethodInfo> <allMethods>5__1; private IEnumerator<MethodInfo> <>s__2; private MethodInfo <method>5__3; private ParameterInfo[] <parameters>5__4; private int <length>5__5; private Type[] <genericTypes>5__6; private Type[] <>s__7; private int <>s__8; private Type <genericType>5__9; private Type[] <>s__10; private int <>s__11; private Type <genericType>5__12; private Type[] <>s__13; private int <>s__14; private Type <genericType>5__15; MethodBase IEnumerator<MethodBase>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TargetMethods>d__0(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || (uint)(num - 1) <= 7u) { try { } finally { <>m__Finally1(); } } <allMethods>5__1 = null; <>s__2 = null; <method>5__3 = null; <parameters>5__4 = null; <genericTypes>5__6 = null; <>s__7 = null; <genericType>5__9 = null; <>s__10 = null; <genericType>5__12 = null; <>s__13 = null; <genericType>5__15 = null; <>1__state = -2; } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <allMethods>5__1 = from m in typeof(Object).GetMethods(BindingFlags.Static | BindingFlags.Public) where m.Name == "Instantiate" select m; <>s__2 = <allMethods>5__1.GetEnumerator(); <>1__state = -3; goto IL_05a7; case 1: <>1__state = -3; goto IL_0591; case 2: <>1__state = -3; <genericType>5__9 = null; <>s__8++; goto IL_01d1; case 3: <>1__state = -3; goto IL_0591; case 4: <>1__state = -3; <genericType>5__12 = null; <>s__11++; goto IL_030d; case 5: <>1__state = -3; goto IL_03b6; case 6: <>1__state = -3; goto IL_0591; case 7: <>1__state = -3; goto IL_0591; case 8: { <>1__state = -3; <genericType>5__15 = null; <>s__14++; goto IL_0578; } IL_01d1: if (<>s__8 < <>s__7.Length) { <genericType>5__9 = <>s__7[<>s__8]; <>2__current = <method>5__3.MakeGenericMethod(<genericType>5__9); <>1__state = 2; return true; } <>s__7 = null; goto IL_0591; IL_0591: <parameters>5__4 = null; <genericTypes>5__6 = null; <method>5__3 = null; goto IL_05a7; IL_05a7: if (<>s__2.MoveNext()) { <method>5__3 = <>s__2.Current; <parameters>5__4 = <method>5__3.GetParameters(); <length>5__5 = <parameters>5__4.Length; <genericTypes>5__6 = new Type[1] { typeof(Object) }; if (<length>5__5 == 1) { if (!<method>5__3.IsGenericMethodDefinition) { <>2__current = <method>5__3; <>1__state = 1; return true; } <>s__7 = <genericTypes>5__6; <>s__8 = 0; goto IL_01d1; } if (<length>5__5 == 2) { if (!<method>5__3.IsGenericMethodDefinition) { if (<parameters>5__4.isMatch(typeof(Object), typeof(Scene))) { <>2__current = <method>5__3; <>1__state = 3; return true; } } else if (<parameters>5__4.isMatch(1, typeof(InstantiateParameters))) { <>s__10 = <genericTypes>5__6; <>s__11 = 0; goto IL_030d; } } else if (<length>5__5 == 3) { if (!<method>5__3.IsGenericMethodDefinition) { if (<parameters>5__4.isMatch(typeof(Object), typeof(Vector3), typeof(Quaternion))) { <>2__current = <method>5__3; <>1__state = 5; return true; } goto IL_03b6; } } else if (<length>5__5 == 4) { if (!<method>5__3.IsGenericMethodDefinition) { if (<parameters>5__4.isMatch(typeof(Object), typeof(Vector3), typeof(Quaternion), typeof(Transform))) { <>2__current = <method>5__3; <>1__state = 7; return true; } } else if (<parameters>5__4.isMatch(typeof(Object), typeof(Vector3), typeof(Quaternion), typeof(InstantiateParameters))) { <>s__13 = <genericTypes>5__6; <>s__14 = 0; goto IL_0578; } } goto IL_0591; } <>m__Finally1(); <>s__2 = null; return false; IL_03b6: if (<parameters>5__4.isMatch(typeof(Object), typeof(Transform), typeof(bool))) { <>2__current = <method>5__3; <>1__state = 6; return true; } goto IL_0591; IL_0578: if (<>s__14 < <>s__13.Length) { <genericType>5__15 = <>s__13[<>s__14]; <>2__current = <method>5__3.MakeGenericMethod(<genericType>5__15); <>1__state = 8; return true; } <>s__13 = null; goto IL_0591; IL_030d: if (<>s__11 < <>s__10.Length) { <genericType>5__12 = <>s__10[<>s__11]; <>2__current = <method>5__3.MakeGenericMethod(<genericType>5__12); <>1__state = 4; return true; } <>s__10 = null; goto IL_0591; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__2 != null) { <>s__2.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<MethodBase> IEnumerable<MethodBase>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <TargetMethods>d__0(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<MethodBase>)this).GetEnumerator(); } } [IteratorStateMachine(typeof(<TargetMethods>d__0))] private static IEnumerable<MethodBase> TargetMethods() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TargetMethods>d__0(-2); } [HarmonyPostfix] public static void afterObjectInstantiation(Object __result) { ObjectInstantiateEvent.setupAndRun(__result); } } internal static class ParameterInfosExt { public static bool isMatch(this ParameterInfo[] array, params Type[] pattern) { return array.isMatch(0, pattern); } public static bool isMatch(this ParameterInfo[] array, int offset = 0, params Type[] pattern) { if (array.Length < pattern.Length + offset) { return false; } for (int i = 0; i < pattern.Length; i++) { ParameterInfo parameterInfo = array[offset + i]; Type type = pattern[i]; if (parameterInfo.GetType() != type) { return false; } } return true; } } } namespace io.wispforest.textureswapper.patches.ui { [HarmonyPatch(typeof(EnergyUI))] public class EnergyUIPatch { [HarmonyPatch("Start")] [HarmonyPrefix] [HarmonyPriority(0)] private static void StartHook(EnergyUI __instance) { TooltipUI.setupTooltipUI((SemiUI)(object)__instance); } } [HarmonyPatch(typeof(HealthUI))] public class HealthUIPatch { [HarmonyPatch("Start")] [HarmonyPrefix] [HarmonyPriority(0)] private static void StartHook(EnergyUI __instance) { TooltipUI.setupTooltipUI((SemiUI)(object)__instance); } } } namespace io.wispforest.textureswapper.utils { public static class ConfigFileExtensions { public static SectionBinder section(this ConfigFile file, string section) { return new SectionBinder(file, section); } public static void settingsChangedSafe<T>(this ConfigEntry<T> entry, EntryChangedHandler<T> changedHandler) { EntryChangedHandler<T> changedHandler2 = changedHandler; bool isLocked = false; entry.SettingChanged += delegate(object sender, EventArgs _) { if (!isLocked) { ConfigEntry<T> changedEntry = sender as ConfigEntry<T>; if (changedEntry != null) { isLocked = true; changedHandler2((ConfigEntryBase)(object)changedEntry, changedEntry.Value, (T t) => changedEntry.Value = t); isLocked = false; } } }; } } public class ConfigEntryBuilder<T, R> { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private SectionBinder <binder>P; [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string <key>P; private Converter<T, R> converter; private R _defaultValue; private bool hasDefaultValue; private string? _description; private AcceptableValueBase? _acceptableValues; private object[]? _tags; internal EntryChangedHandler<R>? _onChangeCallback; private bool hasDescription; public ConfigEntryBuilder(SectionBinder binder, string key, Converter<T, R> converter) { <binder>P = binder; <key>P = key; this.converter = converter; hasDefaultValue = false; hasDescription = false; base..ctor(); } internal ConfigEntryBuilder<T, R> handle(Builder<T, R>? builder) { builder?.Invoke(this); return this; } public ConfigEntryBuilder<T, R> defaultValue(R defaultValue) { _defaultValue = defaultValue; hasDefaultValue = true; return this; } public ConfigEntryBuilder<T, R> description(string? description) { _description = description; return this; } public ConfigEntryBuilder<T, R> description(AcceptableValueBase acceptableValues) { _acceptableValues = acceptableValues; return this; } public ConfigEntryBuilder<T, R> tags(object[]? tags) { _tags = tags; return this; } public ConfigEntryBuilder<T, R> onChange(EntryChangedHandler<R> callback) { _onChangeCallback = _onChangeCallback?.and(callback) ?? callback; return this; } public ConfigEntryBuilder<T, R> onChange(Validator<R> validator) { Validator<R> validator2 = validator; return onChange(delegate(ConfigEntryBase _, R newValue, Func<R, R> setter) { R value = validator2(newValue); setter(value); Plugin.logIfDebugging(() => $"{<key>P} value has been updated! Value: [{value}]"); }); } public SectionBinder bind(out ConfigEntry<T> field) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) ConfigDescription configDescription = ((!hasDescription) ? ((ConfigDescription)null) : new ConfigDescription(_description ?? "", _acceptableValues, _tags ?? Array.Empty<object>())); <binder>P.bind(out field, <key>P, hasDefaultValue ? converter.from(_defaultValue) : default(T), configDescription); if (_onChangeCallback != null) { field.settingsChangedSafe(delegate(ConfigEntryBase entry, T value, Func<T, T> setter) { Func<T, T> setter2 = setter; _onChangeCallback(entry, converter.to(value), (R v) => converter.to(setter2(converter.from(v)))); }); } return <binder>P; } } public delegate void Builder<T, R>(ConfigEntryBuilder<T, R> builder); public delegate T Validator<T>(T t); public delegate void EntryChangedHandler<T>(ConfigEntryBase entry, T newValue, Func<T, T> setter); public static class EntryChangedHandlerExt { public static EntryChangedHandler<T> and<T>(this EntryChangedHandler<T> baseHandler, EntryChangedHandler<T> extraHandler) { EntryChangedHandler<T> baseHandler2 = baseHandler; EntryChangedHandler<T> extraHandler2 = extraHandler; return delegate(ConfigEntryBase entry, T value, Func<T, T> setter) { baseHandler2(entry, value, setter); extraHandler2(entry, value, setter); }; } } public interface Converter { static readonly Converter<string, IList<string>> COMMA_SEPARATED_LIST = of((string input) => input.Split(",").ToList(), (IList<string> input) => GeneralExtensions.Join<string>((IEnumerable<string>)input, (Func<string, string>)null, ",")); static Converter<T, R> of<T, R>(System.Converter<T, R> to, System.Converter<R, T> from) { return new ConvertorImpl<T, R>(to, from); } static Converter<T, T> of<T>() { return new ConvertorImpl<T, T>((T t) => t, (T t) => t); } } public interface Converter<T, R> : Converter { R to(T t); T from(R r); Converter<T, A> xmap<A>(System.Converter<R, A> to, System.Converter<A, R> from) { System.Converter<R, A> to2 = to; System.Converter<A, R> from2 = from; return new ConvertorImpl<T, A>((T t) => to2(this.to(t)), (A a) => this.from(from2(a))); } } internal class ConvertorImpl<T, R> : Converter<T, R>, Converter { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private System.Converter<T, R> <_to>P; [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private System.Converter<R, T> <_from>P; public ConvertorImpl(System.Converter<T, R> _to, System.Converter<R, T> _from) { <_to>P = _to; <_from>P = _from; base..ctor(); } public R to(T t) { return <_to>P(t); } public T from(R r) { return <_from>P(r); } } public class SectionBinder { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private ConfigFile <configFile>P; [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string <section>P; public SectionBinder(ConfigFile configFile, string section) { <configFile>P = configFile; <section>P = section; base..ctor(); } public SectionBinder bind<T>(string key, T defaultValue, Builder<T, T>? builderAction) { ConfigEntry<T> field; return bind(key, (string?)null, defaultValue, out field, builderAction); } public SectionBinder bind<T>(string key, T defaultValue, out ConfigEntry<T> field, Builder<T, T>? builderAction) { return bind(key, (string?)null, defaultValue, out field, builderAction); } public SectionBinder bind<T>(string key, string description, T defaultValue, Builder<T, T>? builderAction = null) { ConfigEntry<T> field; return bind(key, description, defaultValue, out field, builderAction); } public SectionBinder bind<T>(string key, string description, Property<T> property, Builder<T, T>? builderAction = null) { Builder<T, T> builderAction2 = builderAction; Property<T> property2 = property; ConfigEntry<T> field; return bind(key, description, property2.get(), out field, (Builder<T, T>?)delegate(ConfigEntryBuilder<T, T> builder) { builder.handle(builderAction2).onChange(property2.set); }); } public SectionBinder bind<T, R>(string key, string description, Property<R> property, Converter<T, R> converter, Builder<T, R>? builderAction = null) { Builder<T, R> builderAction2 = builderAction; Property<R> property2 = property; Getter<R> getter; return bind(key, description, property2.get(), out getter, converter, delegate(ConfigEntryBuilder<T, R> builder) { builder.handle(builderAction2).onChange(property2.set); }); } public SectionBinder bind<T>(string key, string? description, T defaultValue, out ConfigEntry<T> field, Builder<T, T>? builderAction = null) { new ConfigEntryBuilder<T, T>(this, key, Converter.of<T>()).description(description).defaultValue(defaultValue).handle(builderAction) .bind(out field); return this; } public SectionBinder bind<T>(string key, string? description, T defaultValue, out Getter<T> getter, Builder<T, T>? builderAction = null) { bind(key, description, defaultValue, out ConfigEntry<T> entry, builderAction); getter = () => entry.Value; return this; } public SectionBinder bind<T, R>(string key, string? description, R defaultValue, Converter<T, R> converter, Builder<T, R>? builderAction = null) { Getter<R> getter; return bind(key, description, defaultValue, out getter, converter, builderAction); } public SectionBinder bind<T, R>(string key, string? description, R defaultValue, out Getter<R> getter, Converter<T, R> converter, Builder<T, R>? builderAction = null) { Converter<T, R> converter2 = converter; bool hasChanged = true; new ConfigEntryBuilder<T, R>(this, key, converter2).description(description).defaultValue(defaultValue).handle(builderAction) .onChange(delegate { hasChanged = true; }) .bind(out ConfigEntry<T> field); R value = converter2.to(field.Value); getter = delegate { if (hasChanged) { value = converter2.to(field.Value); } return value; }; return this; } internal SectionBinder bind<T>(out ConfigEntry<T> field, string key, T defaultValue, ConfigDescription? configDescription = null) { field = <configFile>P.Bind<T>(<section>P, key, defaultValue, configDescription); return this; } } public class ObjectInstantiateEvent { public delegate void PostInstantiation(Object obj, Vector3? position, Quaternion? rotation); public static event PostInstantiation? onObjectInstantiation; public static void setupAndRun(object __result, object[]? __args = null) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) Object val = (Object)((__result is Object) ? __result : null); if (val == null) { return; } Plugin.Logger.LogInfo((object)$"Name: {val.name}, Type: {((object)val).GetType()}"); try { Vector3? position = null; Quaternion? rotation = null; if (__args != null) { foreach (object obj in __args) { if (obj is Vector3 value) { position = value; } else if (obj is Quaternion value2) { rotation = value2; } } } onInstantiation(val, position, rotation); } catch (Exception ex) { Plugin.Logger.LogError((object)ex); } } public static void onInstantiation(Object obj, Vector3? position, Quaternion? rotation) { ObjectInstantiateEvent.onObjectInstantiation?.Invoke(obj, position, rotation); } } public class SwapperComponentSetupUtils { public delegate bool MeshEntryMatcher(MeshRenderer renderer, int materialIndex, Material material, Action<Material> setCallback); public delegate void MeshEntryHandler(MeshRenderer renderer, int materialIndex, Material material, Action<Material> setCallback); public static void unswapScene(GameObject rootObject) { if (!Plugin.config.clientSideMode()) { return; } foreach (GameObject item in rootObject.unpackGameObject()) { item.GetComponent<SwapperHandlerHolder>()?.unswapAllTextures(item); } } public static void commonSide(GameObject rootObject, bool clientSideOverride = false) { Level levelCurrent = RunManager.instance.levelCurrent; try { foreach (GameObject obj in rootObject.unpackGameObject()) { tryToAdjustMaterial(levelCurrent, obj, delegate(MeshRenderer mesh, int i, Material material, Action<Material> setAction) { MeshRenderer mesh2 = mesh; Material material2 = material; Action<Material> setAction2 = setAction; if (Plugin.config.clientSideMode() || clientSideOverride) { fullClientSideSetup(obj, mesh2, i, material2, setAction2); } else { MediaIdentifierComponent orAddComponent = ComponentHolderProtocol.GetOrAddComponent<MediaIdentifierComponent>((Object)(object)obj); if (PhotonNetwork.LocalPlayer.IsMasterClient) { Identifier identifier = ActiveSwapperStats.getOrCreate().actOrWaitWithHandler(delegate(MeshSwapper handler) { obj.setSwapperHolder(mesh2, i, material2, setAction2, handler); }); if (identifier == null) { return; } if (orAddComponent != null) { orAddComponent.setId(identifier); } else { Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogWarning((object)"Unable to create or get the needed Painting Component for given obj"); }); } } PhotonView orAddComponent2 = ComponentHolderProtocol.GetOrAddComponent<PhotonView>((Object)(object)obj); Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)("Target Object preparing for Texture Component Replacment: " + ((Object)obj).name)); }); if ((Object)(object)orAddComponent2 == (Object)null) { Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)"Target Object was unable to have a Photon View\n"); }); } else { Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)"Target Object View will now track Painting Component!\n"); }); PhotonView photonView = PunExtensions.GetPhotonView(obj); (photonView.ObservedComponents ?? (photonView.ObservedComponents = new List<Component>())).Add((Component)(object)orAddComponent); } } }); } } catch (Exception ex) { Plugin.Logger.LogError((object)"An error has occured when adjusting painting material!"); Plugin.Logger.LogError((object)ex); } } public static void fullClientSideSetup(GameObject obj, MeshRenderer mesh, int i, Material material, Action<Material> setAction) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_0061: Unknown result type (might be due to invalid IL or missing references) GameObject obj2 = obj; MeshRenderer mesh2 = mesh; Material material2 = material; Action<Material> setAction2 = setAction; Vector3 position = obj2.transform.position; int value = BitConverter.ToInt32(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes($"{position.x:R},{position.y:R},{position.z:R}")), 0); ActiveSwapperStats.getOrCreate().actOrWaitWithHandler(delegate(MeshSwapper handler) { obj2.setSwapperHolder(mesh2, i, material2, setAction2, handler); }, value); } public static void clientPaintingDataChange(GameObject obj, FullMediaData fullData) { FullMediaData fullData2 = fullData; GameObject obj2 = obj; MediaSwapperStorage.loadIfNotFound(fullData2); Level levelCurrent = RunManager.instance.levelCurrent; tryToAdjustMaterial(levelCurrent, obj2, delegate(MeshRenderer mesh, int i, Material material, Action<Material> setAction) { MeshRenderer mesh2 = mesh; Material material2 = material; Action<Material> setAction2 = setAction; Identifier id = fullData2.id; if (MediaIdentifiers.ERROR.Equals(id) || !MediaSwapperStorage.hasMaterial(id)) { Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)$"Unable to Set Clients Material: {id}"); }); } MediaSwapperStorage.getOrActWithHandler(id, delegate(MeshSwapper handler) { if (isCensored(MediaSwapperStorage.getResult(id))) { handler = MediaSwapperStorage.getHandler<MeshSwapper>(UserSettings.getAlternativeCensorImage() ?? MediaIdentifiers.CENSORED); Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)$"The given entry {id} has been censored due to being blacklisted!"); }); } obj2.gameObject.setSwapperHolder(mesh2, i, material2, setAction2, handler); Plugin.logIfDebugging(delegate(ManualLogSource source) { source.LogInfo((object)$"Set Clients Material: {id}"); }); }); }); } public static bool doseObjectSupportMeshSwapping(Level level, GameObject gameObject) { return searchMaterial(level, gameObject); } public static void tryToAdjustMaterial(Level level, GameObject gameObject, MeshEntryHandler handler) { MeshEntryHandler handler2 = handler; searchMaterial(level, gameObject, delegate(MeshRenderer mesh, int i, Material material, Action<Material> setAction) { handler2(mesh, i, material, setAction); return false; }); } public static bool searchMaterial(Level level, GameObject gameObject, MeshEntryMatcher? matcher = null) { List<Regex> source = Plugin.config.textureSwapTargets().Select(RegexUtils.parseRegexWithFlags).ToList(); MeshRenderer[] components = gameObject.GetComponents<MeshRenderer>(); foreach (MeshRenderer mesh in components) { Material[] sharedMaterials = ((Renderer)mesh).sharedMaterials; if (sharedMaterials == null) { continue; } for (int j = 0; j < sharedMaterials.Length; j++) { Material val = sharedMaterials[j]; if (!((Object)(object)val != (Object)null)) { continue; } string name = ((Object)val).name; if (source.Any((Regex regex) => regex.IsMatch(name)) || source.Any((Regex regex) => regex.IsMatch(((Object)((Component)mesh).gameObject).name))) { int targetIndex = j; Action<Material> setCallback = delegate(Material newMaterial) { sharedMaterials[targetIndex] = newMaterial; ((Renderer)mesh).sharedMaterials = sharedMaterials; }; if (matcher == null || matcher(mesh, targetIndex, val, setCallback)) { return true; } } } } return false; } public static bool isCensored(MediaQueryResult queryResult) { if (Plugin.config.shouldRestrictQueries() && queryResult is RatedMediaResult ratedMediaResult && !ratedMediaResult.isSafe()) { return true; } if (queryResult is TaggedMediaResult taggedMediaResult) { foreach (string item in Plugin.config.blacklistedTags()) { if (taggedMediaResult.hasTag(item)) { return true; } } } return false; } } public static class DebugTooltipInfo { private static bool toggledTooltipEnabled = Plugin.config.showDebugTooltipInfo(); private static float countDown = 0f; public static Keybind dumpInfoBind { get; private set; } public static Keybind toggleTooltipInfoBind { get; private set; } public static void init() { dumpInfoBind = Keybinds.Bind("Debug", "Dump Debug Info", "<No Binding>"); toggleTooltipInfoBind = Keybinds.Bind("Debug", "Toggle Debug Tooltip Info", "<No Binding>"); ArgKey<float> rangeKey = ArgKey.optional("range", ArgumentParsers.floatNum(), 50f); ArgKey<int> unpackAmountKey = ArgKey.optional("unpack", ArgumentParsers.integerNum(), 1); ArgumentChatCommand.createAndRegister(Plugin.Logger, "rayCastToObj", "Attempts to raycast an object in the scene and dump its structure", new List<ArgKey>(2) { rangeKey, unpackAmountKey }, delegate(bool _, Arguments arguments) { dumpInfo(arguments.get(rangeKey), arguments.get(unpackAmountKey), findNewObj: true); }); } private static void dumpInfo(float? range = null, int? unpackAmount = null, bool findNewObj = false, Func<string?, bool>? messageHandler = null) { float range2 = range ?? Plugin.config.tooltipRange(); int unpackAmount2 = unpackAmount ?? Plugin.config.infoUnpackingAmount(); string info = getInfo(range2, unpackAmount2, findNewObj); if (messageHandler == null || messageHandler(info)) { Plugin.Logger.LogInfo((object)("Dumped Debug Info: \n" + (info ?? "No target found!"))); } } public static string? getInfo(float range, int unpackAmount, bool findNewObj = false) { MeshRayCaster orCreate = MeshRayCaster.getOrCreate(); Component val = (findNewObj ? orCreate.raycast(range) : orCreate.currentComponent); if ((Object)(object)val == (Object)null) { return null; } GameObject gameObject = ((Component)val.transform).gameObject; gameObject = gameObject.getParent(unpackAmount); return gameObject.dumpDebugInfoTree(" ", " -> ", delegate(object o, List<object> list) { MeshRenderer val2 = (MeshRenderer)((o is MeshRenderer) ? o : null); if (val2 != null) { list.Add(((Renderer)val2).material); list.addAll(((Renderer)val2).materials); list.Add(((Renderer)val2).sharedMaterial); list.addAll(((Renderer)val2).sharedMaterials); } }, (object o) => o is MeshWireframeRenderer); } internal static void update() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.InputDown(dumpInfoBind.inputKey)) { dumpInfo(null, null, findNewObj: true); } if (SemiFunc.InputDown(toggleTooltipInfoBind.inputKey)) { toggledTooltipEnabled = !toggledTooltipEnabled; } if (!TooltipUI.DEBUG.predicate.isValid()) { return; } if (toggledTooltipEnabled) { countDown -= Time.deltaTime; if (countDown < 0f) { dumpInfo(null, null, findNewObj: false, delegate(string? info) { TooltipUI.instance?.setMessage(TooltipUI.DEBUG, info); return false; }); countDown = Plugin.config.tooltipWaitTime(); } } else { TooltipUI.instance?.removeMessage(TooltipUI.BASIC); } } } public delegate void ExecuteFunc(bool isDebug, Arguments args); public delegate bool AccessPredicate(); public class ArgumentChatCommand : ChatCommand { public ArgumentChatCommand(ManualLogSource logger, string name, string description, List<ArgKey> arguments, ExecuteFunc func, AccessPredicate? predicate = null, bool debugOnly = true) : base(name, description, fromExecuteFunc(name, logger, arguments, func), createSuggestionProvider(logger, arguments), (predicate == null) ? ((Func<bool>)(() => true)) : new Func<bool>(predicate.Invoke), debugOnly) { } public static void createAndRegister(ManualLogSource logger, string name, string description, List<ArgKey> arguments, ExecuteFunc func, AccessPredicate? predicate = null, bool debugOnly = true) { ArgumentChatCommand argumentChatCommand = new ArgumentChatCommand(logger, name, description, arguments, func, predicate, debugOnly); Commands.RegisterCommand((ChatCommand)(object)argumentChatCommand); } private static Action<bool, string[]> fromExecuteFunc(string name, ManualLogSource logger, List<ArgKey> arguments, ExecuteFunc func) { ManualLogSource logger2 = logger; List<ArgKey> arguments2 = arguments; string name2 = name; ExecuteFunc func2 = func; return delegate(bool isDebugConsole, string[] strArgs) { Arguments arguments3 = new Arguments().parseArgs(logger2, arguments2, strArgs); IList<ArgKey> missingArgs = arguments3.getMissingArgs(arguments2); if (missingArgs.isNotEmpty()) { logger2.LogError((object)("Unable to execute '" + name2 + "' as its missing the required args: " + missingArgs.toPrettyString())); } else { func2(isDebugConsole, new Arguments().parseArgs(logger2, arguments2, strArgs)); } }; } private static Func<bool, string, string[], List<string>> createSuggestionProvider(ManualLogSource logger, List<ArgKey> arguments) { ManualLogSource logger2 = logger; List<ArgKey> arguments2 = arguments; return delegate(bool _, string partial, string[] strArgs) { string partial2 = partial; return (from @base in new Arguments().parseArgs(logger2, arguments2, strArgs).getMissingArgs(arguments2) select @base.name + ":" into s where s.StartsWith(partial2) || s.Contains(partial2) select s).ToList(); }; } } public class Arguments { private Dictionary<ArgKey, dynamic> _arguments = new Dictionary<ArgKey, object>(); public Arguments parseArgs(ManualLogSource logger, List<ArgKey> argKeys, string[] args) { foreach (string text in args) { string[] array = text.Split(":"); if (array.Length <= 1) { continue; } bool flag = false; foreach (ArgKey argKey in argKeys) { if (argKey.matches(array[0])) { argKey.setArg(logger, _arguments, array[1]); flag = true; } } if (!flag && !string.IsNullOrWhiteSpace(array[1])) { logger.LogWarning((object)("'" + array[0] + "' is not a valid argument name.")); } } return this; } public IList<ArgKey> getMissingArgs(List<ArgKey> argKeys) { return argKeys.Where((ArgKey key) => !_arguments.ContainsKey(key) && !key.isDefaulted).ToList(); } public T get<T>(ArgKey<T> key) { return key.getArg(_arguments); } } public interface ArgKey { bool isDefaulted { get; } string name { get; } static ArgKey<T> required<T>(string name, ArgumentParser<T> parser) { return new ArgKey<T>(name, parser, isDefaulted: false); } static ArgKey<T> optional<T>(string name, ArgumentParser<T> parser, T defaultValue = default(T)) { return new ArgKey<T>(name, parser, isDefaulted: false, defaultValue); } bool matches(string name); void setArg(ManualLogSource logger, Dictionary<ArgKey, dynamic> parsedArgs, string strValue); } public class ArgKey<T> : ArgKey { private readonly ArgumentParser<T?> _parser; private readonly T _defaultValue; public bool isDefaulted { get; } public string name { get; } internal ArgKey(string name, ArgumentParser<T?> parser, bool isDefaulted, T defaultValue = default(T)) { _parser = parser; _defaultValue = defaultValue; this.isDefaulted = isDefaulted; this.name = name; } public bool matches(string name) { return this.name.Equals(name); } public void setArg(ManualLogSource logger, Dictionary<ArgKey, dynamic> parsedArgs, string strValue) { Result<T> result = _parser(strValue); if (result.hasErrored) { logger.LogWarning((object)("Argument [" + name + "]: " + result.errorMsg)); } else { parsedArgs[this] = result.result; } } public T getArg(Dictionary<ArgKey, dynamic> parsedArgs) { dynamic val = (parsedArgs.ContainsKey(this) ? parsedArgs[this] : null); if (val == null && !isDefaulted) { throw new Exception("Unable to get arg '" + name + "' as the value is not defaulted and was never parsed into arguments!"); } return !(val ?? ((object)_defaultValue)); } } public delegate Result<T?> ArgumentParser<T>(string str); public static class ArgumentParsers { public static ArgumentParser<int> integerNum() { int result; return (string str) => of(int.TryParse(str, out result), result, str); } public static ArgumentParser<float> floatNum() { float result; return (string str) => of(float.TryParse(str, out result), result, str); } public static Result<T?> of<T>(bool wasParsed, T result, string str) { return new Result<T>(result, !wasParsed, "Unable to parse value '" + str + "'"); } } public class Result<T> { public T? result { get; } public bool hasErrored { get; } public string? errorMsg { get; } public Result(T? result, bool hasErrored, string? errorMsg) { this.result = result; this.hasErrored = hasErrored; this.errorMsg = errorMsg; base..ctor(); } } public delegate void EntryHandler<T>(T t); public delegate void EntryUnpacker<T>(T t, List<T> list); public delegate bool EntryIgnorer<in T>(T t); public delegate string EntryNameGetter<T>(T t); public delegate void EntryNestScopeCallback(Action action); public class Extensions { } public static class DictionaryExtensions { public static V computeIfAbsent<K, V>(this IDictionary<K, V> dict, K k, Func<V> func) { Func<V> func2 = func; return dict.computeIfAbsent(k, (K _) => func2()); } public static V computeIfAbsent<K, V>(this IDictionary<K, V> dict, K k, Func<K, V> func) { if (!dict.ContainsKey(k)) { dict[k] = func(k); } return dict[k]; } public static V? removeIfPresent<K, V>(this IDictionary<K, V> dict, K k) where V : class { V result = null; if (dict.ContainsKey(k)) { result = dict[k]; dict.Remove(k); } return result; } public static void forEach<K, V>(this IDictionary<K, V> dict, Action<K, V> func) { foreach (KeyValuePair<K, V> item in dict) { func(item.Key, item.Value); } } public static void merge<K, V>(this IDictionary<K, IList<V>> dict, IDictionary<K, IList<V>> otherDict) { dict.merge<K, IList<V>, V>(otherDict); } public static void merge<K, C1, V>(this IDictionary<K, C1> dict, IDictionary<K, C1> otherDict) where C1 : ICollection<V> { IDictionary<K, C1> dict2 = dict; otherDict.forEach(delegate(K k, C1 vs) { if (dict2.ContainsKey(k)) { dict2[k].addAll(vs); } else { dict2[k] = vs; } }); } } public static class ICollectionExtensions { public static void addAll<T>(this ICollection<T> collection, IEnumerable<T> values) { if (collection is List<T> list && values is List<T> collection2) { list.AddRange(collection2); } foreach (T value in values) { collection.Add(value); } } } public static class IListExtensions { public static IList<T> getSublistSafe<T>(this IList<T> list, int startInclusiveIndex, int endInclusiveIndex = -1) { IList<T> result; if (list.Count <= 0) { IList<T> list2 = new List<T>(); result = list2; } else { result = list.getSublist(startInclusiveIndex, endInclusiveIndex); } return result; } public static IList<T> getSublist<T>(this IList<T> list, int startInclusiveIndex, int endInclusiveIndex = -1) { if (endInclusiveIndex <= -1) { endInclusiveIndex = list.Count - 1; } if (endInclusiveIndex >= list.Count) { throw new ArgumentOutOfRangeException($"End Index is out of bounds of the given list size: [Index: {endInclusiveIndex}, Size: {list.Count}"); } if (startInclusiveIndex >= endInclusiveIndex) { throw new ArgumentOutOfRangeException($"Start Index is out of bounds of a Lists Rnage: [Start: {startInclusiveIndex}"); } if (startInclusiveIndex < 0) { throw new ArgumentOutOfRangeException($"End Index is out of bounds of the given list size: [Index: {endInclusiveIndex}, Size: {list.Count}"); } int num = endInclusiveIndex - startInclusiveIndex; List<T> list2 = new List<T>(num); for (int i = num; i < num; i++) { list2.Add(list[i]); } return list2; } } public static class PairedTupleExtensions { public static L? getLeftOrMapRight<L, R>(this (L?, R?) tuple, Func<R, L?> func) { var (val, val2) = tuple; if (val != null) { return val; } if (val2 == null) { throw new NullReferenceException("Unable to handle Either based tuple method due to the Left and Right values are both Null"); } return func(val2); } } public static class EnumerableUtils { private class DelegatingEnumerable<T> : IEnumerable<T>, IEnumerable { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private Func<IEnumerator<T>> <enumeratorMaker>P; public DelegatingEnumerable(Func<IEnumerator<T>> enumeratorMaker) { <enumeratorMaker>P = enumeratorMaker; base..ctor(); } public IEnumerator<T> GetEnumerator() { return <enumeratorMaker>P(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public static IEnumerable<T> delegating<T>(Func<IEnumerator<T>> enumeratorMaker) { return new DelegatingEnumerable<T>(enumeratorMaker); } public static IEnumerable<T> Concat<T>(this IEnumerable<T> first, Func<IEnumerator<T>> enumeratorMaker) { return first.Concat(delegating(enumeratorMaker)); } public static IEnumerable<T> selectNonNull<T>(this IEnumerable<T?> source) { return from source1 in source where source1 != null select (source1); } public static bool isNotEmpty<T>(this IEnumerable<T> source) { return !source.isEmpty(); } public static bool isEmpty<T>(this IEnumerable<T> source) { return (s
Endec.dll
Decompiled 4 months 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.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using Microsoft.CodeAnalysis; using io.wispforest.endec.impl; using io.wispforest.endec.impl.trace; using io.wispforest.endec.util; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("blodhgarm")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("MIT")] [assembly: AssemblyDescription(" A format-agnostic serialization framework ")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+30862a8a5b6a25fe4d608be0613663ff9fef3569")] [assembly: AssemblyProduct("Endec")] [assembly: AssemblyTitle("Endec")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Dragon-Seeker/endec.csharp")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace io.wispforest.endec { public interface Deserializer<out T> where T : class { SerializationContext setupContext(SerializationContext ctx) { return ctx; } byte readByte(SerializationContext ctx); short readShort(SerializationContext ctx); int readInt(SerializationContext ctx); long readLong(SerializationContext ctx); float readFloat(SerializationContext ctx); double readDouble(SerializationContext ctx); int readVarInt(SerializationContext ctx); long readVarLong(SerializationContext ctx); bool readBoolean(SerializationContext ctx); string readString(SerializationContext ctx); byte[] readBytes(SerializationContext ctx); V? readOptional<V>(SerializationContext ctx, Endec<V> endec); SequenceDeserializer<E> sequence<E>(SerializationContext ctx, Endec<E> elementEndec); MapDeserializer<V> map<V>(SerializationContext ctx, Endec<V> valueEndec); StructDeserializer structed(); V tryRead<V>(Func<Deserializer<T>, V> reader); } public interface SequenceDeserializer<E> : IEnumerator<E>, IEnumerator, IDisposable, IEnumerable<E>, IEnumerable { object? IEnumerator.Current => Current; IEnumerator<E> IEnumerable<E>.GetEnumerator() { return this; } IEnumerator IEnumerable.GetEnumerator() { return this; } int estimatedSize(); } public interface MapDeserializer<E> : IEnumerator<KeyValuePair<string, E>>, IEnumerator, IDisposable, IEnumerable<KeyValuePair<string, E>>, IEnumerable { object? IEnumerator.Current => Current; IEnumerator<KeyValuePair<string, E>> IEnumerable<KeyValuePair<string, E>>.GetEnumerator() { return this; } IEnumerator IEnumerable.GetEnumerator() { return this; } int estimatedSize(); } public interface StructDeserializer { F? field<F>(string name, SerializationContext ctx, Endec<F> endec) { return field(name, ctx, endec, null); } F? field<F>(string name, SerializationContext ctx, Endec<F> endec, Func<F>? defaultValueFactory); } public interface SelfDescribedDeserializer<out T> : Deserializer<T> where T : class { void readAny<S>(SerializationContext ctx, Serializer<S> visitor) where S : class; } public delegate T IntFunction<out T>(int size); public delegate void Encoder<in T>(SerializationContext ctx, Serializer<dynamic> serializer, T value); public delegate T Decoder<out T>(SerializationContext ctx, Deserializer<dynamic> deserializer); public delegate T DecoderWithError<out T>(SerializationContext ctx, Deserializer<dynamic> deserializer, Exception exception); public abstract class Endec<T> : Endec { public abstract void encode<E>(SerializationContext ctx, Serializer<E> serializer, T value) where E : class; public abstract T decode<E>(SerializationContext ctx, Deserializer<E> deserializer) where E : class; public E encodeFully<E>(SerializationContext ctx, Func<Serializer<E>> serializerConstructor, T value) where E : class { Serializer<E> serializer = serializerConstructor(); encode(serializer.setupContext(ctx), serializer, value); return serializer.result(); } public E encodeFully<E>(Func<Serializer<E>> serializerConstructor, T value) where E : class { return encodeFully(SerializationContext.empty(), serializerConstructor, value); } public T decodeFully<E>(SerializationContext ctx, Func<E, Deserializer<E>> deserializerConstructor, E value) where E : class { Deserializer<E> deserializer = deserializerConstructor(value); return decode(deserializer.setupContext(ctx), deserializer); } public T decodeFully<E>(Func<E, Deserializer<E>> deserializerConstructor, E value) where E : class { return decodeFully(SerializationContext.empty(), deserializerConstructor, value); } public Endec<IList<T>> listOf() { return Endec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, IList<T> list) { using SequenceSerializer<T> sequenceSerializer = serializer.sequence(ctx, this, list.Count); foreach (T item in list) { sequenceSerializer.element(item); } }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer) { SequenceDeserializer<T> sequenceDeserializer = deserializer.sequence(ctx, this); List<T> list2 = new List<T>(sequenceDeserializer.estimatedSize()); foreach (T item2 in sequenceDeserializer) { list2.Add(item2); } return list2; }); } public Endec<T[]> arrayOf() { return listOf().xmap((IList<T> list) => list.ToArray(), (T[] array) => new List<T>(array)); } public Endec<IDictionary<string, T>> mapOf() { return mapOf(Endec.DefaultDictionary<string, T>()); } public Endec<M> mapOf<M>(IntFunction<M> mapConstructor) where M : IDictionary<string, T> { IntFunction<M> mapConstructor2 = mapConstructor; return Endec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, M map) { using MapSerializer<T> mapSerializer = serializer.map(ctx, this, map.Count); foreach (KeyValuePair<string, T> item in map) { mapSerializer.entry(item.Key, item.Value); } }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer) { MapDeserializer<T> mapDeserializer = deserializer.map(ctx, this); M result = mapConstructor2(mapDeserializer.estimatedSize()); foreach (KeyValuePair<string, T> item2 in mapDeserializer) { ref M reference = ref result; M val = default(M); if (val == null) { val = reference; reference = ref val; } reference[item2.Key] = item2.Value; } return result; }); } public Endec<IDictionary<K, T>> mapOf<K>(Func<K, string> keyToString, Func<string, K> stringToKey) { return mapOf(Endec.DefaultDictionary<K, T>(), keyToString, stringToKey); } public Endec<M> mapOf<K, M>(IntFunction<M> mapConstructor, Func<K, string> keyToString, Func<string, K> stringToKey) where M : IDictionary<K, T> { return Endec.map(mapConstructor, keyToString, stringToKey, this); } public Endec<T?> optionalOf() { return Endec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, T value) { serializer.writeOptional(ctx, this, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readOptional(ctx, this)); } public Endec<R> xmap<R>(Func<T, R> to, Func<R, T> from) { Func<R, T> from2 = from; Func<T, R> to2 = to; return Endec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, R value) { encode(ctx, serializer, from2(value)); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => to2(decode(ctx, deserializer))); } public Endec<R> xmapWithContext<R>(Func<SerializationContext, T, R> to, Func<SerializationContext, R, T> from) { Func<SerializationContext, R, T> from2 = from; Func<SerializationContext, T, R> to2 = to; return Endec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, R value) { encode(ctx, serializer, from2(ctx, value)); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => to2(ctx, decode(ctx, deserializer))); } public Endec<T> validate(Action<T> validator) { Action<T> validator2 = validator; return xmap(delegate(T t) { validator2(t); return t; }, delegate(T t) { validator2(t); return t; }); } public Endec<T> catchErrors(DecoderWithError<T> decodeOnError) { DecoderWithError<T> decodeOnError2 = decodeOnError; return Endec.of(encode, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer) { SerializationContext ctx2 = ctx; try { return deserializer.tryRead((Deserializer<dynamic> deserializer1) => decode(ctx2, deserializer1)); } catch (Exception exception) { return decodeOnError2(ctx2, deserializer, exception); } }); } public Endec<ISet<T>> setOf() { return listOf().xmap((IList<T> list) => new HashSet<T>(list), (ISet<T> set) => new List<T>(set)); } public KeyedEndec<T> keyed(string key, T defaultValue) { return new KeyedEndec<T>(key, this, defaultValue); } public KeyedEndec<T> keyed(string key, Func<T> defaultValueFactory) { return new KeyedEndec<T>(key, this, defaultValueFactory); } public StructEndec<T> structOf(string name) { string name2 = name; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> _, StructSerializer instance, T value) { instance.field(name2, ctx, this, value); }, (SerializationContext ctx, Deserializer<dynamic> _, StructDeserializer instance) => instance.field(name2, ctx, this)); } public StructField<S, T> fieldOf<S>(string name, Func<S, T> getter) { return new StructField<S, T>(name, this, getter); } public StructField<S, T> optionalFieldOf<S>(string name, Func<S, T?> getter) { return optionalFieldOf(name, getter, null); } public StructField<S, T> optionalFieldOf<S>(string name, Func<S, T?> getter, T? defaultValue) { return new StructField<S, T>(name, optionalOf(), getter, defaultValue); } public StructField<S, T> optionalFieldOf<S>(string name, Func<S, T?> getter, Func<T?> defaultValue) { if (defaultValue == null) { throw new NullReferenceException("Supplier was found to be null which is not permitted for optionalFieldOf"); } return new StructField<S, T>(name, optionalOf(), getter, defaultValue); } } public interface Endec { public enum Test { One = 1, Two } static readonly StructEndec<object> VOID = unit<object>(null); static readonly Endec<bool> BOOLEAN = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, bool value) { serializer.writeBoolean(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readBoolean(ctx)); static readonly Endec<byte> BYTE = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, byte value) { serializer.writeByte(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readByte(ctx)); static readonly Endec<short> SHORT = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, short value) { serializer.writeShort(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readShort(ctx)); static readonly Endec<int> INT = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, int value) { serializer.writeInt(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readInt(ctx)); static readonly Endec<int> VAR_INT = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, int value) { serializer.writeVarInt(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readVarInt(ctx)); static readonly Endec<long> LONG = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, long value) { serializer.writeLong(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readLong(ctx)); static readonly Endec<long> VAR_LONG = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, long value) { serializer.writeVarLong(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readVarLong(ctx)); static readonly Endec<float> FLOAT = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, float value) { serializer.writeFloat(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readFloat(ctx)); static readonly Endec<double> DOUBLE = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, double value) { serializer.writeDouble(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readDouble(ctx)); static readonly Endec<string> STRING = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, string value) { serializer.writeString(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readString(ctx)); static readonly Endec<byte[]> BYTES = of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, byte[] value) { serializer.writeBytes(ctx, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer) => deserializer.readBytes(ctx)); static readonly Endec<int[]> INT_ARRAY = INT.listOf().xmap((IList<int> list) => list.ToArray(), (int[] ints) => new List<int>(ints)); static readonly Endec<long[]> LONG_ARRAY = LONG.listOf().xmap((IList<long> list) => list.ToArray(), (long[] longs) => new List<long>(longs)); static readonly Endec<Guid> GUID = ifAttr(SerializationAttributes.HUMAN_READABLE, STRING.xmap(Guid.Parse, (Guid guid) => guid.ToString())).orElse(BYTES.xmap((byte[] bytes) => new Guid(bytes), (Guid guid) => guid.ToByteArray())); static Endec<V> vectorEndec<C, V>(string name, Endec<C> componentEndec, Func<C, C, V> constructor, Func<V, C> xGetter, Func<V, C> yGetter) { Func<C, C, V> constructor2 = constructor; Func<V, C> xGetter2 = xGetter; Func<V, C> yGetter2 = yGetter; return componentEndec.listOf().validate(validateSize<C>(name, 2)).xmap((IList<C> components) => constructor2(components[0], components[1]), (V vector) => new List<C>(2) { xGetter2(vector), yGetter2(vector) }); } static Endec<V> vectorEndec<C, V>(string name, Endec<C> componentEndec, Func<C, C, C, V> constructor, Func<V, C> xGetter, Func<V, C> yGetter, Func<V, C> zGetter) { Func<C, C, C, V> constructor2 = constructor; Func<V, C> xGetter2 = xGetter; Func<V, C> yGetter2 = yGetter; Func<V, C> zGetter2 = zGetter; return componentEndec.listOf().validate(validateSize<C>(name, 3)).xmap((IList<C> components) => constructor2(components[0], components[1], components[2]), (V vector) => new List<C>(3) { xGetter2(vector), yGetter2(vector), zGetter2(vector) }); } static Endec<V> vectorEndec<C, V>(string name, Endec<C> componentEndec, Func<C, C, C, C, V> constructor, Func<V, C> xGetter, Func<V, C> yGetter, Func<V, C> zGetter, Func<V, C> wGetter) { Func<C, C, C, C, V> constructor2 = constructor; Func<V, C> xGetter2 = xGetter; Func<V, C> yGetter2 = yGetter; Func<V, C> zGetter2 = zGetter; Func<V, C> wGetter2 = wGetter; return componentEndec.listOf().validate(validateSize<C>(name, 4)).xmap((IList<C> components) => constructor2(components[0], components[1], components[2], components[3]), (V vector) => new List<C>(4) { xGetter2(vector), yGetter2(vector), zGetter2(vector), wGetter2(vector) }); } private static Action<IList<C>> validateSize<C>(string name, int requiredSize) { string name2 = name; return delegate(IList<C> collection) { if (collection.Count() != 4) { throw new ArgumentException(name2 + "collection must have " + requiredSize + " elements"); } }; } internal static IntFunction<IDictionary<K, V>> DefaultDictionary<K, V>() { return (int i) => new Dictionary<K, V>(i); } static Endec<T> of<T>(Encoder<T> encoder, Decoder<T> decoder) { return new EndecImpl<T>(encoder, decoder); } static Endec<T> recursive<T>(Func<Endec<T>, Endec<T>> builderFunc) { return new RecursiveEndec<T>(builderFunc); } static StructEndec<T> unit<T>(T instance) { T instance2 = instance; return unit(() => instance2); } static StructEndec<T> unit<T>(Func<T> instanceGetter) { Func<T> instanceGetter2 = instanceGetter; return StructEndec.of(delegate { }, (SerializationContext _, Deserializer<dynamic> _, StructDeserializer _) => instanceGetter2()); } static Endec<IDictionary<K, V>> map<K, V>(Endec<K> keyEndec, Endec<V> valueEndec) { return StructEndecBuilder.of(keyEndec.fieldOf("k", (KeyValuePair<K, V> s) => s.Key), valueEndec.fieldOf("v", (KeyValuePair<K, V> s) => s.Value), (K k, V v) => new KeyValuePair<K, V>(k, v)).listOf().xmap(delegate(IList<KeyValuePair<K, V>> entries) { Dictionary<K, V> dictionary = new Dictionary<K, V>(entries.Count); dictionary.AddAll(entries); return dictionary; }, (IDictionary<K, V> kvMap) => new List<KeyValuePair<K, V>>(kvMap)); } static Endec<IDictionary<K, V>> map<K, V>(Func<K, string> keyToString, Func<string, K> stringToKey, Endec<V> valueEndec) { return map(DefaultDictionary<K, V>(), keyToString, stringToKey, valueEndec); } static Endec<M> map<K, V, M>(IntFunction<M> mapConstructor, Func<K, string> keyToString, Func<string, K> stringToKey, Endec<V> valueEndec) where M : IDictionary<K, V> { Endec<V> valueEndec2 = valueEndec; Func<K, string> keyToString2 = keyToString; IntFunction<M> mapConstructor2 = mapConstructor; Func<string, K> stringToKey2 = stringToKey; return of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, M map) { using MapSerializer<V> mapSerializer = serializer.map(ctx, valueEndec2, map.Count); foreach (KeyValuePair<K, V> item in map) { mapSerializer.entry(keyToString2(item.Key), item.Value); } }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer) { MapDeserializer<V> mapDeserializer = deserializer.map(ctx, valueEndec2); M result = mapConstructor2(mapDeserializer.estimatedSize()); foreach (KeyValuePair<string, V> item2 in mapDeserializer) { ref M reference = ref result; M val = default(M); if (val == null) { val = reference; reference = ref val; } reference[stringToKey2(item2.Key)] = item2.Value; } return result; }); } static Endec<E> forEnum<E>() where E : Enum { return forEnum((E arg) => Enum.GetName(typeof(E), arg)); } static void test() { forEnum<Test>(); } static Endec<E> forEnum<E>(Func<E, string?> nameLookup) where E : Enum { Func<E, string?> nameLookup2 = nameLookup; Array enumValues = Enum.GetValues(typeof(E)); Dictionary<string, E?> serializedNames = new Dictionary<string, E>(); Dictionary<E, int> entryToIndex = new Dictionary<E, int>(); int num = 0; foreach (E item in enumValues) { serializedNames[nameLookup2(item)] = item; entryToIndex[item] = num; num++; } Type type = typeof(E); return ifAttr(SerializationAttributes.HUMAN_READABLE, STRING.xmap((string name) => serializedNames[name] ?? throw new Exception(type.Name + " constant with the name of [" + name + "] could not be located!"), (E value) => nameLookup2(value) ?? throw new Exception($"{type.Name} constant with the value of [{value}] could not be located!"))).orElse(VAR_INT.xmap((int ordinal) => (E)enumValues.GetValue(ordinal), (E value) => entryToIndex[value])); } static StructEndec<T> dispatchedStruct<T, K>(Func<K, StructEndec<T>> variantToEndec, Func<T, K> instanceToVariant, Endec<K> variantEndec) { return dispatchedStruct(variantToEndec, instanceToVariant, variantEndec, "type"); } static StructEndec<T> dispatchedStruct<T, K>(Func<K, StructEndec<T>> variantToEndec, Func<T, K> instanceToVariant, Endec<K> variantEndec, string variantKey) { Func<T, K> instanceToVariant2 = instanceToVariant; string variantKey2 = variantKey; Endec<K> variantEndec2 = variantEndec; Func<K, StructEndec<T>> variantToEndec2 = variantToEndec; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, T value) { K val = instanceToVariant2(value); instance.field(variantKey2, ctx, variantEndec2, val); variantToEndec2(val).encodeStruct(ctx, serializer, instance, value); }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) { K arg = instance.field(variantKey2, ctx, variantEndec2); return variantToEndec2(arg).decodeStruct(ctx, deserializer, instance); }); } static StructEndec<T> dispatched<T, K>(Func<K, Endec<T>> variantToEndec, Func<T, K> instanceToVariant, Endec<K> variantEndec) { Func<T, K> instanceToVariant2 = instanceToVariant; Endec<K> variantEndec2 = variantEndec; Func<K, Endec<T>> variantToEndec2 = variantToEndec; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> _, StructSerializer instance, T value) { K val = instanceToVariant2(value); instance.field("variant", ctx, variantEndec2, val); instance.field("instance", ctx, variantToEndec2(val), value); }, delegate(SerializationContext ctx, Deserializer<dynamic> _, StructDeserializer instance) { K arg = instance.field("variant", ctx, variantEndec2); return instance.field("instance", ctx, variantToEndec2(arg)); }); } static StructEndec<T> dispatchedFlatable<T, K>(string variantKey, string instanceKey, Func<K, Endec<T>> variantToEndec, Func<T, K> instanceToVariant, Endec<K> variantEndec) { Func<T, K> instanceToVariant2 = instanceToVariant; Endec<K> variantEndec2 = variantEndec; Func<K, Endec<T>> variantToEndec2 = variantToEndec; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, T value) { K val = instanceToVariant2(value); instance.field("variant", ctx, variantEndec2, val); Endec<T> endec2 = variantToEndec2(val); if (endec2 is StructEndec<T> structEndec2) { structEndec2.encodeStruct(ctx, serializer, instance, value); } else { instance.field("instance", ctx, endec2, value); } }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) { K arg = instance.field("variant", ctx, variantEndec2); Endec<T> endec = variantToEndec2(arg); return (T)((!(endec is StructEndec<T> structEndec)) ? ((object)instance.field("instance", ctx, endec)) : ((object)structEndec.decodeStruct(ctx, deserializer, instance))); }); } static AttributeEndecBuilder<T> ifAttr<T>(SerializationAttribute attribute, Endec<T> endec) { return new AttributeEndecBuilder<T>(endec, attribute); } } public sealed class EndecGetter { public static Endec<T> Endec<T>() where T : EndecGetter<T> { return EndecGetter<T>.Endec(); } } public interface EndecGetter<T> where T : EndecGetter<T> { static Endec<T> Endec() { return (typeof(T).GetMethod("Endec", BindingFlags.Static | BindingFlags.Public).Invoke(null, null) as Endec<T>) ?? throw new InvalidCastException("Unable to get Endec due to it being the incorrect type!"); } } public class SerializationAttributes { public static readonly SerializationAttributeMarker HUMAN_READABLE = SerializationAttribute.marker("human_readable"); } public abstract class SerializationAttribute { public readonly string name; protected SerializationAttribute(string name) { this.name = name; } public static SerializationAttributeMarker marker(string name) { return new SerializationAttributeMarker(name); } public static SerializationAttributeWithValue<T> withValue<T>(string name) { return new SerializationAttributeWithValue<T>(name); } } public sealed class SerializationAttributeMarker : SerializationAttribute, SerializationAttributeInstance { internal SerializationAttributeMarker(string name) : base(name) { } public SerializationAttribute attribute() { return this; } public object value() { return null; } } public sealed class SerializationAttributeWithValue<T> : SerializationAttribute { internal SerializationAttributeWithValue(string name) : base(name) { } public SerializationAttributeInstance instance(T value) { return new InstanceImpl(this, value); } } public interface SerializationAttributeInstance { SerializationAttribute attribute(); object value(); } internal class InstanceImpl : SerializationAttributeInstance { private readonly SerializationAttribute attribute; private readonly object value; internal InstanceImpl(SerializationAttribute attribute, object value) { this.attribute = attribute; this.value = value; } SerializationAttribute SerializationAttributeInstance.attribute() { return attribute; } object SerializationAttributeInstance.value() { return value; } } public class SerializationContext { private static readonly SerializationContext EMPTY = new SerializationContext(new Dictionary<SerializationAttribute, object>(), new HashSet<SerializationAttribute>(), new EndecTrace()); private readonly IDictionary<SerializationAttribute, object> attributeValues; private readonly ISet<SerializationAttribute> suppressedAttributes; private readonly EndecTrace trace; private SerializationContext(IDictionary<SerializationAttribute, object> attributeValues, ISet<SerializationAttribute> suppressedAttributes, EndecTrace trace) { this.attributeValues = attributeValues.ImmutableWrap(); this.suppressedAttributes = suppressedAttributes.ImmutableWrap(); this.trace = trace; } public static SerializationContext empty() { return EMPTY; } public static SerializationContext attributes(params SerializationAttributeInstance[] attributes) { if (attributes.Length != 0) { return new SerializationContext(unpackAttributes(attributes), new HashSet<SerializationAttribute>(), new EndecTrace()); } return EMPTY; } public static SerializationContext suppressed(params SerializationAttribute[] attributes) { if (attributes.Length != 0) { return new SerializationContext(new Dictionary<SerializationAttribute, object>(), new HashSet<SerializationAttribute>(attributes), new EndecTrace()); } return EMPTY; } public SerializationContext withAttributes(params SerializationAttributeInstance[] attributes) { IDictionary<SerializationAttribute, object> dictionary = unpackAttributes(attributes); foreach (KeyValuePair<SerializationAttribute, object> attributeValue in attributeValues) { if (!dictionary.ContainsKey(attributeValue.Key)) { dictionary.Add(attributeValue); } } return new SerializationContext(dictionary, suppressedAttributes, new EndecTrace()); } public SerializationContext withoutAttributes(params SerializationAttribute[] attributes) { Dictionary<SerializationAttribute, object> dictionary = new Dictionary<SerializationAttribute, object>(attributeValues); foreach (SerializationAttribute key in attributes) { dictionary.Remove(key); } return new SerializationContext(dictionary, suppressedAttributes, new EndecTrace()); } public SerializationContext withSuppressed(params SerializationAttribute[] attributes) { HashSet<SerializationAttribute> set = new HashSet<SerializationAttribute>(suppressedAttributes); set.AddAll(attributes); return new SerializationContext(attributeValues, set, new EndecTrace()); } public SerializationContext withoutSuppressed(params SerializationAttribute[] attributes) { HashSet<SerializationAttribute> hashSet = new HashSet<SerializationAttribute>(suppressedAttributes); foreach (SerializationAttribute item in attributes) { hashSet.Remove(item); } return new SerializationContext(attributeValues, hashSet, new EndecTrace()); } public SerializationContext and(SerializationContext other) { Dictionary<SerializationAttribute, object> dictionary = new Dictionary<SerializationAttribute, object>(attributeValues); dictionary.AddAll(other.attributeValues); HashSet<SerializationAttribute> set = new HashSet<SerializationAttribute>(suppressedAttributes); set.AddAll(other.suppressedAttributes); return new SerializationContext(dictionary, set, new EndecTrace()); } public bool hasAttribute(SerializationAttribute attribute) { if (attributeValues.ContainsKey(attribute)) { return !suppressedAttributes.Contains(attribute); } return false; } public A getAttributeValue<A>(SerializationAttributeWithValue<A> attribute) { return (A)attributeValues[attribute]; } public A requireAttributeValue<A>(SerializationAttributeWithValue<A> attribute) { if (hasAttribute(attribute)) { return getAttributeValue(attribute); } throw new MissingAttributeValueException("Context did not provide a value for attribute '" + attribute.name + "'"); } private static IDictionary<SerializationAttribute, object> unpackAttributes(params SerializationAttributeInstance[] attributes) { Dictionary<SerializationAttribute, object> dictionary = new Dictionary<SerializationAttribute, object>(); foreach (SerializationAttributeInstance serializationAttributeInstance in attributes) { dictionary.Add(serializationAttributeInstance.attribute(), serializationAttributeInstance.value()); } return dictionary; } public SerializationContext pushField(string fieldName) { return new SerializationContext(attributeValues, suppressedAttributes, trace.push(new FieldTraceElement(fieldName))); } public SerializationContext pushIndex(int index) { return new SerializationContext(attributeValues, suppressedAttributes, trace.push(new IndexTraceElement(index))); } public void throwMalformedInput(string message) { throw new EndecMalformedInputException(trace, message); } public E exceptionWithTrace<E>(Func<EndecTrace, E> exceptionFactory) where E : Exception { return exceptionFactory(trace); } public override string ToString() { return $"SerializationContext[Attributes: {attributeValues}, SuppressedAttributes: {suppressedAttributes}, CurrentTrace: {trace}]"; } } public interface Serializer<out T> where T : class { SerializationContext setupContext(SerializationContext ctx) { return ctx; } void writeByte(SerializationContext ctx, byte value); void writeShort(SerializationContext ctx, short value); void writeInt(SerializationContext ctx, int value); void writeLong(SerializationContext ctx, long value); void writeFloat(SerializationContext ctx, float value); void writeDouble(SerializationContext ctx, double value); void writeVarInt(SerializationContext ctx, int value); void writeVarLong(SerializationContext ctx, long value); void writeBoolean(SerializationContext ctx, bool value); void writeString(SerializationContext ctx, string value); void writeBytes(SerializationContext ctx, byte[] bytes); void writeOptional<V>(SerializationContext ctx, Endec<V> endec, V? optional); SequenceSerializer<E> sequence<E>(SerializationContext ctx, Endec<E> elementEndec, int size); MapSerializer<V> map<V>(SerializationContext ctx, Endec<V> valueEndec, int size); StructSerializer structed(); T result(); } public interface SequenceSerializer<E> : Endable, IDisposable { void element(E element); } public interface MapSerializer<V> : Endable, IDisposable { void entry(string key, V value); } public interface StructSerializer : Endable, IDisposable { StructSerializer field<F>(string name, SerializationContext ctx, Endec<F> endec, F value) { return field(name, ctx, endec, value, mayOmit: false); } StructSerializer field<F>(string name, SerializationContext ctx, Endec<F> endec, F value, bool mayOmit); } public interface SelfDescribedSerializer<T> : Serializer<T> where T : class { } public delegate void StructuredEncoder<in T>(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, T value); public delegate T StructuredDecoder<out T>(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance); public delegate T StructuredDecoderWithError<out T>(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance, Exception exception); public abstract class StructEndec<T> : Endec<T>, StructEndec, Endec { public abstract void encodeStruct<E>(SerializationContext ctx, Serializer<E> serializer, StructSerializer instance, T value) where E : class; public abstract T decodeStruct<E>(SerializationContext ctx, Deserializer<E> deserializer, StructDeserializer instance) where E : class; public override void encode<E>(SerializationContext ctx, Serializer<E> serializer, T value) { using StructSerializer instance = serializer.structed(); encodeStruct(ctx, serializer, instance, value); } public override T decode<E>(SerializationContext ctx, Deserializer<E> deserializer) { return decodeStruct(ctx, deserializer, deserializer.structed()); } public StructField<S, T> flatFieldOf<S>(Func<S, T> getter) { return new FlatStructField<S, T>(this, getter); } public StructField<M, T> flatInheritedFieldOf<M>() where M : T { return new FlatStructField<M, T>(this, (M m) => (T)(object)m); } public new StructEndec<R> xmap<R>(Func<T, R> to, Func<R, T> from) { Func<R, T> from2 = from; Func<T, R> to2 = to; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, R value) { encodeStruct(ctx, serializer, instance, from2(value)); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => to2(decodeStruct(ctx, deserializer, instance))); } public new StructEndec<R> xmapWithContext<R>(Func<SerializationContext, T, R> to, Func<SerializationContext, R, T> from) { Func<SerializationContext, R, T> from2 = from; Func<SerializationContext, T, R> to2 = to; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, R value) { encodeStruct(ctx, serializer, instance, from2(ctx, value)); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => to2(ctx, decodeStruct(ctx, deserializer, instance))); } public StructEndec<T> structuredCatchErrors(StructuredDecoderWithError<T> decodeOnError) { StructuredDecoderWithError<T> decodeOnError2 = decodeOnError; return StructEndec.of(encodeStruct, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) { SerializationContext ctx2 = ctx; StructDeserializer instance2 = instance; try { return deserializer.tryRead((Deserializer<dynamic> deserializer1) => decodeStruct(ctx2, deserializer1, instance2)); } catch (Exception exception) { return decodeOnError2(ctx2, deserializer, instance2, exception); } }); } public new StructEndec<T> validate(Action<T> validator) { Action<T> validator2 = validator; return xmap(delegate(T t) { validator2(t); return t; }, delegate(T t) { validator2(t); return t; }); } } public interface StructEndec : Endec { static StructEndec<T> of<T>(StructuredEncoder<T> encoder, StructuredDecoder<T> decoder) { return new StructEndecImpl<T>(encoder, decoder); } static StructEndec<T> recursive<T>(Func<StructEndec<T>, StructEndec<T>> builderFunc) { return new RecursiveStructEndec<T>(builderFunc); } static AttributeStructEndecBuilder<T> ifAttr<T>(SerializationAttribute attribute, StructEndec<T> endec) { return new AttributeStructEndecBuilder<T>(endec, attribute); } } } namespace io.wispforest.endec.util { public class BlockWriter { private readonly StringWriter result = new StringWriter(); private readonly Stack<(bool incrementIndentation, string value)> blocks = new Stack<(bool, string)>(); private int indentLevel; public BlockWriter write(string value) { result.Write(value); return this; } public BlockWriter writeln() { writeln(""); return this; } public BlockWriter writeln(string value) { result.Write(value + "\n" + " ".repeat(Math.Max(0, indentLevel))); return this; } public BlockWriter startBlock(string startDelimiter, string endDelimiter) { return startBlock(startDelimiter, endDelimiter, incrementIndentation: true); } public BlockWriter startBlock(string startDelimiter, string endDelimiter, bool incrementIndentation) { if (incrementIndentation) { indentLevel++; writeln(startDelimiter); } else { write(startDelimiter); } blocks.Push((incrementIndentation, endDelimiter)); return this; } public BlockWriter writeBlock(string startDelimiter, string endDelimiter, Action<BlockWriter> consumer) { return writeBlock(startDelimiter, endDelimiter, incrementIndentation: true, consumer); } public BlockWriter writeBlock(string startDelimiter, string endDelimiter, bool incrementIndentation, Action<BlockWriter> consumer) { startBlock(startDelimiter, endDelimiter, incrementIndentation); consumer(this); endBlock(); return this; } public BlockWriter endBlock() { (bool, string) tuple = blocks.Pop(); if (tuple.Item1) { indentLevel--; writeln(); } write(tuple.Item2); return this; } public string buildResult() { return result.ToString(); } } public static class StringExtension { public static string repeat(this string str, int amount) { return new StringBuilder().Insert(0, str, 3).ToString(); } } public interface Endable : IDisposable { void end(); void IDisposable.Dispose() { end(); } } public static class DictionaryExtensions { public static IDictionary<TKey, TValue> ImmutableWrap<TKey, TValue>(this IDictionary<TKey, TValue> dictionary) { return new ReadOnlyDictionary<TKey, TValue>(dictionary); } public static void AddAll<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, IDictionary<TKey, TValue> additional) { foreach (KeyValuePair<TKey, TValue> item in additional) { dictionary.Add(item); } } public static void AddAll<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, IEnumerable<KeyValuePair<TKey, TValue>> additional) { foreach (KeyValuePair<TKey, TValue> item in additional) { dictionary.Add(item); } } public static void PutIfAbsent<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) { if (!dictionary.ContainsKey(key)) { dictionary[key] = value; } } } public static class SetExtensions { public static ISet<T> ImmutableWrap<T>(this ISet<T> set) { return new ReadOnlySet<T>(set); } public static void AddAll<T>(this ISet<T> set, IEnumerable<T> additional) { set.UnionWith(additional); } } public static class EnumerableExtensions { public static ISet<T> ImmutableSet<T>(this IEnumerable<T> set) { return new ReadOnlySet<T>(set); } } public static class CustomAttributeExtensions { public static bool HasCustomAttribute<T>(this Assembly element) where T : Attribute { return element.GetCustomAttribute<T>() != null; } public static bool HasCustomAttribute<T>(this Module element) where T : Attribute { return element.GetCustomAttribute<T>() != null; } public static bool HasCustomAttribute<T>(this MemberInfo element) where T : Attribute { return element.GetCustomAttribute<T>() != null; } public static bool HasCustomAttribute<T>(this ParameterInfo element) where T : Attribute { return element.GetCustomAttribute<T>() != null; } } public interface IndexedEnumerator<out T> : IEnumerator<T>, IEnumerator, IDisposable { int index { get; } } public static class IEnumeratorExtensions { public static IndexedEnumerator<T> GetIndexedEnumerator<T>(this IList<T> list) { return new WrappedIEnumerator<T>(list.GetEnumerator()); } } public class WrappedIEnumerator<T> : IndexedEnumerator<T>, IEnumerator<T>, IEnumerator, IDisposable { [CompilerGenerated] private IEnumerator<T> <enumerator>P; public int index { get; private set; } public T Current => <enumerator>P.Current; object? IEnumerator.Current => Current; public WrappedIEnumerator(IEnumerator<T> enumerator) { <enumerator>P = enumerator; base..ctor(); } public bool MoveNext() { bool num = <enumerator>P.MoveNext(); if (num) { index++; } return num; } public void Reset() { <enumerator>P.Reset(); } public void Dispose() { <enumerator>P.Dispose(); } } public interface MapCarrier { T getWithErrors<T>(SerializationContext ctx, KeyedEndec<T> key); T getWithErrors<T>(KeyedEndec<T> key) { return getWithErrors(SerializationContext.empty(), key); } void put<T>(SerializationContext ctx, KeyedEndec<T> key, T value); void put<T>(KeyedEndec<T> key, T value) { put(SerializationContext.empty(), key, value); } void delete<T>(KeyedEndec<T> key); bool has<T>(KeyedEndec<T> key); T get<T>(SerializationContext ctx, KeyedEndec<T> key) { try { return getWithErrors(ctx, key); } catch (Exception) { return key.defaultValue(); } } T get<T>(KeyedEndec<T> key) { return get(SerializationContext.empty(), key); } void putIfNotNull<T>(KeyedEndec<T> key, T? value) { putIfNotNull(SerializationContext.empty(), key, value); } void putIfNotNull<T>(SerializationContext ctx, KeyedEndec<T> key, T? value) { if (value != null) { put(ctx, key, value); } } void copy<T>(KeyedEndec<T> key, MapCarrier other) { copy(SerializationContext.empty(), key, other); } void copy<T>(SerializationContext ctx, KeyedEndec<T> key, MapCarrier other) { other.put(ctx, key, get(ctx, key)); } void copyIfPresent<T>(KeyedEndec<T> key, MapCarrier other) { copyIfPresent(SerializationContext.empty(), key, other); } void copyIfPresent<T>(SerializationContext ctx, KeyedEndec<T> key, MapCarrier other) { if (has(key)) { copy(ctx, key, other); } } void mutate<T>(KeyedEndec<T> key, Func<T, T> mutator) { mutate(SerializationContext.empty(), key, mutator); } void mutate<T>(SerializationContext ctx, KeyedEndec<T> key, Func<T, T> mutator) { put(ctx, key, mutator(get(ctx, key))); } } public class ReadOnlySet<T> : ISet<T>, ICollection<T>, IEnumerable<T>, IEnumerable { private readonly ISet<T> _set; public int Count => _set.Count; public bool IsReadOnly => true; public ReadOnlySet(ISet<T> set) { _set = set; } public ReadOnlySet(IEnumerable<T> enumerable) { _set = new HashSet<T>(enumerable); } public ReadOnlySet(params T[] entries) { _set = new HashSet<T>(entries); } public void Add(T item) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public void ExceptWith(IEnumerable<T> other) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public void IntersectWith(IEnumerable<T> other) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public bool IsProperSubsetOf(IEnumerable<T> other) { return _set.IsProperSubsetOf(other); } public bool IsProperSupersetOf(IEnumerable<T> other) { return _set.IsProperSupersetOf(other); } public bool IsSubsetOf(IEnumerable<T> other) { return _set.IsSubsetOf(other); } public bool IsSupersetOf(IEnumerable<T> other) { return _set.IsSupersetOf(other); } public bool Overlaps(IEnumerable<T> other) { return _set.Overlaps(other); } public bool SetEquals(IEnumerable<T> other) { return _set.SetEquals(other); } public void SymmetricExceptWith(IEnumerable<T> other) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public void UnionWith(IEnumerable<T> other) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } bool ISet<T>.Add(T item) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public void Clear() { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public bool Contains(T item) { return _set.Contains(item); } public void CopyTo(T[] array, int arrayIndex) { _set.CopyTo(array, arrayIndex); } public bool Remove(T item) { throw new NotSupportedException("Adding an item is not supported due to being read-only."); } public IEnumerator<T> GetEnumerator() { return _set.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public abstract class RecursiveDeserializer<T> : Deserializer<T> where T : class { private readonly LinkedList<Func<T>> frames = new LinkedList<Func<T>>(); private readonly T serialized; protected RecursiveDeserializer(T serialized) { this.serialized = serialized; frames.AddFirst(() => this.serialized); } protected T getValue() { return frames.First.Value(); } protected V frame<V>(Func<T> nextValue, Func<V> action) { try { frames.AddFirst(nextValue); return action(); } finally { frames.RemoveFirst(); } } public V tryRead<V>(Func<Deserializer<T>, V> reader) { LinkedList<Func<T>> linkedList = new LinkedList<Func<T>>(frames); try { return reader(this); } catch (Exception ex) { frames.Clear(); foreach (Func<T> item in linkedList) { frames.AddFirst(item); } throw ex; } } public abstract byte readByte(SerializationContext ctx); public abstract short readShort(SerializationContext ctx); public abstract int readInt(SerializationContext ctx); public abstract long readLong(SerializationContext ctx); public abstract float readFloat(SerializationContext ctx); public abstract double readDouble(SerializationContext ctx); public abstract int readVarInt(SerializationContext ctx); public abstract long readVarLong(SerializationContext ctx); public abstract bool readBoolean(SerializationContext ctx); public abstract string readString(SerializationContext ctx); public abstract byte[] readBytes(SerializationContext ctx); public abstract V? readOptional<V>(SerializationContext ctx, Endec<V> endec); public abstract SequenceDeserializer<E> sequence<E>(SerializationContext ctx, Endec<E> elementEndec); public abstract MapDeserializer<V> map<V>(SerializationContext ctx, Endec<V> valueEndec); public abstract StructDeserializer structed(); } public abstract class RecursiveSerializer<T> : Serializer<T> where T : class { private readonly LinkedList<Action<T>> _frames = new LinkedList<Action<T>>(); private T _result; protected RecursiveSerializer(T initialResult) { _result = initialResult; _frames.AddFirst(delegate(T t) { _result = t; }); } protected void consume(T value) { _frames.First.Value(value); } protected void frame(FrameAction<T> action) { EncodedValue<T> encodedValue = new EncodedValue<T>(); _frames.AddFirst(encodedValue.set); action(encodedValue); _frames.RemoveFirst(); } public T result() { return _result; } public abstract void writeByte(SerializationContext ctx, byte value); public abstract void writeShort(SerializationContext ctx, short value); public abstract void writeInt(SerializationContext ctx, int value); public abstract void writeLong(SerializationContext ctx, long value); public abstract void writeFloat(SerializationContext ctx, float value); public abstract void writeDouble(SerializationContext ctx, double value); public abstract void writeVarInt(SerializationContext ctx, int value); public abstract void writeVarLong(SerializationContext ctx, long value); public abstract void writeBoolean(SerializationContext ctx, bool value); public abstract void writeString(SerializationContext ctx, string value); public abstract void writeBytes(SerializationContext ctx, byte[] bytes); public abstract void writeOptional<V>(SerializationContext ctx, Endec<V> endec, V? optional); public abstract SequenceSerializer<E> sequence<E>(SerializationContext ctx, Endec<E> elementEndec, int size); public abstract MapSerializer<V> map<V>(SerializationContext ctx, Endec<V> valueEndec, int size); public abstract StructSerializer structed(); } public delegate void FrameAction<T>(EncodedValue<T> encoded); public class EncodedValue<T> { private T? _value; private bool _encoded; internal void set(T value) { _value = value; _encoded = true; } public T value() { return _value; } public bool wasEncoded() { return _encoded; } public T require(string name) { if (!_encoded) { throw new Exception("Endec for " + name + " serialized nothing"); } return value(); } } public class VarInts { public const int SEGMENT_BITS = 127; public const int CONTINUE_BIT = 128; public static int getSizeInBytesFromInt(int i) { for (int j = 1; j < 5; j++) { if ((i & (-1 << j * 7)) == 0) { return j; } } return 5; } public static int getSizeInBytesFromLong(long l) { for (int i = 1; i < 10; i++) { if ((l & (-1L << i * 7)) == 0L) { return i; } } return 10; } public static int readInt(Func<byte> readByteSup) { int num = 0; int num2 = 0; while (true) { byte b = readByteSup(); num |= (b & 0x7F) << num2; if ((b & 0x80) == 0) { break; } num2 += 7; if (num2 >= 32) { throw new Exception("VarInt is too big"); } } return num; } public static void writeInt(int value, Action<byte> writeByteFunc) { while (((uint)value & 0xFFFFFF80u) != 0) { writeByteFunc((byte)(((uint)value & 0x7Fu) | 0x80u)); value >>>= 7; } writeByteFunc((byte)value); } public static long readLong(Func<byte> readByteSup) { long num = 0L; int num2 = 0; while (true) { byte b = readByteSup(); num |= (long)(b & 0x7F) << num2; if ((b & 0x80) == 0) { break; } num2 += 7; if (num2 >= 64) { throw new Exception("VarLong is too big"); } } return num; } public static void writeLong(long value, Action<byte> writeByteFunc) { while ((value & -128) != 0L) { writeByteFunc((byte)((value & 0x7F) | 0x80)); value >>>= 7; } writeByteFunc((byte)value); } } } namespace io.wispforest.endec.impl { public class AttributeEndecBuilder<T> { private readonly List<(SerializationAttribute, Endec<T>)> _branches = new List<(SerializationAttribute, Endec<T>)>(); public AttributeEndecBuilder(Endec<T> endec, SerializationAttribute attribute) { _branches.Add((attribute, endec)); } public AttributeEndecBuilder<T> orElseIf(Endec<T> endec, SerializationAttribute attribute) { return orElseIf(attribute, endec); } public AttributeEndecBuilder<T> orElseIf(SerializationAttribute attribute, Endec<T> endec) { SerializationAttribute attribute2 = attribute; if (_branches.Exists(((SerializationAttribute, Endec<T>) tuple) => tuple.Item1.Equals(attribute2))) { throw new ArgumentException("Cannot have more than one branch for attribute " + attribute2.name); } _branches.Add((attribute2, endec)); return this; } public Endec<T> orElse(Endec<T> endec) { Endec<T> endec2 = endec; return Endec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, T value) { Endec<T> endec4 = endec2; foreach (var branch in _branches) { if (ctx.hasAttribute(branch.Item1)) { endec4 = branch.Item2; break; } } endec4.encode(ctx, serializer, value); }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer) { Endec<T> endec3 = endec2; foreach (var branch2 in _branches) { if (ctx.hasAttribute(branch2.Item1)) { endec3 = branch2.Item2; break; } } return endec3.decode(ctx, deserializer); }); } } public class AttributeStructEndecBuilder<T> { private readonly List<(SerializationAttribute, StructEndec<T>)> branches = new List<(SerializationAttribute, StructEndec<T>)>(); public AttributeStructEndecBuilder(StructEndec<T> endec, SerializationAttribute attribute) { branches.Add((attribute, endec)); } public AttributeStructEndecBuilder<T> orElseIf(StructEndec<T> endec, SerializationAttribute attribute) { return orElseIf(attribute, endec); } public AttributeStructEndecBuilder<T> orElseIf(SerializationAttribute attribute, StructEndec<T> endec) { SerializationAttribute attribute2 = attribute; if (branches.Exists(((SerializationAttribute, StructEndec<T>) tuple) => tuple.Item1.Equals(attribute2))) { throw new ArgumentException("Cannot have more than one branch for attribute " + attribute2.name); } branches.Add((attribute2, endec)); return this; } public StructEndec<T> orElse(StructEndec<T> endec) { StructEndec<T> endec2 = endec; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, T value) { StructEndec<T> structEndec2 = endec2; foreach (var branch in branches) { if (ctx.hasAttribute(branch.Item1)) { structEndec2 = branch.Item2; break; } } structEndec2.encodeStruct(ctx, serializer, instance, value); }, delegate(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) { StructEndec<T> structEndec = endec2; foreach (var branch2 in branches) { if (ctx.hasAttribute(branch2.Item1)) { structEndec = branch2.Item2; break; } } return structEndec.decodeStruct(ctx, deserializer, instance); }); } } public static class DebugErrors { public static Action<object, Exception>? decodeErrorHook; } public class EndecImpl<T> : Endec<T> { private readonly Encoder<T> _encoder; private readonly Decoder<T> _decoder; public EndecImpl(Encoder<T> encoder, Decoder<T> decoder) { _encoder = encoder; _decoder = decoder; } public override void encode<E>(SerializationContext ctx, Serializer<E> serializer, T value) { _encoder(ctx, serializer, value); } public override T decode<E>(SerializationContext ctx, Deserializer<E> deserializer) { return _decoder(ctx, deserializer); } } public class KeyedEndec<F> { public string key { get; } public Endec<F> endec { get; } public Func<F> defaultValueFactory { get; } public KeyedEndec(string key, Endec<F> endec, Func<F> defaultValueFactory) { this.key = key; this.endec = endec; this.defaultValueFactory = defaultValueFactory; } public KeyedEndec(string key, Endec<F> endec, F defaultValue) { F defaultValue2 = defaultValue; this..ctor(key, endec, (Func<F>)(() => defaultValue2)); } public F defaultValue() { return defaultValueFactory(); } } public class MissingAttributeValueException : Exception { public MissingAttributeValueException(string message) : base(message) { } } public class RecursiveEndec<T> : Endec<T> { public readonly Endec<T> endec; public RecursiveEndec(Func<Endec<T>, Endec<T>> builder) { endec = builder(this); } public override void encode<E>(SerializationContext ctx, Serializer<E> serializer, T value) { endec.encode(ctx, serializer, value); } public override T decode<E>(SerializationContext ctx, Deserializer<E> deserializer) { return endec.decode(ctx, deserializer); } } public class RecursiveStructEndec<T> : StructEndec<T> { public readonly StructEndec<T> structEndec; public RecursiveStructEndec(Func<StructEndec<T>, StructEndec<T>> builder) { structEndec = builder(this); } public override void encodeStruct<E>(SerializationContext ctx, Serializer<E> serializer, StructSerializer instance, T value) { structEndec.encodeStruct(ctx, serializer, instance, value); } public override T decodeStruct<E>(SerializationContext ctx, Deserializer<E> deserializer, StructDeserializer instance) { return structEndec.decodeStruct(ctx, deserializer, instance); } } public class StructEndecBuilder { public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17); public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17, in T18, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18); public static StructEndec<S> of<S, F1>(StructField<S, F1> f1, Func<F1, S> constructor) { StructField<S, F1> f2 = f1; Func<F1, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f2.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f2.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2>(StructField<S, F1> f1, StructField<S, F2> f2, Func<F1, F2, S> constructor) { StructField<S, F1> f3 = f1; StructField<S, F2> f4 = f2; Func<F1, F2, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f3.encodeField(ctx, serializer, instance, value); f4.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f3.decodeField(ctx, deserializer, instance), f4.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, Func<F1, F2, F3, S> constructor) { StructField<S, F1> f4 = f1; StructField<S, F2> f5 = f2; StructField<S, F3> f6 = f3; Func<F1, F2, F3, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f4.encodeField(ctx, serializer, instance, value); f5.encodeField(ctx, serializer, instance, value); f6.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f4.decodeField(ctx, deserializer, instance), f5.decodeField(ctx, deserializer, instance), f6.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, Func<F1, F2, F3, F4, S> constructor) { StructField<S, F1> f5 = f1; StructField<S, F2> f6 = f2; StructField<S, F3> f7 = f3; StructField<S, F4> f8 = f4; Func<F1, F2, F3, F4, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f5.encodeField(ctx, serializer, instance, value); f6.encodeField(ctx, serializer, instance, value); f7.encodeField(ctx, serializer, instance, value); f8.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f5.decodeField(ctx, deserializer, instance), f6.decodeField(ctx, deserializer, instance), f7.decodeField(ctx, deserializer, instance), f8.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, Func<F1, F2, F3, F4, F5, S> constructor) { StructField<S, F1> f6 = f1; StructField<S, F2> f7 = f2; StructField<S, F3> f8 = f3; StructField<S, F4> f9 = f4; StructField<S, F5> f10 = f5; Func<F1, F2, F3, F4, F5, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f6.encodeField(ctx, serializer, instance, value); f7.encodeField(ctx, serializer, instance, value); f8.encodeField(ctx, serializer, instance, value); f9.encodeField(ctx, serializer, instance, value); f10.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f6.decodeField(ctx, deserializer, instance), f7.decodeField(ctx, deserializer, instance), f8.decodeField(ctx, deserializer, instance), f9.decodeField(ctx, deserializer, instance), f10.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, Func<F1, F2, F3, F4, F5, F6, S> constructor) { StructField<S, F1> f7 = f1; StructField<S, F2> f8 = f2; StructField<S, F3> f9 = f3; StructField<S, F4> f10 = f4; StructField<S, F5> f11 = f5; StructField<S, F6> f12 = f6; Func<F1, F2, F3, F4, F5, F6, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f7.encodeField(ctx, serializer, instance, value); f8.encodeField(ctx, serializer, instance, value); f9.encodeField(ctx, serializer, instance, value); f10.encodeField(ctx, serializer, instance, value); f11.encodeField(ctx, serializer, instance, value); f12.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f7.decodeField(ctx, deserializer, instance), f8.decodeField(ctx, deserializer, instance), f9.decodeField(ctx, deserializer, instance), f10.decodeField(ctx, deserializer, instance), f11.decodeField(ctx, deserializer, instance), f12.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, Func<F1, F2, F3, F4, F5, F6, F7, S> constructor) { StructField<S, F1> f8 = f1; StructField<S, F2> f9 = f2; StructField<S, F3> f10 = f3; StructField<S, F4> f11 = f4; StructField<S, F5> f12 = f5; StructField<S, F6> f13 = f6; StructField<S, F7> f14 = f7; Func<F1, F2, F3, F4, F5, F6, F7, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f8.encodeField(ctx, serializer, instance, value); f9.encodeField(ctx, serializer, instance, value); f10.encodeField(ctx, serializer, instance, value); f11.encodeField(ctx, serializer, instance, value); f12.encodeField(ctx, serializer, instance, value); f13.encodeField(ctx, serializer, instance, value); f14.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f8.decodeField(ctx, deserializer, instance), f9.decodeField(ctx, deserializer, instance), f10.decodeField(ctx, deserializer, instance), f11.decodeField(ctx, deserializer, instance), f12.decodeField(ctx, deserializer, instance), f13.decodeField(ctx, deserializer, instance), f14.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, Func<F1, F2, F3, F4, F5, F6, F7, F8, S> constructor) { StructField<S, F1> f9 = f1; StructField<S, F2> f10 = f2; StructField<S, F3> f11 = f3; StructField<S, F4> f12 = f4; StructField<S, F5> f13 = f5; StructField<S, F6> f14 = f6; StructField<S, F7> f15 = f7; StructField<S, F8> f16 = f8; Func<F1, F2, F3, F4, F5, F6, F7, F8, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f9.encodeField(ctx, serializer, instance, value); f10.encodeField(ctx, serializer, instance, value); f11.encodeField(ctx, serializer, instance, value); f12.encodeField(ctx, serializer, instance, value); f13.encodeField(ctx, serializer, instance, value); f14.encodeField(ctx, serializer, instance, value); f15.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f9.decodeField(ctx, deserializer, instance), f10.decodeField(ctx, deserializer, instance), f11.decodeField(ctx, deserializer, instance), f12.decodeField(ctx, deserializer, instance), f13.decodeField(ctx, deserializer, instance), f14.decodeField(ctx, deserializer, instance), f15.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, S> constructor) { StructField<S, F1> f10 = f1; StructField<S, F2> f11 = f2; StructField<S, F3> f12 = f3; StructField<S, F4> f13 = f4; StructField<S, F5> f14 = f5; StructField<S, F6> f15 = f6; StructField<S, F7> f16 = f7; StructField<S, F8> f17 = f8; StructField<S, F9> f18 = f9; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f10.encodeField(ctx, serializer, instance, value); f11.encodeField(ctx, serializer, instance, value); f12.encodeField(ctx, serializer, instance, value); f13.encodeField(ctx, serializer, instance, value); f14.encodeField(ctx, serializer, instance, value); f15.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f10.decodeField(ctx, deserializer, instance), f11.decodeField(ctx, deserializer, instance), f12.decodeField(ctx, deserializer, instance), f13.decodeField(ctx, deserializer, instance), f14.decodeField(ctx, deserializer, instance), f15.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, S> constructor) { StructField<S, F1> f11 = f1; StructField<S, F2> f13 = f2; StructField<S, F3> f14 = f3; StructField<S, F4> f15 = f4; StructField<S, F5> f16 = f5; StructField<S, F6> f17 = f6; StructField<S, F7> f18 = f7; StructField<S, F8> f19 = f8; StructField<S, F9> f20 = f9; StructField<S, F10> f12 = f10; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f11.encodeField(ctx, serializer, instance, value); f13.encodeField(ctx, serializer, instance, value); f14.encodeField(ctx, serializer, instance, value); f15.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f12.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f11.decodeField(ctx, deserializer, instance), f13.decodeField(ctx, deserializer, instance), f14.decodeField(ctx, deserializer, instance), f15.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f12.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, S> constructor) { StructField<S, F1> f12 = f1; StructField<S, F2> f15 = f2; StructField<S, F3> f16 = f3; StructField<S, F4> f17 = f4; StructField<S, F5> f18 = f5; StructField<S, F6> f19 = f6; StructField<S, F7> f20 = f7; StructField<S, F8> f21 = f8; StructField<S, F9> f22 = f9; StructField<S, F10> f13 = f10; StructField<S, F11> f14 = f11; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f12.encodeField(ctx, serializer, instance, value); f15.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f13.encodeField(ctx, serializer, instance, value); f14.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f12.decodeField(ctx, deserializer, instance), f15.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f13.decodeField(ctx, deserializer, instance), f14.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, S> constructor) { StructField<S, F1> f13 = f1; StructField<S, F2> f17 = f2; StructField<S, F3> f18 = f3; StructField<S, F4> f19 = f4; StructField<S, F5> f20 = f5; StructField<S, F6> f21 = f6; StructField<S, F7> f22 = f7; StructField<S, F8> f23 = f8; StructField<S, F9> f24 = f9; StructField<S, F10> f14 = f10; StructField<S, F11> f15 = f11; StructField<S, F12> f16 = f12; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f13.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); f14.encodeField(ctx, serializer, instance, value); f15.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f13.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance), f14.decodeField(ctx, deserializer, instance), f15.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, StructField<S, F13> f13, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, S> constructor) { StructField<S, F1> f14 = f1; StructField<S, F2> f19 = f2; StructField<S, F3> f20 = f3; StructField<S, F4> f21 = f4; StructField<S, F5> f22 = f5; StructField<S, F6> f23 = f6; StructField<S, F7> f24 = f7; StructField<S, F8> f25 = f8; StructField<S, F9> f26 = f9; StructField<S, F10> f15 = f10; StructField<S, F11> f16 = f11; StructField<S, F12> f17 = f12; StructField<S, F13> f18 = f13; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f14.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); f25.encodeField(ctx, serializer, instance, value); f26.encodeField(ctx, serializer, instance, value); f15.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f14.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance), f25.decodeField(ctx, deserializer, instance), f26.decodeField(ctx, deserializer, instance), f15.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, StructField<S, F13> f13, StructField<S, F14> f14, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, S> constructor) { StructField<S, F1> f15 = f1; StructField<S, F2> f21 = f2; StructField<S, F3> f22 = f3; StructField<S, F4> f23 = f4; StructField<S, F5> f24 = f5; StructField<S, F6> f25 = f6; StructField<S, F7> f26 = f7; StructField<S, F8> f27 = f8; StructField<S, F9> f28 = f9; StructField<S, F10> f16 = f10; StructField<S, F11> f17 = f11; StructField<S, F12> f18 = f12; StructField<S, F13> f19 = f13; StructField<S, F14> f20 = f14; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f15.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); f25.encodeField(ctx, serializer, instance, value); f26.encodeField(ctx, serializer, instance, value); f27.encodeField(ctx, serializer, instance, value); f28.encodeField(ctx, serializer, instance, value); f16.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f15.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance), f25.decodeField(ctx, deserializer, instance), f26.decodeField(ctx, deserializer, instance), f27.decodeField(ctx, deserializer, instance), f28.decodeField(ctx, deserializer, instance), f16.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, StructField<S, F13> f13, StructField<S, F14> f14, StructField<S, F15> f15, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, S> constructor) { StructField<S, F1> f16 = f1; StructField<S, F2> f23 = f2; StructField<S, F3> f24 = f3; StructField<S, F4> f25 = f4; StructField<S, F5> f26 = f5; StructField<S, F6> f27 = f6; StructField<S, F7> f28 = f7; StructField<S, F8> f29 = f8; StructField<S, F9> f30 = f9; StructField<S, F10> f17 = f10; StructField<S, F11> f18 = f11; StructField<S, F12> f19 = f12; StructField<S, F13> f20 = f13; StructField<S, F14> f21 = f14; StructField<S, F15> f22 = f15; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f16.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); f25.encodeField(ctx, serializer, instance, value); f26.encodeField(ctx, serializer, instance, value); f27.encodeField(ctx, serializer, instance, value); f28.encodeField(ctx, serializer, instance, value); f29.encodeField(ctx, serializer, instance, value); f30.encodeField(ctx, serializer, instance, value); f17.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f16.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance), f25.decodeField(ctx, deserializer, instance), f26.decodeField(ctx, deserializer, instance), f27.decodeField(ctx, deserializer, instance), f28.decodeField(ctx, deserializer, instance), f29.decodeField(ctx, deserializer, instance), f30.decodeField(ctx, deserializer, instance), f17.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, StructField<S, F13> f13, StructField<S, F14> f14, StructField<S, F15> f15, StructField<S, F16> f16, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, S> constructor) { StructField<S, F1> f17 = f1; StructField<S, F2> f25 = f2; StructField<S, F3> f26 = f3; StructField<S, F4> f27 = f4; StructField<S, F5> f28 = f5; StructField<S, F6> f29 = f6; StructField<S, F7> f30 = f7; StructField<S, F8> f31 = f8; StructField<S, F9> f32 = f9; StructField<S, F10> f18 = f10; StructField<S, F11> f19 = f11; StructField<S, F12> f20 = f12; StructField<S, F13> f21 = f13; StructField<S, F14> f22 = f14; StructField<S, F15> f23 = f15; StructField<S, F16> f24 = f16; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f17.encodeField(ctx, serializer, instance, value); f25.encodeField(ctx, serializer, instance, value); f26.encodeField(ctx, serializer, instance, value); f27.encodeField(ctx, serializer, instance, value); f28.encodeField(ctx, serializer, instance, value); f29.encodeField(ctx, serializer, instance, value); f30.encodeField(ctx, serializer, instance, value); f31.encodeField(ctx, serializer, instance, value); f32.encodeField(ctx, serializer, instance, value); f18.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f17.decodeField(ctx, deserializer, instance), f25.decodeField(ctx, deserializer, instance), f26.decodeField(ctx, deserializer, instance), f27.decodeField(ctx, deserializer, instance), f28.decodeField(ctx, deserializer, instance), f29.decodeField(ctx, deserializer, instance), f30.decodeField(ctx, deserializer, instance), f31.decodeField(ctx, deserializer, instance), f32.decodeField(ctx, deserializer, instance), f18.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, StructField<S, F13> f13, StructField<S, F14> f14, StructField<S, F15> f15, StructField<S, F16> f16, StructField<S, F17> f17, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, S> constructor) { StructField<S, F1> f18 = f1; StructField<S, F2> f27 = f2; StructField<S, F3> f28 = f3; StructField<S, F4> f29 = f4; StructField<S, F5> f30 = f5; StructField<S, F6> f31 = f6; StructField<S, F7> f32 = f7; StructField<S, F8> f33 = f8; StructField<S, F9> f34 = f9; StructField<S, F10> f19 = f10; StructField<S, F11> f20 = f11; StructField<S, F12> f21 = f12; StructField<S, F13> f22 = f13; StructField<S, F14> f23 = f14; StructField<S, F15> f24 = f15; StructField<S, F16> f25 = f16; StructField<S, F17> f26 = f17; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f18.encodeField(ctx, serializer, instance, value); f27.encodeField(ctx, serializer, instance, value); f28.encodeField(ctx, serializer, instance, value); f29.encodeField(ctx, serializer, instance, value); f30.encodeField(ctx, serializer, instance, value); f31.encodeField(ctx, serializer, instance, value); f32.encodeField(ctx, serializer, instance, value); f33.encodeField(ctx, serializer, instance, value); f34.encodeField(ctx, serializer, instance, value); f19.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); f25.encodeField(ctx, serializer, instance, value); f26.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f18.decodeField(ctx, deserializer, instance), f27.decodeField(ctx, deserializer, instance), f28.decodeField(ctx, deserializer, instance), f29.decodeField(ctx, deserializer, instance), f30.decodeField(ctx, deserializer, instance), f31.decodeField(ctx, deserializer, instance), f32.decodeField(ctx, deserializer, instance), f33.decodeField(ctx, deserializer, instance), f34.decodeField(ctx, deserializer, instance), f19.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance), f25.decodeField(ctx, deserializer, instance), f26.decodeField(ctx, deserializer, instance))); } public static StructEndec<S> of<S, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18>(StructField<S, F1> f1, StructField<S, F2> f2, StructField<S, F3> f3, StructField<S, F4> f4, StructField<S, F5> f5, StructField<S, F6> f6, StructField<S, F7> f7, StructField<S, F8> f8, StructField<S, F9> f9, StructField<S, F10> f10, StructField<S, F11> f11, StructField<S, F12> f12, StructField<S, F13> f13, StructField<S, F14> f14, StructField<S, F15> f15, StructField<S, F16> f16, StructField<S, F17> f17, StructField<S, F18> f18, Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, S> constructor) { StructField<S, F1> f19 = f1; StructField<S, F2> f29 = f2; StructField<S, F3> f30 = f3; StructField<S, F4> f31 = f4; StructField<S, F5> f32 = f5; StructField<S, F6> f33 = f6; StructField<S, F7> f34 = f7; StructField<S, F8> f35 = f8; StructField<S, F9> f36 = f9; StructField<S, F10> f20 = f10; StructField<S, F11> f21 = f11; StructField<S, F12> f22 = f12; StructField<S, F13> f23 = f13; StructField<S, F14> f24 = f14; StructField<S, F15> f25 = f15; StructField<S, F16> f26 = f16; StructField<S, F17> f27 = f17; StructField<S, F18> f28 = f18; Func<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, S> constructor2 = constructor; return StructEndec.of(delegate(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S value) { f19.encodeField(ctx, serializer, instance, value); f29.encodeField(ctx, serializer, instance, value); f30.encodeField(ctx, serializer, instance, value); f31.encodeField(ctx, serializer, instance, value); f32.encodeField(ctx, serializer, instance, value); f33.encodeField(ctx, serializer, instance, value); f34.encodeField(ctx, serializer, instance, value); f35.encodeField(ctx, serializer, instance, value); f36.encodeField(ctx, serializer, instance, value); f20.encodeField(ctx, serializer, instance, value); f21.encodeField(ctx, serializer, instance, value); f22.encodeField(ctx, serializer, instance, value); f23.encodeField(ctx, serializer, instance, value); f24.encodeField(ctx, serializer, instance, value); f25.encodeField(ctx, serializer, instance, value); f26.encodeField(ctx, serializer, instance, value); f27.encodeField(ctx, serializer, instance, value); f28.encodeField(ctx, serializer, instance, value); }, (SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) => constructor2(f19.decodeField(ctx, deserializer, instance), f29.decodeField(ctx, deserializer, instance), f30.decodeField(ctx, deserializer, instance), f31.decodeField(ctx, deserializer, instance), f32.decodeField(ctx, deserializer, instance), f33.decodeField(ctx, deserializer, instance), f34.decodeField(ctx, deserializer, instance), f35.decodeField(ctx, deserializer, instance), f36.decodeField(ctx, deserializer, instance), f20.decodeField(ctx, deserializer, instance), f21.decodeField(ctx, deserializer, instance), f22.decodeField(ctx, deserializer, instance), f23.decodeField(ctx, deserializer, instance), f24.decodeField(ctx, deserializer, instance), f25.decodeField(ctx, deserializer, instance), f26.decodeField(ctx, deserializer, instance), f27.decodeField(ctx, deserializer, instance), f28.decodeField(ctx, deserializer, instance))); } } public class StructEndecImpl<T> : StructEndec<T> { private readonly StructuredEncoder<T> _encoder; private readonly StructuredDecoder<T> _decoder; public StructEndecImpl(StructuredEncoder<T> encoder, StructuredDecoder<T> decoder) { _encoder = encoder; _decoder = decoder; } public override void encodeStruct<E>(SerializationContext ctx, Serializer<E> serializer, StructSerializer instance, T value) { _encoder(ctx, serializer, instance, value); } public override T decodeStruct<E>(SerializationContext ctx, Deserializer<E> deserializer, StructDeserializer instance) { return _decoder(ctx, deserializer, instance); } } public class StructField<S, F> { protected readonly string _name; protected readonly Endec<F> _endec; protected readonly Func<S, F> _getter; protected readonly Func<F>? _defaultValueFactory; public StructField(string name, Endec<F> endec, Func<S, F> getter, Func<F> defaultValueFactory) { _name = name; _endec = endec; _getter = getter; _defaultValueFactory = defaultValueFactory; } public StructField(string name, Endec<F> endec, Func<S, F> getter, F? defaultValue) { F defaultValue2 = defaultValue; this..ctor(name, endec, getter, (Func<F>)(() => defaultValue2)); } public StructField(string name, Endec<F> endec, Func<S, F> getter) : this(name, endec, getter, (Func<F>)null) { } public virtual void encodeField(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S obj) { try { instance.field(_name, ctx, _endec, _getter(obj), _defaultValueFactory != null); } catch (Exception ex) { Exception ex2 = ex; Exception e = ex2; throw ctx.pushField(_name).exceptionWithTrace((Func<EndecTrace, StructFieldException>)delegate(EndecTrace trace) { throw new StructFieldException("Exception occurred when encoding a given StructField: " + trace.ToString(), e); }); } } public virtual F decodeField(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) { try { return instance.field(_name, ctx, _endec, _defaultValueFactory); } catch (Exception ex) { Exception ex2 = ex; Exception e = ex2; throw ctx.pushField(_name).exceptionWithTrace((Func<EndecTrace, StructFieldException>)delegate(EndecTrace trace) { throw new StructFieldException("Exception occurred when decoding a given StructField: " + trace.ToString(), e); }); } } } public sealed class FlatStructField<S, F> : StructField<S, F> { public FlatStructField(StructEndec<F> endec, Func<S, F> getter) : base("", (Endec<F>)endec, getter, (Func<F>)null) { } public override void encodeField(SerializationContext ctx, Serializer<dynamic> serializer, StructSerializer instance, S obj) { (_endec as StructEndec<F>).encodeStruct(ctx, serializer, instance, _getter(obj)); } public override F decodeField(SerializationContext ctx, Deserializer<dynamic> deserializer, StructDeserializer instance) { return (_endec as StructEndec<F>).decodeStruct(ctx, deserializer, instance); } } public class StructFieldException : Exception { public StructFieldException(string message, Exception cause) : base(message, cause) { } } } namespace io.wispforest.endec.impl.trace { public class EndecMalformedInputException : Exception { public readonly EndecTrace location; public readonly string message; public EndecMalformedInputException(EndecTrace location, string message) { this.location = location; this.message = message; base..ctor(createMessage(location, message)); } private static string createMessage(EndecTrace location, string message) { return "Malformed input at " + location.ToString() + ": " + message; } } public class EndecTrace { private readonly IList<EndecTraceElement> elements; public EndecTrace(List<EndecTraceElement> elements) { this.elements = elements; base..ctor(); } public EndecTrace() : this(new List<EndecTraceElement>()) { } public EndecTrace push(EndecTraceElement element) { IList<EndecTraceElement> list = elements; List<EndecTraceElement> list2 = new List<EndecTraceElement>(1 + list.Count); list2.AddRange(list); list2.Add(element); return new EndecTrace(list2); } public override string ToString() { return "$" + string.Join(",", elements.Select((EndecTraceElement element) => element.toFormatedString())); } } public interface EndecTraceElement { string toFormatedString(); } public sealed class FieldTraceElement : EndecTraceElement { [CompilerGenerated] private string <name>P; public FieldTraceElement(string name) { <name>P = name; base..ctor(); } public string toFormatedString() { return "." + <name>P; } } public sealed class IndexTraceElement : EndecTraceElement { [CompilerGenerated] private int <index>P; public IndexTraceElement(int index) { <index>P = index; base..ctor(); } public string toFormatedString() { return "[" + <index>P + "]"; } } } namespace io.wispforest.endec.format.edm { public class EdmDeserializer : RecursiveDeserializer<EdmElement>, SelfDescribedDeserializer<EdmElement>, Deserializer<EdmElement> { internal class Sequence<V> : SequenceDeserializer<V>, IEnumerator<V>, IEnumerator, IDisposable, IEnumerable<V>, IEnumerable { private readonly EdmDeserializer deserializer; private readonly SerializationContext ctx; private readonly Endec<V> valueEndec; private readonly IndexedEnumerator<EdmElement> elements; private readonly int size; public V Current { get { EdmElement element = elements.Current; return deserializer.frame(() => element, () => valueEndec.decode(ctx.pushIndex(elements.index), deserializer)); } } public Sequence(EdmDeserializer deserializer, SerializationContext ctx, Endec<V> valueEndec, IList<EdmElement> elements) { this.deserializer = deserializer; this.ctx = ctx; this.valueEndec = valueEndec; this.elements = elements.GetIndexedEnumerator(); size = elements.Count(); } public int estimatedSize() { return size; } public bool MoveNext() { return elements.MoveNext(); } public void Reset() { elements.Reset(); } public void Dispose() { elements.Dispose(); } } internal class Map<V> : MapDeserializer<V>, IEnumerator<KeyValuePair<string, V>>, IEnumerator, IDisposable, IEnumerable<KeyValuePair<string, V>>, IEnumerable { private readonly EdmDeserializer deserializer; private readonly SerializationContext ctx; private readonly Endec<V> valueEndec; private readonly IEnumerator<KeyValuePair<string, EdmElement>> entries; private readonly int size; public KeyValuePair<string, V> Current { get { KeyValuePair<string, EdmElement> entry = entries.Current; return deserializer.frame(() => entry.Value, () => new KeyValuePair<string, V>(entry.Key, valueEndec.decode(ctx, deserializer))); } } public Map(EdmDeserializer deserializer, SerializationContext ctx, Endec<V> valueEndec, IDictionary<string, EdmElement> entrie
Endec.Json.dll
Decompiled 4 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using io.wispforest.endec.impl; using io.wispforest.endec.util; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("blodhgarm")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("MIT")] [assembly: AssemblyDescription("Newtonsoft Json Module for Endec")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: AssemblyInformationalVersion("1.0.1+7f78aff8b1f8229e8fc9be6479841eb1fdaadc08")] [assembly: AssemblyProduct("Endec.Json")] [assembly: AssemblyTitle("Endec.Json")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Dragon-Seeker/endec.csharp")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace io.wispforest.endec.format.newtonsoft { public class JsonDeserializer : RecursiveDeserializer<JToken>, SelfDescribedDeserializer<JToken>, Deserializer<JToken> { private class JsonSequenceDeserializer<V> : SequenceDeserializer<V>, IEnumerator<V>, IEnumerator, IDisposable, IEnumerable<V>, IEnumerable { private readonly JsonDeserializer deserializer; private readonly SerializationContext ctx; private readonly Endec<V> valueEndec; private readonly IndexedEnumerator<JToken> elements; private readonly int size; public V Current { get { JToken element = ((IEnumerator<JToken>)elements).Current; return ((RecursiveDeserializer<JToken>)(object)deserializer).frame<V>((Func<JToken>)(() => element), (Func<V>)(() => valueEndec.decode<JToken>(ctx.pushIndex(elements.index), (Deserializer<JToken>)(object)deserializer))); } } public JsonSequenceDeserializer(JsonDeserializer deserializer, SerializationContext ctx, Endec<V> valueEndec, JArray elements) { this.deserializer = deserializer; this.ctx = ctx; this.valueEndec = valueEndec; this.elements = IEnumeratorExtensions.GetIndexedEnumerator<JToken>((IList<JToken>)elements); size = ((JContainer)elements).Count; } public int estimatedSize() { return size; } public bool MoveNext() { return ((IEnumerator)elements).MoveNext(); } public void Reset() { ((IEnumerator)elements).Reset(); } public void Dispose() { ((IDisposable)elements).Dispose(); } } private class JsonMapDeserializer<V> : MapDeserializer<V>, IEnumerator<KeyValuePair<string, V>>, IEnumerator, IDisposable, IEnumerable<KeyValuePair<string, V>>, IEnumerable { private readonly JsonDeserializer deserializer; private readonly SerializationContext ctx; private readonly Endec<V> valueEndec; private readonly IEnumerator<KeyValuePair<string, JToken?>> entries; private readonly int size; public KeyValuePair<string, V> Current => next(); public JsonMapDeserializer(JsonDeserializer deserializer, SerializationContext ctx, Endec<V> valueEndec, JObject entries) { this.deserializer = deserializer; this.ctx = ctx; this.valueEndec = valueEndec; this.entries = entries.GetEnumerator(); size = ((JContainer)entries).Count; } public int estimatedSize() { return size; } public bool MoveNext() { return entries.MoveNext(); } public KeyValuePair<string, V> next() { KeyValuePair<string, JToken?> entry = entries.Current; return ((RecursiveDeserializer<JToken>)(object)deserializer).frame<KeyValuePair<string, V>>((Func<JToken>)(() => entry.Value), (Func<KeyValuePair<string, V>>)(() => new KeyValuePair<string, V>(entry.Key, valueEndec.decode<JToken>(ctx.pushField(entry.Key), (Deserializer<JToken>)(object)deserializer)))); } public void Reset() { entries.Reset(); } public void Dispose() { entries.Dispose(); } } private class JsonStructDeserializer : StructDeserializer { private readonly JsonDeserializer deserializer; private readonly JObject obj; public JsonStructDeserializer(JsonDeserializer deserializer, JObject obj) { this.deserializer = deserializer; this.obj = obj; } public F? field<F>(string name, SerializationContext ctx, Endec<F> endec, Func<F>? defaultValueFactory) { Endec<F> endec2 = endec; SerializationContext ctx2 = ctx; string name2 = name; JToken element = obj[name2]; if (element == null) { if (defaultValueFactory == null) { throw new Exception("Field '" + name2 + "' was missing from serialized data, but no default value was provided"); } return defaultValueFactory(); } try { return ((RecursiveDeserializer<JToken>)(object)deserializer).frame<F>((Func<JToken>)(() => element), (Func<F>)(() => ((Endec<JToken>)(object)endec2).decode<JToken>(ctx2.pushField(name2), (Deserializer<JToken>)(object)deserializer))); } catch (Exception ex) { DebugErrors.decodeErrorHook?.Invoke(obj, ex); throw ex; } } } protected JsonDeserializer(JToken serialized) : base(serialized) { } public static JsonDeserializer of(JToken serialized) { return new JsonDeserializer(serialized); } public SerializationContext setupContext(SerializationContext ctx) { return ctx.withAttributes((SerializationAttributeInstance[])(object)new SerializationAttributeInstance[1] { (SerializationAttributeInstance)SerializationAttributes.HUMAN_READABLE }); } public override byte readByte(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToByte(CultureInfo.CurrentCulture)); } public override short readShort(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToInt16(CultureInfo.CurrentCulture)); } public override int readInt(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToInt32(CultureInfo.CurrentCulture)); } public override long readLong(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToInt64(CultureInfo.CurrentCulture)); } public override float readFloat(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToSingle(CultureInfo.CurrentCulture)); } public override double readDouble(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToDouble(CultureInfo.CurrentCulture)); } public override int readVarInt(SerializationContext ctx) { return ((RecursiveDeserializer<JToken>)(object)this).readInt(ctx); } public override long readVarLong(SerializationContext ctx) { return ((RecursiveDeserializer<JToken>)(object)this).readLong(ctx); } public override bool readBoolean(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToBoolean(CultureInfo.CurrentCulture)); } public override string readString(SerializationContext ctx) { return readPrimitive((IConvertible convertible) => convertible.ToString(CultureInfo.CurrentCulture)); } private T readPrimitive<T>(Func<IConvertible, T> func) where T : IConvertible { return readPrimitive(base.getValue(), func); } private T readPrimitive<T>(JToken token, Func<IConvertible, T> func) where T : IConvertible { JValue val = (JValue)(object)((token is JValue) ? token : null); if (val == null) { throw new Exception($"Unable to read JToken as it is not a JValue: {token}"); } if (token == null) { throw new Exception($"Unable to read JToken as the given value is null and can not be converted to the needed type: {typeof(T)}"); } if (!(val.Value is IConvertible arg)) { throw new Exception($"Unable to read JValue as it is not a the correct type: [Type: {typeof(T)}, Obj Type: {val.Value}]"); } return func(arg); } private T getValueSafe<T>() where T : JToken { JToken value = base.getValue(); if (value == null) { throw new NullReferenceException("Value was found to be null meaning something has gone wrong"); } return ((T)(object)((value is T) ? value : null)) ?? throw new Exception($"Unable to cast value safely to `{typeof(T)}` as it was found to be '{((object)value).GetType()}'"); } public override byte[] readBytes(SerializationContext ctx) { JArray valueSafe = getValueSafe<JArray>(); byte[] array = new byte[((JContainer)valueSafe).Count]; for (int i = 0; i < ((JContainer)valueSafe).Count; i++) { array[i] = readPrimitive(valueSafe[i], (IConvertible convertible) => convertible.ToByte(CultureInfo.CurrentCulture)); } return array; } public override V? readOptional<V>(SerializationContext ctx, Endec<V> endec) { //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) JTokenType type = base.getValue().Type; if (((object)(JTokenType)(ref type)).Equals((object)(JTokenType)10)) { return default(V); } return ((Endec<JToken>)(object)endec).decode<JToken>(ctx, (Deserializer<JToken>)(object)this); } public override SequenceDeserializer<E> sequence<E>(SerializationContext ctx, Endec<E> elementEndec) { return (SequenceDeserializer<E>)(object)new JsonSequenceDeserializer<E>(this, ctx, elementEndec, getValueSafe<JArray>()); } public override MapDeserializer<V> map<V>(SerializationContext ctx, Endec<V> valueEndec) { return (MapDeserializer<V>)(object)new JsonMapDeserializer<V>(this, ctx, valueEndec, getValueSafe<JObject>()); } public override StructDeserializer structed() { return (StructDeserializer)(object)new JsonStructDeserializer(this, getValueSafe<JObject>()); } public void readAny<S>(SerializationContext ctx, Serializer<S> visitor) where S : class { decodeValue<S>(ctx, visitor, base.getValue()); } private void decodeValue<S>(SerializationContext ctx, Serializer<S> visitor, JToken element) where S : class { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) bool flag = true; JTokenType type = element.Type; if (((object)(JTokenType)(ref type)).Equals((object)(JTokenType)10)) { ((Serializer<JToken>)(object)visitor).writeOptional<JToken>(ctx, (Endec<JToken>)(object)JsonEndec.INSTANCE, (JToken)null); } else { JValue val = (JValue)(object)((element is JValue) ? element : null); if (val != null) { if (val.Value is string text) { visitor.writeString(ctx, text); } else if (val.Value is bool flag2) { visitor.writeBoolean(ctx, flag2); } else if (val.Value is IConvertible convertible) { try { long num = convertible.ToInt64(CultureInfo.CurrentCulture); if ((byte)num == num) { visitor.writeByte(ctx, convertible.ToByte(CultureInfo.CurrentCulture)); } else if ((short)num == num) { visitor.writeShort(ctx, convertible.ToInt16(CultureInfo.CurrentCulture)); } else if ((int)num == num) { visitor.writeInt(ctx, convertible.ToInt32(CultureInfo.CurrentCulture)); } else { visitor.writeLong(ctx, num); } } catch (Exception ex) when (ex is FormatException || ex is OverflowException) { double num2 = convertible.ToDouble(CultureInfo.CurrentCulture); if ((double)(float)num2 == num2) { visitor.writeFloat(ctx, convertible.ToSingle(CultureInfo.CurrentCulture)); } else { visitor.writeDouble(ctx, num2); } } } else { flag = false; } } else { JArray val2 = (JArray)(object)((element is JArray) ? element : null); if (val2 != null) { SequenceSerializer<JToken> val3 = ((Serializer<JToken>)(object)visitor).sequence<JToken>(ctx, Endec.of<JToken>((Encoder<JToken>)decodeValue<object>, (Decoder<JToken>)((SerializationContext _, Deserializer<dynamic> _) => (JToken)(object)JValue.CreateNull())), ((JContainer)val2).Count); try { foreach (JToken item in val2) { val3.element(item); } } finally { ((IDisposable)val3)?.Dispose(); } } else { JObject val4 = (JObject)(object)((element is JObject) ? element : null); if (val4 != null) { MapSerializer<JToken> val5 = ((Serializer<JToken>)(object)visitor).map<JToken>(ctx, Endec.of<JToken>((Encoder<JToken>)decodeValue<object>, (Decoder<JToken>)((SerializationContext _, Deserializer<dynamic> _) => (JToken)(object)JValue.CreateNull())), ((JContainer)val4).Count); try { foreach (KeyValuePair<string, JToken> item2 in val4) { val5.entry(item2.Key, item2.Value); } } finally { ((IDisposable)val5)?.Dispose(); } } else { flag = false; } } } } if (!flag) { throw new Exception($"Non-standard, unrecognized JsonElement implementation cannot be decoded: {element}"); } } } public class JsonEndec : Endec<JToken> { public static readonly JsonEndec INSTANCE = new JsonEndec(); private JsonEndec() { } public override void encode<E>(SerializationContext ctx, Serializer<E> serializer, JToken value) { if (serializer is SelfDescribedSerializer<E>) { JsonDeserializer.of(value).readAny<E>(ctx, serializer); } else { serializer.writeString(ctx, JsonUtils.writeToString(value)); } } public override JToken decode<E>(SerializationContext ctx, Deserializer<E> deserializer) { if (deserializer is SelfDescribedDeserializer<E> val) { JsonSerializer jsonSerializer = JsonSerializer.of(); ((SelfDescribedDeserializer<JToken>)(object)val).readAny<JToken>(ctx, (Serializer<JToken>)(object)jsonSerializer); return ((RecursiveSerializer<JToken>)(object)jsonSerializer).result(); } return JsonUtils.readFromString(deserializer.readString(ctx)); } } public class JsonSerializer : RecursiveSerializer<JToken>, SelfDescribedSerializer<JToken>, Serializer<JToken> { private class JsonStructSerializer : StructSerializer, Endable, IDisposable { private readonly JsonSerializer _serializer; private readonly JObject _result; public JsonStructSerializer(JsonSerializer serializer) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown _serializer = serializer; if (serializer.prefix != null) { JToken? prefix = serializer.prefix; JObject val = (JObject)(object)((prefix is JObject) ? prefix : null); if (val == null) { throw new Exception("Incompatible prefix of type used " + ((object)_serializer).GetType().Name + " for JSON map/struct"); } _result = val; serializer.prefix = null; } else { _result = new JObject(); } } public StructSerializer field<F>(string name, SerializationContext ctx, Endec<F> endec, F value, bool mayOmit) { Endec<F> endec2 = endec; SerializationContext ctx2 = ctx; string name2 = name; F value2 = value; ((RecursiveSerializer<JToken>)(object)_serializer).frame((FrameAction<JToken>)delegate(EncodedValue<JToken> encoded) { //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) ((Endec<JToken>)(object)endec2).encode<JToken>(ctx2.pushField(name2), (Serializer<JToken>)(object)_serializer, (JToken)value2); JToken val = encoded.require("struct field"); if (mayOmit) { JTokenType type = val.Type; if (((object)(JTokenType)(ref type)).Equals((object)(JTokenType)10)) { return; } } _result.Add(name2, val); }); return (StructSerializer)(object)this; } public void end() { ((RecursiveSerializer<JToken>)(object)_serializer).consume((JToken)(object)_result); } } private class JsonMapSerializer<V> : MapSerializer<V>, Endable, IDisposable { private readonly JsonSerializer _serializer; private readonly SerializationContext _ctx; private readonly Endec<V> _valueEndec; private readonly JObject _result; public JsonMapSerializer(JsonSerializer serializer, SerializationContext ctx, Endec<V> valueEndec) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown _serializer = serializer; _ctx = ctx; _valueEndec = valueEndec; if (serializer.prefix != null) { JToken? prefix = serializer.prefix; JObject val = (JObject)(object)((prefix is JObject) ? prefix : null); if (val == null) { throw new Exception("Incompatible prefix of type used " + ((object)_serializer).GetType().Name + " for JSON map/struct"); } _result = val; serializer.prefix = null; } else { _result = new JObject(); } } public void entry(string key, V value) { string key2 = key; V value2 = value; ((RecursiveSerializer<JToken>)(object)_serializer).frame((FrameAction<JToken>)delegate(EncodedValue<JToken> encoded) { _valueEndec.encode<JToken>(_ctx.pushField(key2), (Serializer<JToken>)(object)_serializer, value2); _result.Add(key2, encoded.require("map value")); }); } public void end() { ((RecursiveSerializer<JToken>)(object)_serializer).consume((JToken)(object)_result); } } private class JsonSequenceSerializer<V> : SequenceSerializer<V>, Endable, IDisposable { private readonly JsonSerializer _serializer; private readonly SerializationContext _ctx; private readonly Endec<V> _valueEndec; private readonly JArray _result; public JsonSequenceSerializer(JsonSerializer serializer, SerializationContext ctx, Endec<V> valueEndec, int size) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown _serializer = serializer; _ctx = ctx; _valueEndec = valueEndec; if (serializer.prefix != null) { JToken? prefix = serializer.prefix; JArray val = (JArray)(object)((prefix is JArray) ? prefix : null); if (val == null) { throw new Exception("Incompatible prefix of type " + ((object)serializer.prefix).GetType().Name + " used for JSON sequence"); } _result = val; serializer.prefix = null; } else { _result = new JArray(); } } public void element(V element) { V element2 = element; ((RecursiveSerializer<JToken>)(object)_serializer).frame((FrameAction<JToken>)delegate(EncodedValue<JToken> encoded) { _valueEndec.encode<JToken>(_ctx.pushIndex(((JContainer)_result).Count), (Serializer<JToken>)(object)_serializer, element2); _result.Add(encoded.require("sequence element")); }); } public void end() { ((RecursiveSerializer<JToken>)(object)_serializer).consume((JToken)(object)_result); } } internal JToken? prefix; protected JsonSerializer(JToken? prefix) : base((JToken)(object)JValue.CreateNull()) { this.prefix = prefix; } public static JsonSerializer of() { return new JsonSerializer(null); } public SerializationContext setupContext(SerializationContext ctx) { return ctx.withAttributes((SerializationAttributeInstance[])(object)new SerializationAttributeInstance[1] { (SerializationAttributeInstance)SerializationAttributes.HUMAN_READABLE }); } public override void writeByte(SerializationContext ctx, byte value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown base.consume((JToken)new JValue((long)value)); } public override void writeShort(SerializationContext ctx, short value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown base.consume((JToken)new JValue((long)value)); } public override void writeInt(SerializationContext ctx, int value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown base.consume((JToken)new JValue((long)value)); } public override void writeLong(SerializationContext ctx, long value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown base.consume((JToken)new JValue(value)); } public override void writeFloat(SerializationContext ctx, float value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown base.consume((JToken)new JValue(value)); } public override void writeDouble(SerializationContext ctx, double value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown base.consume((JToken)new JValue(value)); } public override void writeVarInt(SerializationContext ctx, int value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown base.consume((JToken)new JValue((long)value)); } public override void writeVarLong(SerializationContext ctx, long value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown base.consume((JToken)new JValue(value)); } public override void writeBoolean(SerializationContext ctx, bool value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown base.consume((JToken)new JValue(value)); } public override void writeString(SerializationContext ctx, string value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown base.consume((JToken)new JValue(value)); } public override void writeBytes(SerializationContext ctx, byte[] bytes) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown JArray val = new JArray(); for (int i = 0; i < bytes.Length; i++) { val.Add((JToken)new JValue((long)bytes[i])); } base.consume((JToken)(object)val); } public override void writeOptional<V>(SerializationContext ctx, Endec<V> endec, V? optional) { if (optional == null) { base.consume((JToken)(object)JValue.CreateNull()); } else { ((Endec<JToken>)(object)endec).encode<JToken>(ctx, (Serializer<JToken>)(object)this, (JToken)optional); } } public override SequenceSerializer<E> sequence<E>(SerializationContext ctx, Endec<E> elementEndec, int size) { return (SequenceSerializer<E>)(object)new JsonSequenceSerializer<E>(this, ctx, elementEndec, size); } public override MapSerializer<V> map<V>(SerializationContext ctx, Endec<V> valueEndec, int size) { return (MapSerializer<V>)(object)new JsonMapSerializer<V>(this, ctx, valueEndec); } public override StructSerializer structed() { return (StructSerializer)(object)new JsonStructSerializer(this); } } public class JsonUtils { private static readonly List<string> ALLOWED_JSON_PATTERNS = new List<string>(2) { "*.json", "*.json5" }; public static string writeToString(JToken value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown StringWriter stringWriter = new StringWriter(); value.WriteTo((JsonWriter)new JsonTextWriter((TextWriter)stringWriter)); return stringWriter.ToString(); } public static JToken readFromString(string value) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown return JToken.ReadFrom((JsonReader)new JsonTextReader((TextReader)new StringReader(value))); } public static JToken readFromFile(string path) { return readFromString(File.ReadAllText(path)); } public static JToken readFromStream(Stream value) { return readFromString(new StreamReader(value).ReadToEnd()); } public static JToken readFromFileIfPresent(string path) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown if (!File.Exists(path)) { return (JToken)new JObject(); } return readFromString(File.ReadAllText(path)); } public static T? parseFromFile<T>(string path) where T : EndecGetter<T> { return parseFromFile<T>(path, EndecGetter.Endec<T>()); } public static T? parseFromFile<T>(string path, Endec<T> endec) { if (!File.Exists(path)) { return default(T); } JToken val = readFromFile(path); return ((Endec<JToken>)(object)endec).decodeFully<JToken>((Func<JToken, Deserializer<JToken>>)JsonDeserializer.of, val); } public static T parseFromStream<T>(Stream stream) where T : EndecGetter<T> { return parseFromStream<T>(stream, EndecGetter.Endec<T>()); } public static T parseFromStream<T>(Stream stream, Endec<T> endec) { JToken val = readFromStream(stream); return ((Endec<JToken>)(object)endec).decodeFully<JToken>((Func<JToken, Deserializer<JToken>>)JsonDeserializer.of, val); } public static T parseFromString<T>(string str, Endec<T> endec) { JToken val = readFromString(str); return ((Endec<JToken>)(object)endec).decodeFully<JToken>((Func<JToken, Deserializer<JToken>>)JsonDeserializer.of, val); } public static Dictionary<string, T> parseFiles<T>(string directory, Func<string, string> keyMaker, Action<string, Exception> onError) where T : EndecGetter<T> { return parseFiles<T>(directory, EndecGetter.Endec<T>(), keyMaker, onError); } public static Dictionary<string, T> parseFiles<T>(string directory, Endec<T> endec, Func<string, string> keyMaker, Action<string, Exception> onError) { string directory2 = directory; List<string> list = ALLOWED_JSON_PATTERNS.SelectMany((string pattern) => Directory.GetFiles(directory2, pattern)).ToList(); Dictionary<string, T> dictionary = new Dictionary<string, T>(); foreach (string item in list) { if (item != null && File.Exists(item)) { try { T value = parseFromFile<T>(item, endec); dictionary[keyMaker(item)] = value; } catch (Exception arg) { onError(item, arg); } } } return dictionary; } } }
StandardSocketsHttpHandler.dll
Decompiled 4 months ago
The result has been truncated due to the large size, download it to view full contents!
using System.Buffers.Text; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.Tracing; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Security; using System.Net.Sockets; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Permissions; using System.Text; using System.Threading; using System.Threading.Tasks; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Tal Aloni")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.2.0.10")] [assembly: AssemblyInformationalVersion("2.2.0.10")] [assembly: AssemblyProduct("StandardSocketsHttpHandler")] [assembly: AssemblyTitle("StandardSocketsHttpHandler")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/TalAloni/StandardSocketsHttpHandler")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.2.0.10")] [assembly: TypeForwardedTo(typeof(SslClientAuthenticationOptions))] [module: UnverifiableCode] namespace System { internal static class StringExtensions { internal static string SubstringTrim(this string value, int startIndex) { return value.SubstringTrim(startIndex, value.Length - startIndex); } internal static string SubstringTrim(this string value, int startIndex, int length) { if (length == 0) { return string.Empty; } int num = startIndex + length - 1; while (startIndex <= num && char.IsWhiteSpace(value[startIndex])) { startIndex++; } while (num >= startIndex && char.IsWhiteSpace(value[num])) { num--; } int num2 = num - startIndex + 1; if (num2 != 0) { if (num2 != value.Length) { return value.Substring(startIndex, num2); } return value; } return string.Empty; } } internal static class ByteArrayHelpers { internal static bool EqualsOrdinalAsciiIgnoreCase(string left, ReadOnlySpan<byte> right) { if (left.Length != right.Length) { return false; } for (int i = 0; i < left.Length; i++) { uint num = left[i]; uint num2 = right[i]; if (num - 97 <= 25) { num -= 32; } if (num2 - 97 <= 25) { num2 -= 32; } if (num != num2) { return false; } } return true; } } internal class RuntimeUtils { public static bool IsDotNetFramework() { return RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework"); } public static bool IsDotNetNative() { return RuntimeInformation.FrameworkDescription.StartsWith(".NET Native"); } public static bool IsMono() { return RuntimeInformation.FrameworkDescription.StartsWith("Mono"); } } } namespace System.Threading.Tasks { internal static class TaskExtensions { public static bool IsCompletedSuccessfully(this Task task) { if (task.IsCompleted) { if (!task.IsFaulted) { return !task.IsCanceled; } return false; } return false; } } internal static class TaskToApm { private sealed class TaskWrapperAsyncResult : IAsyncResult { internal readonly Task Task; private readonly object _state; private readonly bool _completedSynchronously; object IAsyncResult.AsyncState => _state; bool IAsyncResult.CompletedSynchronously => _completedSynchronously; bool IAsyncResult.IsCompleted => Task.IsCompleted; WaitHandle IAsyncResult.AsyncWaitHandle => ((IAsyncResult)Task).AsyncWaitHandle; internal TaskWrapperAsyncResult(Task task, object state, bool completedSynchronously) { Task = task; _state = state; _completedSynchronously = completedSynchronously; } } public static IAsyncResult Begin(Task task, AsyncCallback callback, object state) { IAsyncResult asyncResult; if (task.IsCompleted) { asyncResult = new TaskWrapperAsyncResult(task, state, completedSynchronously: true); callback?.Invoke(asyncResult); } else { IAsyncResult asyncResult3; if (task.AsyncState != state) { IAsyncResult asyncResult2 = new TaskWrapperAsyncResult(task, state, completedSynchronously: false); asyncResult3 = asyncResult2; } else { IAsyncResult asyncResult2 = task; asyncResult3 = asyncResult2; } asyncResult = asyncResult3; if (callback != null) { InvokeCallbackWhenTaskCompletes(task, callback, asyncResult); } } return asyncResult; } public static void End(IAsyncResult asyncResult) { Task task = ((!(asyncResult is TaskWrapperAsyncResult taskWrapperAsyncResult)) ? (asyncResult as Task) : taskWrapperAsyncResult.Task); if (task == null) { throw new ArgumentNullException(); } task.GetAwaiter().GetResult(); } public static TResult End<TResult>(IAsyncResult asyncResult) { Task<TResult> task = ((!(asyncResult is TaskWrapperAsyncResult taskWrapperAsyncResult)) ? (asyncResult as Task<TResult>) : (taskWrapperAsyncResult.Task as Task<TResult>)); if (task == null) { throw new ArgumentNullException(); } return task.GetAwaiter().GetResult(); } private static void InvokeCallbackWhenTaskCompletes(Task antecedent, AsyncCallback callback, IAsyncResult asyncResult) { antecedent.ConfigureAwait(continueOnCapturedContext: false).GetAwaiter().OnCompleted(delegate { callback(asyncResult); }); } } } namespace System.Net { internal static class HttpKnownHeaderNames { public const string Accept = "Accept"; public const string AcceptCharset = "Accept-Charset"; public const string AcceptEncoding = "Accept-Encoding"; public const string AcceptLanguage = "Accept-Language"; public const string AcceptPatch = "Accept-Patch"; public const string AcceptRanges = "Accept-Ranges"; public const string AccessControlAllowCredentials = "Access-Control-Allow-Credentials"; public const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; public const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; public const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; public const string AccessControlExposeHeaders = "Access-Control-Expose-Headers"; public const string AccessControlMaxAge = "Access-Control-Max-Age"; public const string Age = "Age"; public const string Allow = "Allow"; public const string AltSvc = "Alt-Svc"; public const string Authorization = "Authorization"; public const string CacheControl = "Cache-Control"; public const string Connection = "Connection"; public const string ContentDisposition = "Content-Disposition"; public const string ContentEncoding = "Content-Encoding"; public const string ContentLanguage = "Content-Language"; public const string ContentLength = "Content-Length"; public const string ContentLocation = "Content-Location"; public const string ContentMD5 = "Content-MD5"; public const string ContentRange = "Content-Range"; public const string ContentSecurityPolicy = "Content-Security-Policy"; public const string ContentType = "Content-Type"; public const string Cookie = "Cookie"; public const string Cookie2 = "Cookie2"; public const string Date = "Date"; public const string ETag = "ETag"; public const string Expect = "Expect"; public const string Expires = "Expires"; public const string From = "From"; public const string Host = "Host"; public const string IfMatch = "If-Match"; public const string IfModifiedSince = "If-Modified-Since"; public const string IfNoneMatch = "If-None-Match"; public const string IfRange = "If-Range"; public const string IfUnmodifiedSince = "If-Unmodified-Since"; public const string KeepAlive = "Keep-Alive"; public const string LastModified = "Last-Modified"; public const string Link = "Link"; public const string Location = "Location"; public const string MaxForwards = "Max-Forwards"; public const string Origin = "Origin"; public const string P3P = "P3P"; public const string Pragma = "Pragma"; public const string ProxyAuthenticate = "Proxy-Authenticate"; public const string ProxyAuthorization = "Proxy-Authorization"; public const string ProxyConnection = "Proxy-Connection"; public const string PublicKeyPins = "Public-Key-Pins"; public const string Range = "Range"; public const string Referer = "Referer"; public const string RetryAfter = "Retry-After"; public const string SecWebSocketAccept = "Sec-WebSocket-Accept"; public const string SecWebSocketExtensions = "Sec-WebSocket-Extensions"; public const string SecWebSocketKey = "Sec-WebSocket-Key"; public const string SecWebSocketProtocol = "Sec-WebSocket-Protocol"; public const string SecWebSocketVersion = "Sec-WebSocket-Version"; public const string Server = "Server"; public const string SetCookie = "Set-Cookie"; public const string SetCookie2 = "Set-Cookie2"; public const string StrictTransportSecurity = "Strict-Transport-Security"; public const string TE = "TE"; public const string TSV = "TSV"; public const string Trailer = "Trailer"; public const string TransferEncoding = "Transfer-Encoding"; public const string Upgrade = "Upgrade"; public const string UpgradeInsecureRequests = "Upgrade-Insecure-Requests"; public const string UserAgent = "User-Agent"; public const string Vary = "Vary"; public const string Via = "Via"; public const string WWWAuthenticate = "WWW-Authenticate"; public const string Warning = "Warning"; public const string XAspNetVersion = "X-AspNet-Version"; public const string XContentDuration = "X-Content-Duration"; public const string XContentTypeOptions = "X-Content-Type-Options"; public const string XFrameOptions = "X-Frame-Options"; public const string XMSEdgeRef = "X-MSEdge-Ref"; public const string XPoweredBy = "X-Powered-By"; public const string XRequestID = "X-Request-ID"; public const string XUACompatible = "X-UA-Compatible"; } internal static class HttpStatusDescription { internal static string Get(HttpStatusCode code) { return Get((int)code); } internal static string Get(int code) { return code switch { 100 => "Continue", 101 => "Switching Protocols", 102 => "Processing", 103 => "Early Hints", 200 => "OK", 201 => "Created", 202 => "Accepted", 203 => "Non-Authoritative Information", 204 => "No Content", 205 => "Reset Content", 206 => "Partial Content", 207 => "Multi-Status", 208 => "Already Reported", 226 => "IM Used", 300 => "Multiple Choices", 301 => "Moved Permanently", 302 => "Found", 303 => "See Other", 304 => "Not Modified", 305 => "Use Proxy", 307 => "Temporary Redirect", 308 => "Permanent Redirect", 400 => "Bad Request", 401 => "Unauthorized", 402 => "Payment Required", 403 => "Forbidden", 404 => "Not Found", 405 => "Method Not Allowed", 406 => "Not Acceptable", 407 => "Proxy Authentication Required", 408 => "Request Timeout", 409 => "Conflict", 410 => "Gone", 411 => "Length Required", 412 => "Precondition Failed", 413 => "Request Entity Too Large", 414 => "Request-Uri Too Long", 415 => "Unsupported Media Type", 416 => "Requested Range Not Satisfiable", 417 => "Expectation Failed", 421 => "Misdirected Request", 422 => "Unprocessable Entity", 423 => "Locked", 424 => "Failed Dependency", 426 => "Upgrade Required", 428 => "Precondition Required", 429 => "Too Many Requests", 431 => "Request Header Fields Too Large", 451 => "Unavailable For Legal Reasons", 500 => "Internal Server Error", 501 => "Not Implemented", 502 => "Bad Gateway", 503 => "Service Unavailable", 504 => "Gateway Timeout", 505 => "Http Version Not Supported", 506 => "Variant Also Negotiates", 507 => "Insufficient Storage", 508 => "Loop Detected", 510 => "Not Extended", 511 => "Network Authentication Required", _ => null, }; } } internal static class HttpVersionInternal { public static readonly Version Unknown = new Version(0, 0); public static readonly Version Version10 = new Version(1, 0); public static readonly Version Version11 = new Version(1, 1); public static readonly Version Version20 = new Version(2, 0); } [EventSource(Name = "Microsoft-System-Net-Http", LocalizationResources = "FxResources.System.Net.Http.SR")] internal sealed class NetEventSource : EventSource { public class Keywords { public const EventKeywords Default = (EventKeywords)1L; public const EventKeywords Debug = (EventKeywords)2L; public const EventKeywords EnterExit = (EventKeywords)4L; } private const int UriBaseAddressId = 17; private const int ContentNullId = 18; private const int ClientSendCompletedId = 19; private const int HeadersInvalidValueId = 20; private const int HandlerMessageId = 21; public static readonly System.Net.NetEventSource Log = new System.Net.NetEventSource(); private const string MissingMember = "(?)"; private const string NullInstance = "(null)"; private const string StaticMethodObject = "(static)"; private const string NoParameters = ""; private const int MaxDumpSize = 1024; private const int EnterEventId = 1; private const int ExitEventId = 2; private const int AssociateEventId = 3; private const int InfoEventId = 4; private const int ErrorEventId = 5; private const int CriticalFailureEventId = 6; private const int DumpArrayEventId = 7; private const int EnumerateSecurityPackagesId = 8; private const int SspiPackageNotFoundId = 9; private const int AcquireDefaultCredentialId = 10; private const int AcquireCredentialsHandleId = 11; private const int InitializeSecurityContextId = 12; private const int SecurityContextInputBufferId = 13; private const int SecurityContextInputBuffersId = 14; private const int AcceptSecuritContextId = 15; private const int OperationReturnedSomethingId = 16; private const int NextAvailableEventId = 17; public new static bool IsEnabled => Log.IsEnabled(); [NonEvent] public static void UriBaseAddress(object obj, Uri baseAddress) { if (IsEnabled) { Log.UriBaseAddress(baseAddress?.ToString(), IdOf(obj), GetHashCode(obj)); } } [Event(17, Keywords = (EventKeywords)2L, Level = EventLevel.Informational)] private void UriBaseAddress(string uriBaseAddress, string objName, int objHash) { WriteEvent(17, uriBaseAddress, objName, objHash); } [NonEvent] public static void ContentNull(object obj) { if (IsEnabled) { Log.ContentNull(IdOf(obj), GetHashCode(obj)); } } [Event(18, Keywords = (EventKeywords)2L, Level = EventLevel.Informational)] private void ContentNull(string objName, int objHash) { WriteEvent(18, objName, objHash); } [NonEvent] public static void ClientSendCompleted(HttpClient httpClient, HttpResponseMessage response, HttpRequestMessage request) { if (IsEnabled) { Log.ClientSendCompleted(response?.ToString(), GetHashCode(request), GetHashCode(response), GetHashCode(httpClient)); } } [Event(19, Keywords = (EventKeywords)2L, Level = EventLevel.Verbose)] private void ClientSendCompleted(string responseString, int httpRequestMessageHash, int httpResponseMessageHash, int httpClientHash) { WriteEvent(19, responseString, httpRequestMessageHash, httpResponseMessageHash, httpClientHash); } [Event(20, Keywords = (EventKeywords)2L, Level = EventLevel.Verbose)] public void HeadersInvalidValue(string name, string rawValue) { WriteEvent(20, name, rawValue); } [Event(21, Keywords = (EventKeywords)2L, Level = EventLevel.Verbose)] public void HandlerMessage(int handlerId, int workerId, int requestId, string memberName, string message) { WriteEvent(21, handlerId, workerId, requestId, memberName, message); } [NonEvent] private unsafe void WriteEvent(int eventId, int arg1, int arg2, int arg3, string arg4, string arg5) { if (!IsEnabled()) { return; } if (arg4 == null) { arg4 = ""; } if (arg5 == null) { arg5 = ""; } fixed (char* ptr2 = arg4) { fixed (char* ptr3 = arg5) { EventData* ptr = stackalloc EventData[5]; *ptr = new EventData { DataPointer = (IntPtr)(&arg1), Size = 4 }; ptr[1] = new EventData { DataPointer = (IntPtr)(&arg2), Size = 4 }; ptr[2] = new EventData { DataPointer = (IntPtr)(&arg3), Size = 4 }; ptr[3] = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg4.Length + 1) * 2 }; ptr[4] = new EventData { DataPointer = (IntPtr)ptr3, Size = (arg5.Length + 1) * 2 }; WriteEventCore(eventId, 5, ptr); } } } [NonEvent] public static void Enter(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, (formattableString != null) ? Format(formattableString) : ""); } } [NonEvent] public static void Enter(object thisOrContextObject, object arg0, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)})"); } } [NonEvent] public static void Enter(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)})"); } } [NonEvent] public static void Enter(object thisOrContextObject, object arg0, object arg1, object arg2, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)}, {Format(arg2)})"); } } [Event(1, Level = EventLevel.Informational, Keywords = (EventKeywords)4L)] private void Enter(string thisOrContextObject, string memberName, string parameters) { WriteEvent(1, thisOrContextObject, memberName ?? "(?)", parameters); } [NonEvent] public static void Exit(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Exit(IdOf(thisOrContextObject), memberName, (formattableString != null) ? Format(formattableString) : ""); } } [NonEvent] public static void Exit(object thisOrContextObject, object arg0, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Exit(IdOf(thisOrContextObject), memberName, Format(arg0).ToString()); } } [NonEvent] public static void Exit(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Exit(IdOf(thisOrContextObject), memberName, $"{Format(arg0)}, {Format(arg1)}"); } } [Event(2, Level = EventLevel.Informational, Keywords = (EventKeywords)4L)] private void Exit(string thisOrContextObject, string memberName, string result) { WriteEvent(2, thisOrContextObject, memberName ?? "(?)", result); } [NonEvent] public static void Info(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Info(IdOf(thisOrContextObject), memberName, (formattableString != null) ? Format(formattableString) : ""); } } [NonEvent] public static void Info(object thisOrContextObject, object message, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Info(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } } [Event(4, Level = EventLevel.Informational, Keywords = (EventKeywords)1L)] private void Info(string thisOrContextObject, string memberName, string message) { WriteEvent(4, thisOrContextObject, memberName ?? "(?)", message); } [NonEvent] public static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(formattableString)); } } [NonEvent] public static void Error(object thisOrContextObject, object message, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } } [Event(5, Level = EventLevel.Warning, Keywords = (EventKeywords)1L)] private void ErrorMessage(string thisOrContextObject, string memberName, string message) { WriteEvent(5, thisOrContextObject, memberName ?? "(?)", message); } [NonEvent] public static void Fail(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(formattableString)); } } [NonEvent] public static void Fail(object thisOrContextObject, object message, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } } [Event(6, Level = EventLevel.Critical, Keywords = (EventKeywords)2L)] private void CriticalFailure(string thisOrContextObject, string memberName, string message) { WriteEvent(6, thisOrContextObject, memberName ?? "(?)", message); } [NonEvent] public static void DumpBuffer(object thisOrContextObject, byte[] buffer, [CallerMemberName] string memberName = null) { DumpBuffer(thisOrContextObject, buffer, 0, buffer.Length, memberName); } [NonEvent] public static void DumpBuffer(object thisOrContextObject, byte[] buffer, int offset, int count, [CallerMemberName] string memberName = null) { if (!IsEnabled) { return; } if (offset < 0 || offset > buffer.Length - count) { Fail(thisOrContextObject, FormattableStringFactory.Create("Invalid {0} Args. Length={1}, Offset={2}, Count={3}", "DumpBuffer", buffer.Length, offset, count), memberName); return; } count = Math.Min(count, 1024); byte[] array = buffer; if (offset != 0 || count != buffer.Length) { array = new byte[count]; Buffer.BlockCopy(buffer, offset, array, 0, count); } Log.DumpBuffer(IdOf(thisOrContextObject), memberName, array); } [NonEvent] public unsafe static void DumpBuffer(object thisOrContextObject, IntPtr bufferPtr, int count, [CallerMemberName] string memberName = null) { if (IsEnabled) { byte[] array = new byte[Math.Min(count, 1024)]; fixed (byte* destination = array) { Buffer.MemoryCopy((void*)bufferPtr, destination, array.Length, array.Length); } Log.DumpBuffer(IdOf(thisOrContextObject), memberName, array); } } [Event(7, Level = EventLevel.Verbose, Keywords = (EventKeywords)2L)] private void DumpBuffer(string thisOrContextObject, string memberName, byte[] buffer) { WriteEvent(7, thisOrContextObject, memberName ?? "(?)", buffer); } [NonEvent] public static void Associate(object first, object second, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Associate(IdOf(first), memberName, IdOf(first), IdOf(second)); } } [NonEvent] public static void Associate(object thisOrContextObject, object first, object second, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Associate(IdOf(thisOrContextObject), memberName, IdOf(first), IdOf(second)); } } [Event(3, Level = EventLevel.Informational, Keywords = (EventKeywords)1L, Message = "[{2}]<-->[{3}]")] private void Associate(string thisOrContextObject, string memberName, string first, string second) { WriteEvent(3, thisOrContextObject, memberName ?? "(?)", first, second); } [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")] private static void DebugValidateArg(object arg) { _ = IsEnabled; } [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")] private static void DebugValidateArg(FormattableString arg) { } [NonEvent] public static string IdOf(object value) { if (value == null) { return "(null)"; } return value.GetType().Name + "#" + GetHashCode(value); } [NonEvent] public static int GetHashCode(object value) { return value?.GetHashCode() ?? 0; } [NonEvent] public static object Format(object value) { if (value == null) { return "(null)"; } string text = null; if (text != null) { return text; } if (value is Array array) { return $"{array.GetType().GetElementType()}[{((Array)value).Length}]"; } if (value is ICollection collection) { return $"{collection.GetType().Name}({collection.Count})"; } if (value is SafeHandle safeHandle) { return $"{safeHandle.GetType().Name}:{safeHandle.GetHashCode()}(0x{safeHandle.DangerousGetHandle():X})"; } if (value is IntPtr) { return $"0x{value:X}"; } string text2 = value.ToString(); if (text2 == null || text2 == value.GetType().FullName) { return IdOf(value); } return value; } [NonEvent] private static string Format(FormattableString s) { switch (s.ArgumentCount) { case 0: return s.Format; case 1: return string.Format(s.Format, Format(s.GetArgument(0))); case 2: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1))); case 3: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)), Format(s.GetArgument(2))); default: { object[] arguments = s.GetArguments(); object[] array = new object[arguments.Length]; for (int i = 0; i < arguments.Length; i++) { array[i] = Format(arguments[i]); } return string.Format(s.Format, array); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, string arg3, string arg4) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } if (arg3 == null) { arg3 = ""; } if (arg4 == null) { arg4 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { fixed (char* ptr4 = arg3) { fixed (char* ptr5 = arg4) { EventData* ptr = stackalloc EventData[4]; *ptr = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg1.Length + 1) * 2 }; ptr[1] = new EventData { DataPointer = (IntPtr)ptr3, Size = (arg2.Length + 1) * 2 }; ptr[2] = new EventData { DataPointer = (IntPtr)ptr4, Size = (arg3.Length + 1) * 2 }; ptr[3] = new EventData { DataPointer = (IntPtr)ptr5, Size = (arg4.Length + 1) * 2 }; WriteEventCore(eventId, 4, ptr); } } } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, byte[] arg3) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } if (arg3 == null) { arg3 = Array.Empty<byte>(); } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { fixed (byte* ptr4 = arg3) { int size = arg3.Length; EventData* ptr = stackalloc EventData[4]; *ptr = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg1.Length + 1) * 2 }; ptr[1] = new EventData { DataPointer = (IntPtr)ptr3, Size = (arg2.Length + 1) * 2 }; ptr[2] = new EventData { DataPointer = (IntPtr)(&size), Size = 4 }; ptr[3] = new EventData { DataPointer = (IntPtr)ptr4, Size = size }; WriteEventCore(eventId, 4, ptr); } } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, int arg2, int arg3, int arg4) { if (IsEnabled()) { if (arg1 == null) { arg1 = ""; } fixed (char* ptr2 = arg1) { EventData* ptr = stackalloc EventData[4]; *ptr = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg1.Length + 1) * 2 }; ptr[1] = new EventData { DataPointer = (IntPtr)(&arg2), Size = 4 }; ptr[2] = new EventData { DataPointer = (IntPtr)(&arg3), Size = 4 }; ptr[3] = new EventData { DataPointer = (IntPtr)(&arg4), Size = 4 }; WriteEventCore(eventId, 4, ptr); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, int arg2, string arg3) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg3 == null) { arg3 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg3) { EventData* ptr = stackalloc EventData[3]; *ptr = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg1.Length + 1) * 2 }; ptr[1] = new EventData { DataPointer = (IntPtr)(&arg2), Size = 4 }; ptr[2] = new EventData { DataPointer = (IntPtr)ptr3, Size = (arg3.Length + 1) * 2 }; WriteEventCore(eventId, 3, ptr); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, int arg3) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { EventData* ptr = stackalloc EventData[3]; *ptr = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg1.Length + 1) * 2 }; ptr[1] = new EventData { DataPointer = (IntPtr)ptr3, Size = (arg2.Length + 1) * 2 }; ptr[2] = new EventData { DataPointer = (IntPtr)(&arg3), Size = 4 }; WriteEventCore(eventId, 3, ptr); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, string arg3, int arg4) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } if (arg3 == null) { arg3 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { fixed (char* ptr4 = arg3) { EventData* ptr = stackalloc EventData[4]; *ptr = new EventData { DataPointer = (IntPtr)ptr2, Size = (arg1.Length + 1) * 2 }; ptr[1] = new EventData { DataPointer = (IntPtr)ptr3, Size = (arg2.Length + 1) * 2 }; ptr[2] = new EventData { DataPointer = (IntPtr)ptr4, Size = (arg3.Length + 1) * 2 }; ptr[3] = new EventData { DataPointer = (IntPtr)(&arg4), Size = 4 }; WriteEventCore(eventId, 4, ptr); } } } } } internal static class SecurityProtocol { public const SslProtocols DefaultSecurityProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13; public const SslProtocols SystemDefaultSecurityProtocols = SslProtocols.None; } internal static class UriScheme { public const string File = "file"; public const string Ftp = "ftp"; public const string Gopher = "gopher"; public const string Http = "http"; public const string Https = "https"; public const string News = "news"; public const string NetPipe = "net.pipe"; public const string NetTcp = "net.tcp"; public const string Nntp = "nntp"; public const string Mailto = "mailto"; public const string Ws = "ws"; public const string Wss = "wss"; public const string SchemeDelimiter = "://"; } } namespace System.Net.Security { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] public class SR { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] public static ResourceManager ResourceManager { get { if (resourceMan == null) { resourceMan = new ResourceManager("System.Net.Http.Net.Security.SR", typeof(SR).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] public static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } public static string event_AttemptingRestartUsingCert => ResourceManager.GetString("event_AttemptingRestartUsingCert", resourceCulture); public static string event_CertificateFromDelegate => ResourceManager.GetString("event_CertificateFromDelegate", resourceCulture); public static string event_CertIsType2 => ResourceManager.GetString("event_CertIsType2", resourceCulture); public static string event_CertsAfterFiltering => ResourceManager.GetString("event_CertsAfterFiltering", resourceCulture); public static string event_EnumerateSecurityPackages => ResourceManager.GetString("event_EnumerateSecurityPackages", resourceCulture); public static string event_FindingMatchingCerts => ResourceManager.GetString("event_FindingMatchingCerts", resourceCulture); public static string event_FoundCertInStore => ResourceManager.GetString("event_FoundCertInStore", resourceCulture); public static string event_LocatingPrivateKey => ResourceManager.GetString("event_LocatingPrivateKey", resourceCulture); public static string event_LookForMatchingCerts => ResourceManager.GetString("event_LookForMatchingCerts", resourceCulture); public static string event_NoDelegateButClientCert => ResourceManager.GetString("event_NoDelegateButClientCert", resourceCulture); public static string event_NoDelegateNoClientCert => ResourceManager.GetString("event_NoDelegateNoClientCert", resourceCulture); public static string event_NoIssuersTryAllCerts => ResourceManager.GetString("event_NoIssuersTryAllCerts", resourceCulture); public static string event_NotFoundCertInStore => ResourceManager.GetString("event_NotFoundCertInStore", resourceCulture); public static string event_OperationReturnedSomething => ResourceManager.GetString("event_OperationReturnedSomething", resourceCulture); public static string event_RemoteCertDeclaredValid => ResourceManager.GetString("event_RemoteCertDeclaredValid", resourceCulture); public static string event_RemoteCertHasNoErrors => ResourceManager.GetString("event_RemoteCertHasNoErrors", resourceCulture); public static string event_RemoteCertificate => ResourceManager.GetString("event_RemoteCertificate", resourceCulture); public static string event_RemoteCertUserDeclaredInvalid => ResourceManager.GetString("event_RemoteCertUserDeclaredInvalid", resourceCulture); public static string event_SecurityContextInputBuffer => ResourceManager.GetString("event_SecurityContextInputBuffer", resourceCulture); public static string event_SecurityContextInputBuffers => ResourceManager.GetString("event_SecurityContextInputBuffers", resourceCulture); public static string event_SelectedCert => ResourceManager.GetString("event_SelectedCert", resourceCulture); public static string event_SspiPackageNotFound => ResourceManager.GetString("event_SspiPackageNotFound", resourceCulture); public static string event_SspiSelectedCipherSuite => ResourceManager.GetString("event_SspiSelectedCipherSuite", resourceCulture); public static string event_UsingCachedCredential => ResourceManager.GetString("event_UsingCachedCredential", resourceCulture); public static string net_allocate_ssl_context_failed => ResourceManager.GetString("net_allocate_ssl_context_failed", resourceCulture); public static string net_alpn_config_failed => ResourceManager.GetString("net_alpn_config_failed", resourceCulture); public static string net_alpn_failed => ResourceManager.GetString("net_alpn_failed", resourceCulture); public static string net_auth_alert => ResourceManager.GetString("net_auth_alert", resourceCulture); public static string net_auth_bad_client_creds => ResourceManager.GetString("net_auth_bad_client_creds", resourceCulture); public static string net_auth_bad_client_creds_or_target_mismatch => ResourceManager.GetString("net_auth_bad_client_creds_or_target_mismatch", resourceCulture); public static string net_auth_client_server => ResourceManager.GetString("net_auth_client_server", resourceCulture); public static string net_auth_context_expectation => ResourceManager.GetString("net_auth_context_expectation", resourceCulture); public static string net_auth_context_expectation_remote => ResourceManager.GetString("net_auth_context_expectation_remote", resourceCulture); public static string net_auth_eof => ResourceManager.GetString("net_auth_eof", resourceCulture); public static string net_auth_ignored_reauth => ResourceManager.GetString("net_auth_ignored_reauth", resourceCulture); public static string net_auth_message_not_encrypted => ResourceManager.GetString("net_auth_message_not_encrypted", resourceCulture); public static string net_auth_must_specify_extended_protection_scheme => ResourceManager.GetString("net_auth_must_specify_extended_protection_scheme", resourceCulture); public static string net_auth_noauth => ResourceManager.GetString("net_auth_noauth", resourceCulture); public static string net_auth_reauth => ResourceManager.GetString("net_auth_reauth", resourceCulture); public static string net_auth_SSPI => ResourceManager.GetString("net_auth_SSPI", resourceCulture); public static string net_auth_supported_impl_levels => ResourceManager.GetString("net_auth_supported_impl_levels", resourceCulture); public static string net_conflicting_options => ResourceManager.GetString("net_conflicting_options", resourceCulture); public static string net_context_buffer_too_small => ResourceManager.GetString("net_context_buffer_too_small", resourceCulture); public static string net_encryptionpolicy_notsupported => ResourceManager.GetString("net_encryptionpolicy_notsupported", resourceCulture); public static string net_frame_max_size => ResourceManager.GetString("net_frame_max_size", resourceCulture); public static string net_frame_read_io => ResourceManager.GetString("net_frame_read_io", resourceCulture); public static string net_frame_read_size => ResourceManager.GetString("net_frame_read_size", resourceCulture); public static string net_frame_size => ResourceManager.GetString("net_frame_size", resourceCulture); public static string net_generic_operation_failed => ResourceManager.GetString("net_generic_operation_failed", resourceCulture); public static string net_gssapi_operation_failed => ResourceManager.GetString("net_gssapi_operation_failed", resourceCulture); public static string net_gssapi_operation_failed_detailed => ResourceManager.GetString("net_gssapi_operation_failed_detailed", resourceCulture); public static string net_invalid_enum => ResourceManager.GetString("net_invalid_enum", resourceCulture); public static string net_io_async_result => ResourceManager.GetString("net_io_async_result", resourceCulture); public static string net_io_connectionclosed => ResourceManager.GetString("net_io_connectionclosed", resourceCulture); public static string net_io_decrypt => ResourceManager.GetString("net_io_decrypt", resourceCulture); public static string net_io_encrypt => ResourceManager.GetString("net_io_encrypt", resourceCulture); public static string net_io_eof => ResourceManager.GetString("net_io_eof", resourceCulture); public static string net_io_header_id => ResourceManager.GetString("net_io_header_id", resourceCulture); public static string net_io_invalidendcall => ResourceManager.GetString("net_io_invalidendcall", resourceCulture); public static string net_io_invalidnestedcall => ResourceManager.GetString("net_io_invalidnestedcall", resourceCulture); public static string net_io_must_be_rw_stream => ResourceManager.GetString("net_io_must_be_rw_stream", resourceCulture); public static string net_io_out_range => ResourceManager.GetString("net_io_out_range", resourceCulture); public static string net_io_read => ResourceManager.GetString("net_io_read", resourceCulture); public static string net_io_readfailure => ResourceManager.GetString("net_io_readfailure", resourceCulture); public static string net_io_write => ResourceManager.GetString("net_io_write", resourceCulture); public static string net_log_open_store_failed => ResourceManager.GetString("net_log_open_store_failed", resourceCulture); public static string net_log_operation_failed_with_error => ResourceManager.GetString("net_log_operation_failed_with_error", resourceCulture); public static string net_log_remote_cert_has_errors => ResourceManager.GetString("net_log_remote_cert_has_errors", resourceCulture); public static string net_log_remote_cert_name_mismatch => ResourceManager.GetString("net_log_remote_cert_name_mismatch", resourceCulture); public static string net_log_remote_cert_not_available => ResourceManager.GetString("net_log_remote_cert_not_available", resourceCulture); public static string net_MethodNotImplementedException => ResourceManager.GetString("net_MethodNotImplementedException", resourceCulture); public static string net_nego_channel_binding_not_supported => ResourceManager.GetString("net_nego_channel_binding_not_supported", resourceCulture); public static string net_nego_not_supported_empty_target_with_defaultcreds => ResourceManager.GetString("net_nego_not_supported_empty_target_with_defaultcreds", resourceCulture); public static string net_nego_protection_level_not_supported => ResourceManager.GetString("net_nego_protection_level_not_supported", resourceCulture); public static string net_nego_server_not_supported => ResourceManager.GetString("net_nego_server_not_supported", resourceCulture); public static string net_noseek => ResourceManager.GetString("net_noseek", resourceCulture); public static string net_ntlm_not_possible_default_cred => ResourceManager.GetString("net_ntlm_not_possible_default_cred", resourceCulture); public static string net_offset_plus_count => ResourceManager.GetString("net_offset_plus_count", resourceCulture); public static string net_security_sslprotocol_contiguous => ResourceManager.GetString("net_security_sslprotocol_contiguous", resourceCulture); public static string net_securitypackagesupport => ResourceManager.GetString("net_securitypackagesupport", resourceCulture); public static string net_securityprotocolnotsupported => ResourceManager.GetString("net_securityprotocolnotsupported", resourceCulture); public static string net_ssl_app_protocol_invalid => ResourceManager.GetString("net_ssl_app_protocol_invalid", resourceCulture); public static string net_ssl_app_protocols_invalid => ResourceManager.GetString("net_ssl_app_protocols_invalid", resourceCulture); public static string net_ssl_check_private_key_failed => ResourceManager.GetString("net_ssl_check_private_key_failed", resourceCulture); public static string net_ssl_decrypt_failed => ResourceManager.GetString("net_ssl_decrypt_failed", resourceCulture); public static string net_ssl_encrypt_failed => ResourceManager.GetString("net_ssl_encrypt_failed", resourceCulture); public static string net_ssl_encryptionpolicy_notsupported => ResourceManager.GetString("net_ssl_encryptionpolicy_notsupported", resourceCulture); public static string net_ssl_get_channel_binding_token_failed => ResourceManager.GetString("net_ssl_get_channel_binding_token_failed", resourceCulture); public static string net_ssl_get_connection_info_failed => ResourceManager.GetString("net_ssl_get_connection_info_failed", resourceCulture); public static string net_ssl_handshake_failed_error => ResourceManager.GetString("net_ssl_handshake_failed_error", resourceCulture); public static string net_ssl_invalid_certificate => ResourceManager.GetString("net_ssl_invalid_certificate", resourceCulture); public static string net_ssl_io_already_shutdown => ResourceManager.GetString("net_ssl_io_already_shutdown", resourceCulture); public static string net_ssl_io_cert_validation => ResourceManager.GetString("net_ssl_io_cert_validation", resourceCulture); public static string net_ssl_io_frame => ResourceManager.GetString("net_ssl_io_frame", resourceCulture); public static string net_ssl_io_no_server_cert => ResourceManager.GetString("net_ssl_io_no_server_cert", resourceCulture); public static string net_ssl_io_renego => ResourceManager.GetString("net_ssl_io_renego", resourceCulture); public static string net_ssl_read_bio_failed_error => ResourceManager.GetString("net_ssl_read_bio_failed_error", resourceCulture); public static string net_ssl_use_cert_failed => ResourceManager.GetString("net_ssl_use_cert_failed", resourceCulture); public static string net_ssl_use_private_key_failed => ResourceManager.GetString("net_ssl_use_private_key_failed", resourceCulture); public static string net_ssl_write_bio_failed_error => ResourceManager.GetString("net_ssl_write_bio_failed_error", resourceCulture); public static string net_ssl_x509Name_push_failed_error => ResourceManager.GetString("net_ssl_x509Name_push_failed_error", resourceCulture); public static string security_ExtendedProtectionPolicy_NoEmptyServiceNameCollection => ResourceManager.GetString("security_ExtendedProtectionPolicy_NoEmptyServiceNameCollection", resourceCulture); public static string security_ExtendedProtectionPolicy_UseDifferentConstructorForNever => ResourceManager.GetString("security_ExtendedProtectionPolicy_UseDifferentConstructorForNever", resourceCulture); public static string security_ServiceNameCollection_EmptyServiceName => ResourceManager.GetString("security_ServiceNameCollection_EmptyServiceName", resourceCulture); public static string SSPIInvalidHandleType => ResourceManager.GetString("SSPIInvalidHandleType", resourceCulture); internal SR() { } } internal static class SslClientAuthenticationOptionsExtensions { public static SslClientAuthenticationOptions ShallowClone(this SslClientAuthenticationOptions options) { return new SslClientAuthenticationOptions { AllowRenegotiation = options.AllowRenegotiation, ApplicationProtocols = options.ApplicationProtocols, CertificateRevocationCheckMode = options.CertificateRevocationCheckMode, ClientCertificates = options.ClientCertificates, EnabledSslProtocols = options.EnabledSslProtocols, EncryptionPolicy = options.EncryptionPolicy, LocalCertificateSelectionCallback = options.LocalCertificateSelectionCallback, RemoteCertificateValidationCallback = options.RemoteCertificateValidationCallback, TargetHost = options.TargetHost }; } } } namespace System.Net.Http { internal sealed class DecompressionHandler : StandardHttpMessageHandler { private abstract class DecompressedContent : HttpContent { private HttpContent _originalContent; private CancellationToken _cancellationToken; private bool _contentConsumed; public DecompressedContent(HttpContent originalContent) { _originalContent = originalContent; _contentConsumed = false; base.Headers.AddHeaders(originalContent.Headers); base.Headers.ContentLength = null; base.Headers.ContentEncoding.Clear(); string text = null; foreach (string item in originalContent.Headers.ContentEncoding) { if (text != null) { base.Headers.ContentEncoding.Add(text); } text = item; } } public void SetDefaultCancellationToken(CancellationToken cancellationToken) { _cancellationToken = cancellationToken; } protected abstract Stream GetDecompressedStream(Stream originalStream); protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) { return SerializeToStreamAsyncInternal(stream, context, _cancellationToken); } internal async Task SerializeToStreamAsyncInternal(Stream stream, TransportContext context, CancellationToken cancellationToken) { using Stream decompressedStream = await CreateContentReadStreamAsync().ConfigureAwait(continueOnCapturedContext: false); await decompressedStream.CopyToAsync(stream, 81920, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } protected override async Task<Stream> CreateContentReadStreamAsync() { if (_contentConsumed) { throw new InvalidOperationException(SR.net_http_content_stream_already_read); } _contentConsumed = true; return GetDecompressedStream(await _originalContent.ReadAsStreamAsync().ConfigureAwait(continueOnCapturedContext: false)); } protected override bool TryComputeLength(out long length) { length = 0L; return false; } protected override void Dispose(bool disposing) { if (disposing) { _originalContent.Dispose(); } base.Dispose(disposing); } } private sealed class GZipDecompressedContent : DecompressedContent { public GZipDecompressedContent(HttpContent originalContent) : base(originalContent) { } protected override Stream GetDecompressedStream(Stream originalStream) { return new GZipStream(originalStream, CompressionMode.Decompress); } } private sealed class DeflateDecompressedContent : DecompressedContent { public DeflateDecompressedContent(HttpContent originalContent) : base(originalContent) { } protected override Stream GetDecompressedStream(Stream originalStream) { return new DeflateStream(originalStream, CompressionMode.Decompress); } } private readonly StandardHttpMessageHandler _innerHandler; private readonly DecompressionMethods _decompressionMethods; private const string s_gzip = "gzip"; private const string s_deflate = "deflate"; private static readonly StringWithQualityHeaderValue s_gzipHeaderValue = new StringWithQualityHeaderValue("gzip"); private static readonly StringWithQualityHeaderValue s_deflateHeaderValue = new StringWithQualityHeaderValue("deflate"); internal bool GZipEnabled => (_decompressionMethods & DecompressionMethods.GZip) != 0; internal bool DeflateEnabled => (_decompressionMethods & DecompressionMethods.Deflate) != 0; public DecompressionHandler(DecompressionMethods decompressionMethods, StandardHttpMessageHandler innerHandler) { _decompressionMethods = decompressionMethods; _innerHandler = innerHandler; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (GZipEnabled) { request.Headers.AcceptEncoding.Add(s_gzipHeaderValue); } if (DeflateEnabled) { request.Headers.AcceptEncoding.Add(s_deflateHeaderValue); } HttpResponseMessage httpResponseMessage = await _innerHandler.SendRequestAsync(request, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); ICollection<string> contentEncoding = httpResponseMessage.Content.Headers.ContentEncoding; if (contentEncoding.Count > 0) { string text = null; foreach (string item in contentEncoding) { text = item; } if (GZipEnabled && text == "gzip") { httpResponseMessage.Content = new GZipDecompressedContent(httpResponseMessage.Content); ((GZipDecompressedContent)httpResponseMessage.Content).SetDefaultCancellationToken(cancellationToken); } else if (DeflateEnabled && text == "deflate") { httpResponseMessage.Content = new DeflateDecompressedContent(httpResponseMessage.Content); ((DeflateDecompressedContent)httpResponseMessage.Content).SetDefaultCancellationToken(cancellationToken); } } return httpResponseMessage; } protected override void Dispose(bool disposing) { if (disposing) { _innerHandler.Dispose(); } base.Dispose(disposing); } } internal static class HttpContentHeadersExtensions { public static void AddHeaders(this HttpContentHeaders headers, HttpContentHeaders sourceHeaders) { foreach (KeyValuePair<string, IEnumerable<string>> sourceHeader in sourceHeaders) { headers.TryAddWithoutValidation(sourceHeader.Key, sourceHeader.Value); } } } internal static class HttpRequestMessageExtensions { public static bool HasHeaders(this HttpRequestMessage request) { bool flag = RuntimeUtils.IsDotNetFramework(); bool flag2 = RuntimeUtils.IsMono(); string name = ((flag || flag2) ? "headers" : "_headers"); FieldInfo field = typeof(HttpRequestMessage).GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); if (field == null && flag) { name = "_headers"; field = typeof(HttpRequestMessage).GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); } else if (field == null && RuntimeUtils.IsDotNetNative()) { return true; } return (HttpRequestHeaders)field.GetValue(request) != null; } } internal static class HttpResponseMessageExtensions { internal static void SetVersionWithoutValidation(this HttpResponseMessage message, Version value) { message.Version = value; } internal static void SetStatusCodeWithoutValidation(this HttpResponseMessage message, HttpStatusCode value) { message.StatusCode = value; } internal static void SetReasonPhraseWithoutValidation(this HttpResponseMessage message, string value) { message.ReasonPhrase = value; } } internal static class HttpHandlerDefaults { public const int DefaultMaxAutomaticRedirections = 50; public const int DefaultMaxConnectionsPerServer = int.MaxValue; public const int DefaultMaxResponseDrainSize = 1048576; public static readonly TimeSpan DefaultResponseDrainTimeout = TimeSpan.FromSeconds(2.0); public const int DefaultMaxResponseHeadersLength = 64; public const DecompressionMethods DefaultAutomaticDecompression = DecompressionMethods.None; public const bool DefaultAutomaticRedirection = true; public const bool DefaultUseCookies = true; public const bool DefaultPreAuthenticate = false; public const ClientCertificateOption DefaultClientCertificateOption = ClientCertificateOption.Manual; public const bool DefaultUseProxy = true; public const bool DefaultUseDefaultCredentials = false; public const bool DefaultCheckCertificateRevocationList = false; public static readonly TimeSpan DefaultPooledConnectionLifetime = Timeout.InfiniteTimeSpan; public static readonly TimeSpan DefaultPooledConnectionIdleTimeout = TimeSpan.FromMinutes(2.0); public static readonly TimeSpan DefaultExpect100ContinueTimeout = TimeSpan.FromSeconds(1.0); public static readonly TimeSpan DefaultConnectTimeout = Timeout.InfiniteTimeSpan; } internal enum HttpParseResult { Parsed, NotParsed, InvalidFormat } internal static class HttpRuleParser { private static readonly bool[] s_tokenChars = CreateTokenChars(); private const int maxNestedCount = 5; private static readonly string[] s_dateFormats = new string[15] { "ddd, d MMM yyyy H:m:s 'GMT'", "ddd, d MMM yyyy H:m:s", "d MMM yyyy H:m:s 'GMT'", "d MMM yyyy H:m:s", "ddd, d MMM yy H:m:s 'GMT'", "ddd, d MMM yy H:m:s", "d MMM yy H:m:s 'GMT'", "d MMM yy H:m:s", "dddd, d'-'MMM'-'yy H:m:s 'GMT'", "dddd, d'-'MMM'-'yy H:m:s", "ddd MMM d H:m:s yyyy", "ddd, d MMM yyyy H:m:s zzz", "ddd, d MMM yyyy H:m:s", "d MMM yyyy H:m:s zzz", "d MMM yyyy H:m:s" }; internal const char CR = '\r'; internal const char LF = '\n'; internal const int MaxInt64Digits = 19; internal const int MaxInt32Digits = 10; internal static readonly Encoding DefaultHttpEncoding = Encoding.GetEncoding(28591); private static bool[] CreateTokenChars() { bool[] array = new bool[128]; for (int i = 33; i < 127; i++) { array[i] = true; } array[40] = false; array[41] = false; array[60] = false; array[62] = false; array[64] = false; array[44] = false; array[59] = false; array[58] = false; array[92] = false; array[34] = false; array[47] = false; array[91] = false; array[93] = false; array[63] = false; array[61] = false; array[123] = false; array[125] = false; return array; } internal static bool IsTokenChar(char character) { if (character > '\u007f') { return false; } return s_tokenChars[(uint)character]; } internal static int GetTokenLength(string input, int startIndex) { if (startIndex >= input.Length) { return 0; } for (int i = startIndex; i < input.Length; i++) { if (!IsTokenChar(input[i])) { return i - startIndex; } } return input.Length - startIndex; } internal static bool IsToken(string input) { for (int i = 0; i < input.Length; i++) { if (!IsTokenChar(input[i])) { return false; } } return true; } internal static bool IsToken(ReadOnlySpan<byte> input) { for (int i = 0; i < input.Length; i++) { if (!IsTokenChar((char)input[i])) { return false; } } return true; } internal static string GetTokenString(ReadOnlySpan<byte> input) { return Encoding.ASCII.GetString(input.ToArray()); } internal static int GetWhitespaceLength(string input, int startIndex) { if (startIndex >= input.Length) { return 0; } int num = startIndex; while (num < input.Length) { switch (input[num]) { case '\t': case ' ': num++; continue; case '\r': if (num + 2 < input.Length && input[num + 1] == '\n') { char c = input[num + 2]; if (c == ' ' || c == '\t') { num += 3; continue; } } break; } return num - startIndex; } return input.Length - startIndex; } internal static bool ContainsInvalidNewLine(string value) { return ContainsInvalidNewLine(value, 0); } internal static bool ContainsInvalidNewLine(string value, int startIndex) { for (int i = startIndex; i < value.Length; i++) { if (value[i] != '\r') { continue; } int num = i + 1; if (num < value.Length && value[num] == '\n') { i = num + 1; if (i == value.Length) { return true; } char c = value[i]; if (c != ' ' && c != '\t') { return true; } } } return false; } internal static int GetNumberLength(string input, int startIndex, bool allowDecimal) { int num = startIndex; bool flag = !allowDecimal; if (input[num] == '.') { return 0; } while (num < input.Length) { char c = input[num]; if (c >= '0' && c <= '9') { num++; continue; } if (flag || c != '.') { break; } flag = true; num++; } return num - startIndex; } internal static int GetHostLength(string input, int startIndex, bool allowToken, out string host) { host = null; if (startIndex >= input.Length) { return 0; } int i = startIndex; bool flag; bool num; for (flag = true; i < input.Length; flag = num, i++) { char c = input[i]; switch (c) { case '/': return 0; default: num = flag && IsTokenChar(c); continue; case '\t': case '\r': case ' ': case ',': break; } break; } int num2 = i - startIndex; if (num2 == 0) { return 0; } string text = input.Substring(startIndex, num2); if ((!allowToken || !flag) && !IsValidHostName(text)) { return 0; } host = text; return num2; } internal static System.Net.Http.HttpParseResult GetCommentLength(string input, int startIndex, out int length) { int nestedCount = 0; return GetExpressionLength(input, startIndex, '(', ')', supportsNesting: true, ref nestedCount, out length); } internal static System.Net.Http.HttpParseResult GetQuotedStringLength(string input, int startIndex, out int length) { int nestedCount = 0; return GetExpressionLength(input, startIndex, '"', '"', supportsNesting: false, ref nestedCount, out length); } internal static System.Net.Http.HttpParseResult GetQuotedPairLength(string input, int startIndex, out int length) { length = 0; if (input[startIndex] != '\\') { return System.Net.Http.HttpParseResult.NotParsed; } if (startIndex + 2 > input.Length || input[startIndex + 1] > '\u007f') { return System.Net.Http.HttpParseResult.InvalidFormat; } length = 2; return System.Net.Http.HttpParseResult.Parsed; } internal static string DateToString(DateTimeOffset dateTime) { return dateTime.ToUniversalTime().ToString("r", CultureInfo.InvariantCulture); } internal static bool TryStringToDate(string input, out DateTimeOffset result) { if (DateTimeOffset.TryParseExact(input, s_dateFormats, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out result)) { return true; } return false; } private static System.Net.Http.HttpParseResult GetExpressionLength(string input, int startIndex, char openChar, char closeChar, bool supportsNesting, ref int nestedCount, out int length) { length = 0; if (input[startIndex] != openChar) { return System.Net.Http.HttpParseResult.NotParsed; } int num = startIndex + 1; while (num < input.Length) { int length2 = 0; if (num + 2 < input.Length && GetQuotedPairLength(input, num, out length2) == System.Net.Http.HttpParseResult.Parsed) { num += length2; continue; } if (supportsNesting && input[num] == openChar) { nestedCount++; try { if (nestedCount > 5) { return System.Net.Http.HttpParseResult.InvalidFormat; } int length3 = 0; switch (GetExpressionLength(input, num, openChar, closeChar, supportsNesting, ref nestedCount, out length3)) { case System.Net.Http.HttpParseResult.Parsed: num += length3; break; case System.Net.Http.HttpParseResult.InvalidFormat: return System.Net.Http.HttpParseResult.InvalidFormat; case System.Net.Http.HttpParseResult.NotParsed: break; } } finally { nestedCount--; } } if (input[num] == closeChar) { length = num - startIndex + 1; return System.Net.Http.HttpParseResult.Parsed; } num++; } return System.Net.Http.HttpParseResult.InvalidFormat; } private static bool IsValidHostName(string host) { Uri result; return Uri.TryCreate("http://u@" + host + "/", UriKind.Absolute, out result); } } internal static class HttpUtilities { internal static Version DefaultRequestVersion => HttpVersionInternal.Version20; internal static Version DefaultResponseVersion => HttpVersionInternal.Version11; internal static bool IsHttpUri(Uri uri) { return IsSupportedScheme(uri.Scheme); } internal static bool IsSupportedScheme(string scheme) { if (!IsSupportedNonSecureScheme(scheme)) { return IsSupportedSecureScheme(scheme); } return true; } internal static bool IsSupportedNonSecureScheme(string scheme) { if (!string.Equals(scheme, "http", StringComparison.OrdinalIgnoreCase)) { return IsNonSecureWebSocketScheme(scheme); } return true; } internal static bool IsSupportedSecureScheme(string scheme) { if (!string.Equals(scheme, "https", StringComparison.OrdinalIgnoreCase)) { return IsSecureWebSocketScheme(scheme); } return true; } internal static bool IsNonSecureWebSocketScheme(string scheme) { return string.Equals(scheme, "ws", StringComparison.OrdinalIgnoreCase); } internal static bool IsSecureWebSocketScheme(string scheme) { return string.Equals(scheme, "wss", StringComparison.OrdinalIgnoreCase); } internal static Task ContinueWithStandard<T>(this Task<T> task, object state, Action<Task<T>, object> continuation) { return task.ContinueWith(continuation, state, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } } internal class AuthenticationHelper { private enum AuthenticationType { Basic, Digest, Ntlm, Negotiate } private readonly struct AuthenticationChallenge { public AuthenticationType AuthenticationType { get; } public string SchemeName { get; } public NetworkCredential Credential { get; } public string ChallengeData { get; } public AuthenticationChallenge(AuthenticationType authenticationType, string schemeName, NetworkCredential credential, string challenge) { AuthenticationType = authenticationType; SchemeName = schemeName; Credential = credential; ChallengeData = challenge; } } internal class DigestResponse { internal readonly Dictionary<string, string> Parameters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); internal const string NonceCount = "00000001"; internal DigestResponse(string challenge) { if (!string.IsNullOrEmpty(challenge)) { Parse(challenge); } } private static bool CharIsSpaceOrTab(char ch) { if (ch != ' ') { return ch == '\t'; } return true; } private static bool MustValueBeQuoted(string key) { if (!key.Equals("realm", StringComparison.OrdinalIgnoreCase) && !key.Equals("nonce", StringComparison.OrdinalIgnoreCase) && !key.Equals("opaque", StringComparison.OrdinalIgnoreCase)) { return key.Equals("qop", StringComparison.OrdinalIgnoreCase); } return true; } private string GetNextKey(string data, int currentIndex, out int parsedIndex) { while (currentIndex < data.Length && CharIsSpaceOrTab(data[currentIndex])) { currentIndex++; } int num = currentIndex; while (currentIndex < data.Length && data[currentIndex] != '=' && !CharIsSpaceOrTab(data[currentIndex])) { currentIndex++; } if (currentIndex == data.Length) { parsedIndex = currentIndex; return null; } int length = currentIndex - num; if (CharIsSpaceOrTab(data[currentIndex])) { while (currentIndex < data.Length && CharIsSpaceOrTab(data[currentIndex])) { currentIndex++; } if (currentIndex == data.Length || data[currentIndex] != '=') { parsedIndex = currentIndex; return null; } } while (currentIndex < data.Length && (CharIsSpaceOrTab(data[currentIndex]) || data[currentIndex] == '=')) { currentIndex++; } parsedIndex = currentIndex; return data.Substring(num, length); } private string GetNextValue(string data, int currentIndex, bool expectQuotes, out int parsedIndex) { bool flag = false; if (data[currentIndex] == '"') { flag = true; currentIndex++; } if (expectQuotes && !flag) { parsedIndex = currentIndex; return null; } StringBuilder stringBuilder = StringBuilderCache.Acquire(); while (currentIndex < data.Length && ((flag && data[currentIndex] != '"') || (!flag && data[currentIndex] != ','))) { stringBuilder.Append(data[currentIndex]); currentIndex++; if (currentIndex == data.Length || (!flag && CharIsSpaceOrTab(data[currentIndex]))) { break; } if (flag && data[currentIndex] == '"' && data[currentIndex - 1] == '\\') { stringBuilder.Append(data[currentIndex]); currentIndex++; } } if (flag) { currentIndex++; } while (currentIndex < data.Length && CharIsSpaceOrTab(data[currentIndex])) { currentIndex++; } if (currentIndex == data.Length) { parsedIndex = currentIndex; return StringBuilderCache.GetStringAndRelease(stringBuilder); } if (data[currentIndex++] != ',') { parsedIndex = currentIndex; return null; } while (currentIndex < data.Length && CharIsSpaceOrTab(data[currentIndex])) { currentIndex++; } parsedIndex = currentIndex; return StringBuilderCache.GetStringAndRelease(stringBuilder); } private void Parse(string challenge) { int parsedIndex = 0; while (parsedIndex < challenge.Length) { string nextKey = GetNextKey(challenge, parsedIndex, out parsedIndex); if (!string.IsNullOrEmpty(nextKey) && parsedIndex < challenge.Length) { string nextValue = GetNextValue(challenge, parsedIndex, MustValueBeQuoted(nextKey), out parsedIndex); if (!string.IsNullOrEmpty(nextValue)) { Parameters.Add(nextKey, nextValue); continue; } break; } break; } } } private const string BasicScheme = "Basic"; private const string DigestScheme = "Digest"; private const string NtlmScheme = "NTLM"; private const string NegotiateScheme = "Negotiate"; private const string Qop = "qop"; private const string Auth = "auth"; private const string AuthInt = "auth-int"; private const string Nonce = "nonce"; private const string NC = "nc"; private const string Realm = "realm"; private const string UserHash = "userhash"; private const string Username = "username"; private const string UsernameStar = "username*"; private const string Algorithm = "algorithm"; private const string Uri = "uri"; private const string Sha256 = "SHA-256"; private const string Md5 = "MD5"; private const string Sha256Sess = "SHA-256-sess"; private const string MD5Sess = "MD5-sess"; private const string CNonce = "cnonce"; private const string Opaque = "opaque"; private const string Response = "response"; private const string Stale = "stale"; private static int[] s_alphaNumChooser = new int[3] { 48, 65, 97 }; private static bool TryGetChallengeDataForScheme(string scheme, HttpHeaderValueCollection<AuthenticationHeaderValue> authenticationHeaderValues, out string challengeData) { foreach (AuthenticationHeaderValue authenticationHeaderValue in authenticationHeaderValues) { if (StringComparer.OrdinalIgnoreCase.Equals(scheme, authenticationHeaderValue.Scheme)) { challengeData = authenticationHeaderValue.Parameter; return true; } } challengeData = null; return false; } internal static bool IsSessionAuthenticationChallenge(HttpResponseMessage response) { if (response.StatusCode != HttpStatusCode.Unauthorized) { return false; } foreach (AuthenticationHeaderValue responseAuthenticationHeaderValue in GetResponseAuthenticationHeaderValues(response, isProxyAuth: false)) { if (StringComparer.OrdinalIgnoreCase.Equals("Negotiate", responseAuthenticationHeaderValue.Scheme) || StringComparer.OrdinalIgnoreCase.Equals("NTLM", responseAuthenticationHeaderValue.Scheme)) { return true; } } return false; } private static bool TryGetValidAuthenticationChallengeForScheme(string scheme, AuthenticationType authenticationType, Uri uri, ICredentials credentials, HttpHeaderValueCollection<AuthenticationHeaderValue> authenticationHeaderValues, out AuthenticationChallenge challenge) { challenge = default(AuthenticationChallenge); if (!TryGetChallengeDataForScheme(scheme, authenticationHeaderValues, out var challengeData)) { return false; } NetworkCredential credential = credentials.GetCredential(uri, scheme); if (credential == null) { return false; } challenge = new AuthenticationChallenge(authenticationType, scheme, credential, challengeData); return true; } private static bool TryGetAuthenticationChallenge(HttpResponseMessage response, bool isProxyAuth, Uri authUri, ICredentials credentials, out AuthenticationChallenge challenge) { if (!IsAuthenticationChallenge(response, isProxyAuth)) { challenge = default(AuthenticationChallenge); return false; } HttpHeaderValueCollection<AuthenticationHeaderValue> responseAuthenticationHeaderValues = GetResponseAuthenticationHeaderValues(response, isProxyAuth); if (!TryGetValidAuthenticationChallengeForScheme("Negotiate", AuthenticationType.Negotiate, authUri, credentials, responseAuthenticationHeaderValues, out challenge) && !TryGetValidAuthenticationChallengeForScheme("NTLM", AuthenticationType.Ntlm, authUri, credentials, responseAuthenticationHeaderValues, out challenge) && !TryGetValidAuthenticationChallengeForScheme("Digest", AuthenticationType.Digest, authUri, credentials, responseAuthenticationHeaderValues, out challenge)) { return TryGetValidAuthenticationChallengeForScheme("Basic", AuthenticationType.Basic, authUri, credentials, responseAuthenticationHeaderValues, out challenge); } return true; } private static bool TryGetRepeatedChallenge(HttpResponseMessage response, string scheme, bool isProxyAuth, out string challengeData) { challengeData = null; if (!IsAuthenticationChallenge(response, isProxyAuth)) { return false; } if (!TryGetChallengeDataForScheme(scheme, GetResponseAuthenticationHeaderValues(response, isProxyAuth), out challengeData)) { return false; } return true; } private static bool IsAuthenticationChallenge(HttpResponseMessage response, bool isProxyAuth) { if (!isProxyAuth) { return response.StatusCode == HttpStatusCode.Unauthorized; } return response.StatusCode == HttpStatusCode.ProxyAuthenticationRequired; } private static HttpHeaderValueCollection<AuthenticationHeaderValue> GetResponseAuthenticationHeaderValues(HttpResponseMessage response, bool isProxyAuth) { if (!isProxyAuth) { return response.Headers.WwwAuthenticate; } return response.Headers.ProxyAuthenticate; } private static void SetRequestAuthenticationHeaderValue(HttpRequestMessage request, AuthenticationHeaderValue headerValue, bool isProxyAuth) { if (isProxyAuth) { request.Headers.ProxyAuthorization = headerValue; } else { request.Headers.Authorization = headerValue; } } private static void SetBasicAuthToken(HttpRequestMessage request, NetworkCredential credential, bool isProxyAuth) { string s = ((!string.IsNullOrEmpty(credential.Domain)) ? (credential.Domain + "\\" + credential.UserName + ":" + credential.Password) : (credential.UserName + ":" + credential.Password)); string parameter = Convert.ToBase64String(Encoding.UTF8.GetBytes(s)); SetRequestAuthenticationHeaderValue(request, new AuthenticationHeaderValue("Basic", parameter), isProxyAuth); } private static async Task<bool> TrySetDigestAuthToken(HttpRequestMessage request, NetworkCredential credential, DigestResponse digestResponse, bool isProxyAuth) { string text = await GetDigestTokenForCredential(credential, request, digestResponse).ConfigureAwait(continueOnCapturedContext: false); if (string.IsNullOrEmpty(text)) { return false; } AuthenticationHeaderValue headerValue = new AuthenticationHeaderValue("Digest", text); SetRequestAuthenticationHeaderValue(request, headerValue, isProxyAuth); return true; } private static Task<HttpResponseMessage> InnerSendAsync(HttpRequestMessage request, bool isProxyAuth, bool doRequestAuth, System.Net.Http.HttpConnectionPool pool, CancellationToken cancellationToken) { if (!isProxyAuth) { return pool.SendWithProxyAuthAsync(request, doRequestAuth, cancellationToken); } return pool.SendWithRetryAsync(request, doRequestAuth, cancellationToken); } private static async Task<HttpResponseMessage> SendWithAuthAsync(HttpRequestMessage request, Uri authUri, ICredentials credentials, bool preAuthenticate, bool isProxyAuth, bool doRequestAuth, System.Net.Http.HttpConnectionPool pool, CancellationToken cancellationToken) { bool performedBasicPreauth = false; if (preAuthenticate) { NetworkCredential credential; lock (pool.PreAuthCredentials) { credential = pool.PreAuthCredentials.GetCredential(authUri, "Basic"); } if (credential != null) { SetBasicAuthToken(request, credential, isProxyAuth); performedBasicPreauth = true; } } HttpResponseMessage response = await InnerSendAsync(request, isProxyAuth, doRequestAuth, pool, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (TryGetAuthenticationChallenge(response, isProxyAuth, authUri, credentials, out var challenge)) { switch (challenge.AuthenticationType) { case AuthenticationType.Digest: { DigestResponse digestResponse = new DigestResponse(challenge.ChallengeData); if (!(await TrySetDigestAuthToken(request, challenge.Credential, digestResponse, isProxyAuth).ConfigureAwait(continueOnCapturedContext: false))) { break; } response.Dispose(); response = await InnerSendAsync(request, isProxyAuth, doRequestAuth, pool, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (TryGetRepeatedChallenge(response, challenge.SchemeName, isProxyAuth, out var challengeData)) { digestResponse = new DigestResponse(challengeData); bool flag = IsServerNonceStale(digestResponse); if (flag) { flag = await TrySetDigestAuthToken(request, challenge.Credential, digestResponse, isProxyAuth).ConfigureAwait(continueOnCapturedContext: false); } if (flag) { response.Dispose(); response = await InnerSendAsync(request, isProxyAuth, doRequestAuth, pool, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } } break; } case AuthenticationType.Basic: { if (performedBasicPreauth) { break; } response.Dispose(); SetBasicAuthToken(request, challenge.Credential, isProxyAuth); response = await InnerSendAsync(request, isProxyAuth, doRequestAuth, pool, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (!preAuthenticate) { break; } HttpStatusCode statusCode = response.StatusCode; if (statusCode == HttpStatusCode.Unauthorized || statusCode == HttpStatusCode.ProxyAuthenticationRequired) { break; } lock (pool.PreAuthCredentials) { try { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Info(pool.PreAuthCredentials, $"Adding Basic credential to cache, uri={authUri}, username={challenge.Credential.UserName}", "SendWithAuthAsync"); } pool.PreAuthCredentials.Add(authUri, "Basic", challenge.Credential); } catch (ArgumentException) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Info(pool.PreAuthCredentials, $"Basic credential present in cache, uri={authUri}, username={challenge.Credential.UserName}", "SendWithAuthAsync"); } } } break; } } } return response; } public static Task<HttpResponseMessage> SendWithProxyAuthAsync(HttpRequestMessage request, Uri proxyUri, ICredentials proxyCredentials, bool doRequestAuth, System.Net.Http.HttpConnectionPool pool, CancellationToken cancellationToken) { return SendWithAuthAsync(request, proxyUri, proxyCredentials, preAuthenticate: false, isProxyAuth: true, doRequestAuth, pool, cancellationToken); } public static Task<HttpResponseMessage> SendWithRequestAuthAsync(HttpRequestMessage request, ICredentials credentials, bool preAuthenticate, System.Net.Http.HttpConnectionPool pool, CancellationToken cancellationToken) { return SendWithAuthAsync(request, request.RequestUri, credentials, preAuthenticate, isProxyAuth: false, doRequestAuth: true, pool, cancellationToken); } public static async Task<string> GetDigestTokenForCredential(NetworkCredential credential, HttpRequestMessage request, DigestResponse digestResponse) { StringBuilder sb = StringBuilderCache.Acquire(); if (digestResponse.Parameters.TryGetValue("algorithm", out var algorithm)) { if (!algorithm.Equals("SHA-256", StringComparison.OrdinalIgnoreCase) && !algorithm.Equals("MD5", StringComparison.OrdinalIgnoreCase) && !algorithm.Equals("SHA-256-sess", StringComparison.OrdinalIgnoreCase) && !algorithm.Equals("MD5-sess", StringComparison.OrdinalIgnoreCase)) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(digestResponse, "Algorithm not supported: {algorithm}", "GetDigestTokenForCredential"); } return null; } } else { algorithm = "MD5"; } if (!digestResponse.Parameters.TryGetValue("nonce", out var nonce)) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(digestResponse, "Nonce missing", "GetDigestTokenForCredential"); } return null; } digestResponse.Parameters.TryGetValue("opaque", out var opaque); if (!digestResponse.Parameters.TryGetValue("realm", out var value)) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(digestResponse, "Realm missing", "GetDigestTokenForCredential"); } return null; } string output; if (digestResponse.Parameters.TryGetValue("userhash", out var value2) && value2 == "true") { sb.AppendKeyValue("username", ComputeHash(credential.UserName + ":" + value, algorithm)); sb.AppendKeyValue("userhash", value2, includeQuotes: false); } else if (System.Net.Http.Headers.HeaderUtilities.IsInputEncoded5987(credential.UserName, out output)) { sb.AppendKeyValue("username*", output, includeQuotes: false); } else { sb.AppendKeyValue("username", credential.UserName); } if (value != string.Empty) { sb.AppendKeyValue("realm", value); } sb.AppendKeyValue("nonce", nonce); sb.AppendKeyValue("uri", request.RequestUri.PathAndQuery); string qop = "auth"; if (digestResponse.Parameters.ContainsKey("qop")) { int num = digestResponse.Parameters["qop"].IndexOf("auth-int"); if (num != -1 && digestResponse.Parameters["qop"].IndexOf("auth") == num && digestResponse.Parameters["qop"].IndexOf("auth", num + "auth-int".Length) == -1) { qop = "auth-int"; } } string cnonce = GetRandomAlphaNumericString(); string a1 = credential.UserName + ":" + value + ":" + credential.Password; if (algorithm.EndsWith("sess", StringComparison.OrdinalIgnoreCase)) { a1 = ComputeHash(a1, algorithm) + ":" + nonce + ":" + cnonce; } string a2 = request.Method.Method + ":" + request.RequestUri.PathAndQuery; if (qop == "auth-int") { string text = ((request.Content != null) ? (await request.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext: false)) : string.Empty); string data = text; a2 = a2 + ":" + ComputeHash(data, algorithm); } string value3 = ComputeHash(ComputeHash(a1, algorithm) + ":" + nonce + ":00000001:" + cnonce + ":" + qop + ":" + ComputeHash(a2, algorithm), algorithm); sb.AppendKeyValue("response", value3); sb.AppendKeyValue("algorithm", algorithm, includeQuotes: false); if (opaque != null) { sb.AppendKeyValue("opaque", opaque); } sb.AppendKeyValue("qop", qop, includeQuotes: false); sb.AppendKeyValue("nc", "00000001", includeQuotes: false); sb.AppendKeyValue("cnonce", cnonce, includeQuotes: true, includeComma: false); return StringBuilderCache.GetStringAndRelease(sb); } public static bool IsServerNonceStale(DigestResponse digestResponse) { string value = null; if (digestResponse.Parameters.TryGetValue("stale", out value)) { return value == "true"; } return false; } private static string GetRandomAlphaNumericString() { byte[] array = new byte[32]; RandomNumberGenerator.Create().GetBytes(array); StringBuilder stringBuilder = StringBuilderCache.Acquire(); int num = 0; while (num < array.Length) { int num2 = array[num++] % 3; int num3 = array[num++] % ((num2 == 0) ? 10 : 26); stringBuilder.Append((char)(s_alphaNumChooser[num2] + num3)); } return StringBuilderCache.GetStringAndRelease(stringBuilder); } private static string ComputeHash(string data, string algorithm) { using HashAlgorithm hashAlgorithm = (algorithm.StartsWith("SHA-256", StringComparison.OrdinalIgnoreCase) ? ((HashAlgorithm)SHA256.Create()) : ((HashAlgorithm)MD5.Create())); Span<byte> span = stackalloc byte[hashAlgorithm.HashSize / 8]; span = hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(data)); StringBuilder stringBuilder = StringBuilderCache.Acquire(span.Length * 2); for (int i = 0; i < span.Length; i++) { stringBuilder.Append(span[i].ToString("x2")); } return StringBuilderCache.GetStringAndRelease(stringBuilder); } private static Task<HttpResponseMessage> InnerSendAsync(HttpRequestMessage request, bool isProxyAuth, System.Net.Http.HttpConnectionPool pool, System.Net.Http.HttpConnection connection, CancellationToken cancellationToken) { if (!isProxyAuth) { return pool.SendWithNtProxyAuthAsync(connection, request, cancellationToken); } return connection.SendAsyncCore(request, cancellationToken); } private static bool ProxySupportsConnectionAuth(HttpResponseMessage response) { if (!response.Headers.TryGetValues(System.Net.Http.Headers.KnownHeaders.ProxySupport.Descriptor.Name, out IEnumerable<string> values)) { return false; } foreach (string item in values) { if (item == "Session-Based-Authentication") { return true; } } return false; } private static async Task<HttpResponseMessage> SendWithNtAuthAsync(HttpRequestMessage request, Uri authUri, ICredentials credentials, bool isProxyAuth, System.Net.Http.HttpConnection connection, System.Net.Http.HttpConnectionPool connectionPool, CancellationToken cancellationToken) { HttpResponseMessage httpResponseMessage = await InnerSendAsync(request, isProxyAuth, connectionPool, connection, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (!isProxyAuth && connection.Kind == System.Net.Http.HttpConnectionKind.Proxy && !ProxySupportsConnectionAuth(httpResponseMessage)) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(connection, $"Proxy doesn't support connection-based auth, uri={authUri}", "SendWithNtAuthAsync"); } return httpResponseMessage; } if (TryGetAuthenticationChallenge(httpResponseMessage, isProxyAuth, authUri, credentials, out var challenge) && (challenge.AuthenticationType == AuthenticationType.Negotiate || challenge.AuthenticationType == AuthenticationType.Ntlm)) { throw new NotImplementedException("Windows Authentication is not implemented"); } return httpResponseMessage; } public static Task<HttpResponseMessage> SendWithNtProxyAuthAsync(HttpRequestMessage request, Uri proxyUri, ICredentials proxyCredentials, System.Net.Http.HttpConnection connection, System.Net.Http.HttpConnectionPool connectionPool, CancellationToken cancellationToken) { return SendWithNtAuthAsync(request, proxyUri, proxyCredentials, isProxyAuth: true, connection, connectionPool, cancellationToken); } public static Task<HttpResponseMessage> SendWithNtConnectionAuthAsync(HttpRequestMessage request, ICredentials credentials, System.Net.Http.HttpConnection connection, System.Net.Http.HttpConnectionPool connectionPool, CancellationToken cancellationToken) { return SendWithNtAuthAsync(request, request.RequestUri, credentials, isProxyAuth: false, connection, connectionPool, cancellationToken); } } internal static class StringBuilderExtensions { public static void AppendKeyValue(this StringBuilder sb, string key, string value, bool includeQuotes = true, bool includeComma = true) { sb.Append(key); sb.Append('='); if (includeQuotes) { sb.Append('"'); } sb.Append(value); if (includeQuotes) { sb.Append('"'); } if (includeComma) { sb.Append(','); sb.Append(' '); } } } internal static class CancellationHelper { private static readonly string s_cancellationMessage = new OperationCanceledException().Message; internal static bool ShouldWrapInOperationCanceledException(Exception exception, CancellationToken cancellationToken) { if (!(exception is OperationCanceledException)) { return cancellationToken.IsCancellationRequested; } return false; } internal static Exception CreateOperationCanceledException(Exception innerException, CancellationToken cancellationToken) { return new TaskCanceledException(s_cancellationMessage, innerException, cancellationToken); } private static void ThrowOperationCanceledException(Exception innerException, CancellationToken cancellationToken) { throw CreateOperationCanceledException(innerException, cancellationToken); } internal static void ThrowIfCancellationRequested(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { ThrowOperationCanceledException(null, cancellationToken); } } } internal class HttpConnection : IDisposable { private sealed class ChunkedEncodingReadStream : HttpContentReadStream { private enum ParsingState : byte { ExpectChunkHeader, ExpectChunkData, ExpectChunkTerminator, ConsumeTrailers, Done } private const int MaxChunkBytesAllowed = 16384; private const int MaxTrailingHeaderLength = 16384; private ulong _chunkBytesRemaining; private ParsingState _state; public override bool NeedsDrain => _connection != null; public ChunkedEncodingReadStream(System.Net.Http.HttpConnection connection) : base(connection) { } public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { System.Net.Http.HttpContentStream.ValidateBufferArgs(buffer, offset, count); return ReadAsyncInternal(new Memory<byte>(buffer, offset, count), cancellationToken); } private Task<int> ReadAsyncInternal(Memory<byte> buffer, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled<int>(cancellationToken); } if (_connection == null || buffer.Length == 0) { return Task.FromResult(0); } int num = ReadChunksFromConnectionBuffer(buffer.Span, default(CancellationTokenRegistration), cancellationToken); if (num > 0) { return Task.FromResult(num); } if (_connection == null) { return Task.FromResult(0); } return ReadAsyncCore(buffer, cancellationToken); } private async Task<int> ReadAsyncCore(Memory<byte> buffer, CancellationToken cancellationToken) { CancellationTokenRegistration ctr = _connection.RegisterCancellation(cancellationToken); try { int num2; do { if (_connection == null) { return 0; } if (_state == ParsingState.ExpectChunkData && buffer.Length >= _connection.ReadBufferSize && _chunkBytesRemaining >= (ulong)_connection.ReadBufferSize) { int num = await _connection.ReadAsync(buffer.Slice(0, (int)Math.Min((ulong)buffer.Length, _chunkBytesRemaining))).ConfigureAwait(continueOnCapturedContext: false); if (num == 0) { throw new IOException(SR.net_http_invalid_response); } _chunkBytesRemaining -= (ulong)num; if (_chunkBytesRemaining == 0L) { _state = ParsingState.ExpectChunkTerminator; } return num; } await _connection.FillAsync().ConfigureAwait(continueOnCapturedContext: false); num2 = ReadChunksFromConnectionBuffer(buffer.Span, ctr, cancellationToken); } while (num2 <= 0); return num2; } catch (Exception ex) when (System.Net.Http.CancellationHelper.ShouldWrapInOperationCanceledException(ex, cancellationToken)) { throw System.Net.Http.CancellationHelper.CreateOperationCanceledException(ex, cancellationToken); } finally { ctr.Dispose(); } } public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) { System.Net.Http.HttpContentStream.ValidateCopyToArgs(this, destination, bufferSize); if (!cancellationToken.IsCancellationRequested) { if (_connection != null) { return CopyToAsyncCore(destination, cancellationToken); } return Task.CompletedTask; } return Task.FromCanceled(cancellationToken); } private async Task CopyToAsyncCore(Stream destination, CancellationToken cancellationToken) { CancellationTokenRegistration ctr = _connection.RegisterCancellation(cancellationToken); try { while (true) { ReadOnlyMemory<byte> buffer = ReadChunkFromConnectionBuffer(int.MaxValue, ctr, cancellationToken); if (buffer.Length != 0) { await destination.WriteAsync(buffer, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); continue; } if (_connection == null) { break; } await _connection.FillAsync().ConfigureAwait(continueOnCapturedContext: false); } } catch (Exception ex) when (System.Net.Http.CancellationHelper.ShouldWrapInOperationCanceledException(ex, cancellationToken)) { throw System.Net.Http.CancellationHelper.CreateOperationCanceledException(ex, cancellationToken); } finally { ctr.Dispose(); } } private int ReadChunksFromConnectionBuffer(Span<byte> buffer, CancellationTokenRegistration cancellationRegistration, CancellationToken cancellationToken) { int num = 0; while (buffer.Length > 0) { ReadOnlyMemory<byte> readOnlyMemory = ReadChunkFromConnectionBuffer(buffer.Length, cancellationRegistration, cancellationToken); if (readOnlyMemory.Length == 0) { break; } num += readOnlyMemory.Length; readOnlyMemory.Span.CopyTo(buffer); buffer = buffer.Slice(readOnlyMemory.Length); } return num; } private ReadOnlyMemory<byte> ReadChunkFromConnectionBuffer(int maxBytesToRead, CancellationTokenRegistration cancellationRegistration, CancellationToken cancellationToken = default(CancellationToken)) { try { ReadOnlySpan<byte> line; switch (_state) { case ParsingState.ExpectChunkHeader: { _connection._allowedReadLineBytes = 16384; if (!_connection.TryReadNextLine(out line)) { return default(ReadOnlyMemory<byte>); } if (!Utf8Parser.TryParse(line, out ulong value, out int bytesConsumed, 'X')) { throw new IOException(SR.net_http_invalid_response); } _chunkBytesRemaining = value; if (bytesConsumed != line.Length) { ValidateChunkExtension(line.Slice(bytesConsumed)); } if (value != 0) { _state = ParsingState.ExpectChunkData; goto case ParsingState.ExpectChunkData; } _state = ParsingState.ConsumeTrailers; goto case ParsingState.ConsumeTrailers; } case ParsingState.ExpectChunkData: { ReadOnlyMemory<byte> remainingBuffer = _connection.RemainingBuffer; if (remainingBuffer.Length == 0) { return default(ReadOnlyMemory<byte>); } int num = Math.Min(maxBytesToRead, (int)Math.Min((ulong)remainingBuffer.Length, _chunkBytesRemaining)); _connection.ConsumeFromRemainingBuffer(num); _chunkBytesRemaining -= (ulong)num; if (_chunkBytesRemaining == 0L) { _state = ParsingState.ExpectChunkTerminator; } return remainingBuffer.Slice(0, num); } case ParsingState.ExpectChunkTerminator: _connection._allowedReadLineBytes = 16384; if (!_connection.TryReadNextLine(out line)) { return default(ReadOnlyMemory<byte>); } if (line.Length != 0) { ThrowInvalidHttpResponse(); } _state = ParsingState.ExpectChunkHeader; goto case ParsingState.ExpectChunkHeader; case ParsingState.ConsumeTrailers: while (true) { _connection._allowedReadLineBytes = 16384; if (!_connection.TryReadNextLine(out line)) { break; } if (line.IsEmpty) { cancellationRegistration.Dispose(); System.Net.Http.CancellationHelper.ThrowIfCancellationRequested(cancellationToken); _state = ParsingState.Done; _connection.CompleteResponse(); _connection = null; break; } } return default(ReadOnlyMemory<byte>); default: if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(this, $"Unexpected state: {_state}", "ReadChunkFromConnectionBuffer"); } return default(ReadOnlyMemory<byte>); } } catch (Exception) { _connection.Dispose(); _connection = null; throw; } } private static void ValidateChunkExtension(ReadOnlySpan<byte> lineAfterChunkSize) { for (int i = 0; i < lineAfterChunkSize.Length; i++) { switch (lineAfterChunkSize[i]) { case 9: case 32: continue; case 59: return; } throw new IOException(SR.net_http_invalid_response); } } public override async Task<bool> DrainAsync(int maxDrainBytes) { CancellationTokenSource cts = null; CancellationTokenRegistration ctr = default(CancellationTokenRegistration); try { int drainedBytes = 0; while (true) { drainedBytes += _connection.RemainingBuffer.Length; while (ReadChunkFromConnectionBuffer(int.MaxValue, ctr).Length != 0) { } if (_connection == null) { return true; } if (drainedBytes >= maxDrainBytes) { break; } if (cts == null) { TimeSpan maxResponseDrainTime = _connection._pool.Settings._maxResponseDrainTime; if (maxResponseDrainTime != Timeout.InfiniteTimeSpan) { cts = new CancellationTokenSource((int)maxResponseDrainTime.TotalMilliseconds); ctr = cts.Token.Register(delegate(object s) { ((System.Net.Http.HttpConnection)s).Dispose(); }, _connection); } } await _connection.FillAsync().ConfigureAwait(continueOnCapturedContext: false); } return false; } finally { ctr.Dispose(); cts?.Dispose(); } } } private sealed class ChunkedEncodingWriteStream : HttpContentWriteStream { private static readonly byte[] s_finalChunkBytes = new byte[5] { 48, 13, 10, 13, 10 }; public ChunkedEncodingWriteStream(System.Net.Http.HttpConnection connection) : base(connection) { } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken ignored) { return WriteAsyncInternal(new ReadOnlyMemory<byte>(buffer, offset, count), ignored); } private Task WriteAsyncInternal(ReadOnlyMemory<byte> buffer, CancellationToken ignored) { if (buffer.Length != 0) { return WriteChunkAsync(buffer); } return _connection.FlushAsync(); } private async Task WriteChunkAsync(ReadOnlyMemory<byte> buffer) { await _connection.WriteHexInt32Async(buffer.Length).ConfigureAwait(continueOnCapturedContext: false); await _connection.WriteTwoBytesAsync(13, 10).ConfigureAwait(continueOnCapturedContext: false); await _connection.WriteAsync(buffer).ConfigureAwait(continueOnCapturedContext: false); await _connection.WriteTwoBytesAsync(13, 10).ConfigureAwait(continueOnCapturedContext: false); } public override async Task FinishAsync() { await _connection.WriteBytesAsync(s_finalChunkBytes).ConfigureAwait(continueOnCapturedContext: false); _connection = null; } } private sealed class ConnectionCloseReadStream : HttpContentReadStream { public ConnectionCloseReadStream(System.Net.Http.HttpConnection connection) : base(connection) { } public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { System.Net.Http.HttpContentStream.ValidateBufferArgs(buffer, offset, count); return ReadAsyncInternal(new Memory<byte>(buffer, offset, count), cancellationToken); } private async Task<int> ReadAsyncInternal(Memory<byte> buffer, CancellationToken cancellationToken) { System.Net.Http.CancellationHelper.ThrowIfCancellationRequested(cancellationToken); if (_connection == null || buffer.Length == 0) { return 0; } Task<int> task = _connection.ReadAsync(buffer); int num; if (task.IsCompletedSuccessfully()) { num = task.Result; } else { CancellationTokenRegistration ctr = _connection.RegisterCancellation(cancellationToken); try { num = await task.ConfigureAwait(continueOnCapturedContext: false); } catch (Exception ex) when (System.Net.Http.CancellationHelper.ShouldWrapInOperationCanceledException(ex, cancellationToken)) { throw System.Net.Http.CancellationHelper.CreateOperationCanceledException(ex, cancellationToken); } finally { ctr.Dispose(); }