code: def huffman_encode(cls, s):
          # type: (str) -> Tuple[int, int]
          
          i = 0
          ibl = 0
          for c in s:
              val, bl = cls._huffman_encode_char(c)
              i = (i << bl) + val
              ibl += bl
  
          padlen = 8 - (ibl % 8)
          if padlen != 8:
              val, bl = cls._huffman_encode_char(EOS())
              i = (i << padlen) + (val >> (bl - padlen))
              ibl += padlen
  
          ret = i, ibl
          assert(ret[0] >= 0)
          assert (ret[1] >= 0)
          return ret
docs: huffman_encode returns the bitstring and the bitlength of the
          bitstring representing the string provided as a parameter
  
          @param str s: the string to encode
          @return (int, int): the bitstring of s and its bitlength
          @raise AssertionError