--- /dev/null
+import sys\r
+from abc import abstractmethod\r
+from typing import Any, Optional, TypeVar, Union, Pattern, Text, Tuple\r
+\r
+_T = TypeVar('_T', bound='Version')\r
+\r
+class Version:\r
+ def __repr__(self) -> str: ...\r
+\r
+ if sys.version_info >= (3,):\r
+ def __eq__(self, other: object) -> bool: ...\r
+ def __lt__(self: _T, other: Union[_T, str]) -> bool: ...\r
+ def __le__(self: _T, other: Union[_T, str]) -> bool: ...\r
+ def __gt__(self: _T, other: Union[_T, str]) -> bool: ...\r
+ def __ge__(self: _T, other: Union[_T, str]) -> bool: ...\r
+\r
+ @abstractmethod\r
+ def __init__(self, vstring: Optional[Text] = ...) -> None: ...\r
+ @abstractmethod\r
+ def parse(self: _T, vstring: Text) -> _T: ...\r
+ @abstractmethod\r
+ def __str__(self) -> str: ...\r
+ if sys.version_info >= (3,):\r
+ @abstractmethod\r
+ def _cmp(self: _T, other: Union[_T, str]) -> bool: ...\r
+ else:\r
+ @abstractmethod\r
+ def __cmp__(self: _T, other: Union[_T, str]) -> bool: ...\r
+\r
+class StrictVersion(Version):\r
+ version_re: Pattern[str]\r
+ version: Tuple[int, int, int]\r
+ prerelease: Optional[Tuple[Text, int]]\r
+\r
+ def __init__(self, vstring: Optional[Text] = ...) -> None: ...\r
+ def parse(self: _T, vstring: Text) -> _T: ...\r
+ def __str__(self) -> str: ...\r
+ if sys.version_info >= (3,):\r
+ def _cmp(self: _T, other: Union[_T, str]) -> bool: ...\r
+ else:\r
+ def __cmp__(self: _T, other: Union[_T, str]) -> bool: ...\r
+\r
+class LooseVersion(Version):\r
+ component_re: Pattern[str]\r
+ vstring: Text\r
+ version: Tuple[Union[Text, int], ...]\r
+\r
+ def __init__(self, vstring: Optional[Text] = ...) -> None: ...\r
+ def parse(self: _T, vstring: Text) -> _T: ...\r
+ def __str__(self) -> str: ...\r
+ if sys.version_info >= (3,):\r
+ def _cmp(self: _T, other: Union[_T, str]) -> bool: ...\r
+ else:\r
+ def __cmp__(self: _T, other: Union[_T, str]) -> bool: ...\r