docs: def _rm_parse_header_line(parts, meta_data):
    """
    parse a repeatmasker alignment header line and place the extracted meta-data
    into the provided dictionary. An example header line is::
  
      239 29.42 1.92 0.97 chr1 11 17 (41) C XX#YY (74) 104 1 m_b1s502i1 4
  
    If the alignment is to the consensus, this will have 14 fields; to the
    reverse complement of the repeat consensus and it'll have 15. Fields as
    follows:
  
    =====  ========    ==========================================================
    Num    Value       description
    =====  ========    ==========================================================
    0      239         Smith-Waterman score of the match
    1      29.42       percent substitutions in match compared to the consensus
    2      1.92        percent bases opposite gap in query seq (deleted bp)
    3      0.97        percent bases opposite gap in repeat consensus (insert bp)
    4      chr1        The name of the reference sequence (usually genomic chrom)
    5      11          Start location in reference; always pos strand, I think..
    6      17          End location in reference; always pos strand, I think..
    7      (41)        Distance to end of ref (alt., neg strand co-ord of end)
    8      C           Alignment is to rev. comp. of consensus. Ommited otherwise
    8/9    XX#YY       XX is the name of the repeat and YY is the family
    9/10   (74)        if +'ve, strt coord; else bases before start on neg strand
    10/11  104         if +'ve, end coord; else start of match in pos strand
    11/12  1           if +'ve, num bases aftr mtch to end; else end in + coords
    12/13  m_b1s5..    ....?
    13/14  4           unique ID
    =====  ========    ==========================================================
  
    Note that repeat-masker calls the larger coordinate the start when the match
    is to the reverse complement; we swap these internally so start < end always,
    regardless of whether the match is to the consensus or the reverse complement
    of the consensus
  
    Each field is mapped to a key as follows
  
    =====  =================================================================
    Num    Key (these are defined in pyokit.datastruct.multipleAlignment.py)
    =====  =================================================================
    0      ALIG_SCORE_KEY
    1      PCENT_SUBS_KEY
    2      PCENT_S1_INDELS_KEY
    3      PCENT_S2_INDELS_KEY
    4      S1_NAME_KEY
    5      S1_START_KEY
    6      S1_END_KEY
    7      S1_END_NEG_STRAND_KEY
    8      S2_REVERSE_COMP_KEY
    8/9    S2_NAME_KEY
    9/10   S2_START_KEY (S2 + strand) / S2_START_NEG_STRAND_KEY (S2 - strand)
    10/11  S2_END_KEY (S2 + strand) / S2_START_KEY (S2 - strand)
    11/12  S2_END_NEG_STRAND_KEY (S2 + strand) / S2_END_KEY (S2 - strand)
    12/13  UNKNOWN_RM_HEADER_FIELD_KEY
    13/14  RM_ID_KEY
    =====  =================================================================
  
    :param parts:     the header line, as a tokenized list.
    :param meta_data: dictionary; resultant key-value pairs placed into this.
    """
    meta_data[ALIG_SCORE_KEY] = parts[0]
    meta_data[PCENT_SUBS_KEY] = float(parts[1])
    meta_data[PCENT_S1_INDELS_KEY] = float(parts[2])
    meta_data[PCENT_S2_INDELS_KEY] = float(parts[3])
    meta_data[ANNOTATION_KEY] = ""
  
    if parts[8] == "C":
      meta_data[UNKNOWN_RM_HEADER_FIELD_KEY] = parts[13]
      meta_data[RM_ID_KEY] = int(parts[14])
    else:
      meta_data[UNKNOWN_RM_HEADER_FIELD_KEY] = parts[12]
      meta_data[RM_ID_KEY] = int(parts[13])