<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def parse(line):
 """ Parse accesslog line to map Python dictionary. Returned dictionary has following keys: - time: access time (datetime; naive) - utcoffset: UTC offset of access time (timedelta) - host: remote IP address. - path: HTTP request path, this will be splitted from query. - query: HTTP requert query string removed from "?". - method: HTTP request method. - protocol: HTTP request version. - status: HTTP response status code. (int) - size: HTTP response size, if available. (int) - referer: Referer header. if "-" is given, that will be ignored. - ua: User agent. if "-" is given, that will be ignored. - ident: remote logname - user: remote user - trailing: Additional information if using custom log format. You can use "utcoffset" with `dateutil.tz.tzoffset` like followings: :param line: one line of access log combined format :type line: string :rtype: dict """

    m = LOG_FORMAT.match(line)
    if m is None:
        return
    access = Access._make(m.groups())
    entry = {
        'host': access.host,
        'path': access.path,
        'query': access.query,
        'method': access.method,
        'protocol': access.protocol,
        'status': int(access.status)
    }
    entry['time'] = datetime.datetime(
        int(access.year), MONTH_ABBR[access.month], int(access.day),
        int(access.hour), int(access.minute), int(access.second))
    # Parse timezone string; "+YYMM" format.
    entry['utcoffset'] = (1 if access.timezone[0] == '+' else -1) * \
        datetime.timedelta(hours=int(access.timezone[1:3]),
                           minutes=int(access.timezone[3:5]))
    if access.ident != '-':
        entry['ident'] = access.ident
    if access.user != '-':
        entry['user'] = access.user
    if access.size != '-':
        entry['size'] = int(access.size)
    if access.referer != '-':
        entry['referer'] = access.referer
    if access.ua != '-':
        entry['ua'] = access.ua
    if access.trailing:
        entry['trailing'] = access.trailing.strip()
    return entry