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 = null}) → 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 = null}) → 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 {}
