// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// See https://github.com/dart-lang/sdk/issues/38654 for context.

// The Dart Project Fuzz Tester (1.53).
// Program generated as:
//   dart dartfuzz.dart --seed 194851581 --no-fp --no-ffi

import 'dart:async';
import 'dart:cli';
import 'dart:collection';
import 'dart:convert';
import 'dart:core';
import 'dart:io';
import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';

Map<int, String> var0 = {
  39: 'sl2a(',
  29: 'HGYdMd',
  93: '\u2665',
  97: 'hJ',
  38: 'O',
  25: '',
  40: ''
};
int var1 = 56;
int var2 = -9;
bool var3 = false;
int var4 = -77;
double var5 = 0.9130097229882881;
String var6 = '\u2665g';
List<int> var7 = [-4294967280, -46, -51, 13, -77, -20];
Set<int> var8 = {
  -9223372036854775680,
  25,
  -43,
  2,
  -57,
  -9223372030412324865,
  4294967423,
  -39
};
Map<int, String> var9 = {90: 'DXbRR', 8: 's\u2665y', 51: '0wumJ', 33: 'aee'};

String foo0() {
  {
    int loc0 = 79;
    while (--loc0 > 0) {
      for (int loc1 in ((var7 +
              [
                -51,
                Int32x4.wwzy,
                (((var3 ? (--var2) : 21) < -40)
                    ? (var3 ? var2 : var7[var1])
                    : (var1--)),
                ((var3
                        ? Float32x4.wyyy
                        : var7[
                            (false ? var4 : ZLibOption.defaultWindowBits)]) <<
                    var7[var7[-32769]]),
                (var3 ? 8 : var7[-9223372036854775680]),
                (Int32x4.xxww ^ Int32x4.zzyy)
              ]) ??
          ((!((var0 !=
                  {
                    96: 'r&\u2665P',
                    94: ('JXX ' + var6),
                    62: '\u26656',
                    35: ListBase.listToString(var7)
                  })))
              ? ((var3 ? var7 : (true ? var7 : var7)) ??
                  [
                    (false ? var2 : -66),
                    -55,
                    (-(var7[loc0])),
                    var7[-12],
                    ((((27 + var1)).isInfinite
                            ? var3
                            : (var3 ? (var9[var7[-88]])!.isEmpty : var3))
                        ? -4294934528
                        : var1),
                    -40,
                    var7[var7[var7[Int32x4.wxyw]]],
                    14
                  ])
              : [Float32x4.yxyy]))) {
        /*
         * Multi-line
         * comment.
         */
        {
          int loc2 = 67;
          while (--loc2 > 0) {
            var8 = {loc1, 62, -37, Float32x4.yxwz, -42};
          }
        }
        var9.forEach((loc2, loc3) {
          var7 = var7;
          try {
            loc3 ??= 'tSWbA';
          } catch (exception, stackTrace) {
            for (int loc4 in [
              ((!((((-82 * var7[-28])).toString() == (var0[31] ?? var6))))
                  ? (--var2)
                  : (--var4))
            ]) {
              var7[Int32x4.wxzx] ~/= Int32x4.ywwx;
            }
            var3 ??= var3;
          } finally {
            var0 ??= var9;
          }
        });
      }
    }
  }
  return ((var3 &&
          (((var3 ? true : (var3 || var3)) ? false : false)
              ? true
              : (!((false && false)))))
      ? 'V-5p'
      : (((Float32x4.xwwx > var7[var2])
              ? var6
              : var9[(((--var2)).isEven ? -90 : (++var2))]) ??
          (var3 ? '' : '!5s#rtD')));
}

