


def       _lowerCAmelCase    (				lowerCAmelCase_				:str				)->bool:
   '''simple docstring'''






   return credit_card_number.startswith(("34", "35", "37", "4", "5", "6")				)



def       _lowerCAmelCase    (				lowerCAmelCase_				:str				)->bool:
   '''simple docstring'''






   snake_case_            =       credit_card_number
   snake_case_            =       0
   snake_case_            =       len(lowerCAmelCase_				) - 2
   for i in range(lowerCAmelCase_		,    -1		,    -2				):
      #  double the value of every second digit
      snake_case_            =       int(cc_number[i]				)
      digit *= 2
      # If doubling of a number results in a two digit number
      # i.e greater than 9(e.g., 6 × 2 = 12),
      # then add the digits of the product (e.g., 12: 1 + 2 = 3, 15: 1 + 5 = 6),
      # to get a single digit number.
      if digit > 9:
         digit %= 10
         digit += 1
      snake_case_            =       cc_number[:i] + str(lowerCAmelCase_				) + cc_number[i + 1 :]
      total += digit

   # Sum up the remaining digits
   for i in range(len(lowerCAmelCase_				) - 1		,    -1		,    -2				):
      total += int(cc_number[i]				)

   return total % 10 == 0



def       _lowerCAmelCase    (				lowerCAmelCase_				:str				)->bool:
   '''simple docstring'''






   snake_case_            =       F'''{credit_card_number} is an invalid credit card number because'''
   if not credit_card_number.isdigit():
      print(F'''{error_message} it has nonnumerical characters.'''				)
      return False

   if not 13 <= len(lowerCAmelCase_				) <= 16:
      print(F'''{error_message} of its length.'''				)
      return False

   if not validate_initial_digits(lowerCAmelCase_				):
      print(F'''{error_message} of its first two digits.'''				)
      return False

   if not luhn_validation(lowerCAmelCase_				):
      print(F'''{error_message} it fails the Luhn check.'''				)
      return False

   print(F'''{credit_card_number} is a valid credit card number.'''				)
   return True


if __name__ == "__main__":
   import doctest

   doctest.testmod()
   validate_credit_card_number('''4111111111111111''')
   validate_credit_card_number('''32323''')








import importlib.metadata
from typing import Union

from packaging.version import Version, parse

from .constants import STR_OPERATION_TO_FUNC


SCREAMING_SNAKE_CASE						:Union[str, Any]			=  parse(importlib.metadata.version('''torch'''))



def       _lowerCAmelCase    (				lowerCAmelCase_				:Union[str, Version]		,    lowerCAmelCase_				:str		,    lowerCAmelCase_				:str				)->Any:
   '''simple docstring'''






   if operation not in STR_OPERATION_TO_FUNC.keys():
      raise ValueError(F'''`operation` must be one of {list(STR_OPERATION_TO_FUNC.keys()				)}, received {operation}'''				)
   snake_case_            =       STR_OPERATION_TO_FUNC[operation]
   if isinstance(lowerCAmelCase_		,    lowerCAmelCase_				):
      snake_case_            =       parse(importlib.metadata.version(lowerCAmelCase_				)				)
   return operation(lowerCAmelCase_		,    parse(lowerCAmelCase_				)				)



def       _lowerCAmelCase    (				lowerCAmelCase_				:str		,    lowerCAmelCase_				:str				)->Any:
   '''simple docstring'''






   return compare_versions(lowerCAmelCase_		,    lowerCAmelCase_		,    lowerCAmelCase_				)




