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

  class C extends dart.core::Object {
    field dart.core::int? _#C#field5 = null;
    field dart.core::bool _#C#field5#isSet = false;
    field dart.core::int? _#C#field6 = null;
    field dart.core::bool _#C#field6#isSet = false;
    field dart.core::int? _#C#field7 = null;
    field dart.core::bool _#C#field7#isSet = false;
    field dart.core::int? _#C#field8 = null;
    field dart.core::bool _#C#field8#isSet = false;
    static field dart.core::int? _#field9 = null;
    static field dart.core::bool _#field9#isSet = false;
    static field dart.core::int? _#field10 = null;
    static field dart.core::bool _#field10#isSet = false;
    static field dart.core::int? _#field11 = null;
    static field dart.core::bool _#field11#isSet = false;
    static field dart.core::int? _#field12 = null;
    static field dart.core::bool _#field12#isSet = false;
    synthetic constructor •() → main::C
      : super dart.core::Object::•()
      ;
    get field5() → dart.core::int? {
      if(!this.{main::C::_#C#field5#isSet}) {
        this.{main::C::_#C#field5} = 42;
        this.{main::C::_#C#field5#isSet} = true;
      }
      return this.{main::C::_#C#field5};
    }
    set field5(dart.core::int? #t1) → void {
      this.{main::C::_#C#field5#isSet} = true;
      this.{main::C::_#C#field5} = #t1;
    }
    get field6() → dart.core::int?
      return this.{main::C::_#C#field6#isSet} ?{dart.core::int?} this.{main::C::_#C#field6} : throw new dart._internal::LateError::fieldNI("field6");
    set field6(dart.core::int? #t2) → void {
      this.{main::C::_#C#field6#isSet} = true;
      this.{main::C::_#C#field6} = #t2;
    }
    get field7() → dart.core::int? {
      if(!this.{main::C::_#C#field7#isSet}) {
        final dart.core::int? #t3 = 42;
        if(this.{main::C::_#C#field7#isSet})
          throw new dart._internal::LateError::fieldADI("field7");
        this.{main::C::_#C#field7} = #t3;
        this.{main::C::_#C#field7#isSet} = true;
      }
      return this.{main::C::_#C#field7};
    }
    get field8() → dart.core::int?
      return this.{main::C::_#C#field8#isSet} ?{dart.core::int?} this.{main::C::_#C#field8} : throw new dart._internal::LateError::fieldNI("field8");
    set field8(dart.core::int? #t4) → void
      if(this.{main::C::_#C#field8#isSet})
        throw new dart._internal::LateError::fieldAI("field8");
      else {
        this.{main::C::_#C#field8#isSet} = true;
        this.{main::C::_#C#field8} = #t4;
      }
    static get field9() → dart.core::int? {
      if(!main::C::_#field9#isSet) {
        main::C::_#field9 = 42;
        main::C::_#field9#isSet = true;
      }
      return main::C::_#field9;
    }
    static set field9(dart.core::int? #t5) → void {
      main::C::_#field9#isSet = true;
      main::C::_#field9 = #t5;
    }
    static get field10() → dart.core::int?
      return main::C::_#field10#isSet ?{dart.core::int?} main::C::_#field10 : throw new dart._internal::LateError::fieldNI("field10");
    static set field10(dart.core::int? #t6) → void {
      main::C::_#field10#isSet = true;
      main::C::_#field10 = #t6;
    }
    static get field11() → dart.core::int? {
      if(!main::C::_#field11#isSet) {
        final dart.core::int? #t7 = 42;
        if(main::C::_#field11#isSet)
          throw new dart._internal::LateError::fieldADI("field11");
        main::C::_#field11 = #t7;
        main::C::_#field11#isSet = true;
      }
      return main::C::_#field11;
    }
    static get field12() → dart.core::int?
      return main::C::_#field12#isSet ?{dart.core::int?} main::C::_#field12 : throw new dart._internal::LateError::fieldNI("field12");
    static set field12(dart.core::int? #t8) → void
      if(main::C::_#field12#isSet)
        throw new dart._internal::LateError::fieldAI("field12");
      else {
        main::C::_#field12#isSet = true;
        main::C::_#field12 = #t8;
      }
  }
  static field dart.core::int? _#field1 = null;
  static field dart.core::bool _#field1#isSet = false;
  static field dart.core::int? _#field2 = null;
  static field dart.core::bool _#field2#isSet = false;
  static field dart.core::int? _#field3 = null;
  static field dart.core::bool _#field3#isSet = false;
  static field dart.core::int? _#field4 = null;
  static field dart.core::bool _#field4#isSet = false;
  static get field1() → dart.core::int? {
    if(!main::_#field1#isSet) {
      main::_#field1 = 42;
      main::_#field1#isSet = true;
    }
    return main::_#field1;
  }
  static set field1(dart.core::int? #t9) → void {
    main::_#field1#isSet = true;
    main::_#field1 = #t9;
  }
  static get field2() → dart.core::int?
    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateError::fieldNI("field2");
  static set field2(dart.core::int? #t10) → void {
    main::_#field2#isSet = true;
    main::_#field2 = #t10;
  }
  static get field3() → dart.core::int? {
    if(!main::_#field3#isSet) {
      final dart.core::int? #t11 = 42;
      if(main::_#field3#isSet)
        throw new dart._internal::LateError::fieldADI("field3");
      main::_#field3 = #t11;
      main::_#field3#isSet = true;
    }
    return main::_#field3;
  }
  static get field4() → dart.core::int?
    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateError::fieldNI("field4");
  static set field4(dart.core::int? #t12) → void
    if(main::_#field4#isSet)
      throw new dart._internal::LateError::fieldAI("field4");
    else {
      main::_#field4#isSet = true;
      main::_#field4 = #t12;
    }
  static method main() → dynamic {
    main::field1 = 44;
    main::field2 = 43;
  }
}
