import "steammessages.proto";
import "base_gcmessages.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum ETFGCMsg {
	k_EMsgGCReportWarKill = 5001;
	k_EMsgGCKickPlayer_DEPRECATED = 5020;
	k_EMsgGCStartedTraining_DEPRECATED = 5021;
	k_EMsgGCFreeTrial_ChooseMostHelpfulFriend = 5022;
	k_EMsgGCRequestTF2Friends = 5023;
	k_EMsgGCRequestTF2FriendsResponse = 5024;
	k_EMsgGCReplay_SubmitContestEntry = 5026;
	k_EMsgGCReplay_SubmitContestEntryResponse = 5027;
	k_EMsgGCSaxxy_Awarded = 5029;
	k_EMsgGCFreeTrial_ThankedBySomeone = 5028;
	k_EMsgGCFreeTrial_ThankedSomeone = 5030;
	k_EMsgGCFreeTrial_ConvertedToPremium = 5031;
	k_EMsgGCMeetThePyroSilliness_BananaCraft_DEPRECATED = 5032;
	k_EMsgGCMVMARG_HighFiveSuccessResponse_DEPRECATED = 5033;
	k_EMsgGCMVMARG_HighFiveOnClient_DEPRECATED = 5034;
	k_EMsgGCCoaching_AddToCoaches = 5200;
	k_EMsgGCCoaching_AddToCoachesResponse = 5201;
	k_EMsgGCCoaching_RemoveFromCoaches = 5202;
	k_EMsgGCCoaching_RemoveFromCoachesResponse = 5203;
	k_EMsgGCCoaching_FindCoach = 5204;
	k_EMsgGCCoaching_FindCoachResponse = 5205;
	k_EMsgGCCoaching_AskCoach = 5206;
	k_EMsgGCCoaching_AskCoachResponse = 5207;
	k_EMsgGCCoaching_CoachJoinGame = 5208;
	k_EMsgGCCoaching_CoachJoining = 5209;
	k_EMsgGCCoaching_CoachJoined = 5210;
	k_EMsgGCCoaching_LikeCurrentCoach = 5211;
	k_EMsgGCCoaching_RemoveCurrentCoach = 5212;
	k_EMsgGCCoaching_AlreadyRatedCoach = 5213;
	k_EMsgGC_Duel_Request = 5500;
	k_EMsgGC_Duel_Response = 5501;
	k_EMsgGC_Duel_Results = 5502;
	k_EMsgGC_Duel_Status = 5503;
	k_EMsgGC_Halloween_ReservedItem_DEPRECATED = 5600;
	k_EMsgGC_Halloween_GrantItem_DEPRECATED = 5601;
	k_EMsgGC_Halloween_GrantItemResponse_DEPRECATED = 5604;
	k_EMsgGC_Halloween_Cheat_QueryResponse_DEPRECATED = 5605;
	k_EMsgGC_Halloween_ItemClaimed_DEPRECATED = 5606;
	k_EMsgGC_Halloween_ReservedItem = 5607;
	k_EMsgGC_Halloween_GrantItem = 5608;
	k_EMsgGC_Halloween_GrantItemResponse = 5609;
	k_EMsgGC_Halloween_Cheat_QueryResponse_DEPRECATED_2 = 5610;
	k_EMsgGC_Halloween_ItemClaimed_DEPRECATED_2 = 5611;
	k_EMsgGC_Halloween_ServerBossEvent = 5612;
	k_EMsgGC_Halloween_Merasmus2012 = 5613;
	k_EMsgGC_Halloween_UpdateMerasmusLootLevel = 5614;
	k_EMsgGC_GameServer_LevelInfo = 5700;
	k_EMsgGC_GameServer_AuthChallenge = 5701;
	k_EMsgGC_GameServer_AuthChallengeResponse = 5702;
	k_EMsgGC_GameServer_CreateIdentity = 5703;
	k_EMsgGC_GameServer_CreateIdentityResponse = 5704;
	k_EMsgGC_GameServer_List = 5705;
	k_EMsgGC_GameServer_ListResponse = 5706;
	k_EMsgGC_GameServer_AuthResult = 5707;
	k_EMsgGC_GameServer_ResetIdentity = 5708;
	k_EMsgGC_GameServer_ResetIdentityResponse = 5709;
	k_EMsgGC_Client_UseServerModificationItem = 5710;
	k_EMsgGC_Client_UseServerModificationItem_Response = 5711;
	k_EMsgGC_GameServer_UseServerModificationItem = 5712;
	k_EMsgGC_GameServer_UseServerModificationItem_Response = 5713;
	k_EMsgGC_GameServer_ServerModificationItemExpired = 5714;
	k_EMsgGC_GameServer_ModificationItemState = 5715;
	k_EMsgGC_GameServer_AckPolicy = 5716;
	k_EMsgGC_GameServer_AckPolicyResponse = 5717;
	k_EMsgGC_QP_ScoreServers = 5800;
	k_EMsgGC_QP_ScoreServersResponse = 5801;
	k_EMsgGC_QP_PlayerJoining = 5802;
	k_EMsgGC_PickupItemEligibility_Query_DEPRECATED = 6000;
	k_EMsgGC_PickupItemEligibility_Query_DEPRECATED_2 = 6001;
	k_EMsgGC_IncrementKillCountAttribute_DEPRECATED = 6100;
	k_EMsgGC_IncrementKillCountResponse_DEPRECATED = 6101;
	k_EMsgGCAbandonCurrentGame = 6235;
	k_EMsgForceSOCacheResend = 6237;
	k_EMsgGCRequestChatChannelList = 6260;
	k_EMsgGCRequestChatChannelListResponse = 6261;
	k_EMsgGCReadyUp = 6270;
	k_EMsgGCKickedFromMatchmakingQueue = 6271;
	k_EMsgGCLeaverDetected = 6272;
	k_EMsgGCLeaverDetectedResponse = 6287;
	k_EMsgGCExitMatchmaking = 6289;
	k_EMsgGCMatchmakingProgress = 6293;
	k_EMsgGCMvMVictoryInfo = 6294;
	k_EMsgGCGameServerMatchmakingStatus = 6295;
	k_EMsgGCMvMVictory = 6297;
	k_EMsgGCMvMVictoryReply = 6298;
	k_EMsgGCGameServerKickingLobby = 6299;
	k_EMsgGCLeaveGameAndPrepareToJoinParty = 6300;
	k_EMsgGC_UpdatePeriodicEvent = 6400;
	k_EMsgGC_DuckLeaderboard_IndividualUpdate = 6401;
	k_EMsgGC_Client2GCEconPreviewDataBlockRequest = 6402;
	k_EMsgGC_Client2GCEconPreviewDataBlockResponse = 6403;
	k_EMsgGC_ClientVerificationChallenge = 6500;
	k_EMsgGC_ClientVerificationChallengeResponse = 6501;
	k_EMsgGC_ClientVerificationVerboseResponse = 6502;
	k_EMsgGC_ClientSetItemSlotAttribute = 6503;
	k_EMsgGC_War_IndividualUpdate = 6505;
	k_EMsgGC_War_JoinWar = 6506;
	k_EMsgGC_War_RequestGlobalStats = 6507;
	k_EMsgGC_War_GlobalStatsResponse = 6508;
	k_EMsgGC_WorldItemPlacement_Attribute = 6510;
	k_EMsgGC_WorldItemPlacement_Update = 6511;
	k_EMsgGC_Match_Result = 6512;
	k_EMsgGCVoteKickPlayerRequest = 6513;
	k_EMsgGCVoteKickPlayerRequestResponse = 6514;
	k_EMsgGC_DailyCompetitiveStatsRollup = 6516;
	k_EMsgGC_DailyCompetitiveStatsRollup_Response = 6517;
	k_EMsgGC_WorldStatusBroadcast = 6518;
	k_EMsgGC_ReportPlayer = 6519;
	k_EMsgGC_Match_ResultResponse = 6520;
	k_EMsgGCGameServerKickingLobbyResponse = 6521;
	k_EMsgGCPlayerLeftMatch = 6522;
	k_EMsgGCPlayerLeftMatchResponse = 6523;
	k_EMsgGCRequestMatchMakerStats = 6524;
	k_EMsgGCMatchMakerStatsResponse = 6525;
	k_EMsgGCMatchHistoryLoad = 6526;
	k_EMsgGC_AcknowledgeXP = 6527;
	k_EMsgGCDataCenterPing_Update = 6528;
	k_EMsgGC_NotificationAcknowledge = 6529;
	k_EMsgGC_NotificationAcknowledgeReply = 6530;
	k_EMsgGC_KickPlayerFromLobby = 6531;
	k_EMsgGC_SurveyQuestionRequest = 6534;
	k_EMsgGC_SurveyQuestionResponse = 6535;
	k_EMsgGC_TFClientInit = 6536;
	k_EMsgGC_NewMatchForLobbyRequest = 6537;
	k_EMsgGC_NewMatchForLobbyResponse = 6538;
	k_EMsgGC_ChangeMatchPlayerTeamsRequest = 6539;
	k_EMsgGC_ChangeMatchPlayerTeamsResponse = 6540;
	k_EMsgGC_QuestIdentify = 6541;
	k_EMsgGC_QuestDevGive = 6542;
	k_EMsgGCQuestComplete_Debug = 6544;
	k_EMsgGC_QuestMapDebug = 6545;
	k_EMsgGC_QuestMapUnlockNode = 6547;
	k_EMsgGC_QuestMapPurchaseReward = 6549;
	k_EMsgGC_SetDisablePartyQuestProgress = 6550;
	k_EMsgGCQuestProgressReport = 6553;
	k_EMsgGCParty_SetOptions = 6554;
	k_EMsgGCParty_SetOptionsResponse = 6555;
	k_EMsgGCParty_QueueForMatch = 6556;
	k_EMsgGCParty_QueueForMatchResponse = 6557;
	k_EMsgGCParty_RemoveFromQueue = 6558;
	k_EMsgGCParty_RemoveFromQueueResponse = 6559;
	k_EMsgGCParty_InvitePlayer = 6560;
	k_EMsgGCParty_RequestJoinPlayer = 6561;
	k_EMsgGCParty_SendChat = 6562;
	k_EMsgGCParty_ChatMsg = 6563;
	k_EMsgGCQuestNodeTurnIn = 6564;
	k_EMsgGCConsumePaintKit = 6565;
	k_EMsgGC_Painkit_DevGrant = 6566;
	k_EMsgGCParty_QueueForStandby = 6567;
	k_EMsgGCParty_QueueForStandbyResponse = 6568;
	k_EMsgGCParty_RemoveFromStandbyQueue = 6569;
	k_EMsgGCParty_RemoveFromStandbyQueueResponse = 6570;
	k_EMsgGCParty_ClearPendingPlayer = 6571;
	k_EMsgGCParty_ClearPendingPlayerResponse = 6572;
	k_EMsgGCParty_ClearOtherPartyRequest = 6573;
	k_EMsgGCParty_ClearOtherPartyRequestResponse = 6574;
	k_EMsgGCParty_PromoteToLeader = 6575;
	k_EMsgGCParty_KickMember = 6576;
	k_EMsgGCQuestStrangeEvent = 6577;
	k_EMsgGC_AcceptLobbyInvite = 6578;
	k_EMsgGC_AcceptLobbyInviteReply = 6579;
	k_EMsgGC_SDRTicket = 6580;
	k_EMsgGC_ProcessMatchVoteKick = 6581;
	k_EMsgGC_ProcessMatchVoteKickResponse = 6582;
	k_EMsgGCToGC_SendAccountBannedNotifications = 6584;
	k_EMsgGCToGC_SendNotification = 6585;
	k_EMsgGCParty_MMError = 6586;
	k_EMsgGCDev_GrantWarKill = 10001;
}

enum EServerModificationItemType {
	kGameServerModificationItem_Halloween = 1;
}

enum ETFSyncedMMMenuStep {
	k_eTFSyncedMMMenuStep_Invalid = -1;
	k_eTFSyncedMMMenuStep_None = 0;
	k_eTFSyncedMMMenuStep_Configuring_Mode = 1;
	k_eTFSyncedMMMenuStep_MvM_Selecting_Mode = 2;
	k_eTFSyncedMMMenuStep_MvM_Selecting_Tour = 3;
	k_eTFSyncedMMMenuStep_MvM_Selecting_Missions = 4;
}

enum ETFMatchGroup {
	option allow_alias = true;
	k_eTFMatchGroup_Invalid = -1;
	k_eTFMatchGroup_MvM_Practice = 0;
	k_eTFMatchGroup_MvM_MannUp = 1;
	k_eTFMatchGroup_First = 0;
	k_eTFMatchGroup_MvM_Default = 0;
	k_eTFMatchGroup_MvM_First = 0;
	k_eTFMatchGroup_MvM_Last = 1;
	k_eTFMatchGroup_Ladder_6v6 = 2;
	k_eTFMatchGroup_Ladder_9v9 = 3;
	k_eTFMatchGroup_Ladder_12v12 = 4;
	k_eTFMatchGroup_Ladder_Default = 2;
	k_eTFMatchGroup_Ladder_First = 2;
	k_eTFMatchGroup_Ladder_Last = 4;
	k_eTFMatchGroup_Casual_6v6 = 5;
	k_eTFMatchGroup_Casual_9v9 = 6;
	k_eTFMatchGroup_Casual_12v12 = 7;
	k_eTFMatchGroup_Casual_Default = 7;
	k_eTFMatchGroup_Casual_First = 5;
	k_eTFMatchGroup_Casual_Last = 7;
	k_eTFMatchGroup_Event_Placeholder = 8;
	k_eTFMatchGroup_Event_Default = 8;
	k_eTFMatchGroup_Event_First = 8;
	k_eTFMatchGroup_Event_Last = 8;
}

enum ETFPartyChatType {
	k_eTFPartyChatType_Invalid = 0;
	k_eTFPartyChatType_MemberChat = 1;
	k_eTFPartyChatType_Synthetic_MemberJoin = 1000;
	k_eTFPartyChatType_Synthetic_MemberLeave = 1001;
	k_eTFPartyChatType_Synthetic_SendFailed = 1002;
	k_eTFPartyChatType_Synthetic_MemberOnline = 1003;
	k_eTFPartyChatType_Synthetic_MemberOffline = 1004;
}

enum TF_GC_GameState {
	TF_GC_GAMESTATE_STATE_INIT = 0;
	TF_GC_GAMESTATE_WAIT_FOR_PLAYERS_TO_LOAD = 1;
	TF_GC_GAMESTATE_STRATEGY_TIME = 3;
	TF_GC_GAMESTATE_GAME_IN_PROGRESS = 5;
	TF_GC_GAMESTATE_POST_GAME = 6;
	TF_GC_GAMESTATE_DISCONNECT = 7;
	TF_GC_GAMESTATE_LAST = 8;
}

enum TF_GC_TEAM {
	TF_GC_TEAM_DEFENDERS = 0;
	TF_GC_TEAM_INVADERS = 1;
	TF_GC_TEAM_BROADCASTER = 2;
	TF_GC_TEAM_SPECTATOR = 3;
	TF_GC_TEAM_PLAYER_POOL = 4;
	TF_GC_TEAM_NOTEAM = 5;
}

enum TFMatchLeaveReason {
	TFMatchLeaveReason_UNSPECIFIED = 0;
	TFMatchLeaveReason_VOTE_KICK = 1;
	TFMatchLeaveReason_IDLE = 2;
	TFMatchLeaveReason_ADMIN_KICK = 3;
	TFMatchLeaveReason_AWOL = 4;
	TFMatchLeaveReason_NO_SHOW = 5;
	TFMatchLeaveReason_GC_REMOVED = 6;
}

enum TFVoteKickReason {
	TFVoteKickReason_Invalid = -1;
	TFVoteKickReason_Other = 0;
	TFVoteKickReason_Cheating = 1;
	TFVoteKickReason_Idle = 2;
	TFVoteKickReason_Scamming = 3;
}

enum ServerMatchmakingState {
	ServerMatchmakingState_INVALID = 0;
	ServerMatchmakingState_NOT_PARTICIPATING = 1;
	ServerMatchmakingState_EMPTY = 2;
	ServerMatchmakingState_ACTIVE_MATCH_REQUESTING_LATE_JOIN = 3;
	ServerMatchmakingState_ACTIVE_MATCH = 4;
}

enum SurveyQuestionType {
	QUESTION_MATCH_QUALITY = 0;
	QUESTION_MAP_QUALITY = 1;
	QUESTION_COMP_INQUIRY = 2;
	QUESTION_CASUAL_INQUIRY = 3;
	QUESTION_RANDOM_CRIT = 4;
}

message CMsgTFGoldenWrenchBroadcast {
	optional int32 wrench_number = 1;
	optional bool deleted = 2;
	optional string user_name = 3;
}

message CMsgTFSaxxyBroadcast {
	optional int32 category_number = 1;
	optional string user_name = 2;
}

message CMsgGCTFSpecificItemBroadcast {
	optional uint32 item_def_index = 1;
	optional bool was_destruction = 2;
	optional string user_name = 3;
}

message CMsgTFWorldStatus {
	optional bool beta_stress_test_event_active = 1 [default = false];
	optional .ETFMatchGroup event_match_group = 2 [default = k_eTFMatchGroup_Invalid];
	optional fixed32 event_expire_time = 3 [default = 0];
	optional uint32 active_client_version = 4;
	repeated .ETFMatchGroup disabled_match_groups = 5;
}

message CSOTFDuelSummary {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 duel_wins = 2;
	optional uint32 duel_losses = 3;
	optional uint32 last_duel_account_id = 4;
	optional uint32 last_duel_timestamp = 5;
	optional uint32 last_duel_status = 6;
}

message CSOTFMapContribution {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 def_index = 2 [(key_field) = true];
	optional uint32 contribution_level = 3;
}

message CMsgTFFreeTrialChooseMostHelpfulFriend {
	optional uint32 account_id_friend = 1;
}

message CMsgTFRequestTF2Friends {
	repeated uint32 account_ids = 1;
}

message CMsgTFRequestTF2FriendsResponse {
	repeated uint32 account_ids = 1;
}

message CSOTFPlayerInfo {
	optional uint32 num_new_users_helped = 1;
}

message CMsgTFThankedBySomeone {
	optional uint64 thanker_steam_id = 1;
}

message CMsgTFThankedSomeone {
}

message CMsgTFFreeTrialConvertedToPremium {
}

message CMsgSaxxyAwarded {
	optional uint32 category = 1;
	repeated string winner_names = 2;
}

message CMsgReplaySubmitContestEntry {
	optional string youtube_url = 1;
	optional uint32 category = 2;
}

message CMsgReplaySubmitContestEntryResponse {
	optional bool success = 1;
}

message CReplayCachedContestData {
	optional fixed32 timestamp = 1;
	optional uint32 num_votes_last_day = 2;
	repeated uint32 video_entry_ids = 3;
	optional uint32 num_flags_last_day = 4;
}

message CMsgTFCoaching_AddToCoaches {
}

message CMsgTFCoaching_RemoveFromCoaches {
}

message CMsgTFCoaching_FindCoach {
	optional uint32 account_id_friend_as_coach = 1;
}

message CMsgTFCoaching_FindCoachResponse {
	optional bool found_coach = 1;
	optional uint32 num_likes = 2;
	optional string coach_name = 3;
}

message CMsgTFCoaching_AskCoach {
	optional uint32 account_id_student = 1;
	optional bool student_is_friend = 2;
}

message CMsgTFCoaching_AskCoachResponse {
	optional bool accept_coaching_assignment = 1;
}

message CMsgTFCoaching_CoachJoinGame {
	optional bool join_game = 1;
	optional uint32 server_address = 2;
	optional uint32 server_port = 3;
	optional uint32 account_id_student = 4;
}

message CMsgTFCoaching_CoachJoining {
	optional uint32 account_id_coach = 1;
	optional uint32 account_id_student = 2;
}

message CMsgTFCoaching_CoachJoined {
	optional uint32 account_id_coach = 1;
}

message CMsgTFCoaching_LikeCurrentCoach {
	optional bool like_coach = 1;
}

message CMsgTFCoaching_RemoveCurrentCoach {
	optional uint32 account_id_coach = 1;
}

message CMsgTFQuickplay_ScoreServers {
	message ServerInfo {
		optional uint32 server_address = 1;
		optional uint32 server_port = 2;
		optional uint32 num_users = 3;
		optional uint64 steam_id = 4;
		optional uint32 max_users = 5;
		optional float user_score = 6;
	}

	repeated .CMsgTFQuickplay_ScoreServers.ServerInfo servers = 1;
}

message CMsgTFQuickplay_ScoreServersResponse {
	message ServerInfo {
		optional uint32 server_address = 1;
		optional uint32 server_port = 2;
		optional float total_score = 3;
		optional uint64 steam_id = 4;
		optional uint32 options_score = 5;
	}

	repeated .CMsgTFQuickplay_ScoreServersResponse.ServerInfo servers = 1;
}

message CMsgTFQuickplay_PlayerJoining {
	optional uint32 account_id = 1;
}

message CMsgGC_GameServer_LevelInfo {
	optional bool level_loaded = 1;
	optional string level_name = 2;
}

message CMsgGC_GameServer_AuthChallenge {
	optional string challenge_string = 1;
}

message CMsgGC_GameServer_AuthResult {
	optional bool authenticated = 1;
	optional int32 game_server_standing = 2;
	optional int32 game_server_standing_trend = 3;
	optional bool is_valve_server = 4;
	optional string message = 5;
}

message CMsgGC_GameServer_AuthChallengeResponse {
	optional uint32 game_server_account_id = 1;
	optional bytes hashed_challenge_string = 2;
}

message CMsgGC_GameServer_CreateIdentity {
	optional uint32 account_id = 1;
}

message CMsgGC_GameServer_CreateIdentityResponse {
	enum EStatus {
		kStatus_GenericFailure = 0;
		kStatus_TooMany = -1;
		kStatus_NoPrivs = -2;
		kStatus_Created = 1;
	}

	optional bool account_created = 1;
	optional uint32 game_server_account_id = 2;
	optional string game_server_identity_token = 3;
	optional .CMsgGC_GameServer_CreateIdentityResponse.EStatus status = 4 [default = kStatus_GenericFailure];
}

message CMsgGC_GameServer_List {
	optional uint32 account_id = 1;
}

message CMsgGC_GameServer_ListResponse {
	message GameServerIdentity {
		optional uint32 game_server_account_id = 1;
		optional string game_server_identity_token = 2;
		optional int32 game_server_standing = 3;
		optional int32 game_server_standing_trend = 4;
	}

	repeated .CMsgGC_GameServer_ListResponse.GameServerIdentity owned_game_servers = 1;
}

message CMsgGC_GameServer_ResetIdentity {
	optional uint32 game_server_account_id = 1;
}

message CMsgGC_GameServer_ResetIdentityResponse {
	optional bool game_server_identity_token_reset = 1;
	optional uint32 game_server_account_id = 2;
	optional string game_server_identity_token = 3;
}

message CMsgGC_GameServer_AckPolicy {
}

message CMsgGC_GameServer_AckPolicyResponse {
	optional uint32 result = 1;
	optional string message = 2;
}

message CMsgGC_Client_UseServerModificationItem {
	optional uint64 item_id = 1;
}

message CMsgGC_Client_UseServerModificationItem_Response {
	enum EServerModificationItemResponse {
		kServerModificationItemResponse_AlreadyInUse = 1;
		kServerModificationItemResponse_NotOnAuthenticatedServer = 2;
		kServerModificationItemResponse_ServerReject = 3;
		kServerModificationItemResponse_InternalError = 4;
		kServerModificationItemResponse_EventAlreadyActive = 5;
	}

	optional .CMsgGC_Client_UseServerModificationItem_Response.EServerModificationItemResponse response_code = 1 [default = kServerModificationItemResponse_AlreadyInUse];
}

message CMsgGC_GameServer_UseServerModificationItem {
	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
}

message CMsgGC_GameServer_UseServerModificationItem_Response {
	enum EServerModificationItemServerResponse {
		kServerModificationItemServerResponse_Accepted = 1;
		kServerModificationItemServerResponse_NoVoteCalled = 2;
		kServerModificationItemServerResponse_VoteFailed = 3;
	}

	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
	optional .CMsgGC_GameServer_UseServerModificationItem_Response.EServerModificationItemServerResponse server_response_code = 2 [default = kServerModificationItemServerResponse_Accepted];
}

message CMsgGC_GameServer_ServerModificationItemExpired {
	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
}

message CMsgGC_GameServer_ServerModificationItem {
	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
	optional bool active = 2;
}

message CMsgGC_Halloween_ReservedItem {
	repeated float x = 1;
	repeated float y = 2;
	repeated float z = 3;
	optional uint32 spawn_meta_info = 7;
}

message CMsgGC_Halloween_GrantItem {
	optional uint32 recipient_account_id = 1;
	optional uint32 level_id = 2;
	optional bool flagged = 3;
}

message CMsgGC_Halloween_GrantItemResponse {
	optional uint32 recipient_account_id = 1;
}

message CMsgGC_Halloween_ItemClaimed {
}

message CMsgGC_PickupItemEligibility_Query {
	optional uint32 account_id = 1;
	optional uint32 seconds_ago = 2;
}

message CMsgGC_PickupItemEligibility_QueryResponse {
	optional uint32 account_id = 1;
	optional bool was_eligible = 2;
	optional uint32 level_id = 3;
}

message CSOTFPartyMember {
	message Activity {
		optional fixed64 lobby_id = 1;
		optional .ETFMatchGroup lobby_match_group = 2 [default = k_eTFMatchGroup_Invalid];
		optional bool multiqueue_blocked = 3;
		optional bool online = 4;
		optional uint32 client_version = 5;
	}

	optional bool owns_ticket = 2;
	optional uint32 completed_missions = 3;
	optional uint32 badge_level = 4;
	optional bool competitive_access = 9;
	optional uint32 experience = 14;
	optional .CTFPerPlayerMatchCriteriaProto player_criteria = 16;
	optional .CSOTFPartyMember.Activity activity = 17;
	optional bool casual_banned = 18;
	optional bool ranked_banned = 19;
	optional bool casual_low_priority = 20;
	optional bool ranked_low_priority = 21;
	optional bool lobby_standby = 22;
}

message TFPendingPartyMember {
	enum EType {
		Invited = 0;
		RequestedToJoin = 1;
	}

	optional fixed64 steamid = 1;
	optional .TFPendingPartyMember.EType type = 2 [default = Invited];
	optional fixed64 inviter = 3;
}

message TFSyncedMMUIState {
	optional .ETFSyncedMMMenuStep menu_step = 1 [default = k_eTFSyncedMMMenuStep_None];
	optional .ETFMatchGroup match_group = 2 [default = k_eTFMatchGroup_Invalid];
}

message CTFGroupMatchCriteriaProto {
	optional bool late_join_ok = 5;
	optional uint32 custom_ping_tolerance = 13 [default = 0];
	optional string mvm_mannup_tour = 10;
	repeated string mvm_mannup_missions = 15;
	repeated string mvm_bootcamp_missions = 16;
	optional .CTFCasualMatchCriteria casual_criteria = 12;
}

message CTFCasualMatchCriteria {
	repeated fixed32 selected_maps_bits = 3;
}

message CTFPerPlayerMatchCriteriaProto {
	optional bool mvm_squad_surplus = 1;
}

message CTFPartyOptions {
	optional bool overwrite_existing = 1;
	optional .CTFGroupMatchCriteriaProto group_criteria = 2;
	optional .CTFPerPlayerMatchCriteriaProto player_criteria = 3;
	optional .TFSyncedMMUIState player_uistate = 5;
}

message CMsgPartySetOptions {
	optional fixed64 party_id = 1;
	optional .CTFPartyOptions options = 2;
}

message CMsgPartySetOptionsResponse {
}

message CMsgPartyQueueForMatch {
	optional fixed64 party_id = 1;
	optional .CTFPartyOptions final_options = 2;
	optional .ETFMatchGroup match_group = 3 [default = k_eTFMatchGroup_Invalid];
}

message CMsgPartyQueueForMatchResponse {
}

message CMsgPartyQueueForStandby {
	optional fixed64 party_id = 1;
	optional fixed64 party_lobby_id = 2;
}

message CMsgPartyQueueForStandbyResponse {
}

message CMsgPartyRemoveFromQueue {
	optional fixed64 party_id = 1;
	optional .ETFMatchGroup match_group = 2 [default = k_eTFMatchGroup_Invalid];
}

message CMsgPartyRemoveFromQueueResponse {
}

message CMsgPartyRemoveFromStandbyQueue {
	optional fixed64 party_id = 1;
}

message CMsgPartyRemoveFromStandbyQueueResponse {
}

message CMsgPartyInvitePlayer {
	optional fixed64 party_id = 1;
	optional fixed64 player_id = 2;
	optional bool expecting_request_to_join = 3;
}

message CMsgPartyRequestJoinPlayer {
	optional fixed64 current_party_id = 1;
	optional fixed64 join_player_id = 2;
	optional fixed64 join_party_id = 3;
	optional bool expecting_invite = 4;
}

message CMsgPartyClearPendingPlayer {
	optional fixed64 party_id = 1;
	optional fixed64 pending_player_id = 2;
}

message CMsgPartyMMError {
	enum Type {
		QUEUE_KICK_NO_PING = 1;
		QUEUE_KICK_AUTH = 2;
	}

	optional .CMsgPartyMMError.Type type = 1 [default = QUEUE_KICK_NO_PING];
}

message CMsgPartyClearPendingPlayerResponse {
}

message CMsgPartyClearOtherPartyRequest {
	optional fixed64 other_party_id = 1;
}

message CMsgPartyClearOtherPartyRequestResponse {
}

message CMsgPartyPromoteToLeader {
	optional fixed64 party_id = 1;
	optional fixed64 new_leader_id = 2;
}

message CMsgPartyKickMember {
	optional fixed64 party_id = 1;
	optional fixed64 target_id = 2;
}

message CMsgPartySendChat {
	optional fixed64 party_id = 1;
	optional string msg = 2;
}

message CMsgPartyChatMsg {
	optional .ETFPartyChatType type = 1 [default = k_eTFPartyChatType_Invalid];
	optional fixed64 actor_id = 2;
	optional string msg = 3;
}

message CSOTFParty {
	message QueueEntry {
		optional .ETFMatchGroup match_group = 1 [default = k_eTFMatchGroup_Invalid];
		optional fixed32 queued_time = 2;
	}

	optional uint64 party_id = 1 [(key_field) = true];
	optional fixed64 leader_id = 2;
	repeated fixed64 member_ids = 3;
	repeated .CSOTFPartyMember members = 13;
	optional uint64 associated_lobby_id = 35;
	optional .ETFMatchGroup associated_lobby_match_group = 40 [default = k_eTFMatchGroup_Invalid];
	repeated .CSOTFParty.QueueEntry matchmaking_queues = 43;
	optional .CTFGroupMatchCriteriaProto group_criteria = 37;
	optional uint32 casual_banned_time = 18;
	optional uint32 casual_low_priority_time = 20;
	optional uint32 ranked_banned_time = 41;
	optional uint32 ranked_low_priority_time = 42;
	optional .TFSyncedMMUIState leader_ui_state = 44;
	repeated .TFPendingPartyMember pending_members = 39;
}

message CSOTFPartyInvite {
	message PartyMember {
		optional fixed64 steamid = 2;
	}

	enum Type {
		PENDING_INVITE = 1;
		PENDING_JOIN_REQUEST = 2;
	}

	optional uint64 group_id = 1 [(key_field) = true];
	optional fixed64 inviter = 2;
	repeated .CSOTFPartyInvite.PartyMember members = 4;
	optional .CSOTFPartyInvite.Type type = 5 [default = PENDING_INVITE];
}

message CTFLobbyPlayerProto {
	enum ConnectState {
		INVALID = 0;
		RESERVATION_PENDING = 1;
		RESERVED = 2;
		CONNECTED = 3;
		DISCONNECTED = 5;
	}

	enum Type {
		INVALID_PLAYER = 0;
		MATCH_PLAYER = 1;
		STANDBY_PLAYER = 2;
		OBSERVING_PLAYER = 3;
	}

	optional fixed64 id = 1 [(key_field) = true];
	optional .TF_GC_TEAM team = 3 [default = TF_GC_TEAM_DEFENDERS];
	optional .CTFLobbyPlayerProto.ConnectState connect_state = 13 [default = INVALID];
	optional string name = 6;
	optional uint64 original_party_id = 12;
	optional bool squad_surplus = 14;
	optional uint32 badge_level = 15;
	optional uint32 last_connect_time = 17;
	optional .CTFLobbyPlayerProto.Type type = 19 [default = INVALID_PLAYER];
	optional double normalized_rating = 20;
	optional double normalized_uncertainty = 22;
	optional uint32 rank = 21;
	optional bool chat_suspension = 23;
}

message CTFLobbyInviteProto {
	optional fixed64 lobby_id = 1 [(key_field) = true];
	optional .ETFMatchGroup match_group = 2 [default = k_eTFMatchGroup_Invalid];
}

message CSOTFGameServerLobby {
	enum State {
		UNKNOWN = 0;
		SERVERSETUP = 1;
		RUN = 2;
	}

	enum WarMatch {
		NOPE = 0;
		INVADERS_ARE_PYRO = 1;
		INVADERS_ARE_HEAVY = 2;
	}

	optional uint64 lobby_id = 1 [(key_field) = true];
	repeated .CTFLobbyPlayerProto members = 2;
	optional fixed64 server_id = 6 [default = 0];
	optional .CSOTFGameServerLobby.State state = 4 [default = UNKNOWN];
	optional string connect = 5;
	optional .TF_GC_GameState game_state = 22 [default = TF_GC_GAMESTATE_STATE_INIT];
	optional double initial_average_mm_rating = 32;
	optional string mannup_tour_name = 42;
	optional string map_name = 38;
	optional string mission_name = 39;
	optional uint32 match_group = 41;
	optional uint64 match_id = 30 [default = 0];
	optional uint32 formed_time = 36;
	optional uint32 flags = 43;
	optional bool late_join_eligible = 44;
	optional uint32 fixed_match_size = 45;
	optional .CSOTFGameServerLobby.WarMatch is_war_match = 46 [default = NOPE];
	repeated uint32 next_maps_for_vote = 47;
	optional uint32 lobby_mm_version = 48;
	repeated .CTFLobbyPlayerProto pending_members = 49;
}

message CMsgExitMatchmaking {
	optional bool explicit_abandon = 1;
	optional uint64 party_id = 2;
	optional uint64 lobby_id = 3;
}

message CMsgAcceptLobbyInvite {
	optional uint64 invited_lobby_id = 1;
	optional uint64 abandoning_match_id = 2;
	repeated uint64 abandoning_invite_lobby_ids = 3;
}

message CMsgAcceptLobbyInviteReply {
}

message CMsgMatchmakingSearchCountRequest {
}

message CMsgMatchmakingSearchCountResponse {
	repeated uint32 searching_players_by_group = 1;
}

message CMsgKickedFromMatchmakingQueue {
}

message CMsgGameServerMatchmakingStatus {
	message Player {
		optional fixed64 steam_id = 1;
		optional .CMsgGameServerMatchmakingStatus.PlayerConnectState connect_state = 2 [default = INVALID];
	}

	enum PlayerConnectState {
		INVALID = 0;
		CONNECTED = 1;
		RESERVED = 2;
	}

	enum Event {
		None = 0;
		MvMVictory = 1;
		MvMDefeat = 2;
		AcknowledgePlayers = 3;
	}

	optional uint32 server_version = 16 [default = 1225];
	optional .ServerMatchmakingState matchmaking_state = 1 [default = ServerMatchmakingState_INVALID];
	optional string map = 3;
	optional string tags = 4;
	optional uint32 bot_count = 5;
	optional uint32 num_spectators = 6;
	optional uint32 max_players = 7;
	optional uint32 slots_free = 8;
	optional uint32 server_region = 9;
	optional float server_loadavg = 10;
	optional bool server_trusted = 11;
	optional bool server_dedicated = 12;
	optional uint32 strict = 17;
	optional string fake_ip = 25;
	repeated .CMsgGameServerMatchmakingStatus.Player players = 13;
	optional .TF_GC_GameState game_state = 14 [default = TF_GC_GAMESTATE_STATE_INIT];
	optional .CMsgGameServerMatchmakingStatus.Event event = 15 [default = None];
	optional uint32 mvm_wave = 18;
	optional uint32 mvm_credits_acquired = 19;
	optional uint32 mvm_credits_dropped = 20;
	optional sint32 match_group = 23 [default = -1];
	optional uint32 lobby_mm_version = 24;
}

message CMsgMatchmakingProgress {
	optional uint32 avg_wait_time_new = 4;
	optional uint32 avg_wait_time_join_late = 5;
	optional uint32 your_wait_time = 6;
	optional uint32 matching_worldwide_searching_players = 8;
	optional uint32 matching_near_you_searching_players = 9;
	optional uint32 total_worldwide_searching_players = 13;
	optional uint32 total_near_you_searching_players = 14;
	optional uint32 matching_worldwide_active_players = 15;
	optional uint32 matching_near_you_active_players = 16;
	optional uint32 total_worldwide_active_players = 17;
	optional uint32 total_near_you_active_players = 18;
	optional uint32 matching_worldwide_empty_gameservers = 19;
	optional uint32 matching_near_you_empty_gameservers = 20;
	optional uint32 total_worldwide_empty_gameservers = 21;
	optional uint32 total_near_you_empty_gameservers = 22;
	optional uint32 urgency_pct = 1;
}

message CMsgMvMVictoryInfo {
	message Item {
		optional .CMsgMvMVictoryInfo.GrantReason grant_reason = 1 [default = INVALID];
		optional bytes item_data = 2;
		optional fixed64 squad_surplus_claimer_steam_id = 3;
	}

	message Player {
		optional fixed64 steam_id = 1;
		optional bool badge_granted = 3;
		optional bool badge_progress_updated = 4;
		optional bool badge_leveled = 5;
		optional uint32 badge_level = 6;
		optional uint32 badge_progress_bits = 7;
		repeated .CMsgMvMVictoryInfo.Item items = 8;
		optional bool voucher_missing = 9;
		optional uint32 badge_points = 10;
	}

	enum GrantReason {
		INVALID = 0;
		BADGE_LEVELED = 1;
		SQUAD_SURPLUS = 2;
		MANN_UP = 3;
		HELP_A_NOOB = 4;
	}

	repeated .CMsgMvMVictoryInfo.Player players = 1;
	optional string tour_name = 2;
	optional string mission_name = 3;
}

message CGCMsgTFHelloResponse {
	optional uint32 version_check = 1;
	repeated uint64 version_checksum = 2;
	optional uint32 version_verbose = 3;
}

message CGCMsgTFSync {
	optional bytes version_checksum = 1;
	optional uint32 version_check = 2;
	optional uint32 version_check_ex = 3;
	optional uint32 version_check_ex2 = 4;
	optional bytes version_checksum_ex = 5;
}

message CGCMsgTFSyncEx {
	optional string version_checksum = 1;
	optional bytes version_checksum_ex = 2;
	optional uint32 version_check = 3;
}

message CMsgMvMVictory {
	message Player {
		optional fixed64 steam_id = 1;
		optional bool squad_surplus = 2;
	}

	optional uint32 legacy_mission_index = 1;
	optional string tour_name_mannup = 5;
	optional string mission_name = 6;
	repeated .CMsgMvMVictory.Player players = 2;
	optional uint64 lobby_id = 3;
	optional fixed32 event_time = 4;
}

message CMsgMvMMannUpVictoryReply {
}

message CMsgGameServerKickingLobby {
	optional uint64 lobby_id = 3;
	optional uint64 match_id = 4;
}

message CMsgGameServerKickingLobbyResponse {
}

message CMsgLeaveGameAndPrepareToJoinParty {
	optional fixed64 party_id = 1;
}

message CMsgPlayerLeftMatch {
	optional fixed64 steam_id = 1;
	optional .TFMatchLeaveReason leave_reason = 2 [default = TFMatchLeaveReason_UNSPECIFIED];
	optional bool was_abandon = 3;
	optional uint64 lobby_id = 4;
	optional uint64 match_id = 5;
	repeated .CMsgTFXPSource xp_breakdown = 6;
}

message CMsgPlayerLeftMatchResponse {
}

message CMsgProcessMatchVoteKick {
	message Vote {
		optional fixed64 steam_id = 1;
		optional bool vote_yay = 2;
	}

	optional fixed64 match_id = 1;
	optional fixed64 initiator_steam_id = 2;
	optional fixed64 target_steam_id = 3;
	optional .TFVoteKickReason reason = 4 [default = TFVoteKickReason_Invalid];
	repeated .CMsgProcessMatchVoteKick.Vote votes = 5;
	optional bool default_pass = 6;
}

message CMsgProcessMatchVoteKickResponse {
	optional bool rip = 1;
}

message CMsgHalloween_ServerBossEvent {
	optional uint32 event_counter = 1;
	optional uint32 timestamp = 2;
	optional uint32 boss_type = 3;
	optional uint32 boss_level = 4;
	optional uint32 event_type = 5;
	optional uint32 players_involved = 6;
	optional float elapsed_time = 7;
}

message CMsgHalloween_Merasmus2012 {
	optional uint32 event_counter = 1;
	optional fixed32 time_submitted = 2;
	optional bool is_valve_server = 3;
	optional uint32 boss_level = 4;
	optional uint32 spawned_health = 5;
	optional uint32 remaining_health = 6;
	optional uint32 life_time = 7;
	optional uint32 bomb_kills = 8;
	optional uint32 staff_kills = 9;
	optional uint32 pvp_kills = 10;
	optional uint32 prophunt_time1 = 11;
	optional uint32 prophunt_time2 = 12;
	optional uint32 dmg_scout = 13;
	optional uint32 dmg_sniper = 14;
	optional uint32 dmg_soldier = 15;
	optional uint32 dmg_demo = 16;
	optional uint32 dmg_medic = 17;
	optional uint32 dmg_heavy = 18;
	optional uint32 dmg_pyro = 19;
	optional uint32 dmg_spy = 20;
	optional uint32 dmg_engineer = 21;
	optional uint32 scout_count = 22;
	optional uint32 sniper_count = 23;
	optional uint32 solider_count = 24;
	optional uint32 demo_count = 25;
	optional uint32 medic_count = 26;
	optional uint32 heavy_count = 27;
	optional uint32 pyro_count = 28;
	optional uint32 spy_count = 29;
	optional uint32 engineer_count = 30;
}

message CMsgUpdateHalloweenMerasmusLootLevel {
	message Player {
		optional fixed64 steam_id = 1;
	}

	repeated .CMsgUpdateHalloweenMerasmusLootLevel.Player players = 1;
	optional uint32 merasmus_level = 2;
}

message CAttribute_String {
	optional string value = 1;
}

message CAttribute_DynamicRecipeComponent {
	optional uint32 def_index = 1;
	optional uint32 item_quality = 2;
	optional uint32 component_flags = 3;
	optional string attributes_string = 4;
	optional uint32 num_required = 5;
	optional uint32 num_fulfilled = 6;
}

message CAttribute_DynamicRecipeComponent_COMPAT_NEVER_SERIALIZE_THIS_OUT {
	optional uint32 def_index = 1;
	optional uint32 item_def = 2;
	optional uint32 item_quality = 3;
	optional uint32 component_flags = 4;
	optional uint32 item_flags = 5;
	optional string attributes_string = 6;
	optional uint32 num_required = 7;
	optional uint32 item_count = 8;
	optional uint32 num_fulfilled = 9;
	optional uint32 items_fulfilled = 10;
}

message CAttribute_ItemSlotCriteria {
	optional string tags = 1;
}

message CMsgSetItemSlotAttribute {
	optional uint64 item_id = 1;
	optional uint64 slot_item_original_id = 2;
	optional uint32 slot_index = 3;
}

message CSOWarData {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 war_id = 2 [(key_field) = true];
	optional uint32 affiliation = 3;
	optional uint32 points_scored = 4;
}

message CGCMsgGC_War_IndividualUpdate {
	optional fixed64 steam_id = 1;
	optional uint32 war_id = 2;
	optional uint32 score = 3;
}

message CGCMsgGC_War_JoinWar {
	optional uint32 affiliation = 1;
	optional uint32 war_id = 2;
}

message CGCMsgGC_War_RequestGlobalStats {
	optional uint32 war_id = 1;
}

message CGCMsgGC_War_GlobalStatsResponse {
	message SideScore {
		optional uint32 side = 1;
		optional uint64 score = 2;
	}

	repeated .CGCMsgGC_War_GlobalStatsResponse.SideScore side_scores = 1;
	optional uint32 war_id = 2;
}

message CGCMsgGC_PlayerDuckLeaderboard_IndividualUpdate {
	optional uint32 score = 2;
	optional uint32 type = 3;
	optional bytes score_id = 4;
	optional uint32 score_check = 5;
}

message CAttribute_WorldItemPlacement {
	optional uint64 original_item_id = 1;
	optional float pos_x = 2;
	optional float pos_y = 3;
	optional float pos_z = 4;
	optional float ang_x = 5;
	optional float ang_y = 6;
	optional float ang_z = 7;
}

message CGCMsg_WorldItemPlacement_Update {
	optional uint64 original_item_id = 1;
	optional float pos_x = 2;
	optional float pos_y = 3;
	optional float pos_z = 4;
	optional float ang_x = 5;
	optional float ang_y = 6;
	optional float ang_z = 7;
	optional bool force_remove_all = 8;
	optional string attrib_name = 9;
}

message CMsgAcknowledgeXP {
	optional int32 match_group = 1;
	optional uint32 predicted_experience = 2;
}

message CMsgTFXPSource {
	enum XPSourceType {
		SOURCE_SCORE = 0;
		SOURCE_OBJECTIVE_BONUS = 1;
		SOURCE_COMPLETED_MATCH = 2;
		SOURCE_COMPETITIVE_ABANDON = 3;
		SOURCE_COMPETITIVE_WIN = 4;
		SOURCE_COMPETITIVE_LOSS = 5;
		SOURCE_AUTOBALANCE_BONUS = 6;
		SOURCE_PRESTIGE_BONUS = 7;
	}

	optional .CMsgTFXPSource.XPSourceType type = 1 [default = SOURCE_SCORE, (key_field) = true];
	optional int32 amount = 2;
	optional int32 match_group = 3;
	optional uint32 account_id = 4 [(key_field) = true];
	optional uint64 match_id = 5 [(key_field) = true];
}

message CMsgTFXPSourceBreakdown {
	repeated .CMsgTFXPSource sources = 1;
}

message CMsgTFClientInit {
	optional uint32 client_version = 1;
	optional int32 language = 2;
}

message CMsgGCNotification {
	enum NotificationType {
		NOTIFICATION_REPORTED_PLAYER_BANNED = 0;
		NOTIFICATION_CUSTOM_STRING = 1;
		NOTIFICATION_MM_BAN_DUE_TO_EXCESSIVE_REPORTS = 2;
		NOTIFICATION_REPORTED_PLAYER_WAS_BANNED = 3;
		NOTIFICATION_SUPPORT_MESSAGE = 4;
		NOTIFICATION_NUM_TYPES = 5;
	}

	optional uint64 notification_id = 1 [(key_field) = true];
	optional uint32 account_id = 2;
	optional fixed32 expiration_time = 3;
	optional .CMsgGCNotification.NotificationType type = 4 [default = NOTIFICATION_CUSTOM_STRING];
	optional string notification_string = 5;
}

message CMsgGCNotificationQueue {
	repeated .CMsgGCNotification notifications = 1;
}

message CMsgNotificationAcknowledge {
	optional uint32 account_id = 1;
	optional uint64 notification_id = 2;
}

message CMsgNotificationAcknowledgeReply {
}

message CMsgGC_Match_Result {
	message Player {
		optional fixed64 steam_id = 1;
		optional uint64 original_party_id = 2;
		optional uint32 team = 3;
		optional uint32 score = 4;
		optional uint32 ping = 5;
		optional uint32 flags = 6;
		optional uint32 rank = 9;
		optional uint32 classes_played = 10;
		optional uint32 kills = 11;
		optional uint32 deaths = 12;
		optional uint32 damage = 13;
		optional uint32 healing = 14;
		optional uint32 support = 15;
		optional uint32 score_medal = 16;
		optional uint32 kills_medal = 17;
		optional uint32 damage_medal = 18;
		optional uint32 healing_medal = 19;
		optional uint32 support_medal = 20;
		repeated .CMsgTFXPSource xp_breakdown = 21;
		optional uint32 leave_time = 22;
		optional .TFMatchLeaveReason leave_reason = 23 [default = TFMatchLeaveReason_UNSPECIFIED];
		optional uint32 connect_time = 24;
	}

	enum Status {
		MATCH_SUCCEEDED = 0;
		MATCH_FAILED_GC = 1;
		MATCH_FAILED_TRUSTED = 2;
		MATCH_FAILED_ABANDON = 3;
		MATCH_FAILED_UNKNOWN = 5;
		MATCH_FAILED_TIMEOUT = 6;
		MATCH_FINISHED_ABANDON = 7;
	}

	optional uint64 match_id = 1 [(key_field) = true];
	optional int32 match_group = 2;
	optional .CMsgGC_Match_Result.Status status = 3 [default = MATCH_SUCCEEDED];
	optional uint32 duration = 4;
	optional uint32 red_score = 5;
	optional uint32 blue_score = 6;
	optional uint32 winning_team = 7;
	optional uint32 map_index = 8;
	optional uint32 game_type = 9 [default = 0];
	repeated .CMsgGC_Match_Result.Player players = 10;
	optional uint32 win_reason = 13;
	optional uint32 flags = 14;
	optional uint32 bots = 16;
}

message CMsgGC_Match_ResultResponse {
}

message CEconItemPreviewDataBlock {
	optional .CSOEconItem econitem = 1;
}

message CMsgGC_Client2GCEconPreviewDataBlockRequest {
	optional uint64 param_s = 1;
	optional uint64 param_a = 2;
	optional uint64 param_d = 3;
	optional uint64 param_m = 4;
}

message CMsgGC_Client2GCEconPreviewDataBlockResponse {
	optional .CEconItemPreviewDataBlock iteminfo = 1;
}

message CSOTFLadderPlayerStats {
	optional uint32 account_id = 1 [(key_field) = true];
	optional int32 match_group = 2 [(key_field) = true];
	optional uint32 season_id = 3 [(key_field) = true];
	optional uint32 games = 9;
	optional uint32 score = 10;
	optional uint32 kills = 11;
	optional uint32 deaths = 12;
	optional uint32 damage = 13;
	optional uint32 healing = 14;
	optional uint32 support = 15;
	optional uint32 score_bronze = 16;
	optional uint32 score_silver = 17;
	optional uint32 score_gold = 18;
	optional uint32 kills_bronze = 19;
	optional uint32 kills_silver = 20;
	optional uint32 kills_gold = 21;
	optional uint32 damage_bronze = 22;
	optional uint32 damage_silver = 23;
	optional uint32 damage_gold = 24;
	optional uint32 healing_bronze = 25;
	optional uint32 healing_silver = 26;
	optional uint32 healing_gold = 27;
	optional uint32 support_bronze = 28;
	optional uint32 support_silver = 29;
	optional uint32 support_gold = 30;
}

message CSOTFRatingData {
	optional uint32 account_id = 1 [(key_field) = true];
	optional int32 rating_type = 2 [(key_field) = true];
	optional uint32 rating_primary = 3;
	optional uint32 rating_secondary = 4;
	optional uint32 rating_tertiary = 5;
}

message CMsgGC_TFVoteKickPlayerRequest {
	optional uint64 target_id = 2;
	optional uint64 voter_id = 3;
	optional .TFVoteKickReason reason = 4 [default = TFVoteKickReason_Invalid];
	optional uint64 match_id = 5;
}

message CMsgGC_VoteKickPlayerRequestResponse {
	optional bool allowed = 1;
	optional bool voter_inhibit = 3;
	optional bool target_inhibit = 4;
}

message CMsgGC_DailyCompetitiveStatsRollup {
}

message CMsgGC_DailyCompetitiveStatsRollup_Response {
	message RankBucketEntry {
		optional uint32 rank = 1;
		optional uint32 records = 2;
		optional uint32 avg_score = 3;
		optional uint32 stdev_score = 4;
		optional uint32 avg_kills = 5;
		optional uint32 stdev_kills = 6;
		optional uint32 avg_damage = 7;
		optional uint32 stdev_damage = 8;
		optional uint32 avg_healing = 9;
		optional uint32 stdev_healing = 10;
		optional uint32 avg_support = 11;
		optional uint32 stdev_support = 12;
	}

	repeated .CMsgGC_DailyCompetitiveStatsRollup_Response.RankBucketEntry rankdata = 1;
}

message CMsgGC_ReportPlayer {
	enum EReason {
		kReason_INVALID = 0;
		kReason_CHEATING = 1;
		kReason_IDLE = 2;
		kReason_HARASSMENT = 3;
		kReason_GRIEFING = 4;
		kReason_COUNT = 5;
	}

	optional uint32 account_id_target = 1;
	optional .CMsgGC_ReportPlayer.EReason reason = 2 [default = kReason_INVALID];
}

message CSOTFMatchResultPlayerStats {
	optional uint64 match_id = 1 [(key_field) = true];
	optional uint32 account_id = 2 [(key_field) = true];
	optional int32 match_group = 3 [(key_field) = true];
	optional uint32 endtime = 4;
	optional uint32 season_id = 5;
	optional uint32 status = 6;
	optional uint32 original_party_id = 7;
	optional uint32 team = 8;
	optional uint32 score = 9;
	optional uint32 ping = 10;
	optional uint32 flags = 11;
	optional uint32 display_rating = 12;
	optional int32 display_rating_change = 13;
	optional uint32 rank = 14;
	optional uint32 classes_played = 15;
	optional uint32 kills = 16;
	optional uint32 deaths = 17;
	optional uint32 damage = 18;
	optional uint32 healing = 19;
	optional uint32 support = 20;
	optional uint32 score_medal = 21;
	optional uint32 kills_medal = 22;
	optional uint32 damage_medal = 23;
	optional uint32 healing_medal = 24;
	optional uint32 support_medal = 25;
	optional uint32 map_index = 26;
	optional uint32 winning_team = 27;
}

message CMsgGCRequestMatchMakerStats {
}

message CMsgGCDataCenterPopulation {
	optional string name = 1;
	optional float health_ratio = 2;
}

message CMsgGCMatchGroupDataCenterPopulation {
	repeated .CMsgGCDataCenterPopulation data_center_population = 1;
}

message CMsgGCMatchMakerStatsResponse {
	repeated uint32 map_count = 1;
	repeated .CMsgGCMatchGroupDataCenterPopulation matchgroup_data_center_population = 2;
}

message CMsgGCMatchHistoryLoad {
	optional .ETFMatchGroup match_group = 1 [default = k_eTFMatchGroup_Invalid];
}

message CMsgGCDataCenterPing_Update {
	message PingEntry {
		optional string name = 1;
		optional uint32 ping = 2;
		optional .CMsgGCDataCenterPing_Update.Status ping_status = 3 [default = Normal];
	}

	enum Status {
		Invalid = 0;
		Normal = 1;
		Unreachable = 2;
		FallbackToDCPing = 3;
	}

	repeated .CMsgGCDataCenterPing_Update.PingEntry pingdata = 1;
}

message CMsgGC_KickPlayerFromLobby {
	optional uint64 targetID = 1;
}

message CMsgGCSurveyRequest {
	optional .SurveyQuestionType question_type = 1 [default = QUESTION_MATCH_QUALITY];
	optional uint64 match_id = 2;
}

message CMsgGCSurveyResponse {
	optional .SurveyQuestionType question_type = 1 [default = QUESTION_MATCH_QUALITY];
	optional uint64 match_id = 2;
	optional int32 response = 3;
}

message CSOQuestMapNode {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 defindex = 3 [(key_field) = true];
	optional uint32 node_id = 4;
	optional bool star_0_earned = 6 [default = false];
	optional bool star_1_earned = 7 [default = false];
	optional bool star_2_earned = 8 [default = false];
	optional bool loot_claimed = 9 [default = false];
	optional uint32 selected_quest_def = 10 [default = 0];
	optional uint32 map_cycle = 11;
}

message CSOQuest {
	optional uint32 account_id = 1;
	optional uint64 quest_id = 2 [(key_field) = true];
	optional uint32 defindex = 3;
	optional bool active = 4 [default = false];
	optional uint32 points_0 = 5;
	optional uint32 points_1 = 6;
	optional uint32 points_2 = 7;
	optional uint32 quest_map_node_source_id = 8;
	optional uint32 map_cycle = 9;
}

message CSOQuestMapRewardPurchase {
	optional uint32 account_id = 1;
	optional uint32 defindex = 2 [(key_field) = true];
	optional uint32 count = 3;
	optional uint32 map_cycle = 4;
	optional uint32 purchase_id = 5;
}

message CMsgGCQuestIdentify {
	optional uint64 quest_id = 1;
}

message CMsgGCQuestDevGive {
	optional uint32 quest_def_index = 1;
}

message CMsgGCQuestNodeTurnIn {
	optional uint32 node_defindex = 1;
}

message CMsgGCQuestMapUnlockNode {
	optional uint32 node_defindex = 1;
	optional uint32 quest_defindex = 2;
}

message CMsgGCNewMatchForLobbyRequest {
	optional uint64 current_match_id = 1;
	optional uint32 next_map_id = 2;
	optional uint64 lobby_id = 3;
}

message CMsgGCNewMatchForLobbyResponse {
	optional bool success = 1;
}

message CMsgGCChangeMatchPlayerTeamsRequest {
	message Member {
		optional uint64 member_id = 1;
		optional .TF_GC_TEAM new_team = 2 [default = TF_GC_TEAM_NOTEAM];
	}

	optional uint64 match_id = 1;
	optional uint64 lobby_id = 2;
	repeated .CMsgGCChangeMatchPlayerTeamsRequest.Member member = 3;
}

message CMsgGCChangeMatchPlayerTeamsResponse {
	optional bool success = 1;
}

message CMsgGCQuestComplete_Debug {
	optional uint64 quest_id = 1;
	optional uint32 points_type = 2;
}

message CMsgGCQuestMap_Debug {
	optional uint32 reset_operation = 1;
	optional uint32 give_credit = 2;
	optional .CMsgGCQuestMapUnlockNode unlock_node = 3;
}

message CMsgGCQuestMapPurchaseReward {
	optional uint32 store_item_defindex = 1;
}

message CMsgGCQuestResponse {
	optional bool success = 1 [default = false];
}

message CMsgGCSetDisablePartyQuestProgress {
	optional bool state = 1;
}

message CMsgQuestProgressReport {
	optional uint64 quest_id = 1;
	optional bool star_0_earned = 2;
	optional bool star_1_earned = 3;
	optional bool star_2_earned = 4;
	repeated uint64 items_earned = 5;
	optional uint32 reward_credits_earned = 6;
	optional bool contract_completed = 7;
}

message CMsgConsumePaintkit {
	optional fixed64 source_id = 1;
	optional uint32 target_defindex = 2;
}

message CMsgPainkitDevGrant {
	optional uint32 paintkit_defindex = 1;
	optional float wear = 2;
	optional uint32 item_defindex = 3;
}

message GCQuestStrangeEvent {
	optional uint32 owner_account_id = 1;
	optional uint32 scorer_account_id = 2;
	optional uint64 quest_id = 3;
	optional uint32 strange_event_id = 4;
	optional uint32 score = 5;
}

message CMsgSDRTicket {
	optional bytes serialized_ticket = 1;
}

message CMsgAuthorizeServerItemRetrieval {
	repeated uint64 item_id = 1;
}

message CMsgGCToGCSendAccountBannedNotifications {
	optional uint32 banned_accountid = 1;
	optional uint32 report_period_begin = 2;
	optional uint32 report_period_end = 3;
}

message CMsgGCToGCSendNotification {
	optional .CMsgGCNotification notification = 1;
}
