docs: def MultiOpenOrdered(self, urns, **kwargs):
      """Opens many URNs and returns handles in the same order.
  
      `MultiOpen` can return file handles in arbitrary order. This makes it more
      efficient and in most cases the order does not matter. However, there are
      cases where order is important and this function should be used instead.
  
      Args:
        urns: A list of URNs to open.
        **kwargs: Same keyword arguments as in `MultiOpen`.
  
      Returns:
        A list of file-like objects corresponding to the specified URNs.
  
      Raises:
        IOError: If one of the specified URNs does not correspond to the AFF4
            object.
      """
      precondition.AssertIterableType(urns, rdfvalue.RDFURN)
  
      urn_filedescs = {}
      for filedesc in self.MultiOpen(urns, **kwargs):
        urn_filedescs[filedesc.urn] = filedesc
  
      filedescs = []
  
      for urn in urns:
        try:
          filedescs.append(urn_filedescs[urn])
        except KeyError:
          raise IOError("No associated AFF4 object for `%s`" % urn)
  
      return filedescs