class A : Java1, Java2 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

  override fun bar(): String {
    return ""
  }

  override fun foo(s: String) {
  }

}

class B : Java1, Java2 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

}

class C : Java1, Java3 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

}

class D : Java1, Java3 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

  @Nullable
  override fun bar(): String {
    return super<Java1>.bar() /*!! String */
  }

  @NotNull
  override fun foo(@NotNull s: String?) {
    super<Java1>.foo(s = s)
  }

}

abstract class E : Java2, KotlinInterface {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class F : Java2, KotlinInterface {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  override fun bar(): String {
    return ""
  }

  override fun foo(s: String) {
  }

}

class G : Java1, KotlinInterface2 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

}

class H : Java1, Java2, Java3 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

}

interface KotlinInterface {
  abstract fun bar(): String

  abstract fun foo(s: String)

  val nullableString: String
    get(): String {
      return ""
    }

}

interface KotlinInterface2 {
  @NotNull
  abstract fun bar(): String

  @NotNull
  abstract fun foo(@NotNull s: String)

  val nullableString: String
    @NotNull
    get(): String {
      return ""
    }

}

fun test(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) {
  val k: String? = a.#nullableString
  val k2: String = a.bar()
  a.foo(s = "")
  val k3: String = b.#nullableString /*!! String */
  val k4: String = b.bar() /*!! String */
  b.foo(s = "")
  b.foo(s = null)
  val k5: String = c.#nullableString /*!! String */
  val k6: String? = c.bar()
  c.foo(s = "")
  c.foo(s = null)
  val k7: String = d.#nullableString /*!! String */
  val k8: String = d.bar()
  d.foo(s = "")
  d.foo(s = null)
  val k9: String = e.<get-nullableString>()
  val k10: String = e.bar() /*!! String */
  e.foo(s = "")
  val k11: String = f.<get-nullableString>()
  val k12: String = f.bar()
  f.foo(s = "")
  val k13: String = g.#nullableString /*!! String */
  val k14: String = g.bar()
  g.foo(s = "")
  g.foo(s = null)
  val k15: String = h.#nullableString /*!! String */
  val k16: String = h.bar() /*!! String */
  h.foo(s = "")
  h.foo(s = null)
}
