library test;
import self as self;
import "dart:core" as core;

class F0 extends core::Object {
  constructor •(core::List<core::int*>* a) → self::F0*
    : super core::Object::•() {}
}
class F1 extends core::Object {
  constructor •({core::List<core::int*>* a = #C1}) → self::F1*
    : super core::Object::•() {}
}
class F2 extends core::Object {
  constructor •(core::Iterable<core::int*>* a) → self::F2*
    : super core::Object::•() {}
}
class F3 extends core::Object {
  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
    : super core::Object::•() {}
}
class F4 extends core::Object {
  constructor •({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → self::F4*
    : super core::Object::•() {}
}
static method test() → void {
  new self::F0::•(<dynamic>[]);
  new self::F0::•(<dynamic>[3]);
  new self::F0::•(<dynamic>["hello"]);
  new self::F0::•(<dynamic>["hello", 3]);
  new self::F1::•(a: <dynamic>[]);
  new self::F1::•(a: <dynamic>[3]);
  new self::F1::•(a: <dynamic>["hello"]);
  new self::F1::•(a: <dynamic>["hello", 3]);
  new self::F2::•(<dynamic>[]);
  new self::F2::•(<dynamic>[3]);
  new self::F2::•(<dynamic>["hello"]);
  new self::F2::•(<dynamic>["hello", 3]);
  new self::F3::•(<dynamic>[]);
  new self::F3::•(<dynamic>[<dynamic>[3]]);
  new self::F3::•(<dynamic>[<dynamic>["hello"]]);
  new self::F3::•(<dynamic>[<dynamic>["hello"], <dynamic>[3]]);
  new self::F4::•(a: <dynamic>[]);
  new self::F4::•(a: <dynamic>[<dynamic>[3]]);
  new self::F4::•(a: <dynamic>[<dynamic>["hello"]]);
  new self::F4::•(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
