old_contents: from clint.textui import colored, puts, indent, progress
  import os
  import re
  
  def message(message, n_indent = 2):
      with indent(n_indent):
          puts(colored.blue('\nSearching...\n'))
  
  
  def boolify(s):
      if s == 'True':
          return True
      if s == 'False':
          return False
      raise ValueError("huh?")
  
  def autoconvert(s):
      for fn in (boolify, int, float):
          try:
              return fn(s)
          except ValueError:
              pass
      return s
  
  def parse_region(region):
      return re.split("[:-]+", region)
  
  
  # Stack Overflow: 377017
  def which(program):
      def is_exe(fpath):
          return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
  
      fpath, fname = os.path.split(program)
      if fpath:
          if is_exe(program):
              return program
      else:
          for path in os.environ["PATH"].split(os.pathsep):
              path = path.strip('"')
              exe_file = os.path.join(path, program)
              if is_exe(exe_file):
                  return exe_file
  
      return None
new_contents: from clint.textui import colored, puts, indent, progress
  import os
  import re
  
  def message(message, n_indent = 2):
      with indent(n_indent):
          puts(colored.blue('\nSearching...\n'))
  
  
  def boolify(s):
      if s == 'True':
          return True
      if s == 'False':
          return False
      raise ValueError("huh?")
  
  def autoconvert(s):
      for fn in (boolify, int, float):
          try:
              return fn(s)
          except ValueError:
              pass
      return s
  
  def parse_region(region):
      return re.split("[:-]+", region)
  
  
  # Stack Overflow: 377017
  def which(program):
      def is_exe(fpath):
          return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
  
      fpath, fname = os.path.split(program)
      if fpath:
          if is_exe(program):
              return program
      else:
          for path in os.environ["PATH"].split(os.pathsep):
              path = path.strip('"')
              exe_file = os.path.join(path, program)
              if is_exe(exe_file):
                  return exe_file
  
      return None
  
  
  # Levenshtein edit distnace
  # https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python
  def lev(s1, s2):
      if len(s1) < len(s2):
          return levenshtein(s2, s1)
  
      # len(s1) >= len(s2)
      if len(s2) == 0:
          return len(s1)
  
      previous_row = range(len(s2) + 1)
      for i, c1 in enumerate(s1):
          current_row = [i + 1]
          for j, c2 in enumerate(s2):
              insertions = previous_row[j + 1] + 1 # j+1 instead of j since previous_row and current_row are one character longer
              deletions = current_row[j] + 1       # than s2
              substitutions = previous_row[j] + (c1 != c2)
              current_row.append(min(insertions, deletions, substitutions))
          previous_row = current_row
      
      return previous_row[-1]
subject: add lev