def METHOD_NAME(request_json):
    raw_items = request_json.get('rawItems')
    if not raw_items:
        return None, None, None
    invalid_items = []
    intervals = []
    gene_ids = set()
    gene_symbols = set()
    for item in raw_items.replace(',', ' ').replace('\t', '<TAB>').split():
        interval_match = re.match('(?P<chrom>\w+):(?P<start>\d+)-(?P<end>\d+)(%(?P<offset>(\d+)))?', item)
        if not interval_match:
            interval_match = re.match('(?P<chrom>\w+)<TAB>(?P<start>\d+)<TAB>(?P<end>\d+)', item)
        if interval_match:
            interval = interval_match.groupdict()
            try:
                interval['chrom'] = interval['chrom'].lstrip('chr')
                interval['start'] = int(interval['start'])
                interval['end'] = int(interval['end'])
                if interval.get('offset'):
                    interval['offset'] = int(interval['offset']) / 100
                if interval['start'] > interval['end']:
                    raise ValueError
                get_xpos(interval['chrom'], interval['start'])
                get_xpos(interval['chrom'], interval['end'])
                intervals.append(interval)
            except (KeyError, ValueError):
                invalid_items.append('chr{chrom}:{start}-{end}'.format(
                    chrom=interval.get('chrom'), start=interval.get('start'), end=interval.get('end')
                ))
        elif item.upper().startswith('ENSG'):
            gene_ids.add(item.replace('<TAB>', ''))
        else:
            gene_symbols.add(item.replace('<TAB>', ''))
    gene_symbols_to_ids = get_gene_ids_for_gene_symbols(gene_symbols)
    invalid_items += [symbol for symbol in gene_symbols if not gene_symbols_to_ids.get(symbol)]
    gene_ids.update({gene_ids[0] for gene_ids in gene_symbols_to_ids.values() if len(gene_ids)})
    genes_by_id = get_genes(list(gene_ids)) if gene_ids else {}
    invalid_items += [gene_id for gene_id in gene_ids if not genes_by_id.get(gene_id)]
    return genes_by_id, intervals, invalid_item