'Appends multiple keyword+value cards to the end of the header, similar
to `list.extend`.
Parameters
cards : iterable
An iterable of (keyword, value, [comment]) tuples; see
`Header.append`.
strip : bool, optional
Remove any keywords that have meaning only to specific types of
HDUs, so that only more general keywords are added from extension
Header or Card list (default: `True`).
unique : bool, optional
If `True`, ensures that no duplicate keywords are appended;
keywords already in this header are simply discarded.  The
exception is commentary keywords (COMMENT, HISTORY, etc.): they are
only treated as duplicates if their values match.
update : bool, optional
If `True`, update the current header with the values and comments
from duplicate keywords in the input header.  This supercedes the
``unique`` argument.  Commentary keywords are treated the same as
if ``unique=True``.
update_first : bool, optional
If the first keyword in the header is \'SIMPLE\', and the first
keyword in the input header is \'XTENSION\', the \'SIMPLE\' keyword is
replaced by the \'XTENSION\' keyword.  Likewise if the first keyword
in the header is \'XTENSION\' and the first keyword in the input
header is \'SIMPLE\', the \'XTENSION\' keyword is replaced by the
\'SIMPLE\' keyword.  This behavior is otherwise dumb as to whether or
not the resulting header is a valid primary or extension header.
This is mostly provided to support backwards compatibility with the
old ``Header.fromTxtFile`` method, and only applies if
``update=True``.
useblanks, bottom, end : bool, optional
These arguments are passed to :meth:`Header.append` while appending
new cards to the header.'

def extend(self, cards, strip=True, unique=False, update=False, update_first=False, useblanks=True, bottom=False, end=False):

    temp = Header(cards)
    if strip:
        temp._strip()
    if len(self):
        first = self.cards[0].keyword
    else:
        first = None
    extend_cards = []
    for (idx, card) in enumerate(temp.cards):
        keyword = card.keyword
        if (keyword not in Card._commentary_keywords):
            if (unique and (not update) and (keyword in self)):
                continue
            elif update:
                if ((idx == 0) and update_first):
                    if (((keyword == 'SIMPLE') and (first == 'XTENSION')) or ((keyword == 'XTENSION') and (first == 'SIMPLE'))):
                        del self[0]
                        self.insert(0, card)
                    else:
                        self[keyword] = (card.value, card.comment)
                elif (keyword in self):
                    self[keyword] = (card.value, card.comment)
                else:
                    extend_cards.append(card)
            else:
                extend_cards.append(card)
        elif ((unique or update) and (keyword in self)):
            if card.is_blank:
                extend_cards.append(card)
                continue
            for value in self[keyword]:
                if (value == card.value):
                    break
            else:
                extend_cards.append(card)
        else:
            extend_cards.append(card)
    for card in extend_cards:
        self.append(card, useblanks=useblanks, bottom=bottom, end=end)
