// WARNING: This file is machine generated by fidlgen.
  
  // fidl_experiment = output_index_json

  #pragma once

  #include <fidl/test.protocollayouts/cpp/markers.h>
  #include <fidl/test.protocollayouts/cpp/wire_types.h>

  #include <lib/fidl/cpp/wire/wire_messaging.h>

  
#ifdef __Fuchsia__

    #include <lib/fidl/cpp/wire/client.h>
    #include <lib/fidl/cpp/wire/connect_service.h>
    #include <lib/fidl/cpp/wire/server.h>
    #include <lib/fidl/cpp/wire/service_handler.h>
    #include <lib/fidl/cpp/wire/sync_call.h>
    #include <lib/fidl/cpp/wire/unknown_interaction_handler.h>
  

#endif  // __Fuchsia__


  #include <fidl/test.protocollayouts.imported/cpp/wire_messaging.h>
  #pragma clang diagnostic push
  #pragma clang diagnostic ignored "-Wshadow"
    
  namespace test_protocollayouts {

  class MainProtocol;
    
  

  class OpenProtocol;
    

}  // namespace test_protocollayouts

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OneWayAnonComposed> final { static constexpr uint64_t value = 467706262354916833lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> final { static constexpr uint64_t value = 1634702755099390832lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final { static constexpr uint64_t value = 3374101322700362141lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OnAnonComposed> final { static constexpr uint64_t value = 9198778981238868491lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OneWayNamedComposed> final { static constexpr uint64_t value = 6735359826241449560lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final { static constexpr uint64_t value = 1110122450485917712lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final { static constexpr uint64_t value = 3520341666774118271lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OnNamedComposed> final { static constexpr uint64_t value = 6802961197456477674lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OneWayImport> final { static constexpr uint64_t value = 374039999976906043lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayImport> final { static constexpr uint64_t value = 3167860988423964164lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final { static constexpr uint64_t value = 4837028007581646602lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OnImport> final { static constexpr uint64_t value = 6584793811321990352lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OneWayLocal> final { static constexpr uint64_t value = 6085941264859402051lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayLocal> final { static constexpr uint64_t value = 7763901300032164763lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> final { static constexpr uint64_t value = 5609487496960056151lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OnLocal> final { static constexpr uint64_t value = 4199259762307646332lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OneWayAnon> final { static constexpr uint64_t value = 4203317713771984620lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayAnon> final { static constexpr uint64_t value = 7435080039097281487lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> final { static constexpr uint64_t value = 7770394869745610225lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::MainProtocol::OnAnon> final { static constexpr uint64_t value = 7275479350674227467lu; };

#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OneWayAnonComposed> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest;
      using Response = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest;
      using Response = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult;
  using DomainError = uint32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OnAnonComposed> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedProtocolOnAnonComposedRequest;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OneWayNamedComposed> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportTablePayload;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportUnionPayload;
      using Response = ::test_protocollayouts_imported::wire::ImportTablePayload;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportTablePayload;
      using Response = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult;
  using DomainError = uint32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OnNamedComposed> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportUnionPayload;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OneWayImport> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportTablePayload;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayImport> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportUnionPayload;
      using Response = ::test_protocollayouts_imported::wire::ImportTablePayload;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayImport>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImport,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImport,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportTablePayload;
      using Response = ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult;
  using DomainError = uint32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OnImport> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportUnionPayload;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OneWayLocal> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::LocalTablePayload;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayLocal> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::LocalUnionPayload;
      using Response = ::test_protocollayouts::wire::LocalTablePayload;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayLocal>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocal,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocal,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::LocalTablePayload;
      using Response = ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult;
  using DomainError = uint32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OnLocal> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::LocalUnionPayload;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OneWayAnon> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayAnon> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest;
      using Response = ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnon>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnon,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnon,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest;
      using Response = ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult;
  using DomainError = uint32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::MainProtocol::OnAnon> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts::wire::MainProtocolOnAnonRequest;
};



#endif  // __Fuchsia__


namespace test_protocollayouts {

}  // namespace test_protocollayouts

#ifdef __Fuchsia__

template<>
struct ::fidl::internal::ProtocolDetails<::test_protocollayouts::MainProtocol> {
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__


template<>
struct ::fidl::internal::WireServerDispatcher<::test_protocollayouts::MainProtocol> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(::fidl::WireServer<::test_protocollayouts::MainProtocol>* impl, ::fidl::IncomingHeaderAndMessage& msg,
                                            internal::MessageStorageViewBase* storage_view,
                                            ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_protocollayouts::MainProtocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
                       internal::MessageStorageViewBase* storage_view,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
  static constexpr const ::fidl::internal::UnknownMethodHandlerEntry& unknown_method_handler_entry_ =
      ::fidl::internal::UnknownMethodHandlerEntry::kClosedProtocolHandlerEntry;
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest)
  : body(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest { ComposedProtocolOneWayAnonComposedRequest } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest)
  : body(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest { ComposedProtocolTwoWayAnonComposedRequest } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> final : public ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse ComposedProtocolTwoWayAnonComposedResponse) : ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse(ComposedProtocolTwoWayAnonComposedResponse){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse ComposedProtocolTwoWayAnonComposedResponse)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(ComposedProtocolTwoWayAnonComposedResponse)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest)
  : body(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest { ComposedProtocolTwoWayAnonComposedWithErrorRequest } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final : public ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult ComposedProtocolTwoWayAnonComposedWithErrorResult) : ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult(ComposedProtocolTwoWayAnonComposedWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult ComposedProtocolTwoWayAnonComposedWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(ComposedProtocolTwoWayAnonComposedWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed> body;

    explicit TransactionalEvent(::test_protocollayouts_imported::wire::ComposedProtocolOnAnonComposedRequest ComposedProtocolOnAnonComposedRequest)
    : body{ ComposedProtocolOnAnonComposedRequest } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportTablePayload body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload)
  : body(::test_protocollayouts_imported::wire::ImportTablePayload { ImportTablePayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportUnionPayload body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload)
  : body(::test_protocollayouts_imported::wire::ImportUnionPayload { ImportUnionPayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportUnionPayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportUnionPayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final : public ::test_protocollayouts_imported::wire::ImportTablePayload {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) : ::test_protocollayouts_imported::wire::ImportTablePayload(ImportTablePayload){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportTablePayload body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload)
  : body(::test_protocollayouts_imported::wire::ImportTablePayload { ImportTablePayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final : public ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult ComposedProtocolTwoWayNamedComposedWithErrorResult) : ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult(ComposedProtocolTwoWayNamedComposedWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult ComposedProtocolTwoWayNamedComposedWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(ComposedProtocolTwoWayNamedComposedWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed> body;

    explicit TransactionalEvent(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload)
    : body{ ImportUnionPayload } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportTablePayload body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload)
  : body(::test_protocollayouts_imported::wire::ImportTablePayload { ImportTablePayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportUnionPayload body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload)
  : body(::test_protocollayouts_imported::wire::ImportUnionPayload { ImportUnionPayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportUnionPayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportUnionPayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport> final : public ::test_protocollayouts_imported::wire::ImportTablePayload {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) : ::test_protocollayouts_imported::wire::ImportTablePayload(ImportTablePayload){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>(ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportTablePayload body;
  explicit TransactionalRequest(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload)
  : body(::test_protocollayouts_imported::wire::ImportTablePayload { ImportTablePayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportTablePayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final : public ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult MainProtocolTwoWayImportWithErrorResult) : ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult(MainProtocolTwoWayImportWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError> body;
  explicit TransactionalResponse(::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult MainProtocolTwoWayImportWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(MainProtocolTwoWayImportWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport> body;

    explicit TransactionalEvent(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload)
    : body{ ImportUnionPayload } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts::wire::LocalTablePayload body;
  explicit TransactionalRequest(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
  : body(::test_protocollayouts::wire::LocalTablePayload { LocalTablePayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts::wire::LocalTablePayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts::wire::LocalTablePayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts::wire::LocalUnionPayload body;
  explicit TransactionalRequest(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload)
  : body(::test_protocollayouts::wire::LocalUnionPayload { LocalUnionPayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts::wire::LocalUnionPayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts::wire::LocalUnionPayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal> final : public ::test_protocollayouts::wire::LocalTablePayload {

  
  explicit WireResponse(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) : ::test_protocollayouts::wire::LocalTablePayload(LocalTablePayload){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::LocalTablePayload, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::LocalTablePayload, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal> body;
  explicit TransactionalResponse(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>(LocalTablePayload)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts::wire::LocalTablePayload body;
  explicit TransactionalRequest(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
  : body(::test_protocollayouts::wire::LocalTablePayload { LocalTablePayload } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts::wire::LocalTablePayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts::wire::LocalTablePayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> final : public ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult MainProtocolTwoWayLocalWithErrorResult) : ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult(MainProtocolTwoWayLocalWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> body;
  explicit TransactionalResponse(::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult MainProtocolTwoWayLocalWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(MainProtocolTwoWayLocalWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal> body;

    explicit TransactionalEvent(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload)
    : body{ LocalUnionPayload } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest body;
  explicit TransactionalRequest(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest)
  : body(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest { MainProtocolOneWayAnonRequest } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts::wire::MainProtocolOneWayAnonRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts::wire::MainProtocolOneWayAnonRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest body;
  explicit TransactionalRequest(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest)
  : body(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest { MainProtocolTwoWayAnonRequest } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon> final : public ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse {

  
  explicit WireResponse(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse MainProtocolTwoWayAnonResponse) : ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse(MainProtocolTwoWayAnonResponse){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon> body;
  explicit TransactionalResponse(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse MainProtocolTwoWayAnonResponse)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>(MainProtocolTwoWayAnonResponse)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest body;
  explicit TransactionalRequest(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest)
  : body(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest { MainProtocolTwoWayAnonWithErrorRequest } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> final : public ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult MainProtocolTwoWayAnonWithErrorResult) : ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult(MainProtocolTwoWayAnonWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> body;
  explicit TransactionalResponse(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult MainProtocolTwoWayAnonWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(MainProtocolTwoWayAnonWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon> body;

    explicit TransactionalEvent(::test_protocollayouts::wire::MainProtocolOnAnonRequest MainProtocolOnAnonRequest)
    : body{ MainProtocolOnAnonRequest } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


namespace fidl {


#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest>::kPrimarySize);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportTablePayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportTablePayload>::kPrimarySize);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportUnionPayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportUnionPayload>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportTablePayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportTablePayload>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportTablePayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportTablePayload>::kPrimarySize);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportUnionPayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportUnionPayload>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportTablePayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportTablePayload>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnImport>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts::wire::LocalTablePayload)
    == TypeTraits<::test_protocollayouts::wire::LocalTablePayload>::kPrimarySize);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts::wire::LocalUnionPayload)
    == TypeTraits<::test_protocollayouts::wire::LocalUnionPayload>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts::wire::LocalTablePayload)
    == TypeTraits<::test_protocollayouts::wire::LocalTablePayload>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnLocal>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest)
    == TypeTraits<::test_protocollayouts::wire::MainProtocolOneWayAnonRequest>::kPrimarySize);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest)
    == TypeTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest)
    == TypeTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest>::kPrimarySize);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::MainProtocol::OnAnon>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl

    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>> {
      ::fidl::internal::InlineMessageBuffer<48> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>> {
      ::fidl::internal::InlineMessageBuffer<48> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>> {
      ::fidl::internal::InlineMessageBuffer<48> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>> {
      ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> handles_storage_;
    };
  template <>
  struct ::fidl::internal::IncomingEventsHandleStorage<::test_protocollayouts::MainProtocol> final :
      public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingEventsHandleStorage<::test_protocollayouts::MainProtocol>> {
   public:
    static constexpr uint32_t kNumHandles = 64;

    ::std::array<zx_handle_t, kNumHandles> handles_;
    ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
  };

  template <>
  struct ::fidl::internal::IncomingEventsStorage<::test_protocollayouts::MainProtocol> final :
      public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingEventsStorage<::test_protocollayouts::MainProtocol>> {
   public:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
    ::fidl::internal::IncomingEventsHandleStorage<::test_protocollayouts::MainProtocol> handles_storage_;
  };





template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
  using Type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
  using Type = ::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResponse*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<48> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> decoded_;
};




template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
  using Type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
  using Type = ::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<48> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> decoded_;
};




template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayImport> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayImport> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayImport>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayImport> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayImport> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayImport>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayImport>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayImport> {
  using Type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImport> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImport> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImport>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImport> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImport> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImport>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImport>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImport>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
  using Type = ::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<48> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> decoded_;
};




template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayLocal> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayLocal> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayLocal>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayLocal> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayLocal> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayLocal>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayLocal>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayLocal> {
  using Type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocal> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocal> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocal> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocal> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
  using Type = ::fit::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> decoded_;
};




template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnon> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnon> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnon>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayAnon> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnon> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnon>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::OneWayAnon>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayAnon> {
  using Type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnon> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnon> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnon> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
  using Type = ::fit::result<uint32_t, ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> decoded_;
};

template<>
class ::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::MainProtocol> : public ::fidl::internal::BaseEventHandlerInterface {
public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
    virtual void OnAnonComposed(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>* event) = 0;
    virtual void OnNamedComposed(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>* event) = 0;
    virtual void OnImport(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>* event) = 0;
    virtual void OnLocal(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>* event) = 0;
    virtual void OnAnon(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>* event) = 0;
};

template<>
class ::fidl::WireAsyncEventHandler<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::MainProtocol>, public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
    void OnAnonComposed(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>* event) override {}
    void OnNamedComposed(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>* event) override {}
    void OnImport(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>* event) override {}
    void OnLocal(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>* event) override {}
    void OnAnon(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>* event) override {}
};


  template<>
  class ::fidl::WireSyncEventHandler<::test_protocollayouts::MainProtocol>
      : public ::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::MainProtocol>, public ::fidl::internal::SyncEventHandler {
   public:
    WireSyncEventHandler() = default;

    // Handle all possible events defined in this protocol.
    // Blocks to consume exactly one message from the channel, then call the corresponding virtual
    // method.
    ::fidl::Status HandleOneEvent(
        ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end);
  };

template <>
class ::fidl::internal::WireEventDispatcher<::test_protocollayouts::MainProtocol> final :
    public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::MainProtocol>> {
 public:
  explicit WireEventDispatcher(::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::MainProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
    ::fidl::Status DispatchEvent(
        ::fidl::IncomingHeaderAndMessage& msg,
        ::fidl::internal::MessageStorageViewBase* storage_view) override;
};



// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |::fidl::ClientEnd<::test_protocollayouts::MainProtocol>|,
// avoiding setting up a client.
template<>
class ::fidl::internal::WireSyncClientImpl<::test_protocollayouts::MainProtocol> final :
    public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireSyncClientImpl<::test_protocollayouts::MainProtocol>> {
 public:
  
    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    OneWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed> _request{ ComposedProtocolOneWayAnonComposedRequest };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed>(_client_end(), &_request);
    }

    // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    TwoWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> _request{ ComposedProtocolTwoWayAnonComposedRequest };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(_client_end(), &_request);
    }

    // Allocates 88 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    TwoWayAnonComposedWithError(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> _request{ ComposedProtocolTwoWayAnonComposedWithErrorRequest };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    OneWayNamedComposed(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed> _request{ ImportTablePayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed>(_client_end(), &_request);
    }

    // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> _request{ ImportUnionPayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(_client_end(), &_request);
    }

    // Allocates 88 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    TwoWayNamedComposedWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> _request{ ImportTablePayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    OneWayImport(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport> _request{ ImportTablePayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayImport>(_client_end(), &_request);
    }

    // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImport>
    TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport> _request{ ImportUnionPayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImport>(_client_end(), &_request);
    }

    // Allocates 88 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    TwoWayImportWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError> _request{ ImportTablePayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    OneWayLocal(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal> _request{ LocalTablePayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayLocal>(_client_end(), &_request);
    }

    // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>
    TwoWayLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal> _request{ LocalUnionPayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>(_client_end(), &_request);
    }

    // Allocates 40 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    TwoWayLocalWithError(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> _request{ LocalTablePayload };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    OneWayAnon(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon> _request{ MainProtocolOneWayAnonRequest };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnon>(_client_end(), &_request);
    }

    // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>
    TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon> _request{ MainProtocolTwoWayAnonRequest };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(_client_end(), &_request);
    }

    // Allocates 40 bytes of request buffer on the stack. Response is heap-allocated.
    ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    TwoWayAnonWithError(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> _request{ MainProtocolTwoWayAnonWithErrorRequest };
      return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(_client_end(), &_request);
    }


 private:
  ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol>(
      _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_protocollayouts::MainProtocol> final :
    public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireSyncBufferClientImpl<::test_protocollayouts::MainProtocol>> {
 public:
  
    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    OneWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed> _request{ ComposedProtocolOneWayAnonComposedRequest };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    TwoWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> _request{ ComposedProtocolTwoWayAnonComposedRequest };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    TwoWayAnonComposedWithError(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> _request{ ComposedProtocolTwoWayAnonComposedWithErrorRequest };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    OneWayNamedComposed(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed> _request{ ImportTablePayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> _request{ ImportUnionPayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    TwoWayNamedComposedWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> _request{ ImportTablePayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    OneWayImport(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayImport> _request{ ImportTablePayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayImport>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImport>
    TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImport> _request{ ImportUnionPayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImport>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    TwoWayImportWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayImportWithError> _request{ ImportTablePayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    OneWayLocal(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayLocal> _request{ LocalTablePayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayLocal>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocal>
    TwoWayLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocal> _request{ LocalUnionPayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocal>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    TwoWayLocalWithError(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> _request{ LocalTablePayload };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    OneWayAnon(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::OneWayAnon> _request{ MainProtocolOneWayAnonRequest };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayAnon>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnon>
    TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnon> _request{ MainProtocolTwoWayAnonRequest };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    TwoWayAnonWithError(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> _request{ MainProtocolTwoWayAnonWithErrorRequest };
      return ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(_client_end(), _allocator(), &_request);
    }


 private:
  ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol>(
      _transport().get<::fidl::internal::ChannelTransport>());
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse ComposedProtocolTwoWayAnonComposedResponse);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse ComposedProtocolTwoWayAnonComposedResponse);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse ComposedProtocolTwoWayAnonComposedResponse);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedResponse ComposedProtocolTwoWayAnonComposedResponse);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResponse*> result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResponse ComposedProtocolTwoWayAnonComposedWithErrorResponse);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult ComposedProtocolTwoWayAnonComposedWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResponse*> result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResponse ComposedProtocolTwoWayAnonComposedWithErrorResponse);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorResult ComposedProtocolTwoWayAnonComposedWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*> result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult ComposedProtocolTwoWayNamedComposedWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*> result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayNamedComposedWithErrorResult ComposedProtocolTwoWayNamedComposedWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayImport> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayImport> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayImport> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayImport> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayImport> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayImportWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*> result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult MainProtocolTwoWayImportWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayImportWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*> result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult MainProtocolTwoWayImportWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayImportWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayLocal> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayLocal> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);

 private:
  void MakeReply(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayLocal> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);

 private:
  void MakeReply(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayLocal> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayLocal> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*> result);
  void ReplySuccess(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult MainProtocolTwoWayLocalWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*> result);
  void ReplySuccess(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult MainProtocolTwoWayLocalWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnon> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayAnon> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse MainProtocolTwoWayAnonResponse);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse MainProtocolTwoWayAnonResponse);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnon> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse MainProtocolTwoWayAnonResponse);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse MainProtocolTwoWayAnonResponse);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnon> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnon> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*> result);
  void ReplySuccess(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse MainProtocolTwoWayAnonWithErrorResponse);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult MainProtocolTwoWayAnonWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<uint32_t, ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*> result);
  void ReplySuccess(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse MainProtocolTwoWayAnonWithErrorResponse);
  void ReplyError(uint32_t error);

 private:
  void MakeReply(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult MainProtocolTwoWayAnonWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |::fidl::ClientEnd<::test_protocollayouts::MainProtocol>|
// and |::fidl::ServerEnd<::test_protocollayouts::MainProtocol>|).
template<>
class ::fidl::WireServer<::test_protocollayouts::MainProtocol> : public ::fidl::internal::IncomingMessageDispatcher {
  public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_protocollayouts::MainProtocol;

  using Handler = fidl::ProtocolHandler<::test_protocollayouts::MainProtocol>;


    using OneWayAnonComposedCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::OneWayAnonComposed>;
      using OneWayAnonComposedRequestView = ::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest*;

  
  virtual void OneWayAnonComposed(
      ::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest* request,
    OneWayAnonComposedCompleter::Sync& completer) = 0;

    using TwoWayAnonComposedCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;
      using TwoWayAnonComposedRequestView = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest*;

  
  virtual void TwoWayAnonComposed(
      ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest* request,
    TwoWayAnonComposedCompleter::Sync& completer) = 0;

    using TwoWayAnonComposedWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;
      using TwoWayAnonComposedWithErrorRequestView = ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest*;

  
  virtual void TwoWayAnonComposedWithError(
      ::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest* request,
    TwoWayAnonComposedWithErrorCompleter::Sync& completer) = 0;

    using OneWayNamedComposedCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::OneWayNamedComposed>;
      using OneWayNamedComposedRequestView = ::test_protocollayouts_imported::wire::ImportTablePayload*;

  
  virtual void OneWayNamedComposed(
      ::test_protocollayouts_imported::wire::ImportTablePayload* request,
    OneWayNamedComposedCompleter::Sync& completer) = 0;

    using TwoWayNamedComposedCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;
      using TwoWayNamedComposedRequestView = ::test_protocollayouts_imported::wire::ImportUnionPayload*;

  
  virtual void TwoWayNamedComposed(
      ::test_protocollayouts_imported::wire::ImportUnionPayload* request,
    TwoWayNamedComposedCompleter::Sync& completer) = 0;

    using TwoWayNamedComposedWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;
      using TwoWayNamedComposedWithErrorRequestView = ::test_protocollayouts_imported::wire::ImportTablePayload*;

  
  virtual void TwoWayNamedComposedWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload* request,
    TwoWayNamedComposedWithErrorCompleter::Sync& completer) = 0;

    using OneWayImportCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::OneWayImport>;
      using OneWayImportRequestView = ::test_protocollayouts_imported::wire::ImportTablePayload*;

  
  virtual void OneWayImport(
      ::test_protocollayouts_imported::wire::ImportTablePayload* request,
    OneWayImportCompleter::Sync& completer) = 0;

    using TwoWayImportCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayImport>;
      using TwoWayImportRequestView = ::test_protocollayouts_imported::wire::ImportUnionPayload*;

  
  virtual void TwoWayImport(
      ::test_protocollayouts_imported::wire::ImportUnionPayload* request,
    TwoWayImportCompleter::Sync& completer) = 0;

    using TwoWayImportWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayImportWithError>;
      using TwoWayImportWithErrorRequestView = ::test_protocollayouts_imported::wire::ImportTablePayload*;

  
  virtual void TwoWayImportWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload* request,
    TwoWayImportWithErrorCompleter::Sync& completer) = 0;

    using OneWayLocalCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::OneWayLocal>;
      using OneWayLocalRequestView = ::test_protocollayouts::wire::LocalTablePayload*;

  
  virtual void OneWayLocal(
      ::test_protocollayouts::wire::LocalTablePayload* request,
    OneWayLocalCompleter::Sync& completer) = 0;

    using TwoWayLocalCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayLocal>;
      using TwoWayLocalRequestView = ::test_protocollayouts::wire::LocalUnionPayload*;

  
  virtual void TwoWayLocal(
      ::test_protocollayouts::wire::LocalUnionPayload* request,
    TwoWayLocalCompleter::Sync& completer) = 0;

    using TwoWayLocalWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;
      using TwoWayLocalWithErrorRequestView = ::test_protocollayouts::wire::LocalTablePayload*;

  
  virtual void TwoWayLocalWithError(
      ::test_protocollayouts::wire::LocalTablePayload* request,
    TwoWayLocalWithErrorCompleter::Sync& completer) = 0;

    using OneWayAnonCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::OneWayAnon>;
      using OneWayAnonRequestView = ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest*;

  
  virtual void OneWayAnon(
      ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest* request,
    OneWayAnonCompleter::Sync& completer) = 0;

    using TwoWayAnonCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayAnon>;
      using TwoWayAnonRequestView = ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest*;

  
  virtual void TwoWayAnon(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest* request,
    TwoWayAnonCompleter::Sync& completer) = 0;

    using TwoWayAnonWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;
      using TwoWayAnonWithErrorRequestView = ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest*;

  
  virtual void TwoWayAnonWithError(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest* request,
    TwoWayAnonWithErrorCompleter::Sync& completer) = 0;


  // |bind_handler| returns a handler that binds incoming connections to this
  // server implementation.
  //
  // The returned handler borrows the server instance.
  // The server must outlive the provided |dispatcher|. Only after
  // the dispatcher is shutdown will it be safe to destroy the servers.
  // The server should not be moved.
  Handler bind_handler(async_dispatcher_t* dispatcher) {
    return [impl=this, dispatcher=dispatcher](::fidl::ServerEnd<::test_protocollayouts::MainProtocol> request) {
        (void) ::fidl::BindServer(dispatcher, std::move(request), impl);
    };
  }

  private:
  void dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) final;
};namespace fidl {

#endif  // __Fuchsia__

    

}  // namespace fidl

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::FlexibleOneWay> final { static constexpr uint64_t value = 3516779973873009953lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final { static constexpr uint64_t value = 5572735551219638488lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final { static constexpr uint64_t value = 3504132377779779458lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::FlexibleEvent> final { static constexpr uint64_t value = 9152311661656086484lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::StrictOneWay> final { static constexpr uint64_t value = 8790149921168801703lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final { static constexpr uint64_t value = 3690935745864999300lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final { static constexpr uint64_t value = 5364624536440098871lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::StrictEvent> final { static constexpr uint64_t value = 3921073878922106269lu; };

template<>
struct ::fidl::internal::WireOrdinal<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> final { static constexpr uint64_t value = 1525606789639046512lu; };

#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleOneWay> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest;
      using Response = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest;
      using Response = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult;
  using DomainError = int32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleEvent> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleEventRequest;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::StrictOneWay> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest;
      using Response = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::StrictTwoWayNoError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::StrictTwoWayNoError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest;
      using Response = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult;
  using DomainError = int32_t;
    
      using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::StrictTwoWayWithError,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::ChannelTransport
      >
  >;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::OpenProtocol::StrictTwoWayWithError,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::ChannelTransport
      >
  >;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::StrictEvent> {
    
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictEventRequest;
};



#endif  // __Fuchsia__


#ifdef __Fuchsia__




template<>
struct ::fidl::internal::WireMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> {
    static constexpr bool HasRequestPayload = true;
      using Request = ::test_protocollayouts_imported::wire::ImportStructPayload;
    
      using Completer = fidl::Completer<>;
};



#endif  // __Fuchsia__


namespace test_protocollayouts {

}  // namespace test_protocollayouts

#ifdef __Fuchsia__

template<>
struct ::fidl::internal::ProtocolDetails<::test_protocollayouts::OpenProtocol> {
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__


template<>
struct ::fidl::internal::WireServerDispatcher<::test_protocollayouts::OpenProtocol> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(::fidl::WireServer<::test_protocollayouts::OpenProtocol>* impl, ::fidl::IncomingHeaderAndMessage& msg,
                                            internal::MessageStorageViewBase* storage_view,
                                            ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_protocollayouts::OpenProtocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
                       internal::MessageStorageViewBase* storage_view,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
  static const ::fidl::internal::UnknownMethodHandlerEntry unknown_method_handler_entry_;
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final : public ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult ComposedOpenProtocolFlexibleTwoWayNoErrorResult) : ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult(ComposedOpenProtocolFlexibleTwoWayNoErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult ComposedOpenProtocolFlexibleTwoWayNoErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(ComposedOpenProtocolFlexibleTwoWayNoErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final : public ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult ComposedOpenProtocolFlexibleTwoWayWithErrorResult) : ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult(ComposedOpenProtocolFlexibleTwoWayWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult ComposedOpenProtocolFlexibleTwoWayWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(ComposedOpenProtocolFlexibleTwoWayWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent> body;

    explicit TransactionalEvent(int32_t value)
    : body{ value } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final : public ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse base) : ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse(std::move(base)) {}
  explicit WireResponse(int32_t value) : ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse{ .value = std::move(value)}{}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> body;
  explicit TransactionalResponse(int32_t value)
  : body(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(value)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


template<>
struct ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final : public ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult {

  
  explicit WireResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult ComposedOpenProtocolStrictTwoWayWithErrorResult) : ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult(ComposedOpenProtocolStrictTwoWayWithErrorResult){}
  WireResponse() = default;
};


template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
      encoder, value, position, recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
      decoder, position, recursion_depth);
  }
};

template<>
struct ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> body;
  explicit TransactionalResponse(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult ComposedOpenProtocolStrictTwoWayWithErrorResult)
  : body(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(ComposedOpenProtocolStrictTwoWayWithErrorResult)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  
    ::fidl::WireEvent<::test_protocollayouts::OpenProtocol::StrictEvent> body;

    explicit TransactionalEvent(int32_t value)
    : body{ value } {
      _InitHeader();
    }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(
    internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::OpenProtocol::StrictEvent>, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::fidl::WireEvent<::test_protocollayouts::OpenProtocol::StrictEvent>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


#ifdef __Fuchsia__
template<>
struct ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;
  
  ::test_protocollayouts_imported::wire::ImportStructPayload body;
  explicit TransactionalRequest(int32_t value)
  : body(::test_protocollayouts_imported::wire::ImportStructPayload { value } ) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
  : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportStructPayload, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
    internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_protocollayouts_imported::wire::ImportStructPayload, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__


namespace fidl {


#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest, value) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest, value) == 0);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest, value) == 0);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest, value) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest, value) == 0);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>::kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, value) == 0);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest)
    == TypeTraits<::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest, value) == 0);

#endif  // __Fuchsia__


template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>)
    == TypeTraits<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>)
    == TypeTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>::kPrimarySize);
#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>)
    == TypeTraits<::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_protocollayouts::OpenProtocol::StrictEvent>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>> : public std::true_type {};


template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
    ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>)
    == TypeTraits<::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_protocollayouts_imported::wire::ImportStructPayload)
    == TypeTraits<::test_protocollayouts_imported::wire::ImportStructPayload>::kPrimarySize);
static_assert(offsetof(::test_protocollayouts_imported::wire::ImportStructPayload, value) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl

    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>> {
      ::fidl::internal::InlineMessageBuffer<32> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>> {
      ::fidl::internal::InlineMessageBuffer<32> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>> {
      ::fidl::internal::InlineMessageBuffer<24> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> handles_storage_;
    };
    template<>
    struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> final
        : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>> {
      static constexpr uint32_t kNumHandles =
            fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, fidl::MessageDirection::kReceiving>();

      ::std::array<zx_handle_t, kNumHandles> handles_;
      ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
    };

    template<>
    struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> final
        : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>> {
      ::fidl::internal::InlineMessageBuffer<32> bytes_;
      ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> handles_storage_;
    };
  template <>
  struct ::fidl::internal::IncomingEventsHandleStorage<::test_protocollayouts::OpenProtocol> final :
      public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingEventsHandleStorage<::test_protocollayouts::OpenProtocol>> {
   public:
    static constexpr uint32_t kNumHandles = 0;

    ::std::array<zx_handle_t, kNumHandles> handles_;
    ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
  };

  template <>
  struct ::fidl::internal::IncomingEventsStorage<::test_protocollayouts::OpenProtocol> final :
      public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingEventsStorage<::test_protocollayouts::OpenProtocol>> {
   public:
    ::fidl::internal::InlineMessageBuffer<24> bytes_;
    ::fidl::internal::IncomingEventsHandleStorage<::test_protocollayouts::OpenProtocol> handles_storage_;
  };





template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
  using Type = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<32> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
  using Type = ::fit::result<int32_t, ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<32> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>> decoded_;
};




template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictOneWay> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictOneWay> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictOneWay>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictOneWay> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictOneWay> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictOneWay>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictOneWay>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
  using Type = ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<24> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> decoded_;
};


template<>
struct ::fidl::internal::WireResultUnwrap<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
  using Type = ::fit::result<int32_t, ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResponse*>;
};

template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
   private:
    ::fidl::internal::InlineMessageBuffer<32> bytes_;
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> decoded_;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>* request);
    explicit WireUnownedResult(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>* response)
        : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(fidl::Status::Ok()), decoded_(response) {
      ExtractValueFromDecoded(decoded_.pointer());
    }

    explicit WireUnownedResult(
        ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(::fidl::internal::StatusFromResult(decoded)) {
      if (decoded.is_ok()) {
        decoded_ = std::move(decoded.value());
        ExtractValueFromDecoded(decoded_.pointer());
      }
    }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  private:
      ::fidl::DecodedValue<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> decoded_;
};




template<>
class [[nodiscard]] ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client,
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>* request
  );

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};


template<>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> final : public ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> {
 public:
    explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>* request);
    explicit WireUnownedResult(
        ::fit::result<::fidl::Error>&& decoded,
        ::fidl::internal::MessageStorageViewBase* storage_view
    ) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

  
};

template<>
class ::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::BaseEventHandlerInterface, public ::fidl::UnknownEventHandler<::test_protocollayouts::OpenProtocol> {
public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
    virtual void FlexibleEvent(::fidl::WireEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>* event) = 0;
    virtual void StrictEvent(::fidl::WireEvent<::test_protocollayouts::OpenProtocol::StrictEvent>* event) = 0;
};

template<>
class ::fidl::WireAsyncEventHandler<::test_protocollayouts::OpenProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::OpenProtocol>, public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
    void FlexibleEvent(::fidl::WireEvent<::test_protocollayouts::OpenProtocol::FlexibleEvent>* event) override {}
    void StrictEvent(::fidl::WireEvent<::test_protocollayouts::OpenProtocol::StrictEvent>* event) override {}
};


  template<>
  class ::fidl::WireSyncEventHandler<::test_protocollayouts::OpenProtocol>
      : public ::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::OpenProtocol>, public ::fidl::internal::SyncEventHandler {
   public:
    WireSyncEventHandler() = default;

    // Handle all possible events defined in this protocol.
    // Blocks to consume exactly one message from the channel, then call the corresponding virtual
    // method.
    ::fidl::Status HandleOneEvent(
        ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> client_end);
  };

template <>
class ::fidl::internal::WireEventDispatcher<::test_protocollayouts::OpenProtocol> final :
    public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::OpenProtocol>> {
 public:
  explicit WireEventDispatcher(::fidl::internal::WireEventHandlerInterface<::test_protocollayouts::OpenProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
    ::fidl::Status DispatchEvent(
        ::fidl::IncomingHeaderAndMessage& msg,
        ::fidl::internal::MessageStorageViewBase* storage_view) override;
};



// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |::fidl::ClientEnd<::test_protocollayouts::OpenProtocol>|,
// avoiding setting up a client.
template<>
class ::fidl::internal::WireSyncClientImpl<::test_protocollayouts::OpenProtocol> final :
    public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireSyncClientImpl<::test_protocollayouts::OpenProtocol>> {
 public:
  
    // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    FlexibleOneWay(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>
    FlexibleTwoWayNoError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>
    FlexibleTwoWayWithError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(_client_end(), &_request);
    }

    // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    StrictOneWay(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictOneWay>(_client_end(), &_request);
    }

    // Allocates 48 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>
    StrictTwoWayNoError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(_client_end(), &_request);
    }

    // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>
    StrictTwoWayWithError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(_client_end(), &_request);
    }

    // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
    ::fidl::OneWayStatus
    FlexibleOneWayNamedPayload(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> _request{ value };
      return ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>(_client_end(), &_request);
    }


 private:
  ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol>(
      _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_protocollayouts::OpenProtocol> final :
    public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireSyncBufferClientImpl<::test_protocollayouts::OpenProtocol>> {
 public:
  
    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    FlexibleOneWay(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWay> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleOneWay>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>
    FlexibleTwoWayNoError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>
    FlexibleTwoWayWithError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    StrictOneWay(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictOneWay> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictOneWay>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>
    StrictTwoWayNoError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>
    StrictTwoWayWithError(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>(_client_end(), _allocator(), &_request);
    }

    // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
    ::fidl::OneWayStatus
    FlexibleOneWayNamedPayload(int32_t value) {
      ::fidl::internal::TransactionalRequest<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> _request{ value };
      return ::fidl::WireUnownedResult<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>(_client_end(), _allocator(), &_request);
    }


 private:
  ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_protocollayouts::OpenProtocol>(
      _transport().get<::fidl::internal::ChannelTransport>());
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(int32_t value);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult ComposedOpenProtocolFlexibleTwoWayNoErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(int32_t value);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorResult ComposedOpenProtocolFlexibleTwoWayNoErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<int32_t, ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse*> result);
  void ReplySuccess(int32_t value);
  void ReplyError(int32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult ComposedOpenProtocolFlexibleTwoWayWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<int32_t, ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse*> result);
  void ReplySuccess(int32_t value);
  void ReplyError(int32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorResult ComposedOpenProtocolFlexibleTwoWayWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(int32_t value);

 private:
  void MakeReply(int32_t value);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(int32_t value);

 private:
  void MakeReply(int32_t value);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};


template<>
class ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> : public ::fidl::internal::CompleterImplBase<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::fit::result<int32_t, ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResponse*> result);
  void ReplySuccess(int32_t value);
  void ReplyError(int32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult ComposedOpenProtocolStrictTwoWayWithErrorResult);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::fit::result<int32_t, ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResponse*> result);
  void ReplySuccess(int32_t value);
  void ReplyError(int32_t error);

 private:
  void MakeReply(::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorResult ComposedOpenProtocolStrictTwoWayWithErrorResult);
};

template<>
class ::fidl::internal::WireCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |::fidl::ClientEnd<::test_protocollayouts::OpenProtocol>|
// and |::fidl::ServerEnd<::test_protocollayouts::OpenProtocol>|).
template<>
class ::fidl::WireServer<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::IncomingMessageDispatcher, public ::fidl::UnknownMethodHandler<::test_protocollayouts::OpenProtocol> {
  public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_protocollayouts::OpenProtocol;

  using Handler = fidl::ProtocolHandler<::test_protocollayouts::OpenProtocol>;


    using FlexibleOneWayCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::FlexibleOneWay>;
      using FlexibleOneWayRequestView = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest*;

  
  virtual void FlexibleOneWay(
      ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleOneWayRequest* request,
    FlexibleOneWayCompleter::Sync& completer) = 0;

    using FlexibleTwoWayNoErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>;
      using FlexibleTwoWayNoErrorRequestView = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest*;

  
  virtual void FlexibleTwoWayNoError(
      ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest* request,
    FlexibleTwoWayNoErrorCompleter::Sync& completer) = 0;

    using FlexibleTwoWayWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>;
      using FlexibleTwoWayWithErrorRequestView = ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest*;

  
  virtual void FlexibleTwoWayWithError(
      ::test_protocollayouts_imported::wire::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest* request,
    FlexibleTwoWayWithErrorCompleter::Sync& completer) = 0;

    using StrictOneWayCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::StrictOneWay>;
      using StrictOneWayRequestView = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest*;

  
  virtual void StrictOneWay(
      ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictOneWayRequest* request,
    StrictOneWayCompleter::Sync& completer) = 0;

    using StrictTwoWayNoErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;
      using StrictTwoWayNoErrorRequestView = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest*;

  
  virtual void StrictTwoWayNoError(
      ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayNoErrorRequest* request,
    StrictTwoWayNoErrorCompleter::Sync& completer) = 0;

    using StrictTwoWayWithErrorCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>;
      using StrictTwoWayWithErrorRequestView = ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest*;

  
  virtual void StrictTwoWayWithError(
      ::test_protocollayouts_imported::wire::ComposedOpenProtocolStrictTwoWayWithErrorRequest* request,
    StrictTwoWayWithErrorCompleter::Sync& completer) = 0;

    using FlexibleOneWayNamedPayloadCompleter = ::fidl::internal::WireCompleter<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>;
      using FlexibleOneWayNamedPayloadRequestView = ::test_protocollayouts_imported::wire::ImportStructPayload*;

  
  virtual void FlexibleOneWayNamedPayload(
      ::test_protocollayouts_imported::wire::ImportStructPayload* request,
    FlexibleOneWayNamedPayloadCompleter::Sync& completer) = 0;


  // |bind_handler| returns a handler that binds incoming connections to this
  // server implementation.
  //
  // The returned handler borrows the server instance.
  // The server must outlive the provided |dispatcher|. Only after
  // the dispatcher is shutdown will it be safe to destroy the servers.
  // The server should not be moved.
  Handler bind_handler(async_dispatcher_t* dispatcher) {
    return [impl=this, dispatcher=dispatcher](::fidl::ServerEnd<::test_protocollayouts::OpenProtocol> request) {
        (void) ::fidl::BindServer(dispatcher, std::move(request), impl);
    };
  }

  private:
  void dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) final;
};namespace fidl {

#endif  // __Fuchsia__


  

    
#ifdef __Fuchsia__
}  // namespace fidl

template<>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_protocollayouts::MainProtocol> : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus OneWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest);
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus OneWayNamedComposed(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus OneWayImport(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus OneWayLocal(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus OneWayAnon(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest);
};

template<>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_protocollayouts::MainProtocol> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_protocollayouts::MainProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
    // Allocates 32 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> TwoWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest);
    // Allocates 40 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest);
    // Allocates 32 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
    // Allocates 40 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
    // Allocates 32 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayImport> TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
    // Allocates 40 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayImportWithError> TwoWayImportWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
    // Allocates 32 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayLocal> TwoWayLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
    // Allocates 40 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> TwoWayLocalWithError(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
    // Allocates 32 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayAnon> TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest);
    // Allocates 40 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> TwoWayAnonWithError(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest);
};

template<>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_protocollayouts::MainProtocol> : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus OneWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest);


// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus OneWayNamedComposed(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);


// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus OneWayImport(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);


// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus OneWayLocal(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);


// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus OneWayAnon(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest);

};

template<>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_protocollayouts::MainProtocol> final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_protocollayouts::MainProtocol> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> TwoWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayImport> TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayImportWithError> TwoWayImportWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayLocal> TwoWayLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> TwoWayLocalWithError(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayAnon> TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> TwoWayAnonWithError(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest);

};
template<>
class ::fidl::internal::WireWeakSyncClientImpl<::test_protocollayouts::MainProtocol> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_protocollayouts::MainProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  
  // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> TwoWayAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest);
  
  // Allocates 88 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(::test_protocollayouts_imported::wire::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest);
  
  // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
  
  // Allocates 88 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
  
  // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImport> TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);
  
  // Allocates 88 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImportWithError> TwoWayImportWithError(::test_protocollayouts_imported::wire::ImportTablePayload ImportTablePayload);
  
  // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocal> TwoWayLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
  
  // Allocates 40 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> TwoWayLocalWithError(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
  
  // Allocates 32 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon> TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest);
  
  // Allocates 40 bytes of request buffer on the stack. Response is heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> TwoWayAnonWithError(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest);
};namespace fidl {

#endif  // __Fuchsia__


    
}  // namespace fidl

#ifdef __Fuchsia__
template<>
class ::fidl::internal::WireWeakEventSender<::test_protocollayouts::MainProtocol> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

    fidl::OneWayStatus OnAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOnAnonComposedRequest ComposedProtocolOnAnonComposedRequest);


    fidl::OneWayStatus OnNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);


    fidl::OneWayStatus OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest MainProtocolOnAnonRequest);


};

template<>
class ::fidl::internal::WireWeakBufferEventSender<::test_protocollayouts::MainProtocol> : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;

    fidl::OneWayStatus OnAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOnAnonComposedRequest ComposedProtocolOnAnonComposedRequest);


    fidl::OneWayStatus OnNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);


    fidl::OneWayStatus OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest MainProtocolOnAnonRequest);


};

template<>
class ::fidl::internal::WireEventSender<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireEventSender<::test_protocollayouts::MainProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

    fidl::OneWayStatus OnAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOnAnonComposedRequest ComposedProtocolOnAnonComposedRequest);


    fidl::OneWayStatus OnNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);


    fidl::OneWayStatus OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest MainProtocolOnAnonRequest);


};

template<>
class ::fidl::internal::WireBufferEventSender<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireBufferEventSender<::test_protocollayouts::MainProtocol>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;

    fidl::OneWayStatus OnAnonComposed(::test_protocollayouts_imported::wire::ComposedProtocolOnAnonComposedRequest ComposedProtocolOnAnonComposedRequest);


    fidl::OneWayStatus OnNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnImport(::test_protocollayouts_imported::wire::ImportUnionPayload ImportUnionPayload);


    fidl::OneWayStatus OnLocal(::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);


    fidl::OneWayStatus OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest MainProtocolOnAnonRequest);


};

#endif  // __Fuchsia__

    
#ifdef __Fuchsia__


template<>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
  
  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus FlexibleOneWay(int32_t value);
  
  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus StrictOneWay(int32_t value);
  
  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus FlexibleOneWayNamedPayload(int32_t value);
};

template<>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_protocollayouts::OpenProtocol> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_protocollayouts::OpenProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
    // Allocates 24 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> FlexibleTwoWayNoError(int32_t value);
    // Allocates 24 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> FlexibleTwoWayWithError(int32_t value);
    // Allocates 24 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> StrictTwoWayNoError(int32_t value);
    // Allocates 24 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> StrictTwoWayWithError(int32_t value);
};

template<>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus FlexibleOneWay(int32_t value);


// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus StrictOneWay(int32_t value);


// Caller provides the backing storage for FIDL message.
::fidl::OneWayStatus FlexibleOneWayNamedPayload(int32_t value);

};

template<>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_protocollayouts::OpenProtocol> final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_protocollayouts::OpenProtocol> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> FlexibleTwoWayNoError(int32_t value);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> FlexibleTwoWayWithError(int32_t value);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> StrictTwoWayNoError(int32_t value);


// Caller provides the backing storage for FIDL message.
::fidl::internal::WireBufferThenable<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> StrictTwoWayWithError(int32_t value);

};
template<>
class ::fidl::internal::WireWeakSyncClientImpl<::test_protocollayouts::OpenProtocol> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_protocollayouts::OpenProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> FlexibleTwoWayNoError(int32_t value);
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> FlexibleTwoWayWithError(int32_t value);
  
  // Allocates 48 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> StrictTwoWayNoError(int32_t value);
  
  // Allocates 56 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> StrictTwoWayWithError(int32_t value);
};

#endif  // __Fuchsia__


    


#ifdef __Fuchsia__
template<>
class ::fidl::internal::WireWeakEventSender<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

    fidl::OneWayStatus FlexibleEvent(int32_t value);


    fidl::OneWayStatus StrictEvent(int32_t value);


};

template<>
class ::fidl::internal::WireWeakBufferEventSender<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;

    fidl::OneWayStatus FlexibleEvent(int32_t value);


    fidl::OneWayStatus StrictEvent(int32_t value);


};

template<>
class ::fidl::internal::WireEventSender<::test_protocollayouts::OpenProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireEventSender<::test_protocollayouts::OpenProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

    fidl::OneWayStatus FlexibleEvent(int32_t value);


    fidl::OneWayStatus StrictEvent(int32_t value);


};

template<>
class ::fidl::internal::WireBufferEventSender<::test_protocollayouts::OpenProtocol>
    : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireBufferEventSender<::test_protocollayouts::OpenProtocol>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;

    fidl::OneWayStatus FlexibleEvent(int32_t value);


    fidl::OneWayStatus StrictEvent(int32_t value);


};

#endif  // __Fuchsia__


  #pragma clang diagnostic pop

  

