//-------------------------------------------------------------------------------------------------------
// 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 = -15797;
b = -12440;
c = -44990;
d = -59142;
e = -63409;
f = -35046;
g = -20649;
h = -45743;
obj0.a = 4530;
obj0.b = 27210;
obj0.c = 65109;
obj0.d = -45403;
obj0.e = 59142;
ary[0] = 64560;
ary[1] = 21942;
ary[100] = 31817;
a = ((obj0.c & obj0.e) & ((b > (-59527 ? -52526 : g)) - (h == (h ? h : -863))));
if(((a & c) == (65421 | ((obj0.a + h) + (b & obj0.c))))) {
} else {
  if(((c ^ ((h <= a) ? (-23059 + -9043) : obj0.a)) < (((32618 * obj0.e) - (45168 * -33241)) * e))) {
    if(((obj0.e - d) <= (b | obj0.c))) {
      f = obj0.b;
      obj0.c = 32629;
      b = ((b + ((-45845 * f) == (-50200 ? e : 51011))) - (((! obj0.d) * obj0.d) ^ (obj0.c++ )));
    } else {
      b = -51234;
      c = (((h - d) ^ ((56094 ? -61281 : d) | (e ^ obj0.c))) + (((c * obj0.c) + (a ^ b)) & (d * (-51447 * f))));
    }
  } else {
    b = a;
    if(((h + c) <= (obj0.a + g))) {
    } else {
      obj0.b = h;
    }
    g = b;
  }
  if(((((-38399 ^ -65329) | (20546 ^ obj0.e)) | obj0.e) == (((obj0.e & h) * (-9062 | b)) ^ obj0.e))) {
    obj0.a = (+ (f | ((f - -7192) - g)));
    obj0.c = e;
    if(((((obj0.d > a) | (-11518 + -8590)) + ((27476 * 56421) + (obj0.a != obj0.b))) != (obj0.c * (-15615 & obj0.b)))) {
      d = 43650;
    } else {
      obj0.a = ((c ^ (obj0.a + (obj0.d * obj0.b))) | (((b | obj0.a) - (d | obj0.d)) ^ (-43385 | (25642 + obj0.b))));
      obj0.a = e;
    }
  } else {
  }
  if((((20879 | obj0.a) - e) == (((f <= -4358) - a) + d))) {
    g = g;
  } else {
    h = d;
    a = ((((28369 == obj0.c) - (c & -47304)) + h) < (((e * 47427) * (! obj0.b)) & -7300));
    if(((f ^ obj0.a) <= (((f * 3620) | e) + ((- obj0.b) == (d & 27597))))) {
      obj0.e = ((obj0.b * -49215) < ((g > 51180) - 57830));
      obj0.e = ((d * ((-3390 < -39523) ? f : (a & 46305))) ? (((-31670 * -65044) * (obj0.b - obj0.d)) ^ (! c)) : (c | obj0.b));
    } else {
      h = (obj0.c++ );
      d = ((((-54851 ^ -49127) != -32760) & e) + ((b & f) - e));
    }
  }
}
obj0.b = ((obj0.b + f) * ((d & a) ^ a));
obj0.b = (((f + 15868) - b) <= (((1956 + -38717) | (32148 + 57694)) - (+ obj0.b)));
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');
})();
