enum EDemoCommands {
	DEM_Error = -1;
	DEM_Stop = 0;
	DEM_FileHeader = 1;
	DEM_FileInfo = 2;
	DEM_SyncTick = 3;
	DEM_SendTables = 4;
	DEM_ClassInfo = 5;
	DEM_StringTables = 6;
	DEM_Packet = 7;
	DEM_SignonPacket = 8;
	DEM_ConsoleCmd = 9;
	DEM_CustomData = 10;
	DEM_CustomDataCallbacks = 11;
	DEM_UserCmd = 12;
	DEM_FullPacket = 13;
	DEM_SaveGame = 14;
	DEM_SpawnGroups = 15;
	DEM_AnimationData = 16;
	DEM_AnimationHeader = 17;
	DEM_Recovery = 18;
	DEM_Max = 19;
	DEM_IsCompressed = 64;
}

message CDemoFileHeader {
	required string demo_file_stamp = 1;
	optional int32 patch_version = 2;
	optional string server_name = 3;
	optional string client_name = 4;
	optional string map_name = 5;
	optional string game_directory = 6;
	optional int32 fullpackets_version = 7;
	optional bool allow_clientside_entities = 8;
	optional bool allow_clientside_particles = 9;
	optional string addons = 10;
	optional string demo_version_name = 11;
	optional string demo_version_guid = 12;
	optional int32 build_num = 13;
	optional string game = 14;
	optional int32 server_start_tick = 15;
}

message CGameInfo {
	message CDotaGameInfo {
		message CPlayerInfo {
			optional string hero_name = 1;
			optional string player_name = 2;
			optional bool is_fake_client = 3;
			optional uint64 steamid = 4;
			optional int32 game_team = 5;
		}

		message CHeroSelectEvent {
			optional bool is_pick = 1;
			optional uint32 team = 2;
			optional int32 hero_id = 3;
		}

		optional uint64 match_id = 1;
		optional int32 game_mode = 2;
		optional int32 game_winner = 3;
		repeated .CGameInfo.CDotaGameInfo.CPlayerInfo player_info = 4;
		optional uint32 leagueid = 5;
		repeated .CGameInfo.CDotaGameInfo.CHeroSelectEvent picks_bans = 6;
		optional uint32 radiant_team_id = 7;
		optional uint32 dire_team_id = 8;
		optional string radiant_team_tag = 9;
		optional string dire_team_tag = 10;
		optional uint32 end_time = 11;
	}

	message CCSGameInfo {
		repeated int32 round_start_ticks = 1;
	}

	optional .CGameInfo.CDotaGameInfo dota = 4;
	optional .CGameInfo.CCSGameInfo cs = 5;
}

message CDemoFileInfo {
	optional float playback_time = 1;
	optional int32 playback_ticks = 2;
	optional int32 playback_frames = 3;
	optional .CGameInfo game_info = 4;
}

message CDemoPacket {
	optional bytes data = 3;
}

message CDemoFullPacket {
	optional .CDemoStringTables string_table = 1;
	optional .CDemoPacket packet = 2;
}

message CDemoSaveGame {
	optional bytes data = 1;
	optional fixed64 steam_id = 2;
	optional fixed64 signature = 3;
	optional int32 version = 4;
}

message CDemoSyncTick {
}

message CDemoConsoleCmd {
	optional string cmdstring = 1;
}

message CDemoSendTables {
	optional bytes data = 1;
}

message CDemoClassInfo {
	message class_t {
		optional int32 class_id = 1;
		optional string network_name = 2;
		optional string table_name = 3;
	}

	repeated .CDemoClassInfo.class_t classes = 1;
}

message CDemoCustomData {
	optional int32 callback_index = 1;
	optional bytes data = 2;
}

message CDemoCustomDataCallbacks {
	repeated string save_id = 1;
}

message CDemoAnimationHeader {
	optional sint32 entity_id = 1;
	optional int32 tick = 2;
	optional bytes data = 3;
}

message CDemoAnimationData {
	optional sint32 entity_id = 1;
	optional int32 start_tick = 2;
	optional int32 end_tick = 3;
	optional bytes data = 4;
	optional int64 data_checksum = 5;
}

message CDemoStringTables {
	message items_t {
		optional string str = 1;
		optional bytes data = 2;
	}

	message table_t {
		optional string table_name = 1;
		repeated .CDemoStringTables.items_t items = 2;
		repeated .CDemoStringTables.items_t items_clientside = 3;
		optional int32 table_flags = 4;
	}

	repeated .CDemoStringTables.table_t tables = 1;
}

message CDemoStop {
}

message CDemoUserCmd {
	optional int32 cmd_number = 1;
	optional bytes data = 2;
}

message CDemoSpawnGroups {
	repeated bytes msgs = 3;
}

message CDemoRecovery {
	message DemoInitialSpawnGroupEntry {
		optional uint32 spawngrouphandle = 1;
		optional bool was_created = 2;
	}

	optional .CDemoRecovery.DemoInitialSpawnGroupEntry initial_spawn_group = 1;
	optional bytes spawn_group_message = 2;
}
