//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

(function() {
var ary = new Array(10);
var obj0 = new Object();
var a;
var b;
var c;
var d;
var e;
var f;
var g;
var h;
a = 13373;
b = 37058;
c = 39506;
d = 58718;
e = -37104;
f = -3616;
g = 13207;
h = -531;
obj0.a = -59333;
obj0.b = -37083;
obj0.c = 33190;
obj0.d = -20035;
obj0.e = 3210;
ary[0] = -53971;
ary[1] = -55880;
ary[100] = 54443;
if((((obj0.e + (b ? f : c)) * ((26182 >= 22051) * -48080)) < (((obj0.d & e) * (h <= obj0.c)) | -39135))) {
  if(((obj0.a & ((obj0.d <= 30617) ? obj0.d : (b ^ -19315))) <= (((-60411 <= f) ? e : (obj0.e++ )) & obj0.c))) {
    g = (((f++ ) + ((22524 - g) & 34788)) > (((- 37542) - f) ^ obj0.e));
    e = ((((-64675 <= obj0.c) & (-53586 ? e : -37004)) ^ (++ obj0.e)) - (b + ((323 ^ obj0.b) * (- 56640))));
    d = 42552;
  } else {
    if(((((obj0.a & -24861) * f) | ((g ^ 48957) ^ (-17689 | f))) < (g | (d - (e + h))))) {
    } else {
    }
    if(((b - -18707) >= (((-39410 < 46435) == (f ^ h)) + ((-61780 - 65219) - (-39744 > d))))) {
    } else {
    }
    f = obj0.d;
  }
} else {
  b = ((((4466 * obj0.d) & (-26239 ? 48867 : 7469)) + (-50818 > (d ? -6629 : -270))) ^ (((b + -13873) - (-29776 + f)) - ((obj0.b + -3637) - -6226)));
  if(((((obj0.e + -39906) & (h ^ -45103)) ^ obj0.d) == ((40465 >= e) * (+ obj0.b)))) {
    g = f;
  } else {
  }
  obj0.d = obj0.b;
}
if(((((- -35076) + (38206 | -277)) + obj0.c) <= ((+ (36165 >= c)) - e))) {
  obj0.e = a;
  e = (! (h + ((4965 == d) ? (-55431 | c) : f)));
  if(((f * ((e - c) * d)) >= (h - d))) {
    obj0.e = (((e * (-28745 ? -19015 : obj0.a)) ^ g) ^ (((-38339 * a) < (c ^ obj0.a)) + h));
  } else {
  }
} else {
  if(((((g * g) <= (- obj0.a)) + obj0.d) == (a | ((-41027 & b) & obj0.b)))) {
    b = a;
    obj0.c = h;
  } else {
  }
  h = a;
}
if((((c & (33827 ^ -25745)) + h) != (a | ((d == -54383) & e)))) {
  obj0.e = -30469;
  if(((((-21354 - d) <= (e >= 43541)) ^ ((f >= c) ? (-36045 >= -62879) : e)) > (c & (g + (33226 * 41002))))) {
    if((((+ (a <= -40571)) | obj0.a) == (((-10915 >= obj0.e) ? (59002 | 9354) : (e | -28857)) & d))) {
    } else {
      obj0.e = b;
      obj0.d = (((obj0.e & (++ f)) * c) ? (((obj0.a * a) | (+ a)) | ((obj0.b < e) ? 34208 : obj0.a)) : (((-48227 != f) ? c : (e & obj0.b)) & ((f <= d) ? (obj0.a ? b : 10167) : (2154 + obj0.a))));
    }
    if(((((-3270 ? 30126 : 17142) & (-5665 <= obj0.b)) & (obj0.e >= (obj0.e != 17038))) != (((e - obj0.d) ^ (-56683 ? 3120 : 36909)) * ((-8175 & obj0.c) - (26577 - obj0.c))))) {
      c = ((f + (++ obj0.e)) >= (d ^ g));
    } else {
    }
    if(((d - a) < (a | h))) {
    } else {
    }
  } else {
    if((((- c) * (++ obj0.e)) <= (obj0.e + f))) {
      e = ((e ^ ((obj0.c == 59388) ^ (f > -50509))) ^ (obj0.a ^ (+ (f - obj0.b))));
      obj0.d = ((b ^ ((42143 ^ -2519) + (15314 == f))) ^ (f - obj0.c));
    } else {
      c = obj0.b;
      d = ((30991 * (+ (-8327 <= -64215))) ^ (((h <= f) ? (obj0.c ^ 63230) : (obj0.b - obj0.c)) * ((d ? a : a) ^ (obj0.a ? -49851 : 27095))));
      a = d;
    }
  }
} else {
  if(((b & (61230 & obj0.d)) == (((obj0.e * 3600) | obj0.b) | (d < (obj0.c != obj0.b))))) {
    h = g;
  } else {
    if(((((-39248 > obj0.b) ? (-51341 ^ -59524) : obj0.c) + (obj0.c + (+ a))) > (((-44725 >= h) ^ obj0.e) ^ obj0.a))) {
      e = b;
      a = obj0.e;
      obj0.c = ((c * ((21794 ? d : c) + (d * -6128))) - (obj0.e + ((d <= -50150) ? (g ^ -41478) : (obj0.b | 39427))));
    } else {
      e = ((obj0.a + obj0.d) < (c + (obj0.b++ )));
    }
    if(((((-39509 == -35036) > (obj0.e | 25261)) | ((45890 == obj0.b) ? (-6792 ? obj0.d : c) : f)) != (d * obj0.d))) {
    } else {
    }
  }
}
if(((64227 + d) != (((-38067 - 9386) & obj0.c) & obj0.e))) {
} else {
}
WScript.Echo("a = " + (a>>3));
WScript.Echo("b = " + (b>>3));
WScript.Echo("c = " + (c>>3));
WScript.Echo("d = " + (d>>3));
WScript.Echo("e = " + (e>>3));
WScript.Echo("f = " + (f>>3));
WScript.Echo("g = " + (g>>3));
WScript.Echo("h = " + (h>>3));
WScript.Echo("obj0.a = " + (obj0.a>>3));
WScript.Echo("obj0.b = " + (obj0.b>>3));
WScript.Echo("obj0.c = " + (obj0.c>>3));
WScript.Echo("obj0.d = " + (obj0.d>>3));
WScript.Echo("obj0.e = " + (obj0.e>>3));
WScript.Echo("ary[0] = " + (ary[0]>>3));
WScript.Echo("ary[1] = " + (ary[1]>>3));
WScript.Echo("ary[100] = " + (ary[100]>>3));
WScript.Echo('done');
})();
