code: def __init__(
      self,
      transfer: Union[Transfer, List[Transfer]],
      *,
      files_listener: Optional[Callable[[int], None]] = None,
      bytes_listener: Optional[Callable[[int], None]] = None,
  ):
      self._start_time = time_msecs()
      self._end_time: Optional[int] = None
      self._duration: Optional[int] = None
      if isinstance(transfer, Transfer):
          self._transfer_report: Union[
              TransferReport, List[TransferReport]
          ] = TransferReport(
              transfer,
              files_listener=files_listener,
              bytes_listener=bytes_listener,
          )
      else:
          self._transfer_report = [
              TransferReport(
                  t,
                  files_listener=files_listener,
                  bytes_listener=bytes_listener,
              )
              for t in transfer
          ]
      self._exception: Optional[Exception] = None
  
imports: from typing import Any, AsyncIterator, Awaitable, Optional, List, Union, Dict, Callable, Tuple
  import os
  import os.path
  import asyncio
  import functools
  import humanize
  from ...utils import retry_transient_errors, url_basename, url_join, bounded_gather2, time_msecs, humanize_timedelta_msecs
  from ..weighted_semaphore import WeightedSemaphore
  from .exceptions import FileAndDirectoryError, UnexpectedEOFError
  from .fs import MultiPartCreate, FileStatus, AsyncFS, FileListEntry
label_desc: Use image node_id 1 to create a new CopyReport object  with example: obj = CopyReport(transfer)