// WARNING: This file is machine generated by fidlgen_llcpp.

#include <fidl/test.bindingsdenylist/cpp/natural_messaging.h>

#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::
    NaturalEventDispatcher<::test_bindingsdenylist::Allowed>::DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::Allowed>::entries_[] = {};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::Allowed>::entries_end_ = &entries_[0];

void fidl::internal::NaturalServerDispatcher<::test_bindingsdenylist::Allowed>::
    Dispatch(::fidl::Server<::test_bindingsdenylist::Allowed>* impl,
             ::fidl::IncomingMessage&& msg,
             internal::IncomingTransportContext transport_context,
             ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_bindingsdenylist::Allowed>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_bindingsdenylist::Allowed>::Dispatch(this, std::move(msg),
                                                  std::move(transport_context),
                                                  txn);
}
#endif  // __Fuchsia__

namespace test_bindingsdenylist {
[[maybe_unused]] constexpr inline uint64_t
    kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_Ordinal =
        2342407566057198902lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_bindingsdenylist
::fidl::internal::NaturalThenable<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
fidl::internal::NaturalClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::
    LibfuzzerNeedsNonemptyProtocol() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::
          kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_Ordinal,
      ::test_bindingsdenylist::
          kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_DynamicFlags};
  return ::fidl::internal::NaturalThenable<
      ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
          LibfuzzerNeedsNonemptyProtocol>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

namespace test_bindingsdenylist {
#endif  // __Fuchsia__

}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::NaturalEventDispatcher<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::
    DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

void fidl::internal::NaturalCompleterBase<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>::Reply() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::
          kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_Ordinal,
      ::test_bindingsdenylist::
          kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::entries_[] = {
    {
        ::test_bindingsdenylist::
            kOnlyLibfuzzerAndDeps_LibfuzzerNeedsNonemptyProtocol_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                              LibfuzzerNeedsNonemptyProtocol>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                  LibfuzzerNeedsNonemptyProtocol>::Sync completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>*>(
              interface)
              ->LibfuzzerNeedsNonemptyProtocol(request, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::entries_end_ = &entries_[1];

void fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::
    Dispatch(
        ::fidl::Server<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>* impl,
        ::fidl::IncomingMessage&& msg,
        internal::IncomingTransportContext transport_context,
        ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::
    dispatch_message(
        ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
        ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>::
      Dispatch(this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::NaturalEventDispatcher<
    ::test_bindingsdenylist::OnlyCppAndDeps>::
    DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::OnlyCppAndDeps>::entries_[] = {};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::OnlyCppAndDeps>::entries_end_ = &entries_[0];

void fidl::internal::
    NaturalServerDispatcher<::test_bindingsdenylist::OnlyCppAndDeps>::Dispatch(
        ::fidl::Server<::test_bindingsdenylist::OnlyCppAndDeps>* impl,
        ::fidl::IncomingMessage&& msg,
        internal::IncomingTransportContext transport_context,
        ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_bindingsdenylist::OnlyCppAndDeps>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_bindingsdenylist::OnlyCppAndDeps>::Dispatch(this, std::move(msg),
                                                         std::move(
                                                             transport_context),
                                                         txn);
}
#endif  // __Fuchsia__

namespace test_bindingsdenylist {
[[maybe_unused]] constexpr inline uint64_t
    kImportsSameNameContext_Unattributed_Ordinal = 475191379775102607lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kImportsSameNameContext_Unattributed_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

[[maybe_unused]] constexpr inline uint64_t
    kImportsSameNameContext_AlwaysAppearsInImportingLibrary_Ordinal =
        2914965219653596920lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kImportsSameNameContext_AlwaysAppearsInImportingLibrary_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_bindingsdenylist
::fitx::result<::fidl::Error> fidl::internal::NaturalClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>::Unattributed() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kImportsSameNameContext_Unattributed_Ordinal,
      ::test_bindingsdenylist::
          kImportsSameNameContext_Unattributed_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::Status status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}

::fitx::result<::fidl::Error> fidl::internal::NaturalClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>::
    AlwaysAppearsInImportingLibrary() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::
          kImportsSameNameContext_AlwaysAppearsInImportingLibrary_Ordinal,
      ::test_bindingsdenylist::
          kImportsSameNameContext_AlwaysAppearsInImportingLibrary_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::Status status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}
namespace test_bindingsdenylist {
#endif  // __Fuchsia__

}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::NaturalEventDispatcher<
    ::test_bindingsdenylist::ImportsSameNameContext>::
    DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::ImportsSameNameContext>::entries_[] = {
    {
        ::test_bindingsdenylist::kImportsSameNameContext_Unattributed_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<
              ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>::
              Sync completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::ImportsSameNameContext>*>(
              interface)
              ->Unattributed(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_bindingsdenylist::
            kImportsSameNameContext_AlwaysAppearsInImportingLibrary_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::
                              AlwaysAppearsInImportingLibrary>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::ImportsSameNameContext::
                  AlwaysAppearsInImportingLibrary>::Sync completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::ImportsSameNameContext>*>(
              interface)
              ->AlwaysAppearsInImportingLibrary(request, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::ImportsSameNameContext>::entries_end_ =
    &entries_[2];

void fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::ImportsSameNameContext>::
    Dispatch(
        ::fidl::Server<::test_bindingsdenylist::ImportsSameNameContext>* impl,
        ::fidl::IncomingMessage&& msg,
        internal::IncomingTransportContext transport_context,
        ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_bindingsdenylist::ImportsSameNameContext>::
    dispatch_message(
        ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
        ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_bindingsdenylist::ImportsSameNameContext>::
      Dispatch(this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__

namespace test_bindingsdenylist {
[[maybe_unused]] constexpr inline uint64_t
    kDenyEachBinding_OnlyDenyDart_Ordinal = 8446571910689294295lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kDenyEachBinding_OnlyDenyDart_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

[[maybe_unused]] constexpr inline uint64_t kDenyEachBinding_OnlyDenyGo_Ordinal =
    7311125300308839833lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kDenyEachBinding_OnlyDenyGo_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

[[maybe_unused]] constexpr inline uint64_t
    kDenyEachBinding_OnlyDenyLibfuzzer_Ordinal = 2184115815603862302lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kDenyEachBinding_OnlyDenyLibfuzzer_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

[[maybe_unused]] constexpr inline uint64_t
    kDenyEachBinding_OnlyDenyRust_Ordinal = 3719805222870932662lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kDenyEachBinding_OnlyDenyRust_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

[[maybe_unused]] constexpr inline uint64_t
    kDenyEachBinding_OnlyDenySyzkaller_Ordinal = 2319043834522757514lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kDenyEachBinding_OnlyDenySyzkaller_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_bindingsdenylist
::fidl::internal::NaturalThenable<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
fidl::internal::NaturalClientImpl<::test_bindingsdenylist::DenyEachBinding>::
    OnlyDenyDart(
        ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
            request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyDart_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyDart_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Request<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
          IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

::fidl::internal::NaturalThenable<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
fidl::internal::NaturalClientImpl<::test_bindingsdenylist::DenyEachBinding>::
    OnlyDenyGo(
        ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
            request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyGo_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyGo_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Request<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
          IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

::fidl::internal::NaturalThenable<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
fidl::internal::NaturalClientImpl<::test_bindingsdenylist::DenyEachBinding>::
    OnlyDenyLibfuzzer(
        ::fidl::Request<
            ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
            request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyLibfuzzer_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyLibfuzzer_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Request<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
          IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

::fidl::internal::NaturalThenable<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
fidl::internal::NaturalClientImpl<::test_bindingsdenylist::DenyEachBinding>::
    OnlyDenyRust(
        ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
            request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyRust_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyRust_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Request<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
          IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

::fidl::internal::NaturalThenable<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
fidl::internal::NaturalClientImpl<::test_bindingsdenylist::DenyEachBinding>::
    OnlyDenySyzkaller(
        ::fidl::Request<
            ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
            request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenySyzkaller_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenySyzkaller_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Request<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
          IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

namespace test_bindingsdenylist {
#endif  // __Fuchsia__

}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::NaturalEventDispatcher<
    ::test_bindingsdenylist::DenyEachBinding>::
    DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

void fidl::internal::NaturalCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>::
    Reply(::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyDart_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyDart_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

void fidl::internal::NaturalCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>::
    Reply(
        ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&&
            response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyGo_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyGo_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

void fidl::internal::NaturalCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>::
    Reply(::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&&
              response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyLibfuzzer_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyLibfuzzer_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

void fidl::internal::NaturalCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>::
    Reply(::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyRust_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyRust_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

void fidl::internal::NaturalCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>::
    Reply(::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&&
              response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenySyzkaller_Ordinal,
      ::test_bindingsdenylist::kDenyEachBinding_OnlyDenySyzkaller_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Response<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::DenyEachBinding>::entries_[] = {
    {
        ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyDart_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest>(
              std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
              request =
                  ::fidl::internal::NaturalMessageConverter<::fidl::Request<
                      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
                      FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>::Sync
              completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::DenyEachBinding>*>(
              interface)
              ->OnlyDenyDart(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyGo_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest>(
              std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
              request =
                  ::fidl::internal::NaturalMessageConverter<::fidl::Request<
                      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
                      FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>::Sync
              completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::DenyEachBinding>*>(
              interface)
              ->OnlyDenyGo(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyLibfuzzer_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest>(
              std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
              request = ::fidl::internal::NaturalMessageConverter<
                  ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::
                                      OnlyDenyLibfuzzer>>::
                  FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>::Sync
              completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::DenyEachBinding>*>(
              interface)
              ->OnlyDenyLibfuzzer(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_bindingsdenylist::kDenyEachBinding_OnlyDenyRust_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest>(
              std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
              request =
                  ::fidl::internal::NaturalMessageConverter<::fidl::Request<
                      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
                      FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>::Sync
              completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::DenyEachBinding>*>(
              interface)
              ->OnlyDenyRust(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_bindingsdenylist::kDenyEachBinding_OnlyDenySyzkaller_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest>(
              std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
              request = ::fidl::internal::NaturalMessageConverter<
                  ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::
                                      OnlyDenySyzkaller>>::
                  FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>::Sync
              completer(txn);
          static_cast<
              ::fidl::Server<::test_bindingsdenylist::DenyEachBinding>*>(
              interface)
              ->OnlyDenySyzkaller(request, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_bindingsdenylist::DenyEachBinding>::entries_end_ = &entries_[5];

void fidl::internal::
    NaturalServerDispatcher<::test_bindingsdenylist::DenyEachBinding>::Dispatch(
        ::fidl::Server<::test_bindingsdenylist::DenyEachBinding>* impl,
        ::fidl::IncomingMessage&& msg,
        internal::IncomingTransportContext transport_context,
        ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_bindingsdenylist::DenyEachBinding>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_bindingsdenylist::DenyEachBinding>::
      Dispatch(this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__
