<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def promote_chat_member(self, chat_id, user_id, can_change_info=None, can_post_messages=None, can_edit_messages=None, can_delete_messages=None, can_invite_users=None, can_restrict_members=None, can_pin_messages=None, can_promote_members=None):
 """ Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate admin rights. Pass False for all boolean parameters to demote a user. Returns True on success. https://core.telegram.org/bots/api#promotechatmember Parameters: :param chat_id: Unique identifier for the target chat or username of the target channel (in the format @channelusername) :type chat_id: int | str|unicode :param user_id: Unique identifier of the target user :type user_id: int Optional keyword parameters: :param can_change_info: Pass True, if the administrator can change chat title, photo and other settings :type can_change_info: bool :param can_post_messages: Pass True, if the administrator can create channel posts, channels only :type can_post_messages: bool :param can_edit_messages: Pass True, if the administrator can edit messages of other users and can pin messages, channels only :type can_edit_messages: bool :param can_delete_messages: Pass True, if the administrator can delete messages of other users :type can_delete_messages: bool :param can_invite_users: Pass True, if the administrator can invite new users to the chat :type can_invite_users: bool :param can_restrict_members: Pass True, if the administrator can restrict, ban or unban chat members :type can_restrict_members: bool :param can_pin_messages: Pass True, if the administrator can pin messages, supergroups only :type can_pin_messages: bool :param can_promote_members: Pass True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by him) :type can_promote_members: bool Returns: :return: Returns True on success :rtype: bool """

        assert_type_or_raise(chat_id, (int, unicode_type), parameter_name="chat_id")
        
        assert_type_or_raise(user_id, int, parameter_name="user_id")
        
        assert_type_or_raise(can_change_info, None, bool, parameter_name="can_change_info")
        
        assert_type_or_raise(can_post_messages, None, bool, parameter_name="can_post_messages")
        
        assert_type_or_raise(can_edit_messages, None, bool, parameter_name="can_edit_messages")
        
        assert_type_or_raise(can_delete_messages, None, bool, parameter_name="can_delete_messages")
        
        assert_type_or_raise(can_invite_users, None, bool, parameter_name="can_invite_users")
        
        assert_type_or_raise(can_restrict_members, None, bool, parameter_name="can_restrict_members")
        
        assert_type_or_raise(can_pin_messages, None, bool, parameter_name="can_pin_messages")
        
        assert_type_or_raise(can_promote_members, None, bool, parameter_name="can_promote_members")
        
        result = self.do("promoteChatMember", chat_id=chat_id, user_id=user_id, can_change_info=can_change_info, can_post_messages=can_post_messages, can_edit_messages=can_edit_messages, can_delete_messages=can_delete_messages, can_invite_users=can_invite_users, can_restrict_members=can_restrict_members, can_pin_messages=can_pin_messages, can_promote_members=can_promote_members)
        if self.return_python_objects:
            logger.debug("Trying to parse {data}".format(data=repr(result)))
            try:
                return from_array_list(bool, result, list_level=0, is_builtin=True)
            except TgApiParseException:
                logger.debug("Failed parsing as primitive bool", exc_info=True)
            # end try
            # no valid parsing so far
            raise TgApiParseException("Could not parse result.")  # See debug log for details!
        # end if return_python_objects
        return result