interface I<T : Any?> {
  abstract fun input(t: T)
  abstract fun output(): T

}

fun <T : Any?> foo(i: I<(T & Any)>) {
  i.input(t = i.output())
}

fun <T : Any?> bar(i: I<out (T & Any)>): (T & Any) {
  return i.output()
}

fun <T : Any?> qux(t: T, i: I<in (T & Any)>) {
  i.input(t = CHECK_NOT_NULL<T>(arg0 = t))
}

class C<TT : Any?> : I<(TT & Any)> {
  constructor(t: TT) /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  val t: TT
    field = t
    get

  override fun input(t: (TT & Any)) {
  }

  override fun output(): (TT & Any) {
    return CHECK_NOT_NULL<TT>(arg0 = <this>.<get-t>())
  }

}

fun <T1 : Any?, T2 : I<(T1 & Any)>> foo2(p1: T1, p2: T2) {
  p2 /*as I<(T1 & Any)> */.input(t = CHECK_NOT_NULL<T1>(arg0 = p1))
}
