<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def catchup_subscriber(self, connection_id):
 """Send an event list with all events that are in the given subscriptions from all blocks since that latest block in the current chain that is in the given last known block ids. Raises: PossibleForkDetectedError A possible fork was detected while building the event list NoKnownBlockError None of the last known blocks were in the current chain KeyError Unknown connection_id """

        with self._subscribers_cv:
            subscriber = self._subscribers[connection_id]
            last_known_block_id = subscriber.get_last_known_block_id()
            subscriptions = subscriber.subscriptions

        if last_known_block_id is not None:
            LOGGER.debug(
                'Catching up Subscriber %s from %s',
                connection_id, last_known_block_id)

            # Send catchup events one block at a time
            for block_id in self.get_catchup_block_ids(last_known_block_id):
                events = self.get_events_for_block_id(block_id, subscriptions)
                event_list = EventList(events=events)
                self._send(connection_id, event_list.SerializeToString())