def decode(message, pblite, ignore_first_item=False):
if not isinstance(pblite, list):<EOL><INDENT>logger.warning('<STR_LIT>',<EOL>type(pblite))<EOL>return<EOL><DEDENT>if ignore_first_item:<EOL><INDENT>pblite = pblite[<NUM_LIT:1>:]<EOL><DEDENT>if pblite and isinstance(pblite[-<NUM_LIT:1>], dict):<EOL><INDENT>extra_fields = {int(field_number): value for field_number, value<EOL>in pblite[-<NUM_LIT:1>].items()}<EOL>pblite = pblite[:-<NUM_LIT:1>]<EOL><DEDENT>else:<EOL><INDENT>extra_fields = {}<EOL><DEDENT>fields_values = itertools.chain(enumerate(pblite, start=<NUM_LIT:1>),<EOL>extra_fields.items())<EOL>for field_number, value in fields_values:<EOL><INDENT>if value is None:<EOL><INDENT>continue<EOL><DEDENT>try:<EOL><INDENT>field = message.DESCRIPTOR.fields_by_number[field_number]<EOL><DEDENT>except KeyError:<EOL><INDENT>if value not in [[], '<STR_LIT>', <NUM_LIT:0>]:<EOL><INDENT>logger.debug('<STR_LIT>'<EOL>'<STR_LIT>', message.__class__.__name__, field_number,<EOL>value)<EOL><DEDENT>continue<EOL><DEDENT>if field.label == FieldDescriptor.LABEL_REPEATED:<EOL><INDENT>_decode_repeated_field(message, field, value)<EOL><DEDENT>else:<EOL><INDENT>_decode_field(message, field, value)<EOL><DEDENT><DEDENT>
Decode pblite to Protocol Buffer message.

    This method is permissive of decoding errors and will log them as warnings
    and continue decoding where possible.

    The first element of the outer pblite list must often be ignored using the
    ignore_first_item parameter because it contains an abbreviation of the name
    of the protobuf message (eg.  cscmrp for ClientSendChatMessageResponseP)
    that's not part of the protobuf.

    Args:
        message: protocol buffer message instance to decode into.
        pblite: list representing a pblite-serialized message.
        ignore_first_item: If True, ignore the item at index 0 in the pblite
            list, making the item at index 1 correspond to field 1 in the
            message.