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

  }

  override fun bar(): MutableList<Int> {
    return mutableListOf<Int>(elements = [1])
  }

  override fun bar2(): MutableList<Number> {
    return mutableListOf<Number>(elements = [1.1])
  }

  override fun bar3(): MutableList<Int> {
    return mutableListOf<Int>(elements = [1])
  }

}

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

  }

}

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

  }

  override fun bar(): MutableList<out Number> {
    return mutableListOf<Int>(elements = [1])
  }

  override fun foo(a: MutableList<out Number>) {
  }

}

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

  }

  override fun bar(): MutableList<Int> {
    return mutableListOf<Int>(elements = [1])
  }

  override fun bar2(): MutableList<Number> {
    return mutableListOf<Number>(elements = [1.1])
  }

  override fun bar3(): MutableList<Int> {
    return mutableListOf<Int>(elements = [1])
  }

}

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

  }

}

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

  }

  override fun bar2(): MutableList<in Number> {
    return mutableListOf<Number>(elements = [1])
  }

  override fun foo2(a: MutableList<in Number>) {
  }

}

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

  }

  override fun bar(): MutableList<Int> {
    return mutableListOf<Int>(elements = [1])
  }

  override fun bar2(): MutableList<Number> {
    return mutableListOf<Number>(elements = [1.1])
  }

  override fun bar3(): MutableList<Int> {
    return mutableListOf<Int>(elements = [1])
  }

}

class H : G {
  constructor() /* primary */ {
    super/*G*/()
    /* <init>() */

  }

  override fun foo(a: MutableList<out Number>) {
  }

  override fun foo2(a: MutableList<in Number>) {
  }

  override fun foo3(a: MutableList<*>) {
  }

}

interface KotlinInterface {
  abstract fun bar(): MutableList<out Number>

  abstract fun bar2(): MutableList<in Number>

  abstract fun bar3(): MutableList<*>

  abstract fun foo(a: MutableList<out Number>)

  abstract fun foo2(a: MutableList<in Number>)

  abstract fun foo3(a: MutableList<*>)

}

interface KotlinInterface2 {
  abstract fun bar(): List<Number>

  abstract fun foo(a: List<Number>)

}

fun test(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) {
  a.foo(a = null)
  a.foo(a = mutableListOf<Int>(elements = [1]))
  a.foo(a = listOf<Int>(element = 1))
  a.bar() /*~> Unit */
  a.foo2(a = null)
  a.foo2(a = mutableListOf<Number?>(elements = [null]))
  a.foo2(a = mutableListOf<@FlexibleNullability Number?>(elements = [1.1]))
  a.bar2() /*~> Unit */
  a.foo3(a = null)
  a.foo3(a = mutableListOf<Nothing?>(elements = [null]))
  a.foo3(a = listOf<Nothing?>(element = null))
  a.foo3(a = listOf<String>(element = ""))
  a.bar3() /*~> Unit */
  b.foo(a = null)
  b.foo(a = mutableListOf<Int>(elements = [1]))
  b.bar() /*~> Unit */
  b.foo2(a = null)
  b.foo2(a = mutableListOf<Number?>(elements = [null]))
  b.foo2(a = mutableListOf<@FlexibleNullability Number?>(elements = [1.1]))
  b.bar2() /*~> Unit */
  b.foo3(a = null)
  b.foo3(a = mutableListOf<Nothing?>(elements = [null]))
  b.foo3(a = mutableListOf<String>(elements = [""]))
  b.bar3() /*~> Unit */
  c.foo(a = mutableListOf<Int>(elements = [1]))
  c.bar() /*~> Unit */
  d.foo(a = null)
  d.foo(a = mutableListOf<Int>(elements = [1]))
  d.bar() /*~> Unit */
  d.foo2(a = null)
  d.foo2(a = mutableListOf<Number?>(elements = [null]))
  d.foo2(a = mutableListOf<@FlexibleNullability Number?>(elements = [1.1]))
  d.bar2() /*~> Unit */
  d.foo3(a = null)
  d.foo3(a = mutableListOf<Nothing?>(elements = [null]))
  d.foo3(a = mutableListOf<String>(elements = [""]))
  d.bar3() /*~> Unit */
  e.foo(a = null)
  e.foo(a = mutableListOf<Int>(elements = [1]))
  e.foo(a = listOf<Int>(element = 1))
  e.bar() /*~> Unit */
  e.foo2(a = null)
  e.foo2(a = mutableListOf<Number?>(elements = [null]))
  e.foo2(a = mutableListOf<@FlexibleNullability Number?>(elements = [1.1]))
  e.bar2() /*~> Unit */
  e.foo3(a = null)
  e.foo3(a = mutableListOf<Nothing?>(elements = [null]))
  e.foo3(a = listOf<Nothing?>(element = null))
  e.foo3(a = listOf<String>(element = ""))
  e.bar3() /*~> Unit */
  f.foo2(a = mutableListOf<Number?>(elements = [null]))
  f.bar2() /*~> Unit */
  g.foo(a = null)
  g.foo(a = mutableListOf<Int>(elements = [1]))
  g.foo(a = listOf<Int>(element = 1))
  g.bar() /*~> Unit */
  g.foo2(a = null)
  g.foo2(a = mutableListOf<Number?>(elements = [null]))
  g.foo2(a = mutableListOf<@FlexibleNullability Number?>(elements = [1.1]))
  g.bar2() /*~> Unit */
  g.foo3(a = null)
  g.foo3(a = mutableListOf<Nothing?>(elements = [null]))
  g.foo3(a = listOf<Nothing?>(element = null))
  g.foo3(a = listOf<String>(element = ""))
  g.bar3() /*~> Unit */
  h.foo(a = mutableListOf<Int>(elements = [1]))
  h.foo2(a = mutableListOf<Number>(elements = [1]))
  h.foo3(a = mutableListOf<String>(elements = [""]))
}
