library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Foo<X extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::Foo<self::Foo::X%>
    : super core::Object::•()
    ;
}
class Bar<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::Bar<self::Bar::X%, self::Bar::Y%>
    : super core::Object::•()
    ;
}
extension A1 on dynamic {
}
extension A2<X extends core::Object? = dynamic> on self::Foo<X%> {
}
extension A3<X extends core::Object? = dynamic, Y extends (X%) → dynamic = (Never) → dynamic> on self::Bar<X%, Y> {
}
extension A4<X extends core::Object? = dynamic, Y extends (X%) → dynamic = (Never) → dynamic> on self::Foo<Y> {
}
static method foo1(dynamic a) → dynamic
  return throw 42;
static method foo2(self::Foo<core::int> a, self::Foo<dynamic> ai) → self::Foo<dynamic>
  return throw 42;
static method foo3(self::Bar<core::int, (core::num) → dynamic> a, self::Bar<dynamic, (Never) → dynamic> ai) → self::Bar<dynamic, (Never) → dynamic>
  return throw 42;
static method foo4(self::Foo<(core::num) → dynamic> a, self::Foo<(Never) → dynamic> ai) → self::Foo<(Never) → dynamic>
  return throw 42;
static method bar() → dynamic {
  dynamic a1;
  self::Foo<core::int> a2;
  self::Foo<dynamic> a2i;
  self::Bar<core::int, (core::num) → dynamic> a3;
  self::Bar<dynamic, (Never) → dynamic> a3i;
  self::Foo<(core::num) → dynamic> a4;
  self::Foo<(Never) → dynamic> a4i;
}
static method main() → dynamic {}
