code: def _flat_crossproduct_scatter(process,        # type: WorkflowJobStep
                                 joborder,       # type: MutableMapping[Text, Any]
                                 scatter_keys,   # type: MutableSequence[Text]
                                 callback,       # type: ReceiveScatterOutput
                                 startindex,     # type: int
                                 runtimeContext  # type: RuntimeContext
                                ):  # type: (...) -> Tuple[List[Generator], int]
      
      scatter_key = scatter_keys[0]
      jobl = len(joborder[scatter_key])
      steps = []
      put = startindex
      for index in range(0, jobl):
          sjob = copy.copy(joborder)
          sjob[scatter_key] = joborder[scatter_key][index]
  
          if len(scatter_keys) == 1:
              if runtimeContext.postScatterEval is not None:
                  sjob = runtimeContext.postScatterEval(sjob)
              steps.append(process.job(
                  sjob, functools.partial(callback.receive_scatter_output, put),
                  runtimeContext))
              put += 1
          else:
              (add, _) = _flat_crossproduct_scatter(
                  process, sjob, scatter_keys[1:], callback, put, runtimeContext)
              put += len(add)
              steps.extend(add)
  
      return (steps, put)
docs: Inner loop.