code: def gen_table(self, inner_widths, inner_heights, outer_widths):
          
          # Yield top border.
          if self.outer_border:
              yield self.horizontal_border('top', outer_widths)
  
          # Yield table body.
          row_count = len(self.table_data)
          last_row_index, before_last_row_index = row_count - 1, row_count - 2
          for i, row in enumerate(self.table_data):
              # Yield the row line by line (e.g. multi-line rows).
              if self.inner_heading_row_border and i == 0:
                  style = 'heading'
              elif self.inner_footing_row_border and i == last_row_index:
                  style = 'footing'
              else:
                  style = 'row'
              for line in self.gen_row_lines(row, style, inner_widths, inner_heights[i]):
                  yield line
              # If this is the last row then break. No separator needed.
              if i == last_row_index:
                  break
              # Yield heading separator.
              if self.inner_heading_row_border and i == 0:
                  yield self.horizontal_border('heading', outer_widths)
              # Yield footing separator.
              elif self.inner_footing_row_border and i == before_last_row_index:
                  yield self.horizontal_border('footing', outer_widths)
              # Yield row separator.
              elif self.inner_row_border:
                  yield self.horizontal_border('row', outer_widths)
  
          # Yield bottom border.
          if self.outer_border:
              yield self.horizontal_border('bottom', outer_widths)
docs: Combine everything and yield every line of the entire table with borders.
  
          :param iter inner_widths: List of widths (no padding) for each column.
          :param iter inner_heights: List of heights (no padding) for each row.
          :param iter outer_widths: List of widths (with padding) for each column.
          :return: