library test;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
    return null;
}
static method F<T extends core::Object* = dynamic>() → self::F::T*
  return null;
static method f() → asy::Future<dynamic>* /* originally async */ {
  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
  asy::FutureOr<dynamic>* :return_value;
  dynamic :async_stack_trace;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        dynamic d;
        core::Object* o;
        for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
        }
        for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
        }
        for (core::Object* x in self::F<core::Iterable<core::Object*>*>()) {
        }
        for (final dynamic #t1 in self::F<core::Iterable<dynamic>*>()) {
          d = #t1;
        }
        for (final core::Object* #t2 in self::F<core::Iterable<core::Object*>*>()) {
          o = #t2;
        }
        {
          dynamic :stream = self::F<asy::Stream<dynamic>*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L2:
            while (true) {
              dynamic #t3 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                dynamic x = :for-iterator.{asy::_StreamIterator::current};
                {}
              }
              else
                break #L2;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        {
          dynamic :stream = self::F<asy::Stream<dynamic>*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L3:
            while (true) {
              dynamic #t6 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                dynamic x = :for-iterator.{asy::_StreamIterator::current};
                {}
              }
              else
                break #L3;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        {
          dynamic :stream = self::F<asy::Stream<core::Object*>*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
          try
            #L4:
            while (true) {
              dynamic #t9 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                core::Object* x = :for-iterator.{asy::_StreamIterator::current};
                {}
              }
              else
                break #L4;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        {
          dynamic :stream = self::F<asy::Stream<dynamic>*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L5:
            while (true) {
              dynamic #t12 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
                {
                  d = #t14;
                }
              }
              else
                break #L5;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        {
          dynamic :stream = self::F<asy::Stream<core::Object*>*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
          try
            #L6:
            while (true) {
              dynamic #t16 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                final core::Object* #t18 = :for-iterator.{asy::_StreamIterator::current};
                {
                  o = #t18;
                }
              }
              else
                break #L6;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t19 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
      }
      asy::_completeOnAsyncReturn(:async_completer, :return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
    }
  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_completer.start(:async_op);
  return :async_completer.{asy::Completer::future};
}
static method main() → asy::Future<dynamic>* /* originally async */ {
  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
  asy::FutureOr<dynamic>* :return_value;
  dynamic :async_stack_trace;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L7:
      {
        for (core::int* x in <core::int*>[1, 2, 3]) {
        }
        for (core::num* x in <core::num*>[1, 2, 3]) {
        }
        for (core::int* x in <core::int*>[1, 2, 3]) {
        }
        {
          dynamic :stream = self::MyStream::•<core::int*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L8:
            while (true) {
              dynamic #t20 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                core::int* x = :for-iterator.{asy::_StreamIterator::current};
                {}
              }
              else
                break #L8;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t22 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        {
          dynamic :stream = self::MyStream::•<core::int*>();
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L9:
            while (true) {
              dynamic #t23 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(:result) {
                core::int* x = :for-iterator.{asy::_StreamIterator::current};
                {}
              }
              else
                break #L9;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t25 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
      }
      asy::_completeOnAsyncReturn(:async_completer, :return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
    }
  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_completer.start(:async_op);
  return :async_completer.{asy::Completer::future};
}
