code: def fen(self, *, shredder: bool = False, en_passant: str = "legal", promoted: Optional[bool] = None) -> str:
          
          return " ".join([
              self.epd(shredder=shredder, en_passant=en_passant, promoted=promoted),
              str(self.halfmove_clock),
              str(self.fullmove_number)
          ])
docs: Gets a FEN representation of the position.
  
          A FEN string (e.g.,
          ``rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1``) consists
          of the position part :func:`~chess.Board.board_fen()`, the
          :data:`~chess.Board.turn`, the castling part
          (:data:`~chess.Board.castling_rights`),
          the en passant square (:data:`~chess.Board.ep_square`),
          the :data:`~chess.Board.halfmove_clock`
          and the :data:`~chess.Board.fullmove_number`.
  
          :param shredder: Use :func:`~chess.Board.castling_shredder_fen()`
              and encode castling rights by the file of the rook
              (like ``HAha``) instead of the default
              :func:`~chess.Board.castling_xfen()` (like ``KQkq``).
          :param en_passant: By default, only fully legal en passant squares
              are included (:func:`~chess.Board.has_legal_en_passant()`).
              Pass ``fen`` to strictly follow the FEN specification
              (always include the en passant square after a two-step pawn move)
              or ``xfen`` to follow the X-FEN specification
              (:func:`~chess.Board.has_pseudo_legal_en_passant()`).
          :param promoted: Mark promoted pieces like ``Q~``. By default, this is
              only enabled in chess variants where this is relevant.