code: def save_card(
      self, uuid, card_type, card_html, card_id=None, overwrite=True
  ):
      card_file_name = card_type
      # TEMPORARY_WORKAROUND: FIXME (LATER) : Fix the duplication of below block in a few months.
      # Check file blame to understand the age of this temporary workaround.
  
      # This function will end up saving cards at two locations.
      # Thereby doubling the number of cards. (Which is a temporary fix)
      # Why do this ? :
      # When cards were introduced there was an assumption made about task-ids being unique.
      # This assumption was incorrect.
      # Only the pathspec needs to be unique but there is no such guarantees about task-ids.
      # When task-ids are non-unique, card read would result in finding incorrect cards.
      # This happens because cards were stored based on task-ids.
      # If we immediately switch from storing based on task-ids to a step-name abstraction folder,
      # then card reading will crash for many users.
      # It would especially happen for users who are accessing cards created by a newer
      # MF client from an older version of MF client.
      # It will also easily end up breaking the metaflow-ui (which maybe using a client from an older version).
      # Hence, we are writing cards to both paths so that we can introduce breaking changes later in the future.
      card_path_with_steps = self.get_card_location(
          self._get_card_write_path(),
          card_file_name,
          uuid,
          card_id=card_id,
          suffix=CardNameSuffix.CARD,
      )
      if SKIP_CARD_DUALWRITE:
          self._backend.save_bytes(
              [
                  (
                      card_path_with_steps,
                      BytesIO(bytes(card_html, "utf-8")),
                  )
              ],
              overwrite=overwrite,
          )
      else:
          card_path_without_steps = self.get_card_location(
              self._get_card_read_path(with_steps=False),
              card_file_name,
              uuid,
              card_id=card_id,
              suffix=CardNameSuffix.CARD,
          )
          for cp in [card_path_with_steps, card_path_without_steps]:
              self._backend.save_bytes(
                  [(cp, BytesIO(bytes(card_html, "utf-8")))],
                  overwrite=overwrite,
              )
  
      return self.info_from_path(
          card_path_with_steps, suffix=CardNameSuffix.CARD
      )
  
imports: from collections import namedtuple
  from io import BytesIO
  import os
  import json
  import shutil
  from metaflow.plugins.datastores.local_storage import LocalStorage
  from metaflow.metaflow_config import CARD_S3ROOT, CARD_LOCALROOT, DATASTORE_LOCAL_DIR, CARD_SUFFIX, CARD_AZUREROOT, CARD_GSROOT, SKIP_CARD_DUALWRITE
  import metaflow.metaflow_config
  from .exception import CardNotPresentException
label_desc: Use image node_id 11 for calling the CardDatastore obj's underlying member method code with example usage: obj.save_card(uuid, card_type, card_html, card_id, overwrite) and returns: self