code: def get_lowest_probable_prepared_certificate_in_view(
              self, view_no) -> Optional[int]:
          
          # TODO: Naive implementation, dont need to iterate over the complete
          # data structures, fix this later
          seq_no_pp = SortedList()  # pp_seq_no of PRE-PREPAREs
          # pp_seq_no of PREPAREs with count of PREPAREs for each
          seq_no_p = set()
  
          for (v, p) in self.prePreparesPendingPrevPP:
              if v == view_no:
                  seq_no_pp.add(p)
              if v > view_no:
                  break
  
          for (v, p), pr in self.preparesWaitingForPrePrepare.items():
              if v == view_no and len(pr) >= self.quorums.prepare.value:
                  seq_no_p.add(p)
  
          for n in seq_no_pp:
              if n in seq_no_p:
                  return n
          return None
docs: Return lowest pp_seq_no of the view for which can be prepared but
          choose from unprocessed PRE-PREPAREs and PREPAREs.