def validate_match_data(match_data):
    """
    validate_match_data performs basic match data validation by examining the following:
        1. Number of picks/bans present in data
        2. Presence of dupicate picks/bans
        3. Duplicate roles on a single side

    Args:
        match_data (dict): dictionary of formatted match data

    Returns:
        bool: True if match_data passes validation checks, False otherwise.
    """
    NUM_BANS = 10
    NUM_PICKS = 10

    is_valid = True
    bans = match_data["bans"]["blue"] + match_data["bans"]["red"]
    picks = match_data["picks"]["blue"] + match_data["picks"]["red"]
    if(len(bans) != NUM_BANS or len(picks)!= NUM_PICKS):
        print("Incorrect number of picks and/or bans found! {} picks, {} bans".format(len(picks), len(bans)))
        is_valid = False

    # Need to consider edge case where teams fail to submit multiple bans (rare, but possible)
    champs = [ban for ban in bans if ban != "none"] + [p for (p,_) in picks]
    if len(set(champs)) != len(champs):
        print("Duplicate submission(s) encountered.")
        counts = {}
        for champ in champs:
            if champ not in counts:
                counts[champ] = 1
            else:
                counts[champ] += 1
        print(sorted([(value, key) for (key, value) in counts.items() if value>1]))
        is_valid = False

    for side in ["blue", "red"]:
        if len(set([pos for (_,pos) in match_data["picks"][side]])) != len(match_data["picks"][side]):
            print("Duplicate position on side {} found.".format(side))
            is_valid = False

    return is_valid