main = <No Member>;
library from "org-dartlang-test:///lib1.dart" as lib1 {
additionalExports = (main::Extension|get#method,
  main::Extension|method,
  main::main,
  main::Class,
  main::Extension)

  export "org-dartlang-test:///main.dart";
  import "org-dartlang-test:///main.dart";
  import "org-dartlang-test:///main.dart" as m;

  extension Extension2 on main::Class* {
    method method2 = lib1::Extension2|method2;
    tearoff method2 = lib1::Extension2|get#method2;
  }
  static method Extension2|method2(final main::Class* #this) → void {}
  static method Extension2|get#method2(final main::Class* #this) → () →* void
    return () → void => lib1::Extension2|method2(#this);
  static method lib1() → dynamic {
    main::Class* a = new main::Class::•();
    main::Extension|method(a);
    lib1::Extension2|method2(a);
    dart.core::print("done");
  }
}
library from "org-dartlang-test:///lib2.dart" as lib2 {

  import "org-dartlang-test:///lib1.dart";
  import "org-dartlang-test:///lib1.dart" as l1;

  extension Extension3 on main::Class* {
    method method3 = lib2::Extension3|method3;
    tearoff method3 = lib2::Extension3|get#method3;
  }
  static method Extension3|method3(final main::Class* #this) → void {}
  static method Extension3|get#method3(final main::Class* #this) → () →* void
    return () → void => lib2::Extension3|method3(#this);
  static method lib2() → dynamic {
    main::Class* a = new main::Class::•();
    main::Extension|method(a);
    lib1::Extension2|method2(a);
    dart.core::print("done");
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib1.dart";
  import "org-dartlang-test:///lib1.dart" as l1;
  import "org-dartlang-test:///lib2.dart";
  import "org-dartlang-test:///lib2.dart" as l2;

  class Class extends dart.core::Object {
    synthetic constructor •() → main::Class*
      : super dart.core::Object::•()
      ;
  }
  extension Extension on main::Class* {
    method method = main::Extension|method;
    tearoff method = main::Extension|get#method;
  }
  static method Extension|method(final main::Class* #this) → void {}
  static method Extension|get#method(final main::Class* #this) → () →* void
    return () → void => main::Extension|method(#this);
  static method main() → dynamic {
    main::Class* a = new main::Class::•();
    main::Extension|method(a);
    lib1::Extension2|method2(a);
    lib1::lib1();
    dart.core::print("Done");
  }
}
