main = main::main;
library from "org-dartlang-test:///lib1.dart" as lib1 {

  extension NumberParsing on dart.core::String* {
    method parseInt = lib1::NumberParsing|parseInt;
    tearoff parseInt = lib1::NumberParsing|get#parseInt;
  }
  static method NumberParsing|parseInt(lowered final dart.core::String* #this) → dart.core::int* {
    return dart.core::int::parse(#this);
  }
  static method NumberParsing|get#parseInt(lowered final dart.core::String* #this) → () →* dart.core::int*
    return () → dart.core::int* => lib1::NumberParsing|parseInt(#this);
}
library from "org-dartlang-test:///lib2.dart" as lib2 {

  extension DuplicateName on dart.core::String* {
    method fooMe1 = lib2::DuplicateName|fooMe1;
    tearoff fooMe1 = lib2::DuplicateName|get#fooMe1;
  }
  static method DuplicateName|fooMe1(lowered final dart.core::String* #this) → dart.core::String* {
    return "Foo1";
  }
  static method DuplicateName|get#fooMe1(lowered final dart.core::String* #this) → () →* dart.core::String*
    return () → dart.core::String* => lib2::DuplicateName|fooMe1(#this);
}
library from "org-dartlang-test:///lib3.dart" as lib3 {

  extension DuplicateName on dart.core::String* {
    method fooMe2 = lib3::DuplicateName|fooMe2;
    tearoff fooMe2 = lib3::DuplicateName|get#fooMe2;
  }
  static method DuplicateName|fooMe2(lowered final dart.core::String* #this) → dart.core::String* {
    return "Foo2";
  }
  static method DuplicateName|get#fooMe2(lowered final dart.core::String* #this) → () →* dart.core::String*
    return () → dart.core::String* => lib3::DuplicateName|fooMe2(#this);
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib1.dart";
  import "org-dartlang-test:///lib2.dart";
  import "org-dartlang-test:///lib3.dart";

  static method main() → dynamic {
    lib1::NumberParsing|parseInt("42");
    lib2::DuplicateName|fooMe1("42");
    lib3::DuplicateName|fooMe2("42");
  }
}
