def METHOD_NAME(fiberassignfiles):
    """
    Return table of TARGETID, SUBPRIORITY used in input fiberassign files
    Args:
        fiberassignfiles: list of input fiberassign files
    Returns: dict[dark|bright|sky] = ndarray with columns TARGETID, SUBPRIORITY
    for targets matching that observing condition (or sky targets)
    """
    log = get_logger()
    # - allow duplicate inputs, but don't process multiple tiles
    processed = set()
    subprio_tables = dict(dark=list(), bright=list(), sky=list())
    for filename in fiberassignfiles:
        # - Have we already processed this file (e.g. from an earlier expid)?
        basename = os.path.basename(filename)
        if basename in processed:
            continue
        else:
            processed.add(basename)
        with fitsio.FITS(filename) as fx:
            hdr = fx[0].read_header()
            if 'SURVEY' not in hdr:
                log.warning(f"Skipping {filename} missing SURVEY keyword")
                continue
            if 'FAPRGRM' not in hdr:
                log.warning(f"Skipping {filename} missing FAPRGRM keyword")
                continue
            program = hdr['FAPRGRM'].lower()
            if program not in ('dark', 'bright'):
                log.warning(f"Skipping {filename} with FAPRGRM={program}")
                continue
            if hdr['SURVEY'].lower() != 'main':
                log.info(f"Skipping {filename} with SURVEY {hdr['SURVEY']} != main")
                continue
            log.info(f'Reading {filename}')
            sp = fx['TARGETS'].read(columns=['TARGETID', 'SUBPRIORITY', 'DESI_TARGET'])
        # - Separate skies from non-skies
        skymask = desi_mask.mask('SKY|SUPP_SKY|BAD_SKY')
        iisky = (sp['DESI_TARGET'] & skymask) != 0
        subprio_tables['sky'].append(sp[iisky])
        subprio_tables[program].append(sp[~iisky])
    log.info('Stacking individual fiberassign inputs')
    for program in subprio_tables.keys():
        subprio_tables[program] = np.hstack(subprio_tables[program])
    # - QA checks on basic assumptions about uniqueness
    log.info('Checking assumptions about TARGETID:SUBPRIORITY uniqueness')
    for program in ['dark', 'bright', 'sky']:
        subprio = subprio_tables[program]
        tid, sortedidx = np.unique(subprio['TARGETID'], return_index=True)
        # - sky can appear multiple times, but with same SUBPRIORITY
        if program == 'sky':
            subpriodict = dict()
            for targetid, sp in zip(
                    subprio['TARGETID'], subprio['SUBPRIORITY']):
                if targetid in subpriodict:
                    if sp != subpriodict[targetid]:
                        log.error(f'{program} TARGETID {targetid} has multiple subpriorities')
                else:
                    subpriodict[targetid] = sp
        # - but other programs should have each TARGETID exactly once
        else:
            if len(tid) != len(subprio):
                log.error(f'Some {program} TARGETIDs appear multiple times')
        log.info(f'Sorting {program} targets by TARGETID')
        subprio_tables[program] = subprio[sortedidx]
    return subprio_tables