import hashlib
import struct
import zlib


def encode_pack_object(obj_type, data):
    size = len(data)
    byte = (obj_type << 4) | (size & 0x0f)
    size >>= 4
    header = bytearray()
    while size:
        header.append(byte | 0x80)
        byte = size & 0x7f
        size >>= 7
    return bytes(header) + zlib.compress(data)


def create_pack_object(count, objects):
    header = struct.pack('!4sLL', b'PACK', 2, count)
    contents = header
    for obj in objects:
        encode_pack_object(obj[0], obj[1])
    sha1 = hashlib.sha1(contents).digest()
    data = contents + sha1
    return data