<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def zpoppush(self, source, destination, count, score, new_score, client=None, withscores=False, on_success=None, if_exists=None):
 """ Pops the first ``count`` members from the ZSET ``source`` and adds them to the ZSET ``destination`` with a score of ``new_score``. If ``score`` is not None, only members up to a score of ``score`` are used. Returns the members that were moved and, if ``withscores`` is True, their original scores. If items were moved, the action defined in ``on_success`` is executed. The only implemented option is a tuple in the form ('update_sets', ``set_value``, ``remove_from_set``, ``add_to_set`` [, ``add_to_set_if_exists``]). If no items are left in the ``source`` ZSET, the ``set_value`` is removed from ``remove_from_set``. If any items were moved to the ``destination`` ZSET, the ``set_value`` is added to ``add_to_set``. If any items were moved to the ``if_exists_key`` ZSET (see below), the ``set_value`` is added to the ``add_to_set_if_exists`` set. If ``if_exists`` is specified as a tuple ('add', if_exists_key, if_exists_score, if_exists_mode), then members that are already in the ``destination`` set will not be returned or updated, but they will be added to a ZSET ``if_exists_key`` with a score of ``if_exists_score`` and the given behavior specified in ``if_exists_mode`` for members that already exist in the ``if_exists_key`` ZSET. ``if_exists_mode`` can be one of the following: - "nx": Don't update the score - "min": Use the smaller of the given and existing score - "max": Use the larger of the given and existing score If ``if_exists`` is specified as a tuple ('noupdate',), then no action will be taken for members that are already in the ``destination`` ZSET (their score will not be updated). """

        if score is None:
            score = '+inf' # Include all elements.
        if withscores:
            if on_success:
                raise NotImplementedError()
            return self._zpoppush_withscores(
                keys=[source, destination],
                args=[score, count, new_score],
                client=client)
        else:
            if if_exists and if_exists[0] == 'add':
                _, if_exists_key, if_exists_score, if_exists_mode = if_exists
                if if_exists_mode != 'min':
                    raise NotImplementedError()

                if not on_success or on_success[0] != 'update_sets':
                    raise NotImplementedError()
                set_value, remove_from_set, add_to_set, add_to_set_if_exists \
                    = on_success[1:]

                return self._zpoppush_exists_min_update_sets(
                        keys=[source, destination, remove_from_set, add_to_set,
                              add_to_set_if_exists, if_exists_key],
                        args=[score, count, new_score, set_value, if_exists_score],
                )
            elif if_exists and if_exists[0] == 'noupdate':
                if not on_success or on_success[0] != 'update_sets':
                    raise NotImplementedError()
                set_value, remove_from_set, add_to_set \
                    = on_success[1:]

                return self._zpoppush_exists_ignore_update_sets(
                        keys=[source, destination, remove_from_set, add_to_set],
                        args=[score, count, new_score, set_value],
                )

            if on_success:
                if on_success[0] != 'update_sets':
                    raise NotImplementedError()
                else:
                    set_value, remove_from_set, add_to_set = on_success[1:]
                    return self._zpoppush_update_sets(
                        keys=[source, destination, remove_from_set, add_to_set],
                        args=[score, count, new_score, set_value],
                        client=client)
            else:
                return self._zpoppush(
                    keys=[source, destination],
                    args=[score, count, new_score],
                    client=client)