// The Dart Project Fuzz Tester (1.2).
// Program generated as:
//   dart dartfuzz.dart --seed 3608420507

// @dart = 2.9

bool var0 = false;
bool var1 = false;
int var2 = -49;
double var3 = double.maxFinite;
String var4 = '5Cw)';
List<int> var5 = [ 8589934591 ];
Map<int, String> var6 = { 0 : '\u2665', 1 : '7\u{1f600}\u{1f600}t\u2665s', 2 : '\u2665&)I', 3 : 'G\u2665\u{1f600}e' };

List<int> foo0(List<int> par1, int par2, int par3) {
  var6 ??= var6;
  var4 ??= '';
  par1 = var5;
  return [ -94 ];
}

int foo1(Map<int, String> par1, bool par2) {
  print((-((((var4 == (var4).toLowerCase()) ? false : par2) ? (-(double.nan)) : (var1 ? (((false ? true : var1) ? (par2 ? ((-((double.maxFinite + var3)))).roundToDouble() : (-(var3))) : var3)).abs() : var3)))));
  { List<int> loc0 = [ 95 ];
    return var2;
  }
}

String foo2() {
  var3 += (true ? ((var3).remainder((var1 ? (-(0.20648281590433248)) : double.maxFinite)) + double.maxFinite) : (var3 * var3));
  var2 %= (var2--);
  var6 = var6;
  return (var1 ? (false ? (((!(true)) || false) ? var4 : ((var6).isEmpty ? var4 : 'I#')) : var4) : 'XLH+c\u2665\u2665');
}

class X0  {

  String fld0_0 = '\u2665';

  String foo0_0() {
    if (((({ 0 : 'e\u{1f600}mw', 1 : 'XZPq', 2 : '2l', 3 : 'EI' } ?? { 0 : '1fG', 1 : 'LV\u2665s\u{1f600}s\u2665', 2 : '\u{1f600}#', 3 : 'V' }) ?? { 0 : 'Z6' })).isNotEmpty) {
      var4 ??= var4;
    } else {
      if ((var5 == ((var1 ? ((!((false ? var1 : (!((true && (var0 ? (false ? (false ? false : var1) : true) : var1))))))) ? var0 : var1) : false) ? ((([ -9223372030412324863, 21, -97 ] + var5) ?? ([ -9223372034707292160, -16, 6 ] + var5)) + ([ 83, -52, 18 ]).sublist((++var2))) : ((var1 ? var5 : var5)).sublist(foo1(var6, true))))) {
        { int loc0 = (var2--);
          if (false) {
            fld0_0 ??= '\u26655JnN';
            { Map<int, String> loc1 = var6;
              return var4;
            }
          }
        }
      }
    }
    return '1f';
  }

  void run() {
    if ((foo0([ -23, -74, 8589934591 ], (true ? (-(-9223372030412324863)) : var2), (var0 ? var2 : foo1({ 0 : 'kU0', 1 : '\u{1f600}', 2 : '\u2665M' }, (var1 && (var2).isEven)))) == [ 81, -9223372030412324865, 56, 62 ])) {
      var6 ??= { 0 : '\u{1f600}\u{1f600}D\u26652', 1 : 'yJb\u26657+' };
      return;
    } else {
      return;
    }
  }
}

class X1 extends X0 {

  double fld1_0 = 0.6358731486904787;

  bool foo1_0() {
    { List<int> loc0 = (foo0(var5, (var1 ? foo1({ 0 : '\u26657@MJF', 1 : 'J' }, true) : (~((--var2)))), ([ 6442450945 ]).removeLast()) + foo0([ 58 ], (-(var2)), (var2++)));
      print(foo0([ 69 ], 97, 63));
      var5 = (((var5).sublist(var2)).sublist(var2)).sublist(((-(var3))).toInt());
    }
    var1 = (!(var0));
    print((!(((-(double.infinity)) != double.minPositive))));
    return var0;
  }

  List<int> foo1_1(bool par1, double par2, int par3) {
    print(foo2());
    fld1_0 = (-(double.infinity));
    var0 = (([ -9223372036854775808, -19 ]).remove(foo1(var6, ((-((par3++))) < var2))) ? (var4 == 'Z72') : var1);
    return foo0(foo0((foo0(([ 14, -79 ] ?? var5), (-(par3)), ((true ? true : (!(var1))) ? (var0 ? (-73 * par3) : 53) : 66)) + (var1 ? var5 : [ 17 ])), ((true ? var1 : (par1 ? (!(false)) : par1)) ? par3 : var2), foo1(var6, true)), foo1({ 0 : '1okmvo', 1 : 'Cyn', 2 : 'Iq\u{1f600}' }, (!((!(foo1_0()))))), (par1 ? (~((foo1_0() ? (--var2) : -1))) : (par1 ? var2 : 74)));
  }

  void run() {
    super.run();
    if ((false ? var0 : ({ 0 : 'SVw', 1 : '\u266576Q', 2 : '\u2665b&E' }).containsValue(var4))) {
      return;
    }
  }
}

class X2 extends X1 {

  String fld2_0 = '';
  Map<int, String> fld2_1 = { 0 : '\u{1f600}\u2665F8', 1 : '\u{1f600}Kd', 2 : 'CW6e@d' };
  Map<int, String> fld2_2 = { 0 : 'MM3Ogd\u{1f600}', 1 : 'D', 2 : 'I\u{1f600}2kH4\u{1f600}' };

  List<int> foo2_0(String par1, double par2, int par3) {
    var6 ??= ({ 0 : 'hVMi', 1 : '', 2 : 'S' } ?? { 0 : '9c\u{1f600}\u{1f600}\u{1f600}dW', 1 : 'g(Fu\u{1f600}bX', 2 : 'Pi2Z\u{1f600}', 3 : 'O\u2665' });
    for (int loc0 = 0; loc0 < 84; loc0++) {
      return (((!((!(var1)))) ? false : false) ? var5 : (false ? var5 : [ -9223372030412324864 ]));
    }
  }

  bool foo2_1(int par1, String par2) {
    { double loc0 = var3;
      fld2_2 = { 0 : 'mWycw' };
      var0 = true;
    }
    return (var1 ? ((par1++) != foo1(fld2_1, (!(false)))) : true);
  }

  Map<int, String> foo2_2() {
    { String loc0 = 'Am 3x';
      return fld2_1;
    }
  }

  double foo2_3(List<int> par1) {
    var6 = foo2_2();
    if (var1) {
      print({ 0 : 'K\u{1f600}\u{1f600}\u2665\u{1f600}', 1 : 'lh34LP' });
      print('im\u2665');
      { String loc0 = (var1 ? ('y\u2665E4UQQ' + ('Q0J2  y').substring(-78)) : foo2());
        { bool loc1 = (((-(-92))).isOdd && (!((!(false)))));
          print(var3);
          if ((var2).isEven) {
            var3 /= 0.536905815119827;
            var2 |= (++var2);
            { double loc2 = var3;
              { int loc3 = foo1({ 0 : 'G(', 1 : '\u{1f600}&a9t', 2 : '\u{1f600}TF', 3 : '\u2665m-' }, true);
                var4 ??= (loc0).substring(((((par1 ?? [ -9223372034707292159, 44, -1, 2147483648 ])).remove((false ? -9223372032559808511 : (((++loc3) ~/ (2147483649 | 54))).ceil())) || false) ? (~((loc3++))) : (foo1(fld2_1, (var6 == { 0 : '', 1 : 'KP8' })) >> 50)));
                if ((true != ((!(loc1)) ? ((-(40)) >= -32) : foo2_1(9223372034707292159, (foo2_2()).remove((((-((loc3).abs())) ~/ 42)).toSigned(-27)))))) {
                  if (loc1) {
                    return loc2;
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  void run() {
    super.run();
    fld2_2 ??= (var1 ? fld2_2 : { 0 : 'M ', 1 : 'zG', 2 : 'c' });
    if (((foo2_1(var2, var4) ? ((false ? ((var1 || (true && foo2_1(9223372032559808512, var4))) ? var5 : var5) : ([ -52 ]).sublist((true ? 24 : var2)))).remove(9223372036854775807) : false) && var0)) {
      for (int loc0 = 0; loc0 < 57; loc0++) {
        var5 ??= (([ 26, 82, -9223372032559808512 ]).sublist((-22 >> 27)) + var5);
        var6 ??= fld2_2;
        fld2_0 ??= foo2();
        for (int loc1 = 0; loc1 < 67; loc1++) {
          for (int loc2 = 0; loc2 < 31; loc2++) {
            var4 = foo2();
            { bool loc3 = foo2_1((-(((!(var0)) ? foo1(fld2_2, true) : foo1((foo2_1((false ? ([ -74, -49, -79, 2 ]).length : 9223372034707292161), 'y') ? ({ 0 : '\u{1f600}Jf', 1 : 'NF' } ?? { 0 : '1 y\u{1f600}\u26659' }) : { 0 : '6MO\u2665A\u{1f600})', 1 : 'p\u{1f600}\u{1f600}6J', 2 : 'sg)' }), var0)))), fld2_0);
              var5 ??= var5;
              for (int loc4 = 0; loc4 < 78; loc4++) {
                return;
              }
            }
          }
        }
      }
    }
  }
}

class X3 extends X2 {

  List<int> fld3_0 = [ -4, -4, -79, 34 ];

  bool foo3_0(int par1, List<int> par2) {
    return (((var1 ? 60 : var2)).isOdd ? ((var1 ? fld3_0 : par2)).remove(foo1(var6, (var1 != var0))) : (false ? false : (('GB').substring((++var2))).endsWith(('p\u{1f600}f1u\u2665' ?? 'L\u2665OY!ui'))));
  }

  int foo3_1(List<int> par1, int par2, bool par3) {
    if (true) {
      return par2;
    }
  }

  List<int> foo3_2(List<int> par1, List<int> par2) {
    for (int loc0 = 0; loc0 < 68; loc0++) {
      { String loc1 = foo2();
        var2 -= (~((false ? (~((false ? loc0 : -9223372034707292161))) : (var2--))));
        for (int loc2 = 0; loc2 < 95; loc2++) {
          var3 ??= ((false ? var3 : (-(var3))) * (var3 ?? ((-(double.negativeInfinity))).remainder((var3 * double.nan))));
          if ((loc1).endsWith('')) {
            print((((!(foo3_0(-47, par2))) ? par1 : ([ 2, -52, -9223372032559808512, 2147483649 ] + par2))).removeLast());
            var2 -= foo3_1((foo0((foo0(((var0 ? [ -4294967295, -95, -22, 27 ] : [ 38 ]) + [ 2147483647 ]), (var3).truncate(), var2) ?? par1), (~(loc0)), 53)).sublist((--loc0)), ((loc2++) ?? ((!((false || var0))) ? (69 + (47 & (foo0([ 24, -98, 2147483647, -48 ], loc0, 47)).indexOf(37))) : (var4).compareTo((var1 ? loc1 : loc1)))), (foo3_0((var2 + (~(loc2))), foo0(([ 20, 13 ] + par2), loc0, var2)) && (loc1).isNotEmpty));
            for (int loc3 = 0; loc3 < 62; loc3++) {
              for (int loc4 = 0; loc4 < 61; loc4++) {
                return fld3_0;
              }
            }
          }
        }
      }
    }
  }

  bool foo3_3(List<int> par1, Map<int, String> par2, Map<int, String> par3) {
    for (int loc0 = 0; loc0 < 16; loc0++) {
      if (foo3_0((-((var0 ? 8589934591 : 65))), foo3_2(fld3_0, (fld3_0).sublist((true ? (0.23821360229648214).toInt() : var2))))) {
        par1 ??= (((var4 == '&Tze') ? ([ -27, 23, -40 ] != par1) : true) ? [ 23, 21, 4294967295 ] : fld3_0);
        print((par2 ?? { 0 : '\u{1f600}\u2665\u{1f600}Jpj&', 1 : '', 2 : '', 3 : '' }));
        var4 = var4;
        var1 = (((~(((++loc0) ?? loc0)))).isEven == false);
      }
      for (int loc1 = 0; loc1 < 93; loc1++) {
        var4 = 'gngT';
        return (foo3_0(((((var3 * (loc1).ceilToDouble()) - ((0.6230577340230226 > var3) ? (var3 - var3) : double.maxFinite)) - double.nan)).ceil(), [ 0 ]) ? ((!(var0)) && foo3_0((-(-59)), [ 8, 1, 12, -9223372030412324863 ])) : foo3_0(foo3_1(foo3_2([ 2, -33, -72 ], [ 30, 58, 0 ]), loc1, (!(var1))), var5));
      }
    }
  }

  void run() {
    super.run();
    var1 = (var6).containsKey((var0 ? (30).floor() : (~((++var2)))));
  }
}

main() {
  try {
    new X3().run();
  } catch (e) {
    print('throws');
  } finally {
    print('$var0\n$var1\n$var2\n$var3\n$var4\n$var5\n$var6\n');
  }
}
