//-------------------------------------------------------------------------------------------------------
// 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 = -8123;
b = -43530;
c = -51237;
d = 4588;
e = -48056;
f = 63678;
g = -21253;
h = 20803;
obj0.a = -6493;
obj0.b = 22501;
obj0.c = 50663;
obj0.d = -50158;
obj0.e = 58576;
ary[0] = -51191;
ary[1] = 18858;
ary[100] = 9773;
b = ((((64054 == -14438) + obj0.b) * f) | (d + d));
if(((obj0.d & c) <= (obj0.d - (e - (b++ ))))) {
} else {
  if(((c | (e ^ (f - 12666))) == ((60486 - e) | d))) {
  } else {
    obj0.b = d;
    b = ((((obj0.b | obj0.e) ^ d) + (+ (obj0.a ^ 62923))) != ((g + (18543 - 25541)) | (a | obj0.c)));
  }
  if(((((obj0.c ^ b) > (g ^ -41702)) * f) == (((b == obj0.a) ? (! -39541) : (obj0.c ^ 30568)) * (e & h)))) {
    e = (((29059 - (c <= h)) ^ (29660 < f)) & ((- obj0.d) & (b * g)));
  } else {
    e = obj0.b;
    a = ((35313 - obj0.a) & (((490 + 16760) * h) * ((f ^ h) & (f ^ obj0.e))));
    g = ((-30456 ^ c) ? ((e * a) | ((-51030 & -10400) - (7132 + 31023))) : (((4654 & obj0.d) + obj0.d) | ((f * 1481) + f)));
  }
}
if(((e * (c * 38927)) > (obj0.c | -42933))) {
} else {
  if(((e & obj0.b) != (c + (b | 65107)))) {
    if((((-40499 >= obj0.d) ^ obj0.c) != ((b * (-9012 & 56054)) | ((-2329 | -43642) ^ 38159)))) {
      obj0.a = obj0.c;
      a = -12428;
    } else {
    }
  } else {
  }
  obj0.d = ((-15838 & e) ^ (((! -8144) - c) | a));
}
if(((((h + 28050) ^ (f - 14826)) - (g * obj0.c)) <= (g + (! e)))) {
  d = c;
  if(((((15757 ^ c) == (34760 + 9854)) | d) >= (h ^ (- (60155 - d))))) {
    obj0.c = ((((obj0.d * f) - -19070) ^ ((-18726 != a) ? -10112 : (1321 * -5859))) != (c & (b++ )));
    a = c;
    if(((4982 | (obj0.b | (a ^ b))) > (f ^ ((- -62276) & (obj0.d + d))))) {
      obj0.a = -45250;
      b = ((((obj0.a != 18214) ? (b & e) : (38172 * 46368)) & a) ? (((22828 ? f : 29595) & (-31544 & 539)) - obj0.c) : ((a - a) ^ ((d ? 20996 : 60102) - 57262)));
    } else {
      g = obj0.d;
      obj0.c = obj0.c;
    }
  } else {
    d = (- (obj0.e & ((- f) + (27728 & 6675))));
    d = ((obj0.d ^ ((d <= -4605) > c)) * (10907 | ((+ 36459) & b)));
  }
} 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');
})();
