code: def mask_left(self, n_seq_bases, mask="S"):
          
          cigs = list(self.items())
          new_cigs = []
  
          c, cum_len  = self.cigar, 0
          for i, (l, op) in enumerate(cigs):
              if op in Cigar.read_consuming_ops:
                  cum_len += l
              if op == "H":
                  cum_len += l
                  new_cigs.append(cigs[i])
              elif cum_len < n_seq_bases:
                  new_cigs.append(cigs[i])
              else:
                  # the current cigar element is split by the masking.
                  right_extra = cum_len - n_seq_bases
                  new_cigs.append((l - right_extra, 'S'))
                  if right_extra != 0:
                      new_cigs.append((right_extra, cigs[i][1]))
              if cum_len >= n_seq_bases: break
          else:
              pass
  
          new_cigs[:i] = [(l, op if op in "HS" else "S") for l, op in
                  new_cigs[:i]]
          new_cigs.extend(cigs[i + 1:])
          return Cigar(Cigar.string_from_elements(new_cigs)).merge_like_ops()
docs: Return a new cigar with cigar string where the first `n_seq_bases` are
          soft-masked unless they are already hard-masked.