Set<int> foo1(int par1, bool par2) {
  // Single-line comment.
  {
    int loc0 = 68;
    while (--loc0 > 0) {
      {
        List<int> loc1 = [
          var1,
          -13,
          (false ? ((~(19)) - ((!(true)) ? (par1++) : -89)) : (~((var2--)))),
          Float32x4.yzww,
          var7[(~((--par1)))],
          (-99 % par1),
          (true ? (~(var7[par1])) : Int32x4.xyxw)
        ];
        for (int loc2 in var8) {
          var7[16] <<= Float32x4.yyyx;
        }
        for (int loc2 = 0; loc2 < 33; loc2++) {
          if (var3) {
            var0 = (Map.unmodifiable(var9) ??
                (Map.unmodifiable(var9) ??
                    Map.from({6: var9[var1], 28: foo0(), 36: '8+'})));
            var9[((-93 * loc1[loc2]) +
                (((!((!(par2)))) || (!(par2)))
                    ? (var4 ~/ JsonUtf8Encoder.DEFAULT_BUFFER_SIZE)
                    : -9223372032559775745))] ??= var6;
          }
          var3 = ((!((loc1[loc0] != (false ? (--var4) : var1)))) ||
              ('').endsWith('xTYEp\u2665'));
        }
      }
      for (int loc1 in var7) {
        var7[Float32x4.ywzy] >>= var2;
        /*
         * Multi-line
         * comment.
         */
        var8 = (((false ? var8 : {var1, Float32x4.xwyw}) ??
                ({(Int32x4.wxyy & var7[(par1--)])} ??
                    (var3
                        ? {var7[73], 20, var4, (var7[(-20 | loc1)] * 84), 47}
                        : (par2
                            ? {
                                8,
                                -66,
                                (((var7[var7[-56]])
                                            .toRadixString(Int32x4.wyxx) !=
                                        (('j' ?? 'r')).toLowerCase())
                                    ? var7[var7[(var2++)]]
                                    : (-(Duration.microsecondsPerDay))),
                                (~(((!(true))
                                    ? (false
                                        ? (++var2)
                                        : var7[ZLibOption.strategyFiltered])
                                    : Float32x4.xxyz))),
                                (var3
                                    ? (true
                                        ? (-95 -
                                            (-25 ??
                                                ((false ? true : var3)
                                                    ? Int32x4.xxww
                                                    : var7[-29])))
                                        : (var2++))
                                    : -34)
                              }
                            : ({(++var4), par1, (-81 % var7[-54])})
                                .toSet())))) ??
            {
              (~((-((loc1++))))),
              (var7[var7[4295032832]] - RawSocketOption.levelIPv4)
            });
      }
    }
  }
  return {
    var7[var2],
    var2,
    (-(((par2 && par2) ? Int32x4.ywzw : Float32x4.wywx))),
    ((!(NetworkInterface.listSupported))
        ? (--var4)
        : (((var6).isEmpty
                ? (-73 * ((var7[var4]).isOdd ? Float32x4.xwww : -63))
                : -4) -
            (~(69)))),
    (((true
                ? (true
                    ? -9223372032559808257
                    : (~((par2 ? (var1--) : (false ? var7[-4] : var1)))))
                : 27) <<
            Float32x4.xyzy) -
        ((~(var7[Float32x4.xyzz])) &
            (((par2 ? true : false) ? par2 : true)
                ? 44
                : ((!(par2)) ? -57 : var7[var2])))),
    (MapBase.mapToString((Map.from({
              77: ((!(false)) ? var6 : var0[var7[var7[var7[-63]]]]),
              87: '9vj',
              50: 'e\u26655-',
              46: var9[-32],
              96: var6
            }) ??
            {
              32: var0[-9223372032559742976],
              4: SetBase.setToString(var8),
              67: var0[Int32x4.yxww],
              53: var9[53],
              91: var6,
              17: '2gtffn'
            })))
        .length
  };
}

String foo2(Map<int, String> par1, bool par2) {
  try {
    par2 = (false
        ? false
        : (SecurityContext.alpnSupported
            ? false
            : (var3 ? ('aXL').isNotEmpty : (77).isNegative)));
    if ((((++var4) ~/ (var4 & var1))).isEven) {
      /*
       * Multi-line
       * comment.
       */
      var7 ??= (((((-(var7[-2]))).toString() ?? foo0()) ??
              (true
                  ? (par1[(-57 + (var7[52] | -91))]! + var9[57]!)
                  : Uri.decodeFull((false
                      ? '17'
                      : (8).toStringAsExponential(var7[var7[8]]))))))
          .codeUnits;
    }
  } catch (exception, stackTrace) {
    {
      bool loc0 = ({
        61: String.fromEnvironment(('K4\u2665dc0' + var6)),
        85: ((!(true)) ? 'I&P' : par1[(~((-((++var4)))))])
      }).isNotEmpty;
      {
        Map<int, String> loc1 =
            Map.from({55: (true ? '' : 'ZoDx\u{1f600}'), 82: foo0()});

        /// Single-line documentation comment.
        var3 = var3;
      }
      {
        int loc1 = 81;
        while (--loc1 > 0) {
          var3 = (!((List.filled(38, 87) !=
              ((false ? (true ? loc0 : true) : var3) ? var7 : var7))));
          try {
            par2 = var3;
            switch (loc1) {
              case 1947756698:
                {
                  var7 = [
                    [(--var1), -74, (-(Float32x4.ywyw))][((-(38)) | (var2--))],
                    Float32x4.yyzy,
                    (Int32x4.yxzx % Int32x4.ywyx),
                    var4,
                    (loc0 ? (var1--) : Float32x4.xzxy),
                    (-((~(-15))))
                  ];

                  /// Single-line documentation comment.
                  throw {
                    (true ? ((var4++) ~/ (-69 ?? 78)) : (var1--)),
                    (--var1),
                    (-((var2--))),
                    (-82 % (-30).bitLength),
                    14,
                    32768,
                    Int32x4.zxwy
                  };
                }
                break;
              case 1947756704:
                {
                  if (true) {
                    break;
                  }
                }
                break;
            }
          } catch (exception, stackTrace) {
            var6 = 'YgW\u{1f600}';
            if ((!(((true ? loc0 : var3) &&
                ((var3 ? ((var1++)).isFinite : par2) || var3))))) {
              try {
                return foo0();
              } catch (exception, stackTrace) {
                var6 = foo0();
              }
              par1 = ((par2 ? (par1 ?? Map.identity()) : var9) ?? var9);
            } else {
              var7 ??= var7;
              return 'ACaB#Z1';
            }
          }
        }
      }
    }
    for (int loc0 = 0; loc0 < 15; loc0++) {
      var7[(-(((Uint64List.bytesPerElement).isFinite ? -12 : -46)))] ~/= (true
          ? loc0
          : (~((var7[(14 >> (-((var1--))))] ^ (9223372032559808639 ?? loc0)))));
    }
  } finally {
    /*
     * Multi-line
     * comment.
     */
    try {
      {
        int loc0 = 73;
        while (--loc0 > 0) {
          {
            int loc1 = 0;
            do {
              var4 <<= loc0;
              for (int loc2 in var8) {
                par2 = true;
                par2 ??= (foo0()).isEmpty;
              }
            } while (++loc1 < 73);
          }
          var9 = var0;
        }
      }
      for (int loc0 = 0; loc0 < 96; loc0++) {
        /// Single-line documentation comment.
        try {
          par2 ??= ('(b').endsWith('x-f76ee');
          var3 = var3;
        } catch (exception, stackTrace) {
          var8 ??= foo1((var3 ? 51 : (false ? Int32x4.zzxy : (-((~(-84)))))),
              (NetworkInterface.listSupported || true));
        }
      }
    } catch (exception, stackTrace) {
      for (int loc0 in [
        (~((-(((par2 ? Int32x4.zzzw : var2) * (-(89))))))),
        -14,
        -88,
        (var4++),
        (var7[((var7[Float32x4.xxxx] % (~(var7[var4]))) | -16)] |
            (var7[Float32x4.zwwz] ^ -9223372036854775681))
      ]) {
        var7[(par2 ? 60 : (-7 >> -53))] ??= Int32x4.yzxw;
        for (int loc1
            in (var3 ? (((loc0 * var7[16])).toString()).codeUnits : var7)) {
          var0.forEach((loc2, loc3) {
            var3 ??= (foo0()).isNotEmpty;
            throw (var4++);
          });
        }
      }
    } finally {
      try {
        var8 = ((!(true))
            ? {Float32x4.zzwy, 67, -6, 85}
            : foo1(Float32x4.zwxy, var3));
        var8 = foo1(
            (-54).abs(),
            ((var3 ? true : (!(var3)))
                ? (!((Uri.encodeFull('aILQc')).endsWith('+7o0Q6b')))
                : ((true ? ('bEIx').endsWith(par1[var2]!) : par2)
                    ? false
                    : ({
                          -77,
                          (false ? -9223372036854775792 : 4294968296),
                          var4,
                          var7[var7[var7[var2]]]
                        } !=
                        {
                          var7[-80],
                          (true ? var7[22] : (-(58))),
                          -77,
                          (var7[Int32x4.wxwz] ~/ 66)
                        }))));
      } catch (exception, stackTrace) {
        try {
          var6 ??= par1[(('R12').isNotEmpty
              ? (par2 ? 4294967396 : var2)
              : (((var0).isEmpty ? true : par2) ? var4 : var2))]!;
          var8 ??= (var8 ??
              {
                (~(((var7[var2] ?? 86) >>
                    (((-(var7[var1]))).isNaN
                        ? (var3 ? (false ? -4294901760 : (-(var7[32]))) : var1)
                        : var4)))),
                Int32x4.wyzy
              });
        } catch (exception, stackTrace) {
          var9 = (Map.of({
                59: var6,
                3: var0[DateTime.may]!,
                49: par1[var2]!,
                71: '6',
                77: ((!(true)) ? ('QB\u2665OU6' ?? 'r-\u2665') : foo0()),
                88: foo0()
              }) ??
              var0);
          var6 ??= ((('').substring(40, (~(Int32x4.yxxx))) ??
                  ((var9[81] ?? '0(G') + ('u-+').toLowerCase())))
              .trimRight();
        }
        var7 = [-9223372032559808512];
      } finally {
        var4 -= var7[(++var2)];
      }
      var0.forEach((loc0, loc1) {
        switch (Int32x4.xyyw) {
          case 2310807338:
            {
              var9[((var7[var7[var1]] % (~(49))) & (~((var7[34]).toInt())))] ??=
                  ('5j' ?? 'jfHUh');
              var8 ??= ((!((!(var3))))
                  ? (par2
                      ? var8
                      : ((var7[(-38 - (var3 ? -38 : -91))]).isNegative
                          ? (true
                              ? (({-83, loc0} ??
                                      {
                                        var1,
                                        27,
                                        -73,
                                        var7[var4],
                                        (-88 +
                                            (~(((var3
                                                    ? ((-(-51)) + -60)
                                                    : var7[-21]) ??
                                                -65))))
                                      }))
                                  .difference({
                                  (-(Float32x4.yxzw)),
                                  (--var2),
                                  Int32x4.wywz,
                                  (-(((true
                                          ? (true
                                              ? (true ? (!(var3)) : true)
                                              : true)
                                          : (var8 != {(~(loc0)), 28, -96}))
                                      ? (par2
                                          ? ((par2
                                                  ? var7[var7[(++var4)]]
                                                  : (var4--)) +
                                              57)
                                          : ((((var3 ? false : true)
                                                      ? par2
                                                      : par2)
                                                  ? (var4 * var7[-74])
                                                  : var2) >>
                                              (false ? 63 : -23)))
                                      : (false ? -6 : (par2 ? 10 : var2))))),
                                  -35,
                                  (-(-92)),
                                  var7[DateTime.saturday]
                                })
                              : Set.identity())
                          : (par2
                              ? {(-((var2 | (-(-57)))))}
                              : ((var4 < 10)
                                  ? foo1(var7[8], par2)
                                  : (var3
                                      ? {96, 82, var7[(++var4)]}
                                      : {var2})))))
                  : foo1(
                      ((false || true)
                          ? loc0
                          : ((var3
                                  ? 49
                                  : ((var2 ?? var7[(-((~(23))))]) >> 97)) <<
                              var7[34])),
                      (!(par2))));
            }
            break;
          case 2310807345:
            {
              var8 ??= ((foo1((false ? var1 : (var4++)), (!(par2))) ??
                      ((var8 ??
                              {
                                var4,
                                -22,
                                (-(var7[((~(Float32x4.zyzx)) | var7[-23])])),
                                -35
                              }) ??
                          {var1, 21, var2, var7[Float32x4.ywyw], loc0})) ??
                  foo1(var7[(~(-75))], (!(false))));
              {
                int loc2 = 64;
                while (--loc2 > 0) {
                  var7 = var7;

                  /// Single-line documentation comment.
                  if (true) {
                    par2 = (var8).add(((var7[var1] + (-(4294967425))) ??
                        var7[((-(-9223372032559775745)) - (--var4))]));
                    if ((Map.from(par1)).isEmpty) {
                      var9 ??= ((Map.unmodifiable(Map.unmodifiable(par1)) ??
                              (((var2).isInfinite ? var9 : par1) ??
                                  Map.unmodifiable((par1 ?? par1)))) ??
                          (Map.unmodifiable({
                                51: par1[(~((~(Uint64List.bytesPerElement))))],
                                14: foo0(),
                                69: var0[var1],
                                56: loc1,
                                41: (false ? var0[Int32x4.yxwy] : loc1),
                                30: ((!(var3)) ? '' : 'L'),
                                80: 'UsR6'
                              }) ??
                              {
                                67: loc1,
                                73: ((var4).isEven
                                    ? ('' ?? (var3 ? foo0() : var6))
                                    : foo0())
                              }));
                    }
                  } else {
                    var7[(SecurityContext.alpnSupported
                        ? (~((true ? Float32x4.ywzw : -97)))
                        : loc2)] = (--var2);
                  }
                }
              }
            }
            break;
        }
        print(true);
      });
    }
    for (int loc0 in [
      (++var1),
      (var7[(~(((false ? (false && par2) : (71).isInfinite)
              ? var7[87]
              : -9223372028264841217)))] -
          var7[var2]),
      ((~((-(((true ? true : false)
              ? var7[-78]
              : (((false || false) ? true : (true && (false && true)))
                  ? var2
                  : (par2 ? -13 : 65))))))) >>
          ((var3 ? false : false) ? (~((~(-97)))) : Uint8List.bytesPerElement))
    ]) {
      // Single-line comment.
      break;
    }
  }
  return 'F+\u2665';
}

main() {
  try {
    foo2(
        ((var3 ? var9 : var0) ??
            {
              30: '',
              58: '\u2665bc',
              45: ' \u{1f600}',
              79: 'zLuiBp',
              2: 'X9\u{1f600}2Lq',
              78: 'PP6NIH',
              77: 'OB',
              80: 'EcL\u{1f600}yp'
            }),
        (!(((47).toString()).isEmpty)));
  } on OutOfMemoryError {
    print('oom');
    exit(254);
  } catch (e, st) {
    print('foo2 throws');
  }
}
