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

import "org-dartlang-testcase:///main_lib.dart";

abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Mixin1&Super1&Super2
    ;
}
abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/  {
  late field core::int field1;
  late field core::int field2;
  method method1() → void
    ;
  method method2() → void
    ;
  get property1() → core::int
    ;
  set property1(core::int value) → void
    ;
  get property2() → core::int
    ;
  set property2(core::int value) → void
    ;
}
abstract class Class1a extends mai::Super1 implements mai::Super2 {
  synthetic constructor •() → self::Class1a
    ;
}
abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class1b&Class1a&Mixin1
    : super self::Class1a::•()
    ;
  mixin-super-stub get field1() → core::int
    return super.{self::Mixin1::field1};
  mixin-super-stub set field1(core::int value) → void
    return super.{self::Mixin1::field1} = value;
  mixin-super-stub get field2() → core::int
    return super.{self::Mixin1::field2};
  mixin-super-stub set field2(core::int value) → void
    return super.{self::Mixin1::field2} = value;
  mixin-super-stub get property1() → core::int
    return super.{self::Mixin1::property1};
  mixin-super-stub set property1(core::int value) → void
    return super.{self::Mixin1::property1} = value;
  mixin-super-stub get property2() → core::int
    return super.{self::Mixin1::property2};
  mixin-super-stub set property2(core::int value) → void
    return super.{self::Mixin1::property2} = value;
  mixin-super-stub method method1() → void
    return super.{self::Mixin1::method1}();
  mixin-super-stub method method2() → void
    return super.{self::Mixin1::method2}();
}
class Class1b extends self::_Class1b&Class1a&Mixin1 {
  synthetic constructor •() → self::Class1b
    ;
}
abstract class Class2a extends mai::Super2 implements mai::Super1 {
  synthetic constructor •() → self::Class2a
    ;
}
abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class2b&Class2a&Mixin1
    : super self::Class2a::•()
    ;
  mixin-super-stub get field1() → core::int
    return super.{self::Mixin1::field1};
  mixin-super-stub set field1(core::int value) → void
    return super.{self::Mixin1::field1} = value;
  mixin-super-stub get field2() → core::int
    return super.{self::Mixin1::field2};
  mixin-super-stub set field2(core::int value) → void
    return super.{self::Mixin1::field2} = value;
  mixin-super-stub get property1() → core::int
    return super.{self::Mixin1::property1};
  mixin-super-stub set property1(core::int value) → void
    return super.{self::Mixin1::property1} = value;
  mixin-super-stub get property2() → core::int
    return super.{self::Mixin1::property2};
  mixin-super-stub set property2(core::int value) → void
    return super.{self::Mixin1::property2} = value;
  mixin-super-stub method method1() → void
    return super.{self::Mixin1::method1}();
  mixin-super-stub method method2() → void
    return super.{self::Mixin1::method2}();
}
class Class2b extends self::_Class2b&Class2a&Mixin1 {
  synthetic constructor •() → self::Class2b
    ;
}
abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
  synthetic constructor •() → self::Class3a
    ;
}
abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class3b&Class3a&Mixin1
    : super self::Class3a::•()
    ;
  mixin-super-stub get field1() → core::int
    return super.{self::Mixin1::field1};
  mixin-super-stub set field1(core::int value) → void
    return super.{self::Mixin1::field1} = value;
  mixin-super-stub get field2() → core::int
    return super.{self::Mixin1::field2};
  mixin-super-stub set field2(core::int value) → void
    return super.{self::Mixin1::field2} = value;
  mixin-super-stub get property1() → core::int
    return super.{self::Mixin1::property1};
  mixin-super-stub set property1(core::int value) → void
    return super.{self::Mixin1::property1} = value;
  mixin-super-stub get property2() → core::int
    return super.{self::Mixin1::property2};
  mixin-super-stub set property2(core::int value) → void
    return super.{self::Mixin1::property2} = value;
  mixin-super-stub method method1() → void
    return super.{self::Mixin1::method1}();
  mixin-super-stub method method2() → void
    return super.{self::Mixin1::method2}();
}
class Class3b extends self::_Class3b&Class3a&Mixin1 {
  synthetic constructor •() → self::Class3b
    ;
}
abstract class Class4a extends mai::Super1 implements mai::Super2 {
  synthetic constructor •() → self::Class4a
    ;
}
abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class4b&Class4a&Mixin2
    : super self::Class4a::•()
    ;
  mixin-super-stub get property1() → core::int
    return super.{mai::Mixin2::property1};
  mixin-super-stub set property1(core::int value) → void
    return super.{mai::Mixin2::property1} = value;
  mixin-super-stub get property2() → core::int
    return super.{mai::Mixin2::property2};
  mixin-super-stub set property2(core::int value) → void
    return super.{mai::Mixin2::property2} = value;
  mixin-super-stub get field1() → core::int
    return super.{mai::Mixin2::field1};
  mixin-super-stub set field1(core::int value) → void
    return super.{mai::Mixin2::field1} = value;
  mixin-super-stub get field2() → core::int
    return super.{mai::Mixin2::field2};
  mixin-super-stub set field2(core::int value) → void
    return super.{mai::Mixin2::field2} = value;
  mixin-super-stub method method1() → void
    return super.{mai::Mixin2::method1}();
  mixin-super-stub method method2() → void
    return super.{mai::Mixin2::method2}();
}
class Class4b extends self::_Class4b&Class4a&Mixin2 {
  synthetic constructor •() → self::Class4b
    ;
}
abstract class Class5a extends mai::Super2 implements mai::Super1 {
  synthetic constructor •() → self::Class5a
    ;
}
abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class5b&Class5a&Mixin2
    : super self::Class5a::•()
    ;
  mixin-super-stub get property1() → core::int
    return super.{mai::Mixin2::property1};
  mixin-super-stub set property1(core::int value) → void
    return super.{mai::Mixin2::property1} = value;
  mixin-super-stub get property2() → core::int
    return super.{mai::Mixin2::property2};
  mixin-super-stub set property2(core::int value) → void
    return super.{mai::Mixin2::property2} = value;
  mixin-super-stub get field1() → core::int
    return super.{mai::Mixin2::field1};
  mixin-super-stub set field1(core::int value) → void
    return super.{mai::Mixin2::field1} = value;
  mixin-super-stub get field2() → core::int
    return super.{mai::Mixin2::field2};
  mixin-super-stub set field2(core::int value) → void
    return super.{mai::Mixin2::field2} = value;
  mixin-super-stub method method1() → void
    return super.{mai::Mixin2::method1}();
  mixin-super-stub method method2() → void
    return super.{mai::Mixin2::method2}();
}
class Class5b extends self::_Class5b&Class5a&Mixin2 {
  synthetic constructor •() → self::Class5b
    ;
}
abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
  synthetic constructor •() → self::Class6a
    ;
}
abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class6b&Class6a&Mixin2
    : super self::Class6a::•()
    ;
  mixin-super-stub get property1() → core::int
    return super.{mai::Mixin2::property1};
  mixin-super-stub set property1(core::int value) → void
    return super.{mai::Mixin2::property1} = value;
  mixin-super-stub get property2() → core::int
    return super.{mai::Mixin2::property2};
  mixin-super-stub set property2(core::int value) → void
    return super.{mai::Mixin2::property2} = value;
  mixin-super-stub get field1() → core::int
    return super.{mai::Mixin2::field1};
  mixin-super-stub set field1(core::int value) → void
    return super.{mai::Mixin2::field1} = value;
  mixin-super-stub get field2() → core::int
    return super.{mai::Mixin2::field2};
  mixin-super-stub set field2(core::int value) → void
    return super.{mai::Mixin2::field2} = value;
  mixin-super-stub method method1() → void
    return super.{mai::Mixin2::method1}();
  mixin-super-stub method method2() → void
    return super.{mai::Mixin2::method2}();
}
class Class6b extends self::_Class6b&Class6a&Mixin2 {
  synthetic constructor •() → self::Class6b
    ;
}

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

class Super1 extends core::Object {
  field core::int field1;
  field core::int property1;
  synthetic constructor •() → mai::Super1
    ;
  method method1() → void
    ;
}
class Super2 extends core::Object {
  field core::int field2;
  field core::int property2;
  synthetic constructor •() → mai::Super2
    ;
  method method2() → void
    ;
}
abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → mai::_Mixin2&Super1&Super2
    ;
}
abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/  {
  late field core::int field1;
  late field core::int field2;
  method method1() → void
    ;
  method method2() → void
    ;
  get property1() → core::int
    ;
  set property1(core::int value) → void
    ;
  get property2() → core::int
    ;
  set property2(core::int value) → void
    ;
}
