<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def await_rpc(self, address, rpc_id, *args, **kwargs):
 """Send an RPC from inside the EmulationLoop. This is the primary method by which tasks running inside the EmulationLoop dispatch RPCs. The RPC is added to the queue of waiting RPCs to be drained by the RPC dispatch task and this coroutine will block until it finishes. **This method must only be called from inside the EmulationLoop** Args: address (int):
 The address of the tile that has the RPC. rpc_id (int):
 The 16-bit id of the rpc we want to call *args: Any required arguments for the RPC as python objects. **kwargs: Only two keyword arguments are supported: - arg_format: A format specifier for the argument list - result_format: A format specifier for the result Returns: list: A list of the decoded response members from the RPC. """


        self.verify_calling_thread(True, "await_rpc must be called from **inside** the event loop")

        if isinstance(rpc_id, RPCDeclaration):
            arg_format = rpc_id.arg_format
            resp_format = rpc_id.resp_format
            rpc_id = rpc_id.rpc_id
        else:
            arg_format = kwargs.get('arg_format', None)
            resp_format = kwargs.get('resp_format', None)

        arg_payload = b''

        if arg_format is not None:
            arg_payload = pack_rpc_payload(arg_format, args)

        self._logger.debug("Sending rpc to %d:%04X, payload=%s", address, rpc_id, args)

        response = AwaitableResponse()
        self._rpc_queue.put_rpc(address, rpc_id, arg_payload, response)

        try:
            resp_payload = await response.wait(1.0)
        except RPCRuntimeError as err:
            resp_payload = err.binary_error

        if resp_format is None:
            return []

        resp = unpack_rpc_payload(resp_format, resp_payload)
        return resp