import base64
import math


def rank(comb):
  return sum([
    math.comb(ci, i + 1)
    for i, ci in enumerate(comb)])


def unrank(N, k):
  comb = []
  n = N
  for r in range(k, 0, -1):
    ci = r - 1
    while math.comb(ci + 1, r) <= n:
      ci += 1
    comb.append(ci)
    n -= math.comb(ci, r)
  return list(reversed(comb))


def int_to_base64(integer: int) -> str:
    """Converts an integer to a base64 string."""
    
    num_bytes = (integer.bit_length() + 7) // 8
    integer_bytes = integer.to_bytes(num_bytes, 'big')
    base64_bytes = base64.b64encode(integer_bytes)
    base64_string = base64_bytes.decode('utf-8')
    return base64_string

# Example usage
number = 1234567890
base64_result = int_to_base64(number)
print(f"The base64 representation of {number} is: {base64_result}")

# To reverse the process
def base64_to_int(base64_string: str) -> int:
    """Converts a base64 string back to an integer."""
    
    base64_bytes = base64_string.encode('utf-8')
    integer_bytes = base64.b64decode(base64_bytes)
    integer = int.from_bytes(integer_bytes, 'big')
    return integer


a = list(sorted([42, 182, 31, 410, 171, 283, 52, 149]))

r = rank(a)
print((r, unrank(r, len(a))))

i = 45544194540887359955917413870427129419278019524063864840334

b = int_to_base64(i)
print(b)
print(base64_to_int(b))
print(i)