# Source code for flask_login.mixins

    class UserMixin:
        """
        This provides default implementations for the methods that Flask-Login
        expects user objects to have.
        """

        # Python 3 implicitly set __hash__ to None if we override __eq__
        # We set it back to its default implementation
        __hash__ = object.__hash__

        @property
        def is_active(self):
            return True

        @property
        def is_authenticated(self):
            return self.is_active

        @property
        def is_anonymous(self):
            return False

        def get_id(self):
            try:
                return str(self.id)
            except AttributeError:
                raise NotImplementedError("No `id` attribute - override `get_id`") from None

        def __eq__(self, other):
            """
            Checks the equality of two `UserMixin` objects using `get_id`.
            """
            if isinstance(other, UserMixin):
                return self.get_id() == other.get_id()
            return NotImplemented

        def __ne__(self, other):
            """
            Checks the inequality of two `UserMixin` objects using `get_id`.
            """
            equal = self.__eq__(other)
            if equal is NotImplemented:
                return NotImplemented
            return not equal

    class AnonymousUserMixin:
        """
        This is the default object for representing an anonymous user.
        """

        @property
        def is_authenticated(self):
            return False

        @property
        def is_active(self):
            return False

        @property
        def is_anonymous(self):
            return True

        def get_id(self):
            return