code: def public_notes(self, key, value):
      
      def _means_not_curated(public_note):
          return public_note in [
              '*Brief entry*',
              '* Brief entry *',
              '*Temporary entry*',
              '* Temporary entry *',
              '*Temporary record*',
              '* Temporary record *',
          ]
  
      public_notes = self.get('public_notes', [])
      thesis_info = self.get('thesis_info', {})
  
      source = force_single_element(value.get('9', ''))
      for value in force_list(value):
          for public_note in force_list(value.get('a')):
              match = IS_DEFENSE_DATE.match(public_note)
              if match:
                  try:
                      thesis_info['defense_date'] = normalize_date(match.group('defense_date'))
                  except ValueError:
                      public_notes.append({
                          'source': source,
                          'value': public_note,
                      })
              elif _means_not_curated(public_note):
                  self['curated'] = False
              else:
                  public_notes.append({
                      'source': source,
                      'value': public_note,
                  })
  
      self['thesis_info'] = thesis_info
      return public_notes
docs: Populate the ``public_notes`` key.
  
      Also populates the ``curated`` and ``thesis_info`` keys through side effects.