// Generated by the protocol buffer compiler.  DO NOT EDIT!

#import "ProtocolBuffers.h"

#import "Weave_pairing_session_log.pb.h"
// @@protoc_insertion_point(imports)

@class AccountInfo;
@class AccountInfoBuilder;
@class AppLog;
@class AppLogBuilder;
@class Environment;
@class EnvironmentBuilder;
@class Event;
@class EventBuilder;
@class FabricInfo;
@class FabricInfoBuilder;
@class IdentificationProfile;
@class IdentificationProfileBuilder;
@class Pair;
@class PairBuilder;
@class SoftwareProfile;
@class SoftwareProfileBuilder;
@class WeavePairingSessionLog;
@class WeavePairingSessionLogBuilder;
#ifndef __has_feature
  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif // __has_feature

#ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
    #define NS_RETURNS_NOT_RETAINED
  #endif
#endif


@interface AppLogRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface AppLog : PBGeneratedMessage {
@private
  BOOL hasWeavePairingSessionLog_:1;
  WeavePairingSessionLog* weavePairingSessionLog;
}
- (BOOL) hasWeavePairingSessionLog;
@property (readonly, strong) WeavePairingSessionLog* weavePairingSessionLog;

+ (AppLog*) defaultInstance;
- (AppLog*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (AppLogBuilder*) builder;
+ (AppLogBuilder*) builder;
+ (AppLogBuilder*) builderWithPrototype:(AppLog*) prototype;
- (AppLogBuilder*) toBuilder;

+ (AppLog*) parseFromData:(NSData*) data;
+ (AppLog*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (AppLog*) parseFromInputStream:(NSInputStream*) input;
+ (AppLog*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (AppLog*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (AppLog*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface AppLogBuilder : PBGeneratedMessageBuilder {
@private
  AppLog* result;
}

- (AppLog*) defaultInstance;

- (AppLogBuilder*) clear;
- (AppLogBuilder*) clone;

- (AppLog*) build;
- (AppLog*) buildPartial;

- (AppLogBuilder*) mergeFrom:(AppLog*) other;
- (AppLogBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (AppLogBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasWeavePairingSessionLog;
- (WeavePairingSessionLog*) weavePairingSessionLog;
- (AppLogBuilder*) setWeavePairingSessionLog:(WeavePairingSessionLog*) value;
- (AppLogBuilder*) setWeavePairingSessionLogBuilder:(WeavePairingSessionLogBuilder*) builderForValue;
- (AppLogBuilder*) mergeWeavePairingSessionLog:(WeavePairingSessionLog*) value;
- (AppLogBuilder*) clearWeavePairingSessionLog;
@end


// @@protoc_insertion_point(global_scope)
