Merge pull request #863 from Jimmy062006/master

Brian [2016-08-09 11:33:35]
Merge pull request #863 from Jimmy062006/master

0.31 API
Filename
PokemonGo/POGOProtos/Data/AssetDigestEntry.cs
PokemonGo/POGOProtos/Data/Battle/BattleAction.cs
PokemonGo/POGOProtos/Data/Battle/BattleActionType.cs
PokemonGo/POGOProtos/Data/Battle/BattleLog.cs
PokemonGo/POGOProtos/Data/Battle/BattleParticipant.cs
PokemonGo/POGOProtos/Data/Battle/BattlePokemonInfo.cs
PokemonGo/POGOProtos/Data/Battle/BattleResults.cs
PokemonGo/POGOProtos/Data/Battle/BattleState.cs
PokemonGo/POGOProtos/Data/Battle/BattleType.cs
PokemonGo/POGOProtos/Data/Battle/POGOProtosDataBattle.cs
PokemonGo/POGOProtos/Data/Capture/CaptureAward.cs
PokemonGo/POGOProtos/Data/Capture/CaptureProbability.cs
PokemonGo/POGOProtos/Data/Capture/POGOProtosDataCapture.cs
PokemonGo/POGOProtos/Data/DownloadUrlEntry.cs
PokemonGo/POGOProtos/Data/Gym/GymMembership.cs
PokemonGo/POGOProtos/Data/Gym/GymState.cs
PokemonGo/POGOProtos/Data/Gym/POGOProtosDataGym.cs
PokemonGo/POGOProtos/Data/Logs/ActionLogEntry.cs
PokemonGo/POGOProtos/Data/Logs/CatchPokemonLogEntry.cs
PokemonGo/POGOProtos/Data/Logs/FortSearchLogEntry.cs
PokemonGo/POGOProtos/Data/Logs/POGOProtosDataLogs.cs
PokemonGo/POGOProtos/Data/POGOProtosData.cs
PokemonGo/POGOProtos/Data/Player/ContactSettings.cs
PokemonGo/POGOProtos/Data/Player/Currency.cs
PokemonGo/POGOProtos/Data/Player/DailyBonus.cs
PokemonGo/POGOProtos/Data/Player/EquippedBadge.cs
PokemonGo/POGOProtos/Data/Player/POGOProtosDataPlayer.cs
PokemonGo/POGOProtos/Data/Player/PlayerAvatar.cs
PokemonGo/POGOProtos/Data/Player/PlayerCamera.cs
PokemonGo/POGOProtos/Data/Player/PlayerCurrency.cs
PokemonGo/POGOProtos/Data/Player/PlayerPublicProfile.cs
PokemonGo/POGOProtos/Data/Player/PlayerStats.cs
PokemonGo/POGOProtos/Data/PlayerBadge.cs
PokemonGo/POGOProtos/Data/PlayerData.cs
PokemonGo/POGOProtos/Data/PokedexEntry.cs
PokemonGo/POGOProtos/Data/PokemonData.cs
PokemonGo/POGOProtos/Enums/ActivityType.cs
PokemonGo/POGOProtos/Enums/BadgeType.cs
PokemonGo/POGOProtos/Enums/CameraInterpolation.cs
PokemonGo/POGOProtos/Enums/CameraTarget.cs
PokemonGo/POGOProtos/Enums/Gender.cs
PokemonGo/POGOProtos/Enums/IapItemCategory.cs
PokemonGo/POGOProtos/Enums/ItemCategory.cs
PokemonGo/POGOProtos/Enums/ItemEffect.cs
PokemonGo/POGOProtos/Enums/POGOProtosEnums.cs
PokemonGo/POGOProtos/Enums/Platform.cs
PokemonGo/POGOProtos/Enums/PokemonFamilyId.cs
PokemonGo/POGOProtos/Enums/PokemonId.cs
PokemonGo/POGOProtos/Enums/PokemonMove.cs
PokemonGo/POGOProtos/Enums/PokemonMovementType.cs
PokemonGo/POGOProtos/Enums/PokemonRarity.cs
PokemonGo/POGOProtos/Enums/PokemonType.cs
PokemonGo/POGOProtos/Enums/TeamColor.cs
PokemonGo/POGOProtos/Enums/TutorialState.cs
PokemonGo/POGOProtos/Inventory/AppliedItem.cs
PokemonGo/POGOProtos/Inventory/AppliedItems.cs
PokemonGo/POGOProtos/Inventory/Candy.cs
PokemonGo/POGOProtos/Inventory/EggIncubator.cs
PokemonGo/POGOProtos/Inventory/EggIncubatorType.cs
PokemonGo/POGOProtos/Inventory/EggIncubators.cs
PokemonGo/POGOProtos/Inventory/InventoryDelta.cs
PokemonGo/POGOProtos/Inventory/InventoryItem.cs
PokemonGo/POGOProtos/Inventory/InventoryItemData.cs
PokemonGo/POGOProtos/Inventory/InventoryUpgrade.cs
PokemonGo/POGOProtos/Inventory/InventoryUpgradeType.cs
PokemonGo/POGOProtos/Inventory/InventoryUpgrades.cs
PokemonGo/POGOProtos/Inventory/Item/ItemAward.cs
PokemonGo/POGOProtos/Inventory/Item/ItemData.cs
PokemonGo/POGOProtos/Inventory/Item/ItemId.cs
PokemonGo/POGOProtos/Inventory/Item/ItemType.cs
PokemonGo/POGOProtos/Inventory/Item/POGOProtosInventoryItem.cs
PokemonGo/POGOProtos/Inventory/POGOProtosInventory.cs
PokemonGo/POGOProtos/Map/Fort/FortData.cs
PokemonGo/POGOProtos/Map/Fort/FortLureInfo.cs
PokemonGo/POGOProtos/Map/Fort/FortModifier.cs
PokemonGo/POGOProtos/Map/Fort/FortRenderingType.cs
PokemonGo/POGOProtos/Map/Fort/FortSponsor.cs
PokemonGo/POGOProtos/Map/Fort/FortSummary.cs
PokemonGo/POGOProtos/Map/Fort/FortType.cs
PokemonGo/POGOProtos/Map/Fort/POGOProtosMapFort.cs
PokemonGo/POGOProtos/Map/MapCell.cs
PokemonGo/POGOProtos/Map/MapObjectsStatus.cs
PokemonGo/POGOProtos/Map/POGOProtosMap.cs
PokemonGo/POGOProtos/Map/Pokemon/MapPokemon.cs
PokemonGo/POGOProtos/Map/Pokemon/NearbyPokemon.cs
PokemonGo/POGOProtos/Map/Pokemon/POGOProtosMapPokemon.cs
PokemonGo/POGOProtos/Map/Pokemon/WildPokemon.cs
PokemonGo/POGOProtos/Map/SpawnPoint.cs
PokemonGo/POGOProtos/Networking/Envelopes/AuthTicket.cs
PokemonGo/POGOProtos/Networking/Envelopes/POGOProtosNetworkingEnvelopes.cs
PokemonGo/POGOProtos/Networking/Envelopes/RequestEnvelope.cs
PokemonGo/POGOProtos/Networking/Envelopes/ResponseEnvelope.cs
PokemonGo/POGOProtos/Networking/Envelopes/Unknown6.cs
PokemonGo/POGOProtos/Networking/Envelopes/Unknown6Response.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/AttackGymMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/EchoMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/FortDetailsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/FortSearchMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetInventoryMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/POGOProtosNetworkingRequestsMessages.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/SetAvatarMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseIncenseMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemGymMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.cs
PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.cs
PokemonGo/POGOProtos/Networking/Requests/POGOProtosNetworkingRequests.cs
PokemonGo/POGOProtos/Networking/Requests/Request.cs
PokemonGo/POGOProtos/Networking/Requests/RequestType.cs
PokemonGo/POGOProtos/Networking/Responses/AddFortModifierResponse.cs
PokemonGo/POGOProtos/Networking/Responses/AttackGymResponse.cs
PokemonGo/POGOProtos/Networking/Responses/CatchPokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.cs
PokemonGo/POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.cs
PokemonGo/POGOProtos/Networking/Responses/ClaimCodenameResponse.cs
PokemonGo/POGOProtos/Networking/Responses/CollectDailyBonusResponse.cs
PokemonGo/POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.cs
PokemonGo/POGOProtos/Networking/Responses/DiskEncounterResponse.cs
PokemonGo/POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.cs
PokemonGo/POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.cs
PokemonGo/POGOProtos/Networking/Responses/DownloadSettingsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/EchoResponse.cs
PokemonGo/POGOProtos/Networking/Responses/EncounterResponse.cs
PokemonGo/POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.cs
PokemonGo/POGOProtos/Networking/Responses/EquipBadgeResponse.cs
PokemonGo/POGOProtos/Networking/Responses/EvolvePokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/FortDeployPokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/FortDetailsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/FortRecallPokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/FortSearchResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetAssetDigestResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetDownloadUrlsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetGymDetailsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetHatchedEggsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetIncensePokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetInventoryResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetMapObjectsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetPlayerProfileResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetPlayerResponse.cs
PokemonGo/POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.cs
PokemonGo/POGOProtos/Networking/Responses/IncenseEncounterResponse.cs
PokemonGo/POGOProtos/Networking/Responses/LevelUpRewardsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.cs
PokemonGo/POGOProtos/Networking/Responses/NicknamePokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/POGOProtosNetworkingResponses.cs
PokemonGo/POGOProtos/Networking/Responses/PlayerUpdateResponse.cs
PokemonGo/POGOProtos/Networking/Responses/RecycleInventoryItemResponse.cs
PokemonGo/POGOProtos/Networking/Responses/ReleasePokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/SetAvatarResponse.cs
PokemonGo/POGOProtos/Networking/Responses/SetContactSettingsResponse.cs
PokemonGo/POGOProtos/Networking/Responses/SetFavoritePokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/SetPlayerTeamResponse.cs
PokemonGo/POGOProtos/Networking/Responses/SfidaActionLogResponse.cs
PokemonGo/POGOProtos/Networking/Responses/StartGymBattleResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UpgradePokemonResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseIncenseResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseItemCaptureResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseItemGymResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseItemPotionResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseItemReviveResponse.cs
PokemonGo/POGOProtos/Networking/Responses/UseItemXpBoostResponse.cs
PokemonGo/POGOProtos/Networking/Signature.cs
PokemonGo/POGOProtos/Networking/Signature/POGOProtosNetworkingSignature.cs
PokemonGo/POGOProtos/POGOProtos.csproj
PokemonGo/POGOProtos/Properties/AssemblyInfo.cs
PokemonGo/POGOProtos/Settings/DownloadSettingsAction.cs
PokemonGo/POGOProtos/Settings/FortSettings.cs
PokemonGo/POGOProtos/Settings/GlobalSettings.cs
PokemonGo/POGOProtos/Settings/InventorySettings.cs
PokemonGo/POGOProtos/Settings/LevelSettings.cs
PokemonGo/POGOProtos/Settings/MapSettings.cs
PokemonGo/POGOProtos/Settings/Master/BadgeSettings.cs
PokemonGo/POGOProtos/Settings/Master/CameraSettings.cs
PokemonGo/POGOProtos/Settings/Master/EncounterSettings.cs
PokemonGo/POGOProtos/Settings/Master/EquippedBadgeSettings.cs
PokemonGo/POGOProtos/Settings/Master/GymBattleSettings.cs
PokemonGo/POGOProtos/Settings/Master/GymLevelSettings.cs
PokemonGo/POGOProtos/Settings/Master/IapItemDisplay.cs
PokemonGo/POGOProtos/Settings/Master/IapSettings.cs
PokemonGo/POGOProtos/Settings/Master/Item/BattleAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/EggIncubatorAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/FoodAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/FortModifierAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/IncenseAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/POGOProtosSettingsMasterItem.cs
PokemonGo/POGOProtos/Settings/Master/Item/PokeballAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/PotionAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Item/ReviveAttributes.cs
PokemonGo/POGOProtos/Settings/Master/ItemSettings.cs
PokemonGo/POGOProtos/Settings/Master/MoveSequenceSettings.cs
PokemonGo/POGOProtos/Settings/Master/MoveSettings.cs
PokemonGo/POGOProtos/Settings/Master/POGOProtosSettingsMaster.cs
PokemonGo/POGOProtos/Settings/Master/PlayerLevelSettings.cs
PokemonGo/POGOProtos/Settings/Master/Pokemon/CameraAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Pokemon/EncounterAttributes.cs
PokemonGo/POGOProtos/Settings/Master/Pokemon/POGOProtosSettingsMasterPokemon.cs
PokemonGo/POGOProtos/Settings/Master/Pokemon/StatsAttributes.cs
PokemonGo/POGOProtos/Settings/Master/PokemonSettings.cs
PokemonGo/POGOProtos/Settings/Master/PokemonUpgradeSettings.cs
PokemonGo/POGOProtos/Settings/Master/TypeEffectiveSettings.cs
PokemonGo/POGOProtos/Settings/POGOProtosSettings.cs
PokemonGo/RocketAPI/.gitattributes
PokemonGo/RocketAPI/.gitignore
PokemonGo/RocketAPI/Client.cs
PokemonGo/RocketAPI/Exceptions/AccessTokenExpiredException.cs
PokemonGo/RocketAPI/Exceptions/AccountNotVerifiedException.cs
PokemonGo/RocketAPI/Exceptions/GoogleException.cs
PokemonGo/RocketAPI/Exceptions/GoogleOfflineException.cs
PokemonGo/RocketAPI/Exceptions/InvalidResponseException.cs
PokemonGo/RocketAPI/Exceptions/PTCOfflineException.cs
PokemonGo/RocketAPI/Extensions/DateTimeExtensions.cs
PokemonGo/RocketAPI/Extensions/HttpClientExtensions.cs
PokemonGo/RocketAPI/GeneratedCode/AllEnum.cs
PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
PokemonGo/RocketAPI/GeneratedCode/Request.cs
PokemonGo/RocketAPI/GeneratedCode/Response.cs
PokemonGo/RocketAPI/Helpers/HttpClientHelper.cs
PokemonGo/RocketAPI/Helpers/JsonHelper.cs
PokemonGo/RocketAPI/Helpers/RandomHelper.cs
PokemonGo/RocketAPI/Helpers/RequestBuilder.cs
PokemonGo/RocketAPI/Helpers/RetryHandler.cs
PokemonGo/RocketAPI/Helpers/S2Helper.cs
PokemonGo/RocketAPI/Helpers/Utils.cs
PokemonGo/RocketAPI/HttpClient/PokemonClient.cs
PokemonGo/RocketAPI/ISettings.cs
PokemonGo/RocketAPI/Login/GoogleLogin.cs
PokemonGo/RocketAPI/Login/PtcLogin.cs
PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
PokemonGo/RocketAPI/Properties/AssemblyInfo.cs
PokemonGo/RocketAPI/Proto/AllEnum.proto
PokemonGo/RocketAPI/Proto/Payloads.proto
PokemonGo/RocketAPI/Proto/Request.proto
PokemonGo/RocketAPI/Proto/Response.proto
PokemonGo/RocketAPI/README.md
PokemonGo/RocketAPI/Rpc/BaseRpc.cs
PokemonGo/RocketAPI/Rpc/Download.cs
PokemonGo/RocketAPI/Rpc/Encounter.cs
PokemonGo/RocketAPI/Rpc/Fort.cs
PokemonGo/RocketAPI/Rpc/Inventory.cs
PokemonGo/RocketAPI/Rpc/Login.cs
PokemonGo/RocketAPI/Rpc/Map.cs
PokemonGo/RocketAPI/Rpc/Misc.cs
PokemonGo/RocketAPI/Rpc/Player.cs
PokemonGo/RocketAPI/Window/ApiFailureStrategy.cs
PokemonGo/RocketAPI/Window/App.config
PokemonGo/RocketAPI/Window/LocationManager.cs
PokemonGo/RocketAPI/Window/MainForm.cs
PokemonGo/RocketAPI/Window/PokeUi.cs
PokemonGo/RocketAPI/Window/PokemonForm.cs
PokemonGo/RocketAPI/Window/PokemonGo.RocketAPI.Window.csproj
PokemonGo/RocketAPI/Window/Program.cs
PokemonGo/RocketAPI/Window/Properties/Resources.Designer.cs
PokemonGo/RocketAPI/Window/Properties/Settings.Designer.cs
PokemonGo/RocketAPI/Window/Resources/encrypt.dll
PokemonGo/RocketAPI/Window/RouteOptimizer.cs
PokemonGo/RocketAPI/Window/Settings.cs
PokemonGo/RocketAPI/Window/SettingsForm.cs
PokemonGo/RocketAPI/app.config
PokemonGo/RocketAPI/packages.config
README.md
Pokemon Go Rocket API.sln
diff --git a/PokemonGo/POGOProtos/Data/AssetDigestEntry.cs b/PokemonGo/POGOProtos/Data/AssetDigestEntry.cs
new file mode 100644
index 0000000..a9b8dfe
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/AssetDigestEntry.cs
@@ -0,0 +1,301 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/AssetDigestEntry.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/AssetDigestEntry.proto</summary>
+  public static partial class AssetDigestEntryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/AssetDigestEntry.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AssetDigestEntryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0RhdGEvQXNzZXREaWdlc3RFbnRyeS5wcm90bxIPUE9H",
+            "T1Byb3Rvcy5EYXRhIncKEEFzc2V0RGlnZXN0RW50cnkSEAoIYXNzZXRfaWQY",
+            "ASABKAkSEwoLYnVuZGxlX25hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoAxIQ",
+            "CghjaGVja3N1bRgEIAEoBxIMCgRzaXplGAUgASgFEgsKA2tleRgGIAEoDGIG",
+            "cHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.AssetDigestEntry), global::POGOProtos.Data.AssetDigestEntry.Parser, new[]{ "AssetId", "BundleName", "Version", "Checksum", "Size", "Key" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AssetDigestEntry : pb::IMessage<AssetDigestEntry> {
+    private static readonly pb::MessageParser<AssetDigestEntry> _parser = new pb::MessageParser<AssetDigestEntry>(() => new AssetDigestEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AssetDigestEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.AssetDigestEntryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AssetDigestEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AssetDigestEntry(AssetDigestEntry other) : this() {
+      assetId_ = other.assetId_;
+      bundleName_ = other.bundleName_;
+      version_ = other.version_;
+      checksum_ = other.checksum_;
+      size_ = other.size_;
+      key_ = other.key_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AssetDigestEntry Clone() {
+      return new AssetDigestEntry(this);
+    }
+
+    /// <summary>Field number for the "asset_id" field.</summary>
+    public const int AssetIdFieldNumber = 1;
+    private string assetId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string AssetId {
+      get { return assetId_; }
+      set {
+        assetId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "bundle_name" field.</summary>
+    public const int BundleNameFieldNumber = 2;
+    private string bundleName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BundleName {
+      get { return bundleName_; }
+      set {
+        bundleName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "version" field.</summary>
+    public const int VersionFieldNumber = 3;
+    private long version_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long Version {
+      get { return version_; }
+      set {
+        version_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "checksum" field.</summary>
+    public const int ChecksumFieldNumber = 4;
+    private uint checksum_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint Checksum {
+      get { return checksum_; }
+      set {
+        checksum_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "size" field.</summary>
+    public const int SizeFieldNumber = 5;
+    private int size_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Size {
+      get { return size_; }
+      set {
+        size_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "key" field.</summary>
+    public const int KeyFieldNumber = 6;
+    private pb::ByteString key_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString Key {
+      get { return key_; }
+      set {
+        key_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AssetDigestEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AssetDigestEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AssetId != other.AssetId) return false;
+      if (BundleName != other.BundleName) return false;
+      if (Version != other.Version) return false;
+      if (Checksum != other.Checksum) return false;
+      if (Size != other.Size) return false;
+      if (Key != other.Key) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AssetId.Length != 0) hash ^= AssetId.GetHashCode();
+      if (BundleName.Length != 0) hash ^= BundleName.GetHashCode();
+      if (Version != 0L) hash ^= Version.GetHashCode();
+      if (Checksum != 0) hash ^= Checksum.GetHashCode();
+      if (Size != 0) hash ^= Size.GetHashCode();
+      if (Key.Length != 0) hash ^= Key.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AssetId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(AssetId);
+      }
+      if (BundleName.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(BundleName);
+      }
+      if (Version != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(Version);
+      }
+      if (Checksum != 0) {
+        output.WriteRawTag(37);
+        output.WriteFixed32(Checksum);
+      }
+      if (Size != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(Size);
+      }
+      if (Key.Length != 0) {
+        output.WriteRawTag(50);
+        output.WriteBytes(Key);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AssetId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(AssetId);
+      }
+      if (BundleName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BundleName);
+      }
+      if (Version != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Version);
+      }
+      if (Checksum != 0) {
+        size += 1 + 4;
+      }
+      if (Size != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Size);
+      }
+      if (Key.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Key);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AssetDigestEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AssetId.Length != 0) {
+        AssetId = other.AssetId;
+      }
+      if (other.BundleName.Length != 0) {
+        BundleName = other.BundleName;
+      }
+      if (other.Version != 0L) {
+        Version = other.Version;
+      }
+      if (other.Checksum != 0) {
+        Checksum = other.Checksum;
+      }
+      if (other.Size != 0) {
+        Size = other.Size;
+      }
+      if (other.Key.Length != 0) {
+        Key = other.Key;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            AssetId = input.ReadString();
+            break;
+          }
+          case 18: {
+            BundleName = input.ReadString();
+            break;
+          }
+          case 24: {
+            Version = input.ReadInt64();
+            break;
+          }
+          case 37: {
+            Checksum = input.ReadFixed32();
+            break;
+          }
+          case 40: {
+            Size = input.ReadInt32();
+            break;
+          }
+          case 50: {
+            Key = input.ReadBytes();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleAction.cs b/PokemonGo/POGOProtos/Data/Battle/BattleAction.cs
new file mode 100644
index 0000000..fd6612b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleAction.cs
@@ -0,0 +1,527 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleAction.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleAction.proto</summary>
+  public static partial class BattleActionReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleAction.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleActionReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CilQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZUFjdGlvbi5wcm90bxIW",
+            "UE9HT1Byb3Rvcy5EYXRhLkJhdHRsZRoqUE9HT1Byb3Rvcy9EYXRhL0JhdHRs",
+            "ZS9CYXR0bGVSZXN1bHRzLnByb3RvGi1QT0dPUHJvdG9zL0RhdGEvQmF0dGxl",
+            "L0JhdHRsZUFjdGlvblR5cGUucHJvdG8aLlBPR09Qcm90b3MvRGF0YS9CYXR0",
+            "bGUvQmF0dGxlUGFydGljaXBhbnQucHJvdG8ihQQKDEJhdHRsZUFjdGlvbhI2",
+            "CgRUeXBlGAEgASgOMiguUE9HT1Byb3Rvcy5EYXRhLkJhdHRsZS5CYXR0bGVB",
+            "Y3Rpb25UeXBlEhcKD2FjdGlvbl9zdGFydF9tcxgCIAEoAxITCgtkdXJhdGlv",
+            "bl9tcxgDIAEoBRIUCgxlbmVyZ3lfZGVsdGEYBSABKAUSFgoOYXR0YWNrZXJf",
+            "aW5kZXgYBiABKAUSFAoMdGFyZ2V0X2luZGV4GAcgASgFEhkKEWFjdGl2ZV9w",
+            "b2tlbW9uX2lkGAggASgGEkAKDXBsYXllcl9qb2luZWQYCSABKAsyKS5QT0dP",
+            "UHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRsZVBhcnRpY2lwYW50Ej0KDmJhdHRs",
+            "ZV9yZXN1bHRzGAogASgLMiUuUE9HT1Byb3Rvcy5EYXRhLkJhdHRsZS5CYXR0",
+            "bGVSZXN1bHRzEioKImRhbWFnZV93aW5kb3dzX3N0YXJ0X3RpbWVzdGFtcF9t",
+            "c3MYCyABKAMSKAogZGFtYWdlX3dpbmRvd3NfZW5kX3RpbWVzdGFtcF9tc3MY",
+            "DCABKAMSPgoLcGxheWVyX2xlZnQYDSABKAsyKS5QT0dPUHJvdG9zLkRhdGEu",
+            "QmF0dGxlLkJhdHRsZVBhcnRpY2lwYW50EhkKEXRhcmdldF9wb2tlbW9uX2lk",
+            "GA4gASgGYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Battle.BattleResultsReflection.Descriptor, global::POGOProtos.Data.Battle.BattleActionTypeReflection.Descriptor, global::POGOProtos.Data.Battle.BattleParticipantReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleAction), global::POGOProtos.Data.Battle.BattleAction.Parser, new[]{ "Type", "ActionStartMs", "DurationMs", "EnergyDelta", "AttackerIndex", "TargetIndex", "ActivePokemonId", "PlayerJoined", "BattleResults", "DamageWindowsStartTimestampMss", "DamageWindowsEndTimestampMss", "PlayerLeft", "TargetPokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BattleAction : pb::IMessage<BattleAction> {
+    private static readonly pb::MessageParser<BattleAction> _parser = new pb::MessageParser<BattleAction>(() => new BattleAction());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleAction> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.BattleActionReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAction() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAction(BattleAction other) : this() {
+      type_ = other.type_;
+      actionStartMs_ = other.actionStartMs_;
+      durationMs_ = other.durationMs_;
+      energyDelta_ = other.energyDelta_;
+      attackerIndex_ = other.attackerIndex_;
+      targetIndex_ = other.targetIndex_;
+      activePokemonId_ = other.activePokemonId_;
+      PlayerJoined = other.playerJoined_ != null ? other.PlayerJoined.Clone() : null;
+      BattleResults = other.battleResults_ != null ? other.BattleResults.Clone() : null;
+      damageWindowsStartTimestampMss_ = other.damageWindowsStartTimestampMss_;
+      damageWindowsEndTimestampMss_ = other.damageWindowsEndTimestampMss_;
+      PlayerLeft = other.playerLeft_ != null ? other.PlayerLeft.Clone() : null;
+      targetPokemonId_ = other.targetPokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAction Clone() {
+      return new BattleAction(this);
+    }
+
+    /// <summary>Field number for the "Type" field.</summary>
+    public const int TypeFieldNumber = 1;
+    private global::POGOProtos.Data.Battle.BattleActionType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleActionType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "action_start_ms" field.</summary>
+    public const int ActionStartMsFieldNumber = 2;
+    private long actionStartMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ActionStartMs {
+      get { return actionStartMs_; }
+      set {
+        actionStartMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "duration_ms" field.</summary>
+    public const int DurationMsFieldNumber = 3;
+    private int durationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DurationMs {
+      get { return durationMs_; }
+      set {
+        durationMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "energy_delta" field.</summary>
+    public const int EnergyDeltaFieldNumber = 5;
+    private int energyDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EnergyDelta {
+      get { return energyDelta_; }
+      set {
+        energyDelta_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attacker_index" field.</summary>
+    public const int AttackerIndexFieldNumber = 6;
+    private int attackerIndex_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AttackerIndex {
+      get { return attackerIndex_; }
+      set {
+        attackerIndex_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_index" field.</summary>
+    public const int TargetIndexFieldNumber = 7;
+    private int targetIndex_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TargetIndex {
+      get { return targetIndex_; }
+      set {
+        targetIndex_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_pokemon_id" field.</summary>
+    public const int ActivePokemonIdFieldNumber = 8;
+    private ulong activePokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong ActivePokemonId {
+      get { return activePokemonId_; }
+      set {
+        activePokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_joined" field.</summary>
+    public const int PlayerJoinedFieldNumber = 9;
+    private global::POGOProtos.Data.Battle.BattleParticipant playerJoined_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleParticipant PlayerJoined {
+      get { return playerJoined_; }
+      set {
+        playerJoined_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_results" field.</summary>
+    public const int BattleResultsFieldNumber = 10;
+    private global::POGOProtos.Data.Battle.BattleResults battleResults_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleResults BattleResults {
+      get { return battleResults_; }
+      set {
+        battleResults_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_windows_start_timestamp_mss" field.</summary>
+    public const int DamageWindowsStartTimestampMssFieldNumber = 11;
+    private long damageWindowsStartTimestampMss_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DamageWindowsStartTimestampMss {
+      get { return damageWindowsStartTimestampMss_; }
+      set {
+        damageWindowsStartTimestampMss_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_windows_end_timestamp_mss" field.</summary>
+    public const int DamageWindowsEndTimestampMssFieldNumber = 12;
+    private long damageWindowsEndTimestampMss_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DamageWindowsEndTimestampMss {
+      get { return damageWindowsEndTimestampMss_; }
+      set {
+        damageWindowsEndTimestampMss_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_left" field.</summary>
+    public const int PlayerLeftFieldNumber = 13;
+    private global::POGOProtos.Data.Battle.BattleParticipant playerLeft_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleParticipant PlayerLeft {
+      get { return playerLeft_; }
+      set {
+        playerLeft_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_pokemon_id" field.</summary>
+    public const int TargetPokemonIdFieldNumber = 14;
+    private ulong targetPokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong TargetPokemonId {
+      get { return targetPokemonId_; }
+      set {
+        targetPokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleAction);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleAction other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Type != other.Type) return false;
+      if (ActionStartMs != other.ActionStartMs) return false;
+      if (DurationMs != other.DurationMs) return false;
+      if (EnergyDelta != other.EnergyDelta) return false;
+      if (AttackerIndex != other.AttackerIndex) return false;
+      if (TargetIndex != other.TargetIndex) return false;
+      if (ActivePokemonId != other.ActivePokemonId) return false;
+      if (!object.Equals(PlayerJoined, other.PlayerJoined)) return false;
+      if (!object.Equals(BattleResults, other.BattleResults)) return false;
+      if (DamageWindowsStartTimestampMss != other.DamageWindowsStartTimestampMss) return false;
+      if (DamageWindowsEndTimestampMss != other.DamageWindowsEndTimestampMss) return false;
+      if (!object.Equals(PlayerLeft, other.PlayerLeft)) return false;
+      if (TargetPokemonId != other.TargetPokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (ActionStartMs != 0L) hash ^= ActionStartMs.GetHashCode();
+      if (DurationMs != 0) hash ^= DurationMs.GetHashCode();
+      if (EnergyDelta != 0) hash ^= EnergyDelta.GetHashCode();
+      if (AttackerIndex != 0) hash ^= AttackerIndex.GetHashCode();
+      if (TargetIndex != 0) hash ^= TargetIndex.GetHashCode();
+      if (ActivePokemonId != 0UL) hash ^= ActivePokemonId.GetHashCode();
+      if (playerJoined_ != null) hash ^= PlayerJoined.GetHashCode();
+      if (battleResults_ != null) hash ^= BattleResults.GetHashCode();
+      if (DamageWindowsStartTimestampMss != 0L) hash ^= DamageWindowsStartTimestampMss.GetHashCode();
+      if (DamageWindowsEndTimestampMss != 0L) hash ^= DamageWindowsEndTimestampMss.GetHashCode();
+      if (playerLeft_ != null) hash ^= PlayerLeft.GetHashCode();
+      if (TargetPokemonId != 0UL) hash ^= TargetPokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Type != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Type);
+      }
+      if (ActionStartMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(ActionStartMs);
+      }
+      if (DurationMs != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(DurationMs);
+      }
+      if (EnergyDelta != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(EnergyDelta);
+      }
+      if (AttackerIndex != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(AttackerIndex);
+      }
+      if (TargetIndex != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(TargetIndex);
+      }
+      if (ActivePokemonId != 0UL) {
+        output.WriteRawTag(65);
+        output.WriteFixed64(ActivePokemonId);
+      }
+      if (playerJoined_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(PlayerJoined);
+      }
+      if (battleResults_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(BattleResults);
+      }
+      if (DamageWindowsStartTimestampMss != 0L) {
+        output.WriteRawTag(88);
+        output.WriteInt64(DamageWindowsStartTimestampMss);
+      }
+      if (DamageWindowsEndTimestampMss != 0L) {
+        output.WriteRawTag(96);
+        output.WriteInt64(DamageWindowsEndTimestampMss);
+      }
+      if (playerLeft_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(PlayerLeft);
+      }
+      if (TargetPokemonId != 0UL) {
+        output.WriteRawTag(113);
+        output.WriteFixed64(TargetPokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (ActionStartMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ActionStartMs);
+      }
+      if (DurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DurationMs);
+      }
+      if (EnergyDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EnergyDelta);
+      }
+      if (AttackerIndex != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AttackerIndex);
+      }
+      if (TargetIndex != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TargetIndex);
+      }
+      if (ActivePokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (playerJoined_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerJoined);
+      }
+      if (battleResults_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleResults);
+      }
+      if (DamageWindowsStartTimestampMss != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DamageWindowsStartTimestampMss);
+      }
+      if (DamageWindowsEndTimestampMss != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DamageWindowsEndTimestampMss);
+      }
+      if (playerLeft_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerLeft);
+      }
+      if (TargetPokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleAction other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.ActionStartMs != 0L) {
+        ActionStartMs = other.ActionStartMs;
+      }
+      if (other.DurationMs != 0) {
+        DurationMs = other.DurationMs;
+      }
+      if (other.EnergyDelta != 0) {
+        EnergyDelta = other.EnergyDelta;
+      }
+      if (other.AttackerIndex != 0) {
+        AttackerIndex = other.AttackerIndex;
+      }
+      if (other.TargetIndex != 0) {
+        TargetIndex = other.TargetIndex;
+      }
+      if (other.ActivePokemonId != 0UL) {
+        ActivePokemonId = other.ActivePokemonId;
+      }
+      if (other.playerJoined_ != null) {
+        if (playerJoined_ == null) {
+          playerJoined_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+        }
+        PlayerJoined.MergeFrom(other.PlayerJoined);
+      }
+      if (other.battleResults_ != null) {
+        if (battleResults_ == null) {
+          battleResults_ = new global::POGOProtos.Data.Battle.BattleResults();
+        }
+        BattleResults.MergeFrom(other.BattleResults);
+      }
+      if (other.DamageWindowsStartTimestampMss != 0L) {
+        DamageWindowsStartTimestampMss = other.DamageWindowsStartTimestampMss;
+      }
+      if (other.DamageWindowsEndTimestampMss != 0L) {
+        DamageWindowsEndTimestampMss = other.DamageWindowsEndTimestampMss;
+      }
+      if (other.playerLeft_ != null) {
+        if (playerLeft_ == null) {
+          playerLeft_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+        }
+        PlayerLeft.MergeFrom(other.PlayerLeft);
+      }
+      if (other.TargetPokemonId != 0UL) {
+        TargetPokemonId = other.TargetPokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            type_ = (global::POGOProtos.Data.Battle.BattleActionType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ActionStartMs = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            DurationMs = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            EnergyDelta = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            AttackerIndex = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            TargetIndex = input.ReadInt32();
+            break;
+          }
+          case 65: {
+            ActivePokemonId = input.ReadFixed64();
+            break;
+          }
+          case 74: {
+            if (playerJoined_ == null) {
+              playerJoined_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+            }
+            input.ReadMessage(playerJoined_);
+            break;
+          }
+          case 82: {
+            if (battleResults_ == null) {
+              battleResults_ = new global::POGOProtos.Data.Battle.BattleResults();
+            }
+            input.ReadMessage(battleResults_);
+            break;
+          }
+          case 88: {
+            DamageWindowsStartTimestampMss = input.ReadInt64();
+            break;
+          }
+          case 96: {
+            DamageWindowsEndTimestampMss = input.ReadInt64();
+            break;
+          }
+          case 106: {
+            if (playerLeft_ == null) {
+              playerLeft_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+            }
+            input.ReadMessage(playerLeft_);
+            break;
+          }
+          case 113: {
+            TargetPokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleActionType.cs b/PokemonGo/POGOProtos/Data/Battle/BattleActionType.cs
new file mode 100644
index 0000000..8c285d6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleActionType.cs
@@ -0,0 +1,59 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleActionType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleActionType.proto</summary>
+  public static partial class BattleActionTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleActionType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleActionTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci1QT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZUFjdGlvblR5cGUucHJv",
+            "dG8SFlBPR09Qcm90b3MuRGF0YS5CYXR0bGUq/AEKEEJhdHRsZUFjdGlvblR5",
+            "cGUSEAoMQUNUSU9OX1VOU0VUEAASEQoNQUNUSU9OX0FUVEFDSxABEhAKDEFD",
+            "VElPTl9ET0RHRRACEhkKFUFDVElPTl9TUEVDSUFMX0FUVEFDSxADEhcKE0FD",
+            "VElPTl9TV0FQX1BPS0VNT04QBBIQCgxBQ1RJT05fRkFJTlQQBRIWChJBQ1RJ",
+            "T05fUExBWUVSX0pPSU4QBhIWChJBQ1RJT05fUExBWUVSX1FVSVQQBxISCg5B",
+            "Q1RJT05fVklDVE9SWRAIEhEKDUFDVElPTl9ERUZFQVQQCRIUChBBQ1RJT05f",
+            "VElNRURfT1VUEApiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Data.Battle.BattleActionType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum BattleActionType {
+    [pbr::OriginalName("ACTION_UNSET")] ActionUnset = 0,
+    [pbr::OriginalName("ACTION_ATTACK")] ActionAttack = 1,
+    [pbr::OriginalName("ACTION_DODGE")] ActionDodge = 2,
+    [pbr::OriginalName("ACTION_SPECIAL_ATTACK")] ActionSpecialAttack = 3,
+    [pbr::OriginalName("ACTION_SWAP_POKEMON")] ActionSwapPokemon = 4,
+    [pbr::OriginalName("ACTION_FAINT")] ActionFaint = 5,
+    [pbr::OriginalName("ACTION_PLAYER_JOIN")] ActionPlayerJoin = 6,
+    [pbr::OriginalName("ACTION_PLAYER_QUIT")] ActionPlayerQuit = 7,
+    [pbr::OriginalName("ACTION_VICTORY")] ActionVictory = 8,
+    [pbr::OriginalName("ACTION_DEFEAT")] ActionDefeat = 9,
+    [pbr::OriginalName("ACTION_TIMED_OUT")] ActionTimedOut = 10,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleLog.cs b/PokemonGo/POGOProtos/Data/Battle/BattleLog.cs
new file mode 100644
index 0000000..bbdceea
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleLog.cs
@@ -0,0 +1,299 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleLog.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleLog.proto</summary>
+  public static partial class BattleLogReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleLog.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleLogReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZUxvZy5wcm90bxIWUE9H",
+            "T1Byb3Rvcy5EYXRhLkJhdHRsZRooUE9HT1Byb3Rvcy9EYXRhL0JhdHRsZS9C",
+            "YXR0bGVTdGF0ZS5wcm90bxonUE9HT1Byb3Rvcy9EYXRhL0JhdHRsZS9CYXR0",
+            "bGVUeXBlLnByb3RvGilQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZUFj",
+            "dGlvbi5wcm90byKNAgoJQmF0dGxlTG9nEjIKBXN0YXRlGAEgASgOMiMuUE9H",
+            "T1Byb3Rvcy5EYXRhLkJhdHRsZS5CYXR0bGVTdGF0ZRI3CgtiYXR0bGVfdHlw",
+            "ZRgCIAEoDjIiLlBPR09Qcm90b3MuRGF0YS5CYXR0bGUuQmF0dGxlVHlwZRIR",
+            "CglzZXJ2ZXJfbXMYAyABKAMSPAoOYmF0dGxlX2FjdGlvbnMYBCADKAsyJC5Q",
+            "T0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRsZUFjdGlvbhIhChliYXR0bGVf",
+            "c3RhcnRfdGltZXN0YW1wX21zGAUgASgDEh8KF2JhdHRsZV9lbmRfdGltZXN0",
+            "YW1wX21zGAYgASgDYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Battle.BattleStateReflection.Descriptor, global::POGOProtos.Data.Battle.BattleTypeReflection.Descriptor, global::POGOProtos.Data.Battle.BattleActionReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleLog), global::POGOProtos.Data.Battle.BattleLog.Parser, new[]{ "State", "BattleType", "ServerMs", "BattleActions", "BattleStartTimestampMs", "BattleEndTimestampMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BattleLog : pb::IMessage<BattleLog> {
+    private static readonly pb::MessageParser<BattleLog> _parser = new pb::MessageParser<BattleLog>(() => new BattleLog());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleLog> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.BattleLogReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleLog() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleLog(BattleLog other) : this() {
+      state_ = other.state_;
+      battleType_ = other.battleType_;
+      serverMs_ = other.serverMs_;
+      battleActions_ = other.battleActions_.Clone();
+      battleStartTimestampMs_ = other.battleStartTimestampMs_;
+      battleEndTimestampMs_ = other.battleEndTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleLog Clone() {
+      return new BattleLog(this);
+    }
+
+    /// <summary>Field number for the "state" field.</summary>
+    public const int StateFieldNumber = 1;
+    private global::POGOProtos.Data.Battle.BattleState state_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleState State {
+      get { return state_; }
+      set {
+        state_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_type" field.</summary>
+    public const int BattleTypeFieldNumber = 2;
+    private global::POGOProtos.Data.Battle.BattleType battleType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleType BattleType {
+      get { return battleType_; }
+      set {
+        battleType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "server_ms" field.</summary>
+    public const int ServerMsFieldNumber = 3;
+    private long serverMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ServerMs {
+      get { return serverMs_; }
+      set {
+        serverMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_actions" field.</summary>
+    public const int BattleActionsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattleAction> _repeated_battleActions_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Data.Battle.BattleAction.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> battleActions_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> BattleActions {
+      get { return battleActions_; }
+    }
+
+    /// <summary>Field number for the "battle_start_timestamp_ms" field.</summary>
+    public const int BattleStartTimestampMsFieldNumber = 5;
+    private long battleStartTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleStartTimestampMs {
+      get { return battleStartTimestampMs_; }
+      set {
+        battleStartTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_end_timestamp_ms" field.</summary>
+    public const int BattleEndTimestampMsFieldNumber = 6;
+    private long battleEndTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleEndTimestampMs {
+      get { return battleEndTimestampMs_; }
+      set {
+        battleEndTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleLog);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleLog other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (State != other.State) return false;
+      if (BattleType != other.BattleType) return false;
+      if (ServerMs != other.ServerMs) return false;
+      if(!battleActions_.Equals(other.battleActions_)) return false;
+      if (BattleStartTimestampMs != other.BattleStartTimestampMs) return false;
+      if (BattleEndTimestampMs != other.BattleEndTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (State != 0) hash ^= State.GetHashCode();
+      if (BattleType != 0) hash ^= BattleType.GetHashCode();
+      if (ServerMs != 0L) hash ^= ServerMs.GetHashCode();
+      hash ^= battleActions_.GetHashCode();
+      if (BattleStartTimestampMs != 0L) hash ^= BattleStartTimestampMs.GetHashCode();
+      if (BattleEndTimestampMs != 0L) hash ^= BattleEndTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (State != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) State);
+      }
+      if (BattleType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) BattleType);
+      }
+      if (ServerMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(ServerMs);
+      }
+      battleActions_.WriteTo(output, _repeated_battleActions_codec);
+      if (BattleStartTimestampMs != 0L) {
+        output.WriteRawTag(40);
+        output.WriteInt64(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        output.WriteRawTag(48);
+        output.WriteInt64(BattleEndTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (State != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) State);
+      }
+      if (BattleType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BattleType);
+      }
+      if (ServerMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ServerMs);
+      }
+      size += battleActions_.CalculateSize(_repeated_battleActions_codec);
+      if (BattleStartTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleEndTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleLog other) {
+      if (other == null) {
+        return;
+      }
+      if (other.State != 0) {
+        State = other.State;
+      }
+      if (other.BattleType != 0) {
+        BattleType = other.BattleType;
+      }
+      if (other.ServerMs != 0L) {
+        ServerMs = other.ServerMs;
+      }
+      battleActions_.Add(other.battleActions_);
+      if (other.BattleStartTimestampMs != 0L) {
+        BattleStartTimestampMs = other.BattleStartTimestampMs;
+      }
+      if (other.BattleEndTimestampMs != 0L) {
+        BattleEndTimestampMs = other.BattleEndTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            state_ = (global::POGOProtos.Data.Battle.BattleState) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            battleType_ = (global::POGOProtos.Data.Battle.BattleType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            ServerMs = input.ReadInt64();
+            break;
+          }
+          case 34: {
+            battleActions_.AddEntriesFrom(input, _repeated_battleActions_codec);
+            break;
+          }
+          case 40: {
+            BattleStartTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 48: {
+            BattleEndTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleParticipant.cs b/PokemonGo/POGOProtos/Data/Battle/BattleParticipant.cs
new file mode 100644
index 0000000..30410b6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleParticipant.cs
@@ -0,0 +1,247 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleParticipant.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleParticipant.proto</summary>
+  public static partial class BattleParticipantReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleParticipant.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleParticipantReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci5QT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZVBhcnRpY2lwYW50LnBy",
+            "b3RvEhZQT0dPUHJvdG9zLkRhdGEuQmF0dGxlGi5QT0dPUHJvdG9zL0RhdGEv",
+            "QmF0dGxlL0JhdHRsZVBva2Vtb25JbmZvLnByb3RvGjBQT0dPUHJvdG9zL0Rh",
+            "dGEvUGxheWVyL1BsYXllclB1YmxpY1Byb2ZpbGUucHJvdG8irAIKEUJhdHRs",
+            "ZVBhcnRpY2lwYW50EkEKDmFjdGl2ZV9wb2tlbW9uGAEgASgLMikuUE9HT1By",
+            "b3Rvcy5EYXRhLkJhdHRsZS5CYXR0bGVQb2tlbW9uSW5mbxJLChZ0cmFpbmVy",
+            "X3B1YmxpY19wcm9maWxlGAIgASgLMisuUE9HT1Byb3Rvcy5EYXRhLlBsYXll",
+            "ci5QbGF5ZXJQdWJsaWNQcm9maWxlEkIKD3JldmVyc2VfcG9rZW1vbhgDIAMo",
+            "CzIpLlBPR09Qcm90b3MuRGF0YS5CYXR0bGUuQmF0dGxlUG9rZW1vbkluZm8S",
+            "QwoQZGVmZWF0ZWRfcG9rZW1vbhgEIAMoCzIpLlBPR09Qcm90b3MuRGF0YS5C",
+            "YXR0bGUuQmF0dGxlUG9rZW1vbkluZm9iBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Battle.BattlePokemonInfoReflection.Descriptor, global::POGOProtos.Data.Player.PlayerPublicProfileReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleParticipant), global::POGOProtos.Data.Battle.BattleParticipant.Parser, new[]{ "ActivePokemon", "TrainerPublicProfile", "ReversePokemon", "DefeatedPokemon" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BattleParticipant : pb::IMessage<BattleParticipant> {
+    private static readonly pb::MessageParser<BattleParticipant> _parser = new pb::MessageParser<BattleParticipant>(() => new BattleParticipant());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleParticipant> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.BattleParticipantReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleParticipant() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleParticipant(BattleParticipant other) : this() {
+      ActivePokemon = other.activePokemon_ != null ? other.ActivePokemon.Clone() : null;
+      TrainerPublicProfile = other.trainerPublicProfile_ != null ? other.TrainerPublicProfile.Clone() : null;
+      reversePokemon_ = other.reversePokemon_.Clone();
+      defeatedPokemon_ = other.defeatedPokemon_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleParticipant Clone() {
+      return new BattleParticipant(this);
+    }
+
+    /// <summary>Field number for the "active_pokemon" field.</summary>
+    public const int ActivePokemonFieldNumber = 1;
+    private global::POGOProtos.Data.Battle.BattlePokemonInfo activePokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattlePokemonInfo ActivePokemon {
+      get { return activePokemon_; }
+      set {
+        activePokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_public_profile" field.</summary>
+    public const int TrainerPublicProfileFieldNumber = 2;
+    private global::POGOProtos.Data.Player.PlayerPublicProfile trainerPublicProfile_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerPublicProfile TrainerPublicProfile {
+      get { return trainerPublicProfile_; }
+      set {
+        trainerPublicProfile_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "reverse_pokemon" field.</summary>
+    public const int ReversePokemonFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattlePokemonInfo> _repeated_reversePokemon_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.Battle.BattlePokemonInfo.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> reversePokemon_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> ReversePokemon {
+      get { return reversePokemon_; }
+    }
+
+    /// <summary>Field number for the "defeated_pokemon" field.</summary>
+    public const int DefeatedPokemonFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattlePokemonInfo> _repeated_defeatedPokemon_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Data.Battle.BattlePokemonInfo.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> defeatedPokemon_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> DefeatedPokemon {
+      get { return defeatedPokemon_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleParticipant);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleParticipant other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(ActivePokemon, other.ActivePokemon)) return false;
+      if (!object.Equals(TrainerPublicProfile, other.TrainerPublicProfile)) return false;
+      if(!reversePokemon_.Equals(other.reversePokemon_)) return false;
+      if(!defeatedPokemon_.Equals(other.defeatedPokemon_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (activePokemon_ != null) hash ^= ActivePokemon.GetHashCode();
+      if (trainerPublicProfile_ != null) hash ^= TrainerPublicProfile.GetHashCode();
+      hash ^= reversePokemon_.GetHashCode();
+      hash ^= defeatedPokemon_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (activePokemon_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(ActivePokemon);
+      }
+      if (trainerPublicProfile_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(TrainerPublicProfile);
+      }
+      reversePokemon_.WriteTo(output, _repeated_reversePokemon_codec);
+      defeatedPokemon_.WriteTo(output, _repeated_defeatedPokemon_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (activePokemon_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActivePokemon);
+      }
+      if (trainerPublicProfile_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TrainerPublicProfile);
+      }
+      size += reversePokemon_.CalculateSize(_repeated_reversePokemon_codec);
+      size += defeatedPokemon_.CalculateSize(_repeated_defeatedPokemon_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleParticipant other) {
+      if (other == null) {
+        return;
+      }
+      if (other.activePokemon_ != null) {
+        if (activePokemon_ == null) {
+          activePokemon_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+        }
+        ActivePokemon.MergeFrom(other.ActivePokemon);
+      }
+      if (other.trainerPublicProfile_ != null) {
+        if (trainerPublicProfile_ == null) {
+          trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+        }
+        TrainerPublicProfile.MergeFrom(other.TrainerPublicProfile);
+      }
+      reversePokemon_.Add(other.reversePokemon_);
+      defeatedPokemon_.Add(other.defeatedPokemon_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (activePokemon_ == null) {
+              activePokemon_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+            }
+            input.ReadMessage(activePokemon_);
+            break;
+          }
+          case 18: {
+            if (trainerPublicProfile_ == null) {
+              trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+            }
+            input.ReadMessage(trainerPublicProfile_);
+            break;
+          }
+          case 26: {
+            reversePokemon_.AddEntriesFrom(input, _repeated_reversePokemon_codec);
+            break;
+          }
+          case 34: {
+            defeatedPokemon_.AddEntriesFrom(input, _repeated_defeatedPokemon_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattlePokemonInfo.cs b/PokemonGo/POGOProtos/Data/Battle/BattlePokemonInfo.cs
new file mode 100644
index 0000000..fb8f52d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattlePokemonInfo.cs
@@ -0,0 +1,224 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattlePokemonInfo.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattlePokemonInfo.proto</summary>
+  public static partial class BattlePokemonInfoReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattlePokemonInfo.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattlePokemonInfoReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci5QT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZVBva2Vtb25JbmZvLnBy",
+            "b3RvEhZQT0dPUHJvdG9zLkRhdGEuQmF0dGxlGiFQT0dPUHJvdG9zL0RhdGEv",
+            "UG9rZW1vbkRhdGEucHJvdG8idwoRQmF0dGxlUG9rZW1vbkluZm8SMgoMcG9r",
+            "ZW1vbl9kYXRhGAEgASgLMhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRh",
+            "EhYKDmN1cnJlbnRfaGVhbHRoGAIgASgFEhYKDmN1cnJlbnRfZW5lcmd5GAMg",
+            "ASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattlePokemonInfo), global::POGOProtos.Data.Battle.BattlePokemonInfo.Parser, new[]{ "PokemonData", "CurrentHealth", "CurrentEnergy" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BattlePokemonInfo : pb::IMessage<BattlePokemonInfo> {
+    private static readonly pb::MessageParser<BattlePokemonInfo> _parser = new pb::MessageParser<BattlePokemonInfo>(() => new BattlePokemonInfo());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattlePokemonInfo> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.BattlePokemonInfoReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattlePokemonInfo() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattlePokemonInfo(BattlePokemonInfo other) : this() {
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      currentHealth_ = other.currentHealth_;
+      currentEnergy_ = other.currentEnergy_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattlePokemonInfo Clone() {
+      return new BattlePokemonInfo(this);
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 1;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_health" field.</summary>
+    public const int CurrentHealthFieldNumber = 2;
+    private int currentHealth_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CurrentHealth {
+      get { return currentHealth_; }
+      set {
+        currentHealth_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_energy" field.</summary>
+    public const int CurrentEnergyFieldNumber = 3;
+    private int currentEnergy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CurrentEnergy {
+      get { return currentEnergy_; }
+      set {
+        currentEnergy_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattlePokemonInfo);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattlePokemonInfo other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (CurrentHealth != other.CurrentHealth) return false;
+      if (CurrentEnergy != other.CurrentEnergy) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (CurrentHealth != 0) hash ^= CurrentHealth.GetHashCode();
+      if (CurrentEnergy != 0) hash ^= CurrentEnergy.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (pokemonData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PokemonData);
+      }
+      if (CurrentHealth != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(CurrentHealth);
+      }
+      if (CurrentEnergy != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(CurrentEnergy);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (CurrentHealth != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CurrentHealth);
+      }
+      if (CurrentEnergy != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CurrentEnergy);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattlePokemonInfo other) {
+      if (other == null) {
+        return;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.CurrentHealth != 0) {
+        CurrentHealth = other.CurrentHealth;
+      }
+      if (other.CurrentEnergy != 0) {
+        CurrentEnergy = other.CurrentEnergy;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 16: {
+            CurrentHealth = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            CurrentEnergy = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleResults.cs b/PokemonGo/POGOProtos/Data/Battle/BattleResults.cs
new file mode 100644
index 0000000..5eaa264
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleResults.cs
@@ -0,0 +1,268 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleResults.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleResults.proto</summary>
+  public static partial class BattleResultsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleResults.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleResultsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CipQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZVJlc3VsdHMucHJvdG8S",
+            "FlBPR09Qcm90b3MuRGF0YS5CYXR0bGUaIlBPR09Qcm90b3MvRGF0YS9HeW0v",
+            "R3ltU3RhdGUucHJvdG8aLlBPR09Qcm90b3MvRGF0YS9CYXR0bGUvQmF0dGxl",
+            "UGFydGljaXBhbnQucHJvdG8i3gEKDUJhdHRsZVJlc3VsdHMSMAoJZ3ltX3N0",
+            "YXRlGAEgASgLMh0uUE9HT1Byb3Rvcy5EYXRhLkd5bS5HeW1TdGF0ZRI8Cglh",
+            "dHRhY2tlcnMYAiADKAsyKS5QT0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRs",
+            "ZVBhcnRpY2lwYW50EiEKGXBsYXllcl9leHBlcmllbmNlX2F3YXJkZWQYAyAD",
+            "KAUSIAoYbmV4dF9kZWZlbmRlcl9wb2tlbW9uX2lkGAQgASgDEhgKEGd5bV9w",
+            "b2ludHNfZGVsdGEYBSABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Gym.GymStateReflection.Descriptor, global::POGOProtos.Data.Battle.BattleParticipantReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleResults), global::POGOProtos.Data.Battle.BattleResults.Parser, new[]{ "GymState", "Attackers", "PlayerExperienceAwarded", "NextDefenderPokemonId", "GymPointsDelta" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BattleResults : pb::IMessage<BattleResults> {
+    private static readonly pb::MessageParser<BattleResults> _parser = new pb::MessageParser<BattleResults>(() => new BattleResults());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleResults> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.BattleResultsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleResults() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleResults(BattleResults other) : this() {
+      GymState = other.gymState_ != null ? other.GymState.Clone() : null;
+      attackers_ = other.attackers_.Clone();
+      playerExperienceAwarded_ = other.playerExperienceAwarded_.Clone();
+      nextDefenderPokemonId_ = other.nextDefenderPokemonId_;
+      gymPointsDelta_ = other.gymPointsDelta_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleResults Clone() {
+      return new BattleResults(this);
+    }
+
+    /// <summary>Field number for the "gym_state" field.</summary>
+    public const int GymStateFieldNumber = 1;
+    private global::POGOProtos.Data.Gym.GymState gymState_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Gym.GymState GymState {
+      get { return gymState_; }
+      set {
+        gymState_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attackers" field.</summary>
+    public const int AttackersFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattleParticipant> _repeated_attackers_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Data.Battle.BattleParticipant.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleParticipant> attackers_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleParticipant>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleParticipant> Attackers {
+      get { return attackers_; }
+    }
+
+    /// <summary>Field number for the "player_experience_awarded" field.</summary>
+    public const int PlayerExperienceAwardedFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_playerExperienceAwarded_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> playerExperienceAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> PlayerExperienceAwarded {
+      get { return playerExperienceAwarded_; }
+    }
+
+    /// <summary>Field number for the "next_defender_pokemon_id" field.</summary>
+    public const int NextDefenderPokemonIdFieldNumber = 4;
+    private long nextDefenderPokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextDefenderPokemonId {
+      get { return nextDefenderPokemonId_; }
+      set {
+        nextDefenderPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_points_delta" field.</summary>
+    public const int GymPointsDeltaFieldNumber = 5;
+    private int gymPointsDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GymPointsDelta {
+      get { return gymPointsDelta_; }
+      set {
+        gymPointsDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleResults);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleResults other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(GymState, other.GymState)) return false;
+      if(!attackers_.Equals(other.attackers_)) return false;
+      if(!playerExperienceAwarded_.Equals(other.playerExperienceAwarded_)) return false;
+      if (NextDefenderPokemonId != other.NextDefenderPokemonId) return false;
+      if (GymPointsDelta != other.GymPointsDelta) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (gymState_ != null) hash ^= GymState.GetHashCode();
+      hash ^= attackers_.GetHashCode();
+      hash ^= playerExperienceAwarded_.GetHashCode();
+      if (NextDefenderPokemonId != 0L) hash ^= NextDefenderPokemonId.GetHashCode();
+      if (GymPointsDelta != 0) hash ^= GymPointsDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (gymState_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(GymState);
+      }
+      attackers_.WriteTo(output, _repeated_attackers_codec);
+      playerExperienceAwarded_.WriteTo(output, _repeated_playerExperienceAwarded_codec);
+      if (NextDefenderPokemonId != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(NextDefenderPokemonId);
+      }
+      if (GymPointsDelta != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(GymPointsDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (gymState_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymState);
+      }
+      size += attackers_.CalculateSize(_repeated_attackers_codec);
+      size += playerExperienceAwarded_.CalculateSize(_repeated_playerExperienceAwarded_codec);
+      if (NextDefenderPokemonId != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextDefenderPokemonId);
+      }
+      if (GymPointsDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GymPointsDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleResults other) {
+      if (other == null) {
+        return;
+      }
+      if (other.gymState_ != null) {
+        if (gymState_ == null) {
+          gymState_ = new global::POGOProtos.Data.Gym.GymState();
+        }
+        GymState.MergeFrom(other.GymState);
+      }
+      attackers_.Add(other.attackers_);
+      playerExperienceAwarded_.Add(other.playerExperienceAwarded_);
+      if (other.NextDefenderPokemonId != 0L) {
+        NextDefenderPokemonId = other.NextDefenderPokemonId;
+      }
+      if (other.GymPointsDelta != 0) {
+        GymPointsDelta = other.GymPointsDelta;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (gymState_ == null) {
+              gymState_ = new global::POGOProtos.Data.Gym.GymState();
+            }
+            input.ReadMessage(gymState_);
+            break;
+          }
+          case 18: {
+            attackers_.AddEntriesFrom(input, _repeated_attackers_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            playerExperienceAwarded_.AddEntriesFrom(input, _repeated_playerExperienceAwarded_codec);
+            break;
+          }
+          case 32: {
+            NextDefenderPokemonId = input.ReadInt64();
+            break;
+          }
+          case 40: {
+            GymPointsDelta = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleState.cs b/PokemonGo/POGOProtos/Data/Battle/BattleState.cs
new file mode 100644
index 0000000..c877b5e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleState.cs
@@ -0,0 +1,49 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleState.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleState.proto</summary>
+  public static partial class BattleStateReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleState.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleStateReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZVN0YXRlLnByb3RvEhZQ",
+            "T0dPUHJvdG9zLkRhdGEuQmF0dGxlKlQKC0JhdHRsZVN0YXRlEg8KC1NUQVRF",
+            "X1VOU0VUEAASCgoGQUNUSVZFEAESCwoHVklDVE9SWRACEgwKCERFRkVBVEVE",
+            "EAMSDQoJVElNRURfT1VUEARiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Data.Battle.BattleState), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum BattleState {
+    [pbr::OriginalName("STATE_UNSET")] StateUnset = 0,
+    [pbr::OriginalName("ACTIVE")] Active = 1,
+    [pbr::OriginalName("VICTORY")] Victory = 2,
+    [pbr::OriginalName("DEFEATED")] Defeated = 3,
+    [pbr::OriginalName("TIMED_OUT")] TimedOut = 4,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/BattleType.cs b/PokemonGo/POGOProtos/Data/Battle/BattleType.cs
new file mode 100644
index 0000000..99a286c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/BattleType.cs
@@ -0,0 +1,47 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Battle/BattleType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Battle/BattleType.proto</summary>
+  public static partial class BattleTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Battle/BattleType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZVR5cGUucHJvdG8SFlBP",
+            "R09Qcm90b3MuRGF0YS5CYXR0bGUqPQoKQmF0dGxlVHlwZRIVChFCQVRUTEVf",
+            "VFlQRV9VTlNFVBAAEgoKBk5PUk1BTBABEgwKCFRSQUlOSU5HEAJiBnByb3Rv",
+            "Mw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Data.Battle.BattleType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum BattleType {
+    [pbr::OriginalName("BATTLE_TYPE_UNSET")] Unset = 0,
+    [pbr::OriginalName("NORMAL")] Normal = 1,
+    [pbr::OriginalName("TRAINING")] Training = 2,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Battle/POGOProtosDataBattle.cs b/PokemonGo/POGOProtos/Data/Battle/POGOProtosDataBattle.cs
new file mode 100644
index 0000000..447d927
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Battle/POGOProtosDataBattle.cs
@@ -0,0 +1,1435 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Data.Battle.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Battle {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Data.Battle.proto</summary>
+  public static partial class POGOProtosDataBattleReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Data.Battle.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosDataBattleReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChxQT0dPUHJvdG9zLkRhdGEuQmF0dGxlLnByb3RvEhZQT0dPUHJvdG9zLkRh",
+            "dGEuQmF0dGxlGhVQT0dPUHJvdG9zLkRhdGEucHJvdG8aGVBPR09Qcm90b3Mu",
+            "RGF0YS5HeW0ucHJvdG8aHFBPR09Qcm90b3MuRGF0YS5QbGF5ZXIucHJvdG8i",
+            "dwoRQmF0dGxlUG9rZW1vbkluZm8SMgoMcG9rZW1vbl9kYXRhGAEgASgLMhwu",
+            "UE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEhYKDmN1cnJlbnRfaGVhbHRo",
+            "GAIgASgFEhYKDmN1cnJlbnRfZW5lcmd5GAMgASgFIt4BCg1CYXR0bGVSZXN1",
+            "bHRzEjAKCWd5bV9zdGF0ZRgBIAEoCzIdLlBPR09Qcm90b3MuRGF0YS5HeW0u",
+            "R3ltU3RhdGUSPAoJYXR0YWNrZXJzGAIgAygLMikuUE9HT1Byb3Rvcy5EYXRh",
+            "LkJhdHRsZS5CYXR0bGVQYXJ0aWNpcGFudBIhChlwbGF5ZXJfZXhwZXJpZW5j",
+            "ZV9hd2FyZGVkGAMgAygFEiAKGG5leHRfZGVmZW5kZXJfcG9rZW1vbl9pZBgE",
+            "IAEoAxIYChBneW1fcG9pbnRzX2RlbHRhGAUgASgFIo0CCglCYXR0bGVMb2cS",
+            "MgoFc3RhdGUYASABKA4yIy5QT0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRs",
+            "ZVN0YXRlEjcKC2JhdHRsZV90eXBlGAIgASgOMiIuUE9HT1Byb3Rvcy5EYXRh",
+            "LkJhdHRsZS5CYXR0bGVUeXBlEhEKCXNlcnZlcl9tcxgDIAEoAxI8Cg5iYXR0",
+            "bGVfYWN0aW9ucxgEIAMoCzIkLlBPR09Qcm90b3MuRGF0YS5CYXR0bGUuQmF0",
+            "dGxlQWN0aW9uEiEKGWJhdHRsZV9zdGFydF90aW1lc3RhbXBfbXMYBSABKAMS",
+            "HwoXYmF0dGxlX2VuZF90aW1lc3RhbXBfbXMYBiABKAMirAIKEUJhdHRsZVBh",
+            "cnRpY2lwYW50EkEKDmFjdGl2ZV9wb2tlbW9uGAEgASgLMikuUE9HT1Byb3Rv",
+            "cy5EYXRhLkJhdHRsZS5CYXR0bGVQb2tlbW9uSW5mbxJLChZ0cmFpbmVyX3B1",
+            "YmxpY19wcm9maWxlGAIgASgLMisuUE9HT1Byb3Rvcy5EYXRhLlBsYXllci5Q",
+            "bGF5ZXJQdWJsaWNQcm9maWxlEkIKD3JldmVyc2VfcG9rZW1vbhgDIAMoCzIp",
+            "LlBPR09Qcm90b3MuRGF0YS5CYXR0bGUuQmF0dGxlUG9rZW1vbkluZm8SQwoQ",
+            "ZGVmZWF0ZWRfcG9rZW1vbhgEIAMoCzIpLlBPR09Qcm90b3MuRGF0YS5CYXR0",
+            "bGUuQmF0dGxlUG9rZW1vbkluZm8ihQQKDEJhdHRsZUFjdGlvbhI2CgRUeXBl",
+            "GAEgASgOMiguUE9HT1Byb3Rvcy5EYXRhLkJhdHRsZS5CYXR0bGVBY3Rpb25U",
+            "eXBlEhcKD2FjdGlvbl9zdGFydF9tcxgCIAEoAxITCgtkdXJhdGlvbl9tcxgD",
+            "IAEoBRIUCgxlbmVyZ3lfZGVsdGEYBSABKAUSFgoOYXR0YWNrZXJfaW5kZXgY",
+            "BiABKAUSFAoMdGFyZ2V0X2luZGV4GAcgASgFEhkKEWFjdGl2ZV9wb2tlbW9u",
+            "X2lkGAggASgGEkAKDXBsYXllcl9qb2luZWQYCSABKAsyKS5QT0dPUHJvdG9z",
+            "LkRhdGEuQmF0dGxlLkJhdHRsZVBhcnRpY2lwYW50Ej0KDmJhdHRsZV9yZXN1",
+            "bHRzGAogASgLMiUuUE9HT1Byb3Rvcy5EYXRhLkJhdHRsZS5CYXR0bGVSZXN1",
+            "bHRzEioKImRhbWFnZV93aW5kb3dzX3N0YXJ0X3RpbWVzdGFtcF9tc3MYCyAB",
+            "KAMSKAogZGFtYWdlX3dpbmRvd3NfZW5kX3RpbWVzdGFtcF9tc3MYDCABKAMS",
+            "PgoLcGxheWVyX2xlZnQYDSABKAsyKS5QT0dPUHJvdG9zLkRhdGEuQmF0dGxl",
+            "LkJhdHRsZVBhcnRpY2lwYW50EhkKEXRhcmdldF9wb2tlbW9uX2lkGA4gASgG",
+            "KlQKC0JhdHRsZVN0YXRlEg8KC1NUQVRFX1VOU0VUEAASCgoGQUNUSVZFEAES",
+            "CwoHVklDVE9SWRACEgwKCERFRkVBVEVEEAMSDQoJVElNRURfT1VUEAQq/AEK",
+            "EEJhdHRsZUFjdGlvblR5cGUSEAoMQUNUSU9OX1VOU0VUEAASEQoNQUNUSU9O",
+            "X0FUVEFDSxABEhAKDEFDVElPTl9ET0RHRRACEhkKFUFDVElPTl9TUEVDSUFM",
+            "X0FUVEFDSxADEhcKE0FDVElPTl9TV0FQX1BPS0VNT04QBBIQCgxBQ1RJT05f",
+            "RkFJTlQQBRIWChJBQ1RJT05fUExBWUVSX0pPSU4QBhIWChJBQ1RJT05fUExB",
+            "WUVSX1FVSVQQBxISCg5BQ1RJT05fVklDVE9SWRAIEhEKDUFDVElPTl9ERUZF",
+            "QVQQCRIUChBBQ1RJT05fVElNRURfT1VUEAoqPQoKQmF0dGxlVHlwZRIVChFC",
+            "QVRUTEVfVFlQRV9VTlNFVBAAEgoKBk5PUk1BTBABEgwKCFRSQUlOSU5HEAJQ",
+            "AFABUAJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.POGOProtosDataReflection.Descriptor, global::POGOProtos.Data.Gym.POGOProtosDataGymReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Data.Battle.BattleState), typeof(global::POGOProtos.Data.Battle.BattleActionType), typeof(global::POGOProtos.Data.Battle.BattleType), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattlePokemonInfo), global::POGOProtos.Data.Battle.BattlePokemonInfo.Parser, new[]{ "PokemonData", "CurrentHealth", "CurrentEnergy" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleResults), global::POGOProtos.Data.Battle.BattleResults.Parser, new[]{ "GymState", "Attackers", "PlayerExperienceAwarded", "NextDefenderPokemonId", "GymPointsDelta" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleLog), global::POGOProtos.Data.Battle.BattleLog.Parser, new[]{ "State", "BattleType", "ServerMs", "BattleActions", "BattleStartTimestampMs", "BattleEndTimestampMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleParticipant), global::POGOProtos.Data.Battle.BattleParticipant.Parser, new[]{ "ActivePokemon", "TrainerPublicProfile", "ReversePokemon", "DefeatedPokemon" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Battle.BattleAction), global::POGOProtos.Data.Battle.BattleAction.Parser, new[]{ "Type", "ActionStartMs", "DurationMs", "EnergyDelta", "AttackerIndex", "TargetIndex", "ActivePokemonId", "PlayerJoined", "BattleResults", "DamageWindowsStartTimestampMss", "DamageWindowsEndTimestampMss", "PlayerLeft", "TargetPokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum BattleState {
+    [pbr::OriginalName("STATE_UNSET")] StateUnset = 0,
+    [pbr::OriginalName("ACTIVE")] Active = 1,
+    [pbr::OriginalName("VICTORY")] Victory = 2,
+    [pbr::OriginalName("DEFEATED")] Defeated = 3,
+    [pbr::OriginalName("TIMED_OUT")] TimedOut = 4,
+  }
+
+  public enum BattleActionType {
+    [pbr::OriginalName("ACTION_UNSET")] ActionUnset = 0,
+    [pbr::OriginalName("ACTION_ATTACK")] ActionAttack = 1,
+    [pbr::OriginalName("ACTION_DODGE")] ActionDodge = 2,
+    [pbr::OriginalName("ACTION_SPECIAL_ATTACK")] ActionSpecialAttack = 3,
+    [pbr::OriginalName("ACTION_SWAP_POKEMON")] ActionSwapPokemon = 4,
+    [pbr::OriginalName("ACTION_FAINT")] ActionFaint = 5,
+    [pbr::OriginalName("ACTION_PLAYER_JOIN")] ActionPlayerJoin = 6,
+    [pbr::OriginalName("ACTION_PLAYER_QUIT")] ActionPlayerQuit = 7,
+    [pbr::OriginalName("ACTION_VICTORY")] ActionVictory = 8,
+    [pbr::OriginalName("ACTION_DEFEAT")] ActionDefeat = 9,
+    [pbr::OriginalName("ACTION_TIMED_OUT")] ActionTimedOut = 10,
+  }
+
+  public enum BattleType {
+    [pbr::OriginalName("BATTLE_TYPE_UNSET")] Unset = 0,
+    [pbr::OriginalName("NORMAL")] Normal = 1,
+    [pbr::OriginalName("TRAINING")] Training = 2,
+  }
+
+  #endregion
+
+  #region Messages
+  public sealed partial class BattlePokemonInfo : pb::IMessage<BattlePokemonInfo> {
+    private static readonly pb::MessageParser<BattlePokemonInfo> _parser = new pb::MessageParser<BattlePokemonInfo>(() => new BattlePokemonInfo());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattlePokemonInfo> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattlePokemonInfo() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattlePokemonInfo(BattlePokemonInfo other) : this() {
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      currentHealth_ = other.currentHealth_;
+      currentEnergy_ = other.currentEnergy_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattlePokemonInfo Clone() {
+      return new BattlePokemonInfo(this);
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 1;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_health" field.</summary>
+    public const int CurrentHealthFieldNumber = 2;
+    private int currentHealth_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CurrentHealth {
+      get { return currentHealth_; }
+      set {
+        currentHealth_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_energy" field.</summary>
+    public const int CurrentEnergyFieldNumber = 3;
+    private int currentEnergy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CurrentEnergy {
+      get { return currentEnergy_; }
+      set {
+        currentEnergy_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattlePokemonInfo);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattlePokemonInfo other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (CurrentHealth != other.CurrentHealth) return false;
+      if (CurrentEnergy != other.CurrentEnergy) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (CurrentHealth != 0) hash ^= CurrentHealth.GetHashCode();
+      if (CurrentEnergy != 0) hash ^= CurrentEnergy.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (pokemonData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PokemonData);
+      }
+      if (CurrentHealth != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(CurrentHealth);
+      }
+      if (CurrentEnergy != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(CurrentEnergy);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (CurrentHealth != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CurrentHealth);
+      }
+      if (CurrentEnergy != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CurrentEnergy);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattlePokemonInfo other) {
+      if (other == null) {
+        return;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.CurrentHealth != 0) {
+        CurrentHealth = other.CurrentHealth;
+      }
+      if (other.CurrentEnergy != 0) {
+        CurrentEnergy = other.CurrentEnergy;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 16: {
+            CurrentHealth = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            CurrentEnergy = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class BattleResults : pb::IMessage<BattleResults> {
+    private static readonly pb::MessageParser<BattleResults> _parser = new pb::MessageParser<BattleResults>(() => new BattleResults());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleResults> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleResults() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleResults(BattleResults other) : this() {
+      GymState = other.gymState_ != null ? other.GymState.Clone() : null;
+      attackers_ = other.attackers_.Clone();
+      playerExperienceAwarded_ = other.playerExperienceAwarded_.Clone();
+      nextDefenderPokemonId_ = other.nextDefenderPokemonId_;
+      gymPointsDelta_ = other.gymPointsDelta_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleResults Clone() {
+      return new BattleResults(this);
+    }
+
+    /// <summary>Field number for the "gym_state" field.</summary>
+    public const int GymStateFieldNumber = 1;
+    private global::POGOProtos.Data.Gym.GymState gymState_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Gym.GymState GymState {
+      get { return gymState_; }
+      set {
+        gymState_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attackers" field.</summary>
+    public const int AttackersFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattleParticipant> _repeated_attackers_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Data.Battle.BattleParticipant.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleParticipant> attackers_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleParticipant>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleParticipant> Attackers {
+      get { return attackers_; }
+    }
+
+    /// <summary>Field number for the "player_experience_awarded" field.</summary>
+    public const int PlayerExperienceAwardedFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_playerExperienceAwarded_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> playerExperienceAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> PlayerExperienceAwarded {
+      get { return playerExperienceAwarded_; }
+    }
+
+    /// <summary>Field number for the "next_defender_pokemon_id" field.</summary>
+    public const int NextDefenderPokemonIdFieldNumber = 4;
+    private long nextDefenderPokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextDefenderPokemonId {
+      get { return nextDefenderPokemonId_; }
+      set {
+        nextDefenderPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_points_delta" field.</summary>
+    public const int GymPointsDeltaFieldNumber = 5;
+    private int gymPointsDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GymPointsDelta {
+      get { return gymPointsDelta_; }
+      set {
+        gymPointsDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleResults);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleResults other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(GymState, other.GymState)) return false;
+      if(!attackers_.Equals(other.attackers_)) return false;
+      if(!playerExperienceAwarded_.Equals(other.playerExperienceAwarded_)) return false;
+      if (NextDefenderPokemonId != other.NextDefenderPokemonId) return false;
+      if (GymPointsDelta != other.GymPointsDelta) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (gymState_ != null) hash ^= GymState.GetHashCode();
+      hash ^= attackers_.GetHashCode();
+      hash ^= playerExperienceAwarded_.GetHashCode();
+      if (NextDefenderPokemonId != 0L) hash ^= NextDefenderPokemonId.GetHashCode();
+      if (GymPointsDelta != 0) hash ^= GymPointsDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (gymState_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(GymState);
+      }
+      attackers_.WriteTo(output, _repeated_attackers_codec);
+      playerExperienceAwarded_.WriteTo(output, _repeated_playerExperienceAwarded_codec);
+      if (NextDefenderPokemonId != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(NextDefenderPokemonId);
+      }
+      if (GymPointsDelta != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(GymPointsDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (gymState_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymState);
+      }
+      size += attackers_.CalculateSize(_repeated_attackers_codec);
+      size += playerExperienceAwarded_.CalculateSize(_repeated_playerExperienceAwarded_codec);
+      if (NextDefenderPokemonId != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextDefenderPokemonId);
+      }
+      if (GymPointsDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GymPointsDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleResults other) {
+      if (other == null) {
+        return;
+      }
+      if (other.gymState_ != null) {
+        if (gymState_ == null) {
+          gymState_ = new global::POGOProtos.Data.Gym.GymState();
+        }
+        GymState.MergeFrom(other.GymState);
+      }
+      attackers_.Add(other.attackers_);
+      playerExperienceAwarded_.Add(other.playerExperienceAwarded_);
+      if (other.NextDefenderPokemonId != 0L) {
+        NextDefenderPokemonId = other.NextDefenderPokemonId;
+      }
+      if (other.GymPointsDelta != 0) {
+        GymPointsDelta = other.GymPointsDelta;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (gymState_ == null) {
+              gymState_ = new global::POGOProtos.Data.Gym.GymState();
+            }
+            input.ReadMessage(gymState_);
+            break;
+          }
+          case 18: {
+            attackers_.AddEntriesFrom(input, _repeated_attackers_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            playerExperienceAwarded_.AddEntriesFrom(input, _repeated_playerExperienceAwarded_codec);
+            break;
+          }
+          case 32: {
+            NextDefenderPokemonId = input.ReadInt64();
+            break;
+          }
+          case 40: {
+            GymPointsDelta = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class BattleLog : pb::IMessage<BattleLog> {
+    private static readonly pb::MessageParser<BattleLog> _parser = new pb::MessageParser<BattleLog>(() => new BattleLog());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleLog> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleLog() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleLog(BattleLog other) : this() {
+      state_ = other.state_;
+      battleType_ = other.battleType_;
+      serverMs_ = other.serverMs_;
+      battleActions_ = other.battleActions_.Clone();
+      battleStartTimestampMs_ = other.battleStartTimestampMs_;
+      battleEndTimestampMs_ = other.battleEndTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleLog Clone() {
+      return new BattleLog(this);
+    }
+
+    /// <summary>Field number for the "state" field.</summary>
+    public const int StateFieldNumber = 1;
+    private global::POGOProtos.Data.Battle.BattleState state_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleState State {
+      get { return state_; }
+      set {
+        state_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_type" field.</summary>
+    public const int BattleTypeFieldNumber = 2;
+    private global::POGOProtos.Data.Battle.BattleType battleType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleType BattleType {
+      get { return battleType_; }
+      set {
+        battleType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "server_ms" field.</summary>
+    public const int ServerMsFieldNumber = 3;
+    private long serverMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ServerMs {
+      get { return serverMs_; }
+      set {
+        serverMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_actions" field.</summary>
+    public const int BattleActionsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattleAction> _repeated_battleActions_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Data.Battle.BattleAction.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> battleActions_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> BattleActions {
+      get { return battleActions_; }
+    }
+
+    /// <summary>Field number for the "battle_start_timestamp_ms" field.</summary>
+    public const int BattleStartTimestampMsFieldNumber = 5;
+    private long battleStartTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleStartTimestampMs {
+      get { return battleStartTimestampMs_; }
+      set {
+        battleStartTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_end_timestamp_ms" field.</summary>
+    public const int BattleEndTimestampMsFieldNumber = 6;
+    private long battleEndTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleEndTimestampMs {
+      get { return battleEndTimestampMs_; }
+      set {
+        battleEndTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleLog);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleLog other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (State != other.State) return false;
+      if (BattleType != other.BattleType) return false;
+      if (ServerMs != other.ServerMs) return false;
+      if(!battleActions_.Equals(other.battleActions_)) return false;
+      if (BattleStartTimestampMs != other.BattleStartTimestampMs) return false;
+      if (BattleEndTimestampMs != other.BattleEndTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (State != 0) hash ^= State.GetHashCode();
+      if (BattleType != 0) hash ^= BattleType.GetHashCode();
+      if (ServerMs != 0L) hash ^= ServerMs.GetHashCode();
+      hash ^= battleActions_.GetHashCode();
+      if (BattleStartTimestampMs != 0L) hash ^= BattleStartTimestampMs.GetHashCode();
+      if (BattleEndTimestampMs != 0L) hash ^= BattleEndTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (State != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) State);
+      }
+      if (BattleType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) BattleType);
+      }
+      if (ServerMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(ServerMs);
+      }
+      battleActions_.WriteTo(output, _repeated_battleActions_codec);
+      if (BattleStartTimestampMs != 0L) {
+        output.WriteRawTag(40);
+        output.WriteInt64(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        output.WriteRawTag(48);
+        output.WriteInt64(BattleEndTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (State != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) State);
+      }
+      if (BattleType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BattleType);
+      }
+      if (ServerMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ServerMs);
+      }
+      size += battleActions_.CalculateSize(_repeated_battleActions_codec);
+      if (BattleStartTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleEndTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleLog other) {
+      if (other == null) {
+        return;
+      }
+      if (other.State != 0) {
+        State = other.State;
+      }
+      if (other.BattleType != 0) {
+        BattleType = other.BattleType;
+      }
+      if (other.ServerMs != 0L) {
+        ServerMs = other.ServerMs;
+      }
+      battleActions_.Add(other.battleActions_);
+      if (other.BattleStartTimestampMs != 0L) {
+        BattleStartTimestampMs = other.BattleStartTimestampMs;
+      }
+      if (other.BattleEndTimestampMs != 0L) {
+        BattleEndTimestampMs = other.BattleEndTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            state_ = (global::POGOProtos.Data.Battle.BattleState) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            battleType_ = (global::POGOProtos.Data.Battle.BattleType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            ServerMs = input.ReadInt64();
+            break;
+          }
+          case 34: {
+            battleActions_.AddEntriesFrom(input, _repeated_battleActions_codec);
+            break;
+          }
+          case 40: {
+            BattleStartTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 48: {
+            BattleEndTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class BattleParticipant : pb::IMessage<BattleParticipant> {
+    private static readonly pb::MessageParser<BattleParticipant> _parser = new pb::MessageParser<BattleParticipant>(() => new BattleParticipant());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleParticipant> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleParticipant() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleParticipant(BattleParticipant other) : this() {
+      ActivePokemon = other.activePokemon_ != null ? other.ActivePokemon.Clone() : null;
+      TrainerPublicProfile = other.trainerPublicProfile_ != null ? other.TrainerPublicProfile.Clone() : null;
+      reversePokemon_ = other.reversePokemon_.Clone();
+      defeatedPokemon_ = other.defeatedPokemon_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleParticipant Clone() {
+      return new BattleParticipant(this);
+    }
+
+    /// <summary>Field number for the "active_pokemon" field.</summary>
+    public const int ActivePokemonFieldNumber = 1;
+    private global::POGOProtos.Data.Battle.BattlePokemonInfo activePokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattlePokemonInfo ActivePokemon {
+      get { return activePokemon_; }
+      set {
+        activePokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_public_profile" field.</summary>
+    public const int TrainerPublicProfileFieldNumber = 2;
+    private global::POGOProtos.Data.Player.PlayerPublicProfile trainerPublicProfile_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerPublicProfile TrainerPublicProfile {
+      get { return trainerPublicProfile_; }
+      set {
+        trainerPublicProfile_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "reverse_pokemon" field.</summary>
+    public const int ReversePokemonFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattlePokemonInfo> _repeated_reversePokemon_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.Battle.BattlePokemonInfo.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> reversePokemon_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> ReversePokemon {
+      get { return reversePokemon_; }
+    }
+
+    /// <summary>Field number for the "defeated_pokemon" field.</summary>
+    public const int DefeatedPokemonFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattlePokemonInfo> _repeated_defeatedPokemon_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Data.Battle.BattlePokemonInfo.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> defeatedPokemon_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattlePokemonInfo> DefeatedPokemon {
+      get { return defeatedPokemon_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleParticipant);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleParticipant other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(ActivePokemon, other.ActivePokemon)) return false;
+      if (!object.Equals(TrainerPublicProfile, other.TrainerPublicProfile)) return false;
+      if(!reversePokemon_.Equals(other.reversePokemon_)) return false;
+      if(!defeatedPokemon_.Equals(other.defeatedPokemon_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (activePokemon_ != null) hash ^= ActivePokemon.GetHashCode();
+      if (trainerPublicProfile_ != null) hash ^= TrainerPublicProfile.GetHashCode();
+      hash ^= reversePokemon_.GetHashCode();
+      hash ^= defeatedPokemon_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (activePokemon_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(ActivePokemon);
+      }
+      if (trainerPublicProfile_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(TrainerPublicProfile);
+      }
+      reversePokemon_.WriteTo(output, _repeated_reversePokemon_codec);
+      defeatedPokemon_.WriteTo(output, _repeated_defeatedPokemon_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (activePokemon_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActivePokemon);
+      }
+      if (trainerPublicProfile_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TrainerPublicProfile);
+      }
+      size += reversePokemon_.CalculateSize(_repeated_reversePokemon_codec);
+      size += defeatedPokemon_.CalculateSize(_repeated_defeatedPokemon_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleParticipant other) {
+      if (other == null) {
+        return;
+      }
+      if (other.activePokemon_ != null) {
+        if (activePokemon_ == null) {
+          activePokemon_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+        }
+        ActivePokemon.MergeFrom(other.ActivePokemon);
+      }
+      if (other.trainerPublicProfile_ != null) {
+        if (trainerPublicProfile_ == null) {
+          trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+        }
+        TrainerPublicProfile.MergeFrom(other.TrainerPublicProfile);
+      }
+      reversePokemon_.Add(other.reversePokemon_);
+      defeatedPokemon_.Add(other.defeatedPokemon_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (activePokemon_ == null) {
+              activePokemon_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+            }
+            input.ReadMessage(activePokemon_);
+            break;
+          }
+          case 18: {
+            if (trainerPublicProfile_ == null) {
+              trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+            }
+            input.ReadMessage(trainerPublicProfile_);
+            break;
+          }
+          case 26: {
+            reversePokemon_.AddEntriesFrom(input, _repeated_reversePokemon_codec);
+            break;
+          }
+          case 34: {
+            defeatedPokemon_.AddEntriesFrom(input, _repeated_defeatedPokemon_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class BattleAction : pb::IMessage<BattleAction> {
+    private static readonly pb::MessageParser<BattleAction> _parser = new pb::MessageParser<BattleAction>(() => new BattleAction());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleAction> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAction() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAction(BattleAction other) : this() {
+      type_ = other.type_;
+      actionStartMs_ = other.actionStartMs_;
+      durationMs_ = other.durationMs_;
+      energyDelta_ = other.energyDelta_;
+      attackerIndex_ = other.attackerIndex_;
+      targetIndex_ = other.targetIndex_;
+      activePokemonId_ = other.activePokemonId_;
+      PlayerJoined = other.playerJoined_ != null ? other.PlayerJoined.Clone() : null;
+      BattleResults = other.battleResults_ != null ? other.BattleResults.Clone() : null;
+      damageWindowsStartTimestampMss_ = other.damageWindowsStartTimestampMss_;
+      damageWindowsEndTimestampMss_ = other.damageWindowsEndTimestampMss_;
+      PlayerLeft = other.playerLeft_ != null ? other.PlayerLeft.Clone() : null;
+      targetPokemonId_ = other.targetPokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAction Clone() {
+      return new BattleAction(this);
+    }
+
+    /// <summary>Field number for the "Type" field.</summary>
+    public const int TypeFieldNumber = 1;
+    private global::POGOProtos.Data.Battle.BattleActionType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleActionType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "action_start_ms" field.</summary>
+    public const int ActionStartMsFieldNumber = 2;
+    private long actionStartMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ActionStartMs {
+      get { return actionStartMs_; }
+      set {
+        actionStartMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "duration_ms" field.</summary>
+    public const int DurationMsFieldNumber = 3;
+    private int durationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DurationMs {
+      get { return durationMs_; }
+      set {
+        durationMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "energy_delta" field.</summary>
+    public const int EnergyDeltaFieldNumber = 5;
+    private int energyDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EnergyDelta {
+      get { return energyDelta_; }
+      set {
+        energyDelta_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attacker_index" field.</summary>
+    public const int AttackerIndexFieldNumber = 6;
+    private int attackerIndex_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AttackerIndex {
+      get { return attackerIndex_; }
+      set {
+        attackerIndex_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_index" field.</summary>
+    public const int TargetIndexFieldNumber = 7;
+    private int targetIndex_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TargetIndex {
+      get { return targetIndex_; }
+      set {
+        targetIndex_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_pokemon_id" field.</summary>
+    public const int ActivePokemonIdFieldNumber = 8;
+    private ulong activePokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong ActivePokemonId {
+      get { return activePokemonId_; }
+      set {
+        activePokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_joined" field.</summary>
+    public const int PlayerJoinedFieldNumber = 9;
+    private global::POGOProtos.Data.Battle.BattleParticipant playerJoined_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleParticipant PlayerJoined {
+      get { return playerJoined_; }
+      set {
+        playerJoined_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_results" field.</summary>
+    public const int BattleResultsFieldNumber = 10;
+    private global::POGOProtos.Data.Battle.BattleResults battleResults_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleResults BattleResults {
+      get { return battleResults_; }
+      set {
+        battleResults_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_windows_start_timestamp_mss" field.</summary>
+    public const int DamageWindowsStartTimestampMssFieldNumber = 11;
+    private long damageWindowsStartTimestampMss_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DamageWindowsStartTimestampMss {
+      get { return damageWindowsStartTimestampMss_; }
+      set {
+        damageWindowsStartTimestampMss_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_windows_end_timestamp_mss" field.</summary>
+    public const int DamageWindowsEndTimestampMssFieldNumber = 12;
+    private long damageWindowsEndTimestampMss_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DamageWindowsEndTimestampMss {
+      get { return damageWindowsEndTimestampMss_; }
+      set {
+        damageWindowsEndTimestampMss_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_left" field.</summary>
+    public const int PlayerLeftFieldNumber = 13;
+    private global::POGOProtos.Data.Battle.BattleParticipant playerLeft_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleParticipant PlayerLeft {
+      get { return playerLeft_; }
+      set {
+        playerLeft_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_pokemon_id" field.</summary>
+    public const int TargetPokemonIdFieldNumber = 14;
+    private ulong targetPokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong TargetPokemonId {
+      get { return targetPokemonId_; }
+      set {
+        targetPokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleAction);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleAction other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Type != other.Type) return false;
+      if (ActionStartMs != other.ActionStartMs) return false;
+      if (DurationMs != other.DurationMs) return false;
+      if (EnergyDelta != other.EnergyDelta) return false;
+      if (AttackerIndex != other.AttackerIndex) return false;
+      if (TargetIndex != other.TargetIndex) return false;
+      if (ActivePokemonId != other.ActivePokemonId) return false;
+      if (!object.Equals(PlayerJoined, other.PlayerJoined)) return false;
+      if (!object.Equals(BattleResults, other.BattleResults)) return false;
+      if (DamageWindowsStartTimestampMss != other.DamageWindowsStartTimestampMss) return false;
+      if (DamageWindowsEndTimestampMss != other.DamageWindowsEndTimestampMss) return false;
+      if (!object.Equals(PlayerLeft, other.PlayerLeft)) return false;
+      if (TargetPokemonId != other.TargetPokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (ActionStartMs != 0L) hash ^= ActionStartMs.GetHashCode();
+      if (DurationMs != 0) hash ^= DurationMs.GetHashCode();
+      if (EnergyDelta != 0) hash ^= EnergyDelta.GetHashCode();
+      if (AttackerIndex != 0) hash ^= AttackerIndex.GetHashCode();
+      if (TargetIndex != 0) hash ^= TargetIndex.GetHashCode();
+      if (ActivePokemonId != 0UL) hash ^= ActivePokemonId.GetHashCode();
+      if (playerJoined_ != null) hash ^= PlayerJoined.GetHashCode();
+      if (battleResults_ != null) hash ^= BattleResults.GetHashCode();
+      if (DamageWindowsStartTimestampMss != 0L) hash ^= DamageWindowsStartTimestampMss.GetHashCode();
+      if (DamageWindowsEndTimestampMss != 0L) hash ^= DamageWindowsEndTimestampMss.GetHashCode();
+      if (playerLeft_ != null) hash ^= PlayerLeft.GetHashCode();
+      if (TargetPokemonId != 0UL) hash ^= TargetPokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Type != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Type);
+      }
+      if (ActionStartMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(ActionStartMs);
+      }
+      if (DurationMs != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(DurationMs);
+      }
+      if (EnergyDelta != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(EnergyDelta);
+      }
+      if (AttackerIndex != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(AttackerIndex);
+      }
+      if (TargetIndex != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(TargetIndex);
+      }
+      if (ActivePokemonId != 0UL) {
+        output.WriteRawTag(65);
+        output.WriteFixed64(ActivePokemonId);
+      }
+      if (playerJoined_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(PlayerJoined);
+      }
+      if (battleResults_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(BattleResults);
+      }
+      if (DamageWindowsStartTimestampMss != 0L) {
+        output.WriteRawTag(88);
+        output.WriteInt64(DamageWindowsStartTimestampMss);
+      }
+      if (DamageWindowsEndTimestampMss != 0L) {
+        output.WriteRawTag(96);
+        output.WriteInt64(DamageWindowsEndTimestampMss);
+      }
+      if (playerLeft_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(PlayerLeft);
+      }
+      if (TargetPokemonId != 0UL) {
+        output.WriteRawTag(113);
+        output.WriteFixed64(TargetPokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (ActionStartMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ActionStartMs);
+      }
+      if (DurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DurationMs);
+      }
+      if (EnergyDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EnergyDelta);
+      }
+      if (AttackerIndex != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AttackerIndex);
+      }
+      if (TargetIndex != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TargetIndex);
+      }
+      if (ActivePokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (playerJoined_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerJoined);
+      }
+      if (battleResults_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleResults);
+      }
+      if (DamageWindowsStartTimestampMss != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DamageWindowsStartTimestampMss);
+      }
+      if (DamageWindowsEndTimestampMss != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DamageWindowsEndTimestampMss);
+      }
+      if (playerLeft_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerLeft);
+      }
+      if (TargetPokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleAction other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.ActionStartMs != 0L) {
+        ActionStartMs = other.ActionStartMs;
+      }
+      if (other.DurationMs != 0) {
+        DurationMs = other.DurationMs;
+      }
+      if (other.EnergyDelta != 0) {
+        EnergyDelta = other.EnergyDelta;
+      }
+      if (other.AttackerIndex != 0) {
+        AttackerIndex = other.AttackerIndex;
+      }
+      if (other.TargetIndex != 0) {
+        TargetIndex = other.TargetIndex;
+      }
+      if (other.ActivePokemonId != 0UL) {
+        ActivePokemonId = other.ActivePokemonId;
+      }
+      if (other.playerJoined_ != null) {
+        if (playerJoined_ == null) {
+          playerJoined_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+        }
+        PlayerJoined.MergeFrom(other.PlayerJoined);
+      }
+      if (other.battleResults_ != null) {
+        if (battleResults_ == null) {
+          battleResults_ = new global::POGOProtos.Data.Battle.BattleResults();
+        }
+        BattleResults.MergeFrom(other.BattleResults);
+      }
+      if (other.DamageWindowsStartTimestampMss != 0L) {
+        DamageWindowsStartTimestampMss = other.DamageWindowsStartTimestampMss;
+      }
+      if (other.DamageWindowsEndTimestampMss != 0L) {
+        DamageWindowsEndTimestampMss = other.DamageWindowsEndTimestampMss;
+      }
+      if (other.playerLeft_ != null) {
+        if (playerLeft_ == null) {
+          playerLeft_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+        }
+        PlayerLeft.MergeFrom(other.PlayerLeft);
+      }
+      if (other.TargetPokemonId != 0UL) {
+        TargetPokemonId = other.TargetPokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            type_ = (global::POGOProtos.Data.Battle.BattleActionType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ActionStartMs = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            DurationMs = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            EnergyDelta = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            AttackerIndex = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            TargetIndex = input.ReadInt32();
+            break;
+          }
+          case 65: {
+            ActivePokemonId = input.ReadFixed64();
+            break;
+          }
+          case 74: {
+            if (playerJoined_ == null) {
+              playerJoined_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+            }
+            input.ReadMessage(playerJoined_);
+            break;
+          }
+          case 82: {
+            if (battleResults_ == null) {
+              battleResults_ = new global::POGOProtos.Data.Battle.BattleResults();
+            }
+            input.ReadMessage(battleResults_);
+            break;
+          }
+          case 88: {
+            DamageWindowsStartTimestampMss = input.ReadInt64();
+            break;
+          }
+          case 96: {
+            DamageWindowsEndTimestampMss = input.ReadInt64();
+            break;
+          }
+          case 106: {
+            if (playerLeft_ == null) {
+              playerLeft_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+            }
+            input.ReadMessage(playerLeft_);
+            break;
+          }
+          case 113: {
+            TargetPokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Capture/CaptureAward.cs b/PokemonGo/POGOProtos/Data/Capture/CaptureAward.cs
new file mode 100644
index 0000000..1c650b7
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Capture/CaptureAward.cs
@@ -0,0 +1,218 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Capture/CaptureAward.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Capture {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Capture/CaptureAward.proto</summary>
+  public static partial class CaptureAwardReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Capture/CaptureAward.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CaptureAwardReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CipQT0dPUHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlQXdhcmQucHJvdG8S",
+            "F1BPR09Qcm90b3MuRGF0YS5DYXB0dXJlGiNQT0dPUHJvdG9zL0VudW1zL0Fj",
+            "dGl2aXR5VHlwZS5wcm90byKCAQoMQ2FwdHVyZUF3YXJkEjkKDWFjdGl2aXR5",
+            "X3R5cGUYASADKA4yHi5QT0dPUHJvdG9zLkVudW1zLkFjdGl2aXR5VHlwZUIC",
+            "EAESDgoCeHAYAiADKAVCAhABEhEKBWNhbmR5GAMgAygFQgIQARIUCghzdGFy",
+            "ZHVzdBgEIAMoBUICEAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.ActivityTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Capture.CaptureAward), global::POGOProtos.Data.Capture.CaptureAward.Parser, new[]{ "ActivityType", "Xp", "Candy", "Stardust" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CaptureAward : pb::IMessage<CaptureAward> {
+    private static readonly pb::MessageParser<CaptureAward> _parser = new pb::MessageParser<CaptureAward>(() => new CaptureAward());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CaptureAward> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Capture.CaptureAwardReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureAward() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureAward(CaptureAward other) : this() {
+      activityType_ = other.activityType_.Clone();
+      xp_ = other.xp_.Clone();
+      candy_ = other.candy_.Clone();
+      stardust_ = other.stardust_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureAward Clone() {
+      return new CaptureAward(this);
+    }
+
+    /// <summary>Field number for the "activity_type" field.</summary>
+    public const int ActivityTypeFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.ActivityType> _repeated_activityType_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Enums.ActivityType) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.ActivityType> activityType_ = new pbc::RepeatedField<global::POGOProtos.Enums.ActivityType>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.ActivityType> ActivityType {
+      get { return activityType_; }
+    }
+
+    /// <summary>Field number for the "xp" field.</summary>
+    public const int XpFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_xp_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> xp_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Xp {
+      get { return xp_; }
+    }
+
+    /// <summary>Field number for the "candy" field.</summary>
+    public const int CandyFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_candy_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> candy_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Candy {
+      get { return candy_; }
+    }
+
+    /// <summary>Field number for the "stardust" field.</summary>
+    public const int StardustFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_stardust_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> stardust_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Stardust {
+      get { return stardust_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CaptureAward);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CaptureAward other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!activityType_.Equals(other.activityType_)) return false;
+      if(!xp_.Equals(other.xp_)) return false;
+      if(!candy_.Equals(other.candy_)) return false;
+      if(!stardust_.Equals(other.stardust_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= activityType_.GetHashCode();
+      hash ^= xp_.GetHashCode();
+      hash ^= candy_.GetHashCode();
+      hash ^= stardust_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      activityType_.WriteTo(output, _repeated_activityType_codec);
+      xp_.WriteTo(output, _repeated_xp_codec);
+      candy_.WriteTo(output, _repeated_candy_codec);
+      stardust_.WriteTo(output, _repeated_stardust_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += activityType_.CalculateSize(_repeated_activityType_codec);
+      size += xp_.CalculateSize(_repeated_xp_codec);
+      size += candy_.CalculateSize(_repeated_candy_codec);
+      size += stardust_.CalculateSize(_repeated_stardust_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CaptureAward other) {
+      if (other == null) {
+        return;
+      }
+      activityType_.Add(other.activityType_);
+      xp_.Add(other.xp_);
+      candy_.Add(other.candy_);
+      stardust_.Add(other.stardust_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            activityType_.AddEntriesFrom(input, _repeated_activityType_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            xp_.AddEntriesFrom(input, _repeated_xp_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            candy_.AddEntriesFrom(input, _repeated_candy_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            stardust_.AddEntriesFrom(input, _repeated_stardust_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Capture/CaptureProbability.cs b/PokemonGo/POGOProtos/Data/Capture/CaptureProbability.cs
new file mode 100644
index 0000000..b423372
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Capture/CaptureProbability.cs
@@ -0,0 +1,205 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Capture/CaptureProbability.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Capture {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Capture/CaptureProbability.proto</summary>
+  public static partial class CaptureProbabilityReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Capture/CaptureProbability.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CaptureProbabilityReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjBQT0dPUHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlUHJvYmFiaWxpdHku",
+            "cHJvdG8SF1BPR09Qcm90b3MuRGF0YS5DYXB0dXJlGiZQT0dPUHJvdG9zL0lu",
+            "dmVudG9yeS9JdGVtL0l0ZW1JZC5wcm90byKVAQoSQ2FwdHVyZVByb2JhYmls",
+            "aXR5EjwKDXBva2ViYWxsX3R5cGUYASADKA4yIS5QT0dPUHJvdG9zLkludmVu",
+            "dG9yeS5JdGVtLkl0ZW1JZEICEAESHwoTY2FwdHVyZV9wcm9iYWJpbGl0eRgC",
+            "IAMoAkICEAESIAoYcmV0aWNsZV9kaWZmaWN1bHR5X3NjYWxlGAwgASgBYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Capture.CaptureProbability), global::POGOProtos.Data.Capture.CaptureProbability.Parser, new[]{ "PokeballType", "CaptureProbability_", "ReticleDifficultyScale" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CaptureProbability : pb::IMessage<CaptureProbability> {
+    private static readonly pb::MessageParser<CaptureProbability> _parser = new pb::MessageParser<CaptureProbability>(() => new CaptureProbability());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CaptureProbability> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Capture.CaptureProbabilityReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureProbability() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureProbability(CaptureProbability other) : this() {
+      pokeballType_ = other.pokeballType_.Clone();
+      captureProbability_ = other.captureProbability_.Clone();
+      reticleDifficultyScale_ = other.reticleDifficultyScale_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureProbability Clone() {
+      return new CaptureProbability(this);
+    }
+
+    /// <summary>Field number for the "pokeball_type" field.</summary>
+    public const int PokeballTypeFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemId> _repeated_pokeballType_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Inventory.Item.ItemId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> pokeballType_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> PokeballType {
+      get { return pokeballType_; }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbability_FieldNumber = 2;
+    private static readonly pb::FieldCodec<float> _repeated_captureProbability_codec
+        = pb::FieldCodec.ForFloat(18);
+    private readonly pbc::RepeatedField<float> captureProbability_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> CaptureProbability_ {
+      get { return captureProbability_; }
+    }
+
+    /// <summary>Field number for the "reticle_difficulty_scale" field.</summary>
+    public const int ReticleDifficultyScaleFieldNumber = 12;
+    private double reticleDifficultyScale_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ReticleDifficultyScale {
+      get { return reticleDifficultyScale_; }
+      set {
+        reticleDifficultyScale_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CaptureProbability);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CaptureProbability other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!pokeballType_.Equals(other.pokeballType_)) return false;
+      if(!captureProbability_.Equals(other.captureProbability_)) return false;
+      if (ReticleDifficultyScale != other.ReticleDifficultyScale) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= pokeballType_.GetHashCode();
+      hash ^= captureProbability_.GetHashCode();
+      if (ReticleDifficultyScale != 0D) hash ^= ReticleDifficultyScale.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      pokeballType_.WriteTo(output, _repeated_pokeballType_codec);
+      captureProbability_.WriteTo(output, _repeated_captureProbability_codec);
+      if (ReticleDifficultyScale != 0D) {
+        output.WriteRawTag(97);
+        output.WriteDouble(ReticleDifficultyScale);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += pokeballType_.CalculateSize(_repeated_pokeballType_codec);
+      size += captureProbability_.CalculateSize(_repeated_captureProbability_codec);
+      if (ReticleDifficultyScale != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CaptureProbability other) {
+      if (other == null) {
+        return;
+      }
+      pokeballType_.Add(other.pokeballType_);
+      captureProbability_.Add(other.captureProbability_);
+      if (other.ReticleDifficultyScale != 0D) {
+        ReticleDifficultyScale = other.ReticleDifficultyScale;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            pokeballType_.AddEntriesFrom(input, _repeated_pokeballType_codec);
+            break;
+          }
+          case 18:
+          case 21: {
+            captureProbability_.AddEntriesFrom(input, _repeated_captureProbability_codec);
+            break;
+          }
+          case 97: {
+            ReticleDifficultyScale = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Capture/POGOProtosDataCapture.cs b/PokemonGo/POGOProtos/Data/Capture/POGOProtosDataCapture.cs
new file mode 100644
index 0000000..7560c23
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Capture/POGOProtosDataCapture.cs
@@ -0,0 +1,381 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Data.Capture.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Capture {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Data.Capture.proto</summary>
+  public static partial class POGOProtosDataCaptureReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Data.Capture.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosDataCaptureReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch1QT0dPUHJvdG9zLkRhdGEuQ2FwdHVyZS5wcm90bxIXUE9HT1Byb3Rvcy5E",
+            "YXRhLkNhcHR1cmUaH1BPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0ucHJvdG8a",
+            "FlBPR09Qcm90b3MuRW51bXMucHJvdG8ilQEKEkNhcHR1cmVQcm9iYWJpbGl0",
+            "eRI8Cg1wb2tlYmFsbF90eXBlGAEgAygOMiEuUE9HT1Byb3Rvcy5JbnZlbnRv",
+            "cnkuSXRlbS5JdGVtSWRCAhABEh8KE2NhcHR1cmVfcHJvYmFiaWxpdHkYAiAD",
+            "KAJCAhABEiAKGHJldGljbGVfZGlmZmljdWx0eV9zY2FsZRgMIAEoASJyCgxD",
+            "YXB0dXJlQXdhcmQSNQoNYWN0aXZpdHlfdHlwZRgBIAMoDjIeLlBPR09Qcm90",
+            "b3MuRW51bXMuQWN0aXZpdHlUeXBlEgoKAnhwGAIgAygFEg0KBWNhbmR5GAMg",
+            "AygFEhAKCHN0YXJkdXN0GAQgAygFUABQAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Capture.CaptureProbability), global::POGOProtos.Data.Capture.CaptureProbability.Parser, new[]{ "PokeballType", "CaptureProbability_", "ReticleDifficultyScale" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Capture.CaptureAward), global::POGOProtos.Data.Capture.CaptureAward.Parser, new[]{ "ActivityType", "Xp", "Candy", "Stardust" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CaptureProbability : pb::IMessage<CaptureProbability> {
+    private static readonly pb::MessageParser<CaptureProbability> _parser = new pb::MessageParser<CaptureProbability>(() => new CaptureProbability());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CaptureProbability> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Capture.POGOProtosDataCaptureReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureProbability() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureProbability(CaptureProbability other) : this() {
+      pokeballType_ = other.pokeballType_.Clone();
+      captureProbability_ = other.captureProbability_.Clone();
+      reticleDifficultyScale_ = other.reticleDifficultyScale_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureProbability Clone() {
+      return new CaptureProbability(this);
+    }
+
+    /// <summary>Field number for the "pokeball_type" field.</summary>
+    public const int PokeballTypeFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemId> _repeated_pokeballType_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Inventory.Item.ItemId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> pokeballType_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> PokeballType {
+      get { return pokeballType_; }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbability_FieldNumber = 2;
+    private static readonly pb::FieldCodec<float> _repeated_captureProbability_codec
+        = pb::FieldCodec.ForFloat(18);
+    private readonly pbc::RepeatedField<float> captureProbability_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> CaptureProbability_ {
+      get { return captureProbability_; }
+    }
+
+    /// <summary>Field number for the "reticle_difficulty_scale" field.</summary>
+    public const int ReticleDifficultyScaleFieldNumber = 12;
+    private double reticleDifficultyScale_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ReticleDifficultyScale {
+      get { return reticleDifficultyScale_; }
+      set {
+        reticleDifficultyScale_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CaptureProbability);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CaptureProbability other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!pokeballType_.Equals(other.pokeballType_)) return false;
+      if(!captureProbability_.Equals(other.captureProbability_)) return false;
+      if (ReticleDifficultyScale != other.ReticleDifficultyScale) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= pokeballType_.GetHashCode();
+      hash ^= captureProbability_.GetHashCode();
+      if (ReticleDifficultyScale != 0D) hash ^= ReticleDifficultyScale.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      pokeballType_.WriteTo(output, _repeated_pokeballType_codec);
+      captureProbability_.WriteTo(output, _repeated_captureProbability_codec);
+      if (ReticleDifficultyScale != 0D) {
+        output.WriteRawTag(97);
+        output.WriteDouble(ReticleDifficultyScale);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += pokeballType_.CalculateSize(_repeated_pokeballType_codec);
+      size += captureProbability_.CalculateSize(_repeated_captureProbability_codec);
+      if (ReticleDifficultyScale != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CaptureProbability other) {
+      if (other == null) {
+        return;
+      }
+      pokeballType_.Add(other.pokeballType_);
+      captureProbability_.Add(other.captureProbability_);
+      if (other.ReticleDifficultyScale != 0D) {
+        ReticleDifficultyScale = other.ReticleDifficultyScale;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            pokeballType_.AddEntriesFrom(input, _repeated_pokeballType_codec);
+            break;
+          }
+          case 18:
+          case 21: {
+            captureProbability_.AddEntriesFrom(input, _repeated_captureProbability_codec);
+            break;
+          }
+          case 97: {
+            ReticleDifficultyScale = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CaptureAward : pb::IMessage<CaptureAward> {
+    private static readonly pb::MessageParser<CaptureAward> _parser = new pb::MessageParser<CaptureAward>(() => new CaptureAward());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CaptureAward> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Capture.POGOProtosDataCaptureReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureAward() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureAward(CaptureAward other) : this() {
+      activityType_ = other.activityType_.Clone();
+      xp_ = other.xp_.Clone();
+      candy_ = other.candy_.Clone();
+      stardust_ = other.stardust_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CaptureAward Clone() {
+      return new CaptureAward(this);
+    }
+
+    /// <summary>Field number for the "activity_type" field.</summary>
+    public const int ActivityTypeFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.ActivityType> _repeated_activityType_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Enums.ActivityType) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.ActivityType> activityType_ = new pbc::RepeatedField<global::POGOProtos.Enums.ActivityType>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.ActivityType> ActivityType {
+      get { return activityType_; }
+    }
+
+    /// <summary>Field number for the "xp" field.</summary>
+    public const int XpFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_xp_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> xp_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Xp {
+      get { return xp_; }
+    }
+
+    /// <summary>Field number for the "candy" field.</summary>
+    public const int CandyFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_candy_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> candy_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Candy {
+      get { return candy_; }
+    }
+
+    /// <summary>Field number for the "stardust" field.</summary>
+    public const int StardustFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_stardust_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> stardust_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Stardust {
+      get { return stardust_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CaptureAward);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CaptureAward other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!activityType_.Equals(other.activityType_)) return false;
+      if(!xp_.Equals(other.xp_)) return false;
+      if(!candy_.Equals(other.candy_)) return false;
+      if(!stardust_.Equals(other.stardust_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= activityType_.GetHashCode();
+      hash ^= xp_.GetHashCode();
+      hash ^= candy_.GetHashCode();
+      hash ^= stardust_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      activityType_.WriteTo(output, _repeated_activityType_codec);
+      xp_.WriteTo(output, _repeated_xp_codec);
+      candy_.WriteTo(output, _repeated_candy_codec);
+      stardust_.WriteTo(output, _repeated_stardust_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += activityType_.CalculateSize(_repeated_activityType_codec);
+      size += xp_.CalculateSize(_repeated_xp_codec);
+      size += candy_.CalculateSize(_repeated_candy_codec);
+      size += stardust_.CalculateSize(_repeated_stardust_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CaptureAward other) {
+      if (other == null) {
+        return;
+      }
+      activityType_.Add(other.activityType_);
+      xp_.Add(other.xp_);
+      candy_.Add(other.candy_);
+      stardust_.Add(other.stardust_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            activityType_.AddEntriesFrom(input, _repeated_activityType_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            xp_.AddEntriesFrom(input, _repeated_xp_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            candy_.AddEntriesFrom(input, _repeated_candy_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            stardust_.AddEntriesFrom(input, _repeated_stardust_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/DownloadUrlEntry.cs b/PokemonGo/POGOProtos/Data/DownloadUrlEntry.cs
new file mode 100644
index 0000000..9dfee27
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/DownloadUrlEntry.cs
@@ -0,0 +1,244 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/DownloadUrlEntry.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/DownloadUrlEntry.proto</summary>
+  public static partial class DownloadUrlEntryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/DownloadUrlEntry.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadUrlEntryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0RhdGEvRG93bmxvYWRVcmxFbnRyeS5wcm90bxIPUE9H",
+            "T1Byb3Rvcy5EYXRhIlEKEERvd25sb2FkVXJsRW50cnkSEAoIYXNzZXRfaWQY",
+            "ASABKAkSCwoDdXJsGAIgASgJEgwKBHNpemUYAyABKAUSEAoIY2hlY2tzdW0Y",
+            "BCABKAdiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.DownloadUrlEntry), global::POGOProtos.Data.DownloadUrlEntry.Parser, new[]{ "AssetId", "Url", "Size", "Checksum" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadUrlEntry : pb::IMessage<DownloadUrlEntry> {
+    private static readonly pb::MessageParser<DownloadUrlEntry> _parser = new pb::MessageParser<DownloadUrlEntry>(() => new DownloadUrlEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadUrlEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.DownloadUrlEntryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadUrlEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadUrlEntry(DownloadUrlEntry other) : this() {
+      assetId_ = other.assetId_;
+      url_ = other.url_;
+      size_ = other.size_;
+      checksum_ = other.checksum_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadUrlEntry Clone() {
+      return new DownloadUrlEntry(this);
+    }
+
+    /// <summary>Field number for the "asset_id" field.</summary>
+    public const int AssetIdFieldNumber = 1;
+    private string assetId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string AssetId {
+      get { return assetId_; }
+      set {
+        assetId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "url" field.</summary>
+    public const int UrlFieldNumber = 2;
+    private string url_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Url {
+      get { return url_; }
+      set {
+        url_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "size" field.</summary>
+    public const int SizeFieldNumber = 3;
+    private int size_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Size {
+      get { return size_; }
+      set {
+        size_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "checksum" field.</summary>
+    public const int ChecksumFieldNumber = 4;
+    private uint checksum_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint Checksum {
+      get { return checksum_; }
+      set {
+        checksum_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadUrlEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadUrlEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AssetId != other.AssetId) return false;
+      if (Url != other.Url) return false;
+      if (Size != other.Size) return false;
+      if (Checksum != other.Checksum) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AssetId.Length != 0) hash ^= AssetId.GetHashCode();
+      if (Url.Length != 0) hash ^= Url.GetHashCode();
+      if (Size != 0) hash ^= Size.GetHashCode();
+      if (Checksum != 0) hash ^= Checksum.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AssetId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(AssetId);
+      }
+      if (Url.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Url);
+      }
+      if (Size != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Size);
+      }
+      if (Checksum != 0) {
+        output.WriteRawTag(37);
+        output.WriteFixed32(Checksum);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AssetId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(AssetId);
+      }
+      if (Url.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Url);
+      }
+      if (Size != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Size);
+      }
+      if (Checksum != 0) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadUrlEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AssetId.Length != 0) {
+        AssetId = other.AssetId;
+      }
+      if (other.Url.Length != 0) {
+        Url = other.Url;
+      }
+      if (other.Size != 0) {
+        Size = other.Size;
+      }
+      if (other.Checksum != 0) {
+        Checksum = other.Checksum;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            AssetId = input.ReadString();
+            break;
+          }
+          case 18: {
+            Url = input.ReadString();
+            break;
+          }
+          case 24: {
+            Size = input.ReadInt32();
+            break;
+          }
+          case 37: {
+            Checksum = input.ReadFixed32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Gym/GymMembership.cs b/PokemonGo/POGOProtos/Data/Gym/GymMembership.cs
new file mode 100644
index 0000000..704af07
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Gym/GymMembership.cs
@@ -0,0 +1,203 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Gym/GymMembership.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Gym {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Gym/GymMembership.proto</summary>
+  public static partial class GymMembershipReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Gym/GymMembership.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GymMembershipReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL0RhdGEvR3ltL0d5bU1lbWJlcnNoaXAucHJvdG8SE1BP",
+            "R09Qcm90b3MuRGF0YS5HeW0aIVBPR09Qcm90b3MvRGF0YS9Qb2tlbW9uRGF0",
+            "YS5wcm90bxowUE9HT1Byb3Rvcy9EYXRhL1BsYXllci9QbGF5ZXJQdWJsaWNQ",
+            "cm9maWxlLnByb3RvIpABCg1HeW1NZW1iZXJzaGlwEjIKDHBva2Vtb25fZGF0",
+            "YRgBIAEoCzIcLlBPR09Qcm90b3MuRGF0YS5Qb2tlbW9uRGF0YRJLChZ0cmFp",
+            "bmVyX3B1YmxpY19wcm9maWxlGAIgASgLMisuUE9HT1Byb3Rvcy5EYXRhLlBs",
+            "YXllci5QbGF5ZXJQdWJsaWNQcm9maWxlYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Data.Player.PlayerPublicProfileReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Gym.GymMembership), global::POGOProtos.Data.Gym.GymMembership.Parser, new[]{ "PokemonData", "TrainerPublicProfile" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GymMembership : pb::IMessage<GymMembership> {
+    private static readonly pb::MessageParser<GymMembership> _parser = new pb::MessageParser<GymMembership>(() => new GymMembership());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymMembership> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Gym.GymMembershipReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymMembership() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymMembership(GymMembership other) : this() {
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      TrainerPublicProfile = other.trainerPublicProfile_ != null ? other.TrainerPublicProfile.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymMembership Clone() {
+      return new GymMembership(this);
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 1;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_public_profile" field.</summary>
+    public const int TrainerPublicProfileFieldNumber = 2;
+    private global::POGOProtos.Data.Player.PlayerPublicProfile trainerPublicProfile_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerPublicProfile TrainerPublicProfile {
+      get { return trainerPublicProfile_; }
+      set {
+        trainerPublicProfile_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymMembership);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymMembership other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(TrainerPublicProfile, other.TrainerPublicProfile)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (trainerPublicProfile_ != null) hash ^= TrainerPublicProfile.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (pokemonData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PokemonData);
+      }
+      if (trainerPublicProfile_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(TrainerPublicProfile);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (trainerPublicProfile_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TrainerPublicProfile);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymMembership other) {
+      if (other == null) {
+        return;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.trainerPublicProfile_ != null) {
+        if (trainerPublicProfile_ == null) {
+          trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+        }
+        TrainerPublicProfile.MergeFrom(other.TrainerPublicProfile);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 18: {
+            if (trainerPublicProfile_ == null) {
+              trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+            }
+            input.ReadMessage(trainerPublicProfile_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Gym/GymState.cs b/PokemonGo/POGOProtos/Data/Gym/GymState.cs
new file mode 100644
index 0000000..4b26207
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Gym/GymState.cs
@@ -0,0 +1,188 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Gym/GymState.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Gym {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Gym/GymState.proto</summary>
+  public static partial class GymStateReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Gym/GymState.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GymStateReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiJQT0dPUHJvdG9zL0RhdGEvR3ltL0d5bVN0YXRlLnByb3RvEhNQT0dPUHJv",
+            "dG9zLkRhdGEuR3ltGiJQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnREYXRhLnBy",
+            "b3RvGidQT0dPUHJvdG9zL0RhdGEvR3ltL0d5bU1lbWJlcnNoaXAucHJvdG8i",
+            "dQoIR3ltU3RhdGUSMAoJZm9ydF9kYXRhGAEgASgLMh0uUE9HT1Byb3Rvcy5N",
+            "YXAuRm9ydC5Gb3J0RGF0YRI3CgttZW1iZXJzaGlwcxgCIAMoCzIiLlBPR09Q",
+            "cm90b3MuRGF0YS5HeW0uR3ltTWVtYmVyc2hpcGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Map.Fort.FortDataReflection.Descriptor, global::POGOProtos.Data.Gym.GymMembershipReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Gym.GymState), global::POGOProtos.Data.Gym.GymState.Parser, new[]{ "FortData", "Memberships" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GymState : pb::IMessage<GymState> {
+    private static readonly pb::MessageParser<GymState> _parser = new pb::MessageParser<GymState>(() => new GymState());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymState> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Gym.GymStateReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymState() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymState(GymState other) : this() {
+      FortData = other.fortData_ != null ? other.FortData.Clone() : null;
+      memberships_ = other.memberships_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymState Clone() {
+      return new GymState(this);
+    }
+
+    /// <summary>Field number for the "fort_data" field.</summary>
+    public const int FortDataFieldNumber = 1;
+    private global::POGOProtos.Map.Fort.FortData fortData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortData FortData {
+      get { return fortData_; }
+      set {
+        fortData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "memberships" field.</summary>
+    public const int MembershipsFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Gym.GymMembership> _repeated_memberships_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Data.Gym.GymMembership.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Gym.GymMembership> memberships_ = new pbc::RepeatedField<global::POGOProtos.Data.Gym.GymMembership>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Gym.GymMembership> Memberships {
+      get { return memberships_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymState);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymState other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(FortData, other.FortData)) return false;
+      if(!memberships_.Equals(other.memberships_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (fortData_ != null) hash ^= FortData.GetHashCode();
+      hash ^= memberships_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (fortData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(FortData);
+      }
+      memberships_.WriteTo(output, _repeated_memberships_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (fortData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortData);
+      }
+      size += memberships_.CalculateSize(_repeated_memberships_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymState other) {
+      if (other == null) {
+        return;
+      }
+      if (other.fortData_ != null) {
+        if (fortData_ == null) {
+          fortData_ = new global::POGOProtos.Map.Fort.FortData();
+        }
+        FortData.MergeFrom(other.FortData);
+      }
+      memberships_.Add(other.memberships_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (fortData_ == null) {
+              fortData_ = new global::POGOProtos.Map.Fort.FortData();
+            }
+            input.ReadMessage(fortData_);
+            break;
+          }
+          case 18: {
+            memberships_.AddEntriesFrom(input, _repeated_memberships_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Gym/POGOProtosDataGym.cs b/PokemonGo/POGOProtos/Data/Gym/POGOProtosDataGym.cs
new file mode 100644
index 0000000..7b7317c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Gym/POGOProtosDataGym.cs
@@ -0,0 +1,350 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Data.Gym.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Gym {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Data.Gym.proto</summary>
+  public static partial class POGOProtosDataGymReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Data.Gym.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosDataGymReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChlQT0dPUHJvdG9zLkRhdGEuR3ltLnByb3RvEhNQT0dPUHJvdG9zLkRhdGEu",
+            "R3ltGhVQT0dPUHJvdG9zLkRhdGEucHJvdG8aHFBPR09Qcm90b3MuRGF0YS5Q",
+            "bGF5ZXIucHJvdG8aGVBPR09Qcm90b3MuTWFwLkZvcnQucHJvdG8ikAEKDUd5",
+            "bU1lbWJlcnNoaXASMgoMcG9rZW1vbl9kYXRhGAEgASgLMhwuUE9HT1Byb3Rv",
+            "cy5EYXRhLlBva2Vtb25EYXRhEksKFnRyYWluZXJfcHVibGljX3Byb2ZpbGUY",
+            "AiABKAsyKy5QT0dPUHJvdG9zLkRhdGEuUGxheWVyLlBsYXllclB1YmxpY1By",
+            "b2ZpbGUidQoIR3ltU3RhdGUSMAoJZm9ydF9kYXRhGAEgASgLMh0uUE9HT1By",
+            "b3Rvcy5NYXAuRm9ydC5Gb3J0RGF0YRI3CgttZW1iZXJzaGlwcxgCIAMoCzIi",
+            "LlBPR09Qcm90b3MuRGF0YS5HeW0uR3ltTWVtYmVyc2hpcFAAUAFQAmIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.POGOProtosDataReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Gym.GymMembership), global::POGOProtos.Data.Gym.GymMembership.Parser, new[]{ "PokemonData", "TrainerPublicProfile" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Gym.GymState), global::POGOProtos.Data.Gym.GymState.Parser, new[]{ "FortData", "Memberships" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GymMembership : pb::IMessage<GymMembership> {
+    private static readonly pb::MessageParser<GymMembership> _parser = new pb::MessageParser<GymMembership>(() => new GymMembership());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymMembership> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Gym.POGOProtosDataGymReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymMembership() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymMembership(GymMembership other) : this() {
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      TrainerPublicProfile = other.trainerPublicProfile_ != null ? other.TrainerPublicProfile.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymMembership Clone() {
+      return new GymMembership(this);
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 1;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_public_profile" field.</summary>
+    public const int TrainerPublicProfileFieldNumber = 2;
+    private global::POGOProtos.Data.Player.PlayerPublicProfile trainerPublicProfile_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerPublicProfile TrainerPublicProfile {
+      get { return trainerPublicProfile_; }
+      set {
+        trainerPublicProfile_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymMembership);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymMembership other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(TrainerPublicProfile, other.TrainerPublicProfile)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (trainerPublicProfile_ != null) hash ^= TrainerPublicProfile.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (pokemonData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PokemonData);
+      }
+      if (trainerPublicProfile_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(TrainerPublicProfile);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (trainerPublicProfile_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TrainerPublicProfile);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymMembership other) {
+      if (other == null) {
+        return;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.trainerPublicProfile_ != null) {
+        if (trainerPublicProfile_ == null) {
+          trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+        }
+        TrainerPublicProfile.MergeFrom(other.TrainerPublicProfile);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 18: {
+            if (trainerPublicProfile_ == null) {
+              trainerPublicProfile_ = new global::POGOProtos.Data.Player.PlayerPublicProfile();
+            }
+            input.ReadMessage(trainerPublicProfile_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GymState : pb::IMessage<GymState> {
+    private static readonly pb::MessageParser<GymState> _parser = new pb::MessageParser<GymState>(() => new GymState());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymState> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Gym.POGOProtosDataGymReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymState() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymState(GymState other) : this() {
+      FortData = other.fortData_ != null ? other.FortData.Clone() : null;
+      memberships_ = other.memberships_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymState Clone() {
+      return new GymState(this);
+    }
+
+    /// <summary>Field number for the "fort_data" field.</summary>
+    public const int FortDataFieldNumber = 1;
+    private global::POGOProtos.Map.Fort.FortData fortData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortData FortData {
+      get { return fortData_; }
+      set {
+        fortData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "memberships" field.</summary>
+    public const int MembershipsFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Gym.GymMembership> _repeated_memberships_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Data.Gym.GymMembership.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Gym.GymMembership> memberships_ = new pbc::RepeatedField<global::POGOProtos.Data.Gym.GymMembership>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Gym.GymMembership> Memberships {
+      get { return memberships_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymState);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymState other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(FortData, other.FortData)) return false;
+      if(!memberships_.Equals(other.memberships_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (fortData_ != null) hash ^= FortData.GetHashCode();
+      hash ^= memberships_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (fortData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(FortData);
+      }
+      memberships_.WriteTo(output, _repeated_memberships_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (fortData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortData);
+      }
+      size += memberships_.CalculateSize(_repeated_memberships_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymState other) {
+      if (other == null) {
+        return;
+      }
+      if (other.fortData_ != null) {
+        if (fortData_ == null) {
+          fortData_ = new global::POGOProtos.Map.Fort.FortData();
+        }
+        FortData.MergeFrom(other.FortData);
+      }
+      memberships_.Add(other.memberships_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (fortData_ == null) {
+              fortData_ = new global::POGOProtos.Map.Fort.FortData();
+            }
+            input.ReadMessage(fortData_);
+            break;
+          }
+          case 18: {
+            memberships_.AddEntriesFrom(input, _repeated_memberships_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Logs/ActionLogEntry.cs b/PokemonGo/POGOProtos/Data/Logs/ActionLogEntry.cs
new file mode 100644
index 0000000..4207766
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Logs/ActionLogEntry.cs
@@ -0,0 +1,290 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Logs/ActionLogEntry.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Logs {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Logs/ActionLogEntry.proto</summary>
+  public static partial class ActionLogEntryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Logs/ActionLogEntry.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ActionLogEntryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CilQT0dPUHJvdG9zL0RhdGEvTG9ncy9BY3Rpb25Mb2dFbnRyeS5wcm90bxIU",
+            "UE9HT1Byb3Rvcy5EYXRhLkxvZ3MaL1BPR09Qcm90b3MvRGF0YS9Mb2dzL0Nh",
+            "dGNoUG9rZW1vbkxvZ0VudHJ5LnByb3RvGi1QT0dPUHJvdG9zL0RhdGEvTG9n",
+            "cy9Gb3J0U2VhcmNoTG9nRW50cnkucHJvdG8ixQEKDkFjdGlvbkxvZ0VudHJ5",
+            "EhQKDHRpbWVzdGFtcF9tcxgBIAEoAxINCgVzZmlkYRgCIAEoCBJDCg1jYXRj",
+            "aF9wb2tlbW9uGAMgASgLMiouUE9HT1Byb3Rvcy5EYXRhLkxvZ3MuQ2F0Y2hQ",
+            "b2tlbW9uTG9nRW50cnlIABI/Cgtmb3J0X3NlYXJjaBgEIAEoCzIoLlBPR09Q",
+            "cm90b3MuRGF0YS5Mb2dzLkZvcnRTZWFyY2hMb2dFbnRyeUgAQggKBkFjdGlv",
+            "bmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Logs.CatchPokemonLogEntryReflection.Descriptor, global::POGOProtos.Data.Logs.FortSearchLogEntryReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Logs.ActionLogEntry), global::POGOProtos.Data.Logs.ActionLogEntry.Parser, new[]{ "TimestampMs", "Sfida", "CatchPokemon", "FortSearch" }, new[]{ "Action" }, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ActionLogEntry : pb::IMessage<ActionLogEntry> {
+    private static readonly pb::MessageParser<ActionLogEntry> _parser = new pb::MessageParser<ActionLogEntry>(() => new ActionLogEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ActionLogEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Logs.ActionLogEntryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionLogEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionLogEntry(ActionLogEntry other) : this() {
+      timestampMs_ = other.timestampMs_;
+      sfida_ = other.sfida_;
+      switch (other.ActionCase) {
+        case ActionOneofCase.CatchPokemon:
+          CatchPokemon = other.CatchPokemon.Clone();
+          break;
+        case ActionOneofCase.FortSearch:
+          FortSearch = other.FortSearch.Clone();
+          break;
+      }
+
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionLogEntry Clone() {
+      return new ActionLogEntry(this);
+    }
+
+    /// <summary>Field number for the "timestamp_ms" field.</summary>
+    public const int TimestampMsFieldNumber = 1;
+    private long timestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long TimestampMs {
+      get { return timestampMs_; }
+      set {
+        timestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sfida" field.</summary>
+    public const int SfidaFieldNumber = 2;
+    private bool sfida_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Sfida {
+      get { return sfida_; }
+      set {
+        sfida_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "catch_pokemon" field.</summary>
+    public const int CatchPokemonFieldNumber = 3;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.CatchPokemonLogEntry CatchPokemon {
+      get { return actionCase_ == ActionOneofCase.CatchPokemon ? (global::POGOProtos.Data.Logs.CatchPokemonLogEntry) action_ : null; }
+      set {
+        action_ = value;
+        actionCase_ = value == null ? ActionOneofCase.None : ActionOneofCase.CatchPokemon;
+      }
+    }
+
+    /// <summary>Field number for the "fort_search" field.</summary>
+    public const int FortSearchFieldNumber = 4;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.FortSearchLogEntry FortSearch {
+      get { return actionCase_ == ActionOneofCase.FortSearch ? (global::POGOProtos.Data.Logs.FortSearchLogEntry) action_ : null; }
+      set {
+        action_ = value;
+        actionCase_ = value == null ? ActionOneofCase.None : ActionOneofCase.FortSearch;
+      }
+    }
+
+    private object action_;
+    /// <summary>Enum of possible cases for the "Action" oneof.</summary>
+    public enum ActionOneofCase {
+      None = 0,
+      CatchPokemon = 3,
+      FortSearch = 4,
+    }
+    private ActionOneofCase actionCase_ = ActionOneofCase.None;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionOneofCase ActionCase {
+      get { return actionCase_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void ClearAction() {
+      actionCase_ = ActionOneofCase.None;
+      action_ = null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ActionLogEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ActionLogEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (TimestampMs != other.TimestampMs) return false;
+      if (Sfida != other.Sfida) return false;
+      if (!object.Equals(CatchPokemon, other.CatchPokemon)) return false;
+      if (!object.Equals(FortSearch, other.FortSearch)) return false;
+      if (ActionCase != other.ActionCase) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (TimestampMs != 0L) hash ^= TimestampMs.GetHashCode();
+      if (Sfida != false) hash ^= Sfida.GetHashCode();
+      if (actionCase_ == ActionOneofCase.CatchPokemon) hash ^= CatchPokemon.GetHashCode();
+      if (actionCase_ == ActionOneofCase.FortSearch) hash ^= FortSearch.GetHashCode();
+      hash ^= (int) actionCase_;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (TimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(TimestampMs);
+      }
+      if (Sfida != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(Sfida);
+      }
+      if (actionCase_ == ActionOneofCase.CatchPokemon) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CatchPokemon);
+      }
+      if (actionCase_ == ActionOneofCase.FortSearch) {
+        output.WriteRawTag(34);
+        output.WriteMessage(FortSearch);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (TimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(TimestampMs);
+      }
+      if (Sfida != false) {
+        size += 1 + 1;
+      }
+      if (actionCase_ == ActionOneofCase.CatchPokemon) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CatchPokemon);
+      }
+      if (actionCase_ == ActionOneofCase.FortSearch) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortSearch);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ActionLogEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.TimestampMs != 0L) {
+        TimestampMs = other.TimestampMs;
+      }
+      if (other.Sfida != false) {
+        Sfida = other.Sfida;
+      }
+      switch (other.ActionCase) {
+        case ActionOneofCase.CatchPokemon:
+          CatchPokemon = other.CatchPokemon;
+          break;
+        case ActionOneofCase.FortSearch:
+          FortSearch = other.FortSearch;
+          break;
+      }
+
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            TimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            Sfida = input.ReadBool();
+            break;
+          }
+          case 26: {
+            global::POGOProtos.Data.Logs.CatchPokemonLogEntry subBuilder = new global::POGOProtos.Data.Logs.CatchPokemonLogEntry();
+            if (actionCase_ == ActionOneofCase.CatchPokemon) {
+              subBuilder.MergeFrom(CatchPokemon);
+            }
+            input.ReadMessage(subBuilder);
+            CatchPokemon = subBuilder;
+            break;
+          }
+          case 34: {
+            global::POGOProtos.Data.Logs.FortSearchLogEntry subBuilder = new global::POGOProtos.Data.Logs.FortSearchLogEntry();
+            if (actionCase_ == ActionOneofCase.FortSearch) {
+              subBuilder.MergeFrom(FortSearch);
+            }
+            input.ReadMessage(subBuilder);
+            FortSearch = subBuilder;
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Logs/CatchPokemonLogEntry.cs b/PokemonGo/POGOProtos/Data/Logs/CatchPokemonLogEntry.cs
new file mode 100644
index 0000000..6b46659
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Logs/CatchPokemonLogEntry.cs
@@ -0,0 +1,262 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Logs/CatchPokemonLogEntry.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Logs {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Logs/CatchPokemonLogEntry.proto</summary>
+  public static partial class CatchPokemonLogEntryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Logs/CatchPokemonLogEntry.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CatchPokemonLogEntryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci9QT0dPUHJvdG9zL0RhdGEvTG9ncy9DYXRjaFBva2Vtb25Mb2dFbnRyeS5w",
+            "cm90bxIUUE9HT1Byb3Rvcy5EYXRhLkxvZ3MaIFBPR09Qcm90b3MvRW51bXMv",
+            "UG9rZW1vbklkLnByb3RvIvcBChRDYXRjaFBva2Vtb25Mb2dFbnRyeRJBCgZy",
+            "ZXN1bHQYASABKA4yMS5QT0dPUHJvdG9zLkRhdGEuTG9ncy5DYXRjaFBva2Vt",
+            "b25Mb2dFbnRyeS5SZXN1bHQSLwoKcG9rZW1vbl9pZBgCIAEoDjIbLlBPR09Q",
+            "cm90b3MuRW51bXMuUG9rZW1vbklkEhUKDWNvbWJhdF9wb2ludHMYAyABKAUS",
+            "FwoPcG9rZW1vbl9kYXRhX2lkGAQgASgEIjsKBlJlc3VsdBIJCgVVTlNFVBAA",
+            "EhQKEFBPS0VNT05fQ0FQVFVSRUQQARIQCgxQT0tFTU9OX0ZMRUQQAmIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Logs.CatchPokemonLogEntry), global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Parser, new[]{ "Result", "PokemonId", "CombatPoints", "PokemonDataId" }, null, new[]{ typeof(global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CatchPokemonLogEntry : pb::IMessage<CatchPokemonLogEntry> {
+    private static readonly pb::MessageParser<CatchPokemonLogEntry> _parser = new pb::MessageParser<CatchPokemonLogEntry>(() => new CatchPokemonLogEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CatchPokemonLogEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Logs.CatchPokemonLogEntryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonLogEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonLogEntry(CatchPokemonLogEntry other) : this() {
+      result_ = other.result_;
+      pokemonId_ = other.pokemonId_;
+      combatPoints_ = other.combatPoints_;
+      pokemonDataId_ = other.pokemonDataId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonLogEntry Clone() {
+      return new CatchPokemonLogEntry(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "combat_points" field.</summary>
+    public const int CombatPointsFieldNumber = 3;
+    private int combatPoints_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CombatPoints {
+      get { return combatPoints_; }
+      set {
+        combatPoints_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data_id" field.</summary>
+    public const int PokemonDataIdFieldNumber = 4;
+    private ulong pokemonDataId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonDataId {
+      get { return pokemonDataId_; }
+      set {
+        pokemonDataId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonLogEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CatchPokemonLogEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (CombatPoints != other.CombatPoints) return false;
+      if (PokemonDataId != other.PokemonDataId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (CombatPoints != 0) hash ^= CombatPoints.GetHashCode();
+      if (PokemonDataId != 0UL) hash ^= PokemonDataId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (CombatPoints != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(CombatPoints);
+      }
+      if (PokemonDataId != 0UL) {
+        output.WriteRawTag(32);
+        output.WriteUInt64(PokemonDataId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (CombatPoints != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CombatPoints);
+      }
+      if (PokemonDataId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonDataId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CatchPokemonLogEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.CombatPoints != 0) {
+        CombatPoints = other.CombatPoints;
+      }
+      if (other.PokemonDataId != 0UL) {
+        PokemonDataId = other.PokemonDataId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            CombatPoints = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            PokemonDataId = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CatchPokemonLogEntry message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("POKEMON_CAPTURED")] PokemonCaptured = 1,
+        [pbr::OriginalName("POKEMON_FLED")] PokemonFled = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Logs/FortSearchLogEntry.cs b/PokemonGo/POGOProtos/Data/Logs/FortSearchLogEntry.cs
new file mode 100644
index 0000000..05605ec
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Logs/FortSearchLogEntry.cs
@@ -0,0 +1,252 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Logs/FortSearchLogEntry.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Logs {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Logs/FortSearchLogEntry.proto</summary>
+  public static partial class FortSearchLogEntryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Logs/FortSearchLogEntry.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortSearchLogEntryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci1QT0dPUHJvdG9zL0RhdGEvTG9ncy9Gb3J0U2VhcmNoTG9nRW50cnkucHJv",
+            "dG8SFFBPR09Qcm90b3MuRGF0YS5Mb2dzGihQT0dPUHJvdG9zL0ludmVudG9y",
+            "eS9JdGVtL0l0ZW1EYXRhLnByb3RvIsoBChJGb3J0U2VhcmNoTG9nRW50cnkS",
+            "PwoGcmVzdWx0GAEgASgOMi8uUE9HT1Byb3Rvcy5EYXRhLkxvZ3MuRm9ydFNl",
+            "YXJjaExvZ0VudHJ5LlJlc3VsdBIPCgdmb3J0X2lkGAIgASgJEjIKBWl0ZW1z",
+            "GAMgAygLMiMuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtRGF0YRIM",
+            "CgRlZ2dzGAQgASgFIiAKBlJlc3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQ",
+            "AWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Logs.FortSearchLogEntry), global::POGOProtos.Data.Logs.FortSearchLogEntry.Parser, new[]{ "Result", "FortId", "Items", "Eggs" }, null, new[]{ typeof(global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortSearchLogEntry : pb::IMessage<FortSearchLogEntry> {
+    private static readonly pb::MessageParser<FortSearchLogEntry> _parser = new pb::MessageParser<FortSearchLogEntry>(() => new FortSearchLogEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSearchLogEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Logs.FortSearchLogEntryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchLogEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchLogEntry(FortSearchLogEntry other) : this() {
+      result_ = other.result_;
+      fortId_ = other.fortId_;
+      items_ = other.items_.Clone();
+      eggs_ = other.eggs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchLogEntry Clone() {
+      return new FortSearchLogEntry(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 2;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "items" field.</summary>
+    public const int ItemsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemData> _repeated_items_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Inventory.Item.ItemData.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemData> items_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemData>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemData> Items {
+      get { return items_; }
+    }
+
+    /// <summary>Field number for the "eggs" field.</summary>
+    public const int EggsFieldNumber = 4;
+    private int eggs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Eggs {
+      get { return eggs_; }
+      set {
+        eggs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSearchLogEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSearchLogEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (FortId != other.FortId) return false;
+      if(!items_.Equals(other.items_)) return false;
+      if (Eggs != other.Eggs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      hash ^= items_.GetHashCode();
+      if (Eggs != 0) hash ^= Eggs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (FortId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(FortId);
+      }
+      items_.WriteTo(output, _repeated_items_codec);
+      if (Eggs != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(Eggs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      size += items_.CalculateSize(_repeated_items_codec);
+      if (Eggs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Eggs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSearchLogEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      items_.Add(other.items_);
+      if (other.Eggs != 0) {
+        Eggs = other.Eggs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 26: {
+            items_.AddEntriesFrom(input, _repeated_items_codec);
+            break;
+          }
+          case 32: {
+            Eggs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortSearchLogEntry message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Logs/POGOProtosDataLogs.cs b/PokemonGo/POGOProtos/Data/Logs/POGOProtosDataLogs.cs
new file mode 100644
index 0000000..2cf9811
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Logs/POGOProtosDataLogs.cs
@@ -0,0 +1,720 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Data.Logs.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Logs {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Data.Logs.proto</summary>
+  public static partial class POGOProtosDataLogsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Data.Logs.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosDataLogsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChpQT0dPUHJvdG9zLkRhdGEuTG9ncy5wcm90bxIUUE9HT1Byb3Rvcy5EYXRh",
+            "LkxvZ3MaFlBPR09Qcm90b3MuRW51bXMucHJvdG8aH1BPR09Qcm90b3MuSW52",
+            "ZW50b3J5Lkl0ZW0ucHJvdG8ixQEKDkFjdGlvbkxvZ0VudHJ5EhQKDHRpbWVz",
+            "dGFtcF9tcxgBIAEoAxINCgVzZmlkYRgCIAEoCBJDCg1jYXRjaF9wb2tlbW9u",
+            "GAMgASgLMiouUE9HT1Byb3Rvcy5EYXRhLkxvZ3MuQ2F0Y2hQb2tlbW9uTG9n",
+            "RW50cnlIABI/Cgtmb3J0X3NlYXJjaBgEIAEoCzIoLlBPR09Qcm90b3MuRGF0",
+            "YS5Mb2dzLkZvcnRTZWFyY2hMb2dFbnRyeUgAQggKBkFjdGlvbiL3AQoUQ2F0",
+            "Y2hQb2tlbW9uTG9nRW50cnkSQQoGcmVzdWx0GAEgASgOMjEuUE9HT1Byb3Rv",
+            "cy5EYXRhLkxvZ3MuQ2F0Y2hQb2tlbW9uTG9nRW50cnkuUmVzdWx0Ei8KCnBv",
+            "a2Vtb25faWQYAiABKA4yGy5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25JZBIV",
+            "Cg1jb21iYXRfcG9pbnRzGAMgASgFEhcKD3Bva2Vtb25fZGF0YV9pZBgEIAEo",
+            "BCI7CgZSZXN1bHQSCQoFVU5TRVQQABIUChBQT0tFTU9OX0NBUFRVUkVEEAES",
+            "EAoMUE9LRU1PTl9GTEVEEAIiygEKEkZvcnRTZWFyY2hMb2dFbnRyeRI/CgZy",
+            "ZXN1bHQYASABKA4yLy5QT0dPUHJvdG9zLkRhdGEuTG9ncy5Gb3J0U2VhcmNo",
+            "TG9nRW50cnkuUmVzdWx0Eg8KB2ZvcnRfaWQYAiABKAkSMgoFaXRlbXMYAyAD",
+            "KAsyIy5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1EYXRhEgwKBGVn",
+            "Z3MYBCABKAUiIAoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABUABQ",
+            "AWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Logs.ActionLogEntry), global::POGOProtos.Data.Logs.ActionLogEntry.Parser, new[]{ "TimestampMs", "Sfida", "CatchPokemon", "FortSearch" }, new[]{ "Action" }, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Logs.CatchPokemonLogEntry), global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Parser, new[]{ "Result", "PokemonId", "CombatPoints", "PokemonDataId" }, null, new[]{ typeof(global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Logs.FortSearchLogEntry), global::POGOProtos.Data.Logs.FortSearchLogEntry.Parser, new[]{ "Result", "FortId", "Items", "Eggs" }, null, new[]{ typeof(global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ActionLogEntry : pb::IMessage<ActionLogEntry> {
+    private static readonly pb::MessageParser<ActionLogEntry> _parser = new pb::MessageParser<ActionLogEntry>(() => new ActionLogEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ActionLogEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Logs.POGOProtosDataLogsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionLogEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionLogEntry(ActionLogEntry other) : this() {
+      timestampMs_ = other.timestampMs_;
+      sfida_ = other.sfida_;
+      switch (other.ActionCase) {
+        case ActionOneofCase.CatchPokemon:
+          CatchPokemon = other.CatchPokemon.Clone();
+          break;
+        case ActionOneofCase.FortSearch:
+          FortSearch = other.FortSearch.Clone();
+          break;
+      }
+
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionLogEntry Clone() {
+      return new ActionLogEntry(this);
+    }
+
+    /// <summary>Field number for the "timestamp_ms" field.</summary>
+    public const int TimestampMsFieldNumber = 1;
+    private long timestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long TimestampMs {
+      get { return timestampMs_; }
+      set {
+        timestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sfida" field.</summary>
+    public const int SfidaFieldNumber = 2;
+    private bool sfida_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Sfida {
+      get { return sfida_; }
+      set {
+        sfida_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "catch_pokemon" field.</summary>
+    public const int CatchPokemonFieldNumber = 3;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.CatchPokemonLogEntry CatchPokemon {
+      get { return actionCase_ == ActionOneofCase.CatchPokemon ? (global::POGOProtos.Data.Logs.CatchPokemonLogEntry) action_ : null; }
+      set {
+        action_ = value;
+        actionCase_ = value == null ? ActionOneofCase.None : ActionOneofCase.CatchPokemon;
+      }
+    }
+
+    /// <summary>Field number for the "fort_search" field.</summary>
+    public const int FortSearchFieldNumber = 4;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.FortSearchLogEntry FortSearch {
+      get { return actionCase_ == ActionOneofCase.FortSearch ? (global::POGOProtos.Data.Logs.FortSearchLogEntry) action_ : null; }
+      set {
+        action_ = value;
+        actionCase_ = value == null ? ActionOneofCase.None : ActionOneofCase.FortSearch;
+      }
+    }
+
+    private object action_;
+    /// <summary>Enum of possible cases for the "Action" oneof.</summary>
+    public enum ActionOneofCase {
+      None = 0,
+      CatchPokemon = 3,
+      FortSearch = 4,
+    }
+    private ActionOneofCase actionCase_ = ActionOneofCase.None;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ActionOneofCase ActionCase {
+      get { return actionCase_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void ClearAction() {
+      actionCase_ = ActionOneofCase.None;
+      action_ = null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ActionLogEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ActionLogEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (TimestampMs != other.TimestampMs) return false;
+      if (Sfida != other.Sfida) return false;
+      if (!object.Equals(CatchPokemon, other.CatchPokemon)) return false;
+      if (!object.Equals(FortSearch, other.FortSearch)) return false;
+      if (ActionCase != other.ActionCase) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (TimestampMs != 0L) hash ^= TimestampMs.GetHashCode();
+      if (Sfida != false) hash ^= Sfida.GetHashCode();
+      if (actionCase_ == ActionOneofCase.CatchPokemon) hash ^= CatchPokemon.GetHashCode();
+      if (actionCase_ == ActionOneofCase.FortSearch) hash ^= FortSearch.GetHashCode();
+      hash ^= (int) actionCase_;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (TimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(TimestampMs);
+      }
+      if (Sfida != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(Sfida);
+      }
+      if (actionCase_ == ActionOneofCase.CatchPokemon) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CatchPokemon);
+      }
+      if (actionCase_ == ActionOneofCase.FortSearch) {
+        output.WriteRawTag(34);
+        output.WriteMessage(FortSearch);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (TimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(TimestampMs);
+      }
+      if (Sfida != false) {
+        size += 1 + 1;
+      }
+      if (actionCase_ == ActionOneofCase.CatchPokemon) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CatchPokemon);
+      }
+      if (actionCase_ == ActionOneofCase.FortSearch) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortSearch);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ActionLogEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.TimestampMs != 0L) {
+        TimestampMs = other.TimestampMs;
+      }
+      if (other.Sfida != false) {
+        Sfida = other.Sfida;
+      }
+      switch (other.ActionCase) {
+        case ActionOneofCase.CatchPokemon:
+          CatchPokemon = other.CatchPokemon;
+          break;
+        case ActionOneofCase.FortSearch:
+          FortSearch = other.FortSearch;
+          break;
+      }
+
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            TimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            Sfida = input.ReadBool();
+            break;
+          }
+          case 26: {
+            global::POGOProtos.Data.Logs.CatchPokemonLogEntry subBuilder = new global::POGOProtos.Data.Logs.CatchPokemonLogEntry();
+            if (actionCase_ == ActionOneofCase.CatchPokemon) {
+              subBuilder.MergeFrom(CatchPokemon);
+            }
+            input.ReadMessage(subBuilder);
+            CatchPokemon = subBuilder;
+            break;
+          }
+          case 34: {
+            global::POGOProtos.Data.Logs.FortSearchLogEntry subBuilder = new global::POGOProtos.Data.Logs.FortSearchLogEntry();
+            if (actionCase_ == ActionOneofCase.FortSearch) {
+              subBuilder.MergeFrom(FortSearch);
+            }
+            input.ReadMessage(subBuilder);
+            FortSearch = subBuilder;
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CatchPokemonLogEntry : pb::IMessage<CatchPokemonLogEntry> {
+    private static readonly pb::MessageParser<CatchPokemonLogEntry> _parser = new pb::MessageParser<CatchPokemonLogEntry>(() => new CatchPokemonLogEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CatchPokemonLogEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Logs.POGOProtosDataLogsReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonLogEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonLogEntry(CatchPokemonLogEntry other) : this() {
+      result_ = other.result_;
+      pokemonId_ = other.pokemonId_;
+      combatPoints_ = other.combatPoints_;
+      pokemonDataId_ = other.pokemonDataId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonLogEntry Clone() {
+      return new CatchPokemonLogEntry(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "combat_points" field.</summary>
+    public const int CombatPointsFieldNumber = 3;
+    private int combatPoints_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CombatPoints {
+      get { return combatPoints_; }
+      set {
+        combatPoints_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data_id" field.</summary>
+    public const int PokemonDataIdFieldNumber = 4;
+    private ulong pokemonDataId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonDataId {
+      get { return pokemonDataId_; }
+      set {
+        pokemonDataId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonLogEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CatchPokemonLogEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (CombatPoints != other.CombatPoints) return false;
+      if (PokemonDataId != other.PokemonDataId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (CombatPoints != 0) hash ^= CombatPoints.GetHashCode();
+      if (PokemonDataId != 0UL) hash ^= PokemonDataId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (CombatPoints != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(CombatPoints);
+      }
+      if (PokemonDataId != 0UL) {
+        output.WriteRawTag(32);
+        output.WriteUInt64(PokemonDataId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (CombatPoints != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CombatPoints);
+      }
+      if (PokemonDataId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonDataId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CatchPokemonLogEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.CombatPoints != 0) {
+        CombatPoints = other.CombatPoints;
+      }
+      if (other.PokemonDataId != 0UL) {
+        PokemonDataId = other.PokemonDataId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Data.Logs.CatchPokemonLogEntry.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            CombatPoints = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            PokemonDataId = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CatchPokemonLogEntry message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("POKEMON_CAPTURED")] PokemonCaptured = 1,
+        [pbr::OriginalName("POKEMON_FLED")] PokemonFled = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class FortSearchLogEntry : pb::IMessage<FortSearchLogEntry> {
+    private static readonly pb::MessageParser<FortSearchLogEntry> _parser = new pb::MessageParser<FortSearchLogEntry>(() => new FortSearchLogEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSearchLogEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Logs.POGOProtosDataLogsReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchLogEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchLogEntry(FortSearchLogEntry other) : this() {
+      result_ = other.result_;
+      fortId_ = other.fortId_;
+      items_ = other.items_.Clone();
+      eggs_ = other.eggs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchLogEntry Clone() {
+      return new FortSearchLogEntry(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 2;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "items" field.</summary>
+    public const int ItemsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemData> _repeated_items_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Inventory.Item.ItemData.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemData> items_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemData>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemData> Items {
+      get { return items_; }
+    }
+
+    /// <summary>Field number for the "eggs" field.</summary>
+    public const int EggsFieldNumber = 4;
+    private int eggs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Eggs {
+      get { return eggs_; }
+      set {
+        eggs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSearchLogEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSearchLogEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (FortId != other.FortId) return false;
+      if(!items_.Equals(other.items_)) return false;
+      if (Eggs != other.Eggs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      hash ^= items_.GetHashCode();
+      if (Eggs != 0) hash ^= Eggs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (FortId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(FortId);
+      }
+      items_.WriteTo(output, _repeated_items_codec);
+      if (Eggs != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(Eggs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      size += items_.CalculateSize(_repeated_items_codec);
+      if (Eggs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Eggs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSearchLogEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      items_.Add(other.items_);
+      if (other.Eggs != 0) {
+        Eggs = other.Eggs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Data.Logs.FortSearchLogEntry.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 26: {
+            items_.AddEntriesFrom(input, _repeated_items_codec);
+            break;
+          }
+          case 32: {
+            Eggs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortSearchLogEntry message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/POGOProtosData.cs b/PokemonGo/POGOProtos/Data/POGOProtosData.cs
new file mode 100644
index 0000000..3a9374c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/POGOProtosData.cs
@@ -0,0 +1,2339 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Data.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Data.proto</summary>
+  public static partial class POGOProtosDataReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Data.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosDataReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChVQT0dPUHJvdG9zLkRhdGEucHJvdG8SD1BPR09Qcm90b3MuRGF0YRoWUE9H",
+            "T1Byb3Rvcy5FbnVtcy5wcm90bxofUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRl",
+            "bS5wcm90bxocUE9HT1Byb3Rvcy5EYXRhLlBsYXllci5wcm90byKLAQoLUGxh",
+            "eWVyQmFkZ2USLwoKYmFkZ2VfdHlwZRgBIAEoDjIbLlBPR09Qcm90b3MuRW51",
+            "bXMuQmFkZ2VUeXBlEgwKBHJhbmsYAiABKAUSEwoLc3RhcnRfdmFsdWUYAyAB",
+            "KAUSEQoJZW5kX3ZhbHVlGAQgASgFEhUKDWN1cnJlbnRfdmFsdWUYBSABKAEi",
+            "UQoQRG93bmxvYWRVcmxFbnRyeRIQCghhc3NldF9pZBgBIAEoCRILCgN1cmwY",
+            "AiABKAkSDAoEc2l6ZRgDIAEoBRIQCghjaGVja3N1bRgEIAEoByKsAQoMUG9r",
+            "ZWRleEVudHJ5Ei8KCnBva2Vtb25faWQYASABKA4yGy5QT0dPUHJvdG9zLkVu",
+            "dW1zLlBva2Vtb25JZBIZChF0aW1lc19lbmNvdW50ZXJlZBgCIAEoBRIWCg50",
+            "aW1lc19jYXB0dXJlZBgDIAEoBRIeChZldm9sdXRpb25fc3RvbmVfcGllY2Vz",
+            "GAQgASgFEhgKEGV2b2x1dGlvbl9zdG9uZXMYBSABKAUimAYKC1Bva2Vtb25E",
+            "YXRhEgoKAmlkGAEgASgGEi8KCnBva2Vtb25faWQYAiABKA4yGy5QT0dPUHJv",
+            "dG9zLkVudW1zLlBva2Vtb25JZBIKCgJjcBgDIAEoBRIPCgdzdGFtaW5hGAQg",
+            "ASgFEhMKC3N0YW1pbmFfbWF4GAUgASgFEi0KBm1vdmVfMRgGIAEoDjIdLlBP",
+            "R09Qcm90b3MuRW51bXMuUG9rZW1vbk1vdmUSLQoGbW92ZV8yGAcgASgOMh0u",
+            "UE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uTW92ZRIYChBkZXBsb3llZF9mb3J0",
+            "X2lkGAggASgJEhIKCm93bmVyX25hbWUYCSABKAkSDgoGaXNfZWdnGAogASgI",
+            "EhwKFGVnZ19rbV93YWxrZWRfdGFyZ2V0GAsgASgBEhsKE2VnZ19rbV93YWxr",
+            "ZWRfc3RhcnQYDCABKAESDgoGb3JpZ2luGA4gASgFEhAKCGhlaWdodF9tGA8g",
+            "ASgCEhEKCXdlaWdodF9rZxgQIAEoAhIZChFpbmRpdmlkdWFsX2F0dGFjaxgR",
+            "IAEoBRIaChJpbmRpdmlkdWFsX2RlZmVuc2UYEiABKAUSGgoSaW5kaXZpZHVh",
+            "bF9zdGFtaW5hGBMgASgFEhUKDWNwX211bHRpcGxpZXIYFCABKAISMwoIcG9r",
+            "ZWJhbGwYFSABKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1J",
+            "ZBIYChBjYXB0dXJlZF9jZWxsX2lkGBYgASgEEhgKEGJhdHRsZXNfYXR0YWNr",
+            "ZWQYFyABKAUSGAoQYmF0dGxlc19kZWZlbmRlZBgYIAEoBRIYChBlZ2dfaW5j",
+            "dWJhdG9yX2lkGBkgASgJEhgKEGNyZWF0aW9uX3RpbWVfbXMYGiABKAQSFAoM",
+            "bnVtX3VwZ3JhZGVzGBsgASgFEiAKGGFkZGl0aW9uYWxfY3BfbXVsdGlwbGll",
+            "chgcIAEoAhIQCghmYXZvcml0ZRgdIAEoBRIQCghuaWNrbmFtZRgeIAEoCRIR",
+            "Cglmcm9tX2ZvcnQYHyABKAUidwoQQXNzZXREaWdlc3RFbnRyeRIQCghhc3Nl",
+            "dF9pZBgBIAEoCRITCgtidW5kbGVfbmFtZRgCIAEoCRIPCgd2ZXJzaW9uGAMg",
+            "ASgDEhAKCGNoZWNrc3VtGAQgASgHEgwKBHNpemUYBSABKAUSCwoDa2V5GAYg",
+            "ASgMIoMECgpQbGF5ZXJEYXRhEh0KFWNyZWF0aW9uX3RpbWVzdGFtcF9tcxgB",
+            "IAEoAxIQCgh1c2VybmFtZRgCIAEoCRIpCgR0ZWFtGAUgASgOMhsuUE9HT1By",
+            "b3Rvcy5FbnVtcy5UZWFtQ29sb3ISOwoOdHV0b3JpYWxfc3RhdGUYByADKA4y",
+            "Hy5QT0dPUHJvdG9zLkVudW1zLlR1dG9yaWFsU3RhdGVCAhABEjQKBmF2YXRh",
+            "chgIIAEoCzIkLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIuUGxheWVyQXZhdGFy",
+            "EhsKE21heF9wb2tlbW9uX3N0b3JhZ2UYCSABKAUSGAoQbWF4X2l0ZW1fc3Rv",
+            "cmFnZRgKIAEoBRI3CgtkYWlseV9ib251cxgLIAEoCzIiLlBPR09Qcm90b3Mu",
+            "RGF0YS5QbGF5ZXIuRGFpbHlCb251cxI9Cg5lcXVpcHBlZF9iYWRnZRgMIAEo",
+            "CzIlLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIuRXF1aXBwZWRCYWRnZRJBChBj",
+            "b250YWN0X3NldHRpbmdzGA0gASgLMicuUE9HT1Byb3Rvcy5EYXRhLlBsYXll",
+            "ci5Db250YWN0U2V0dGluZ3MSNAoKY3VycmVuY2llcxgOIAMoCzIgLlBPR09Q",
+            "cm90b3MuRGF0YS5QbGF5ZXIuQ3VycmVuY3lQAFABUAJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PlayerBadge), global::POGOProtos.Data.PlayerBadge.Parser, new[]{ "BadgeType", "Rank", "StartValue", "EndValue", "CurrentValue" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.DownloadUrlEntry), global::POGOProtos.Data.DownloadUrlEntry.Parser, new[]{ "AssetId", "Url", "Size", "Checksum" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PokedexEntry), global::POGOProtos.Data.PokedexEntry.Parser, new[]{ "PokemonId", "TimesEncountered", "TimesCaptured", "EvolutionStonePieces", "EvolutionStones" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PokemonData), global::POGOProtos.Data.PokemonData.Parser, new[]{ "Id", "PokemonId", "Cp", "Stamina", "StaminaMax", "Move1", "Move2", "DeployedFortId", "OwnerName", "IsEgg", "EggKmWalkedTarget", "EggKmWalkedStart", "Origin", "HeightM", "WeightKg", "IndividualAttack", "IndividualDefense", "IndividualStamina", "CpMultiplier", "Pokeball", "CapturedCellId", "BattlesAttacked", "BattlesDefended", "EggIncubatorId", "CreationTimeMs", "NumUpgrades", "AdditionalCpMultiplier", "Favorite", "Nickname", "FromFort" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.AssetDigestEntry), global::POGOProtos.Data.AssetDigestEntry.Parser, new[]{ "AssetId", "BundleName", "Version", "Checksum", "Size", "Key" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PlayerData), global::POGOProtos.Data.PlayerData.Parser, new[]{ "CreationTimestampMs", "Username", "Team", "TutorialState", "Avatar", "MaxPokemonStorage", "MaxItemStorage", "DailyBonus", "EquippedBadge", "ContactSettings", "Currencies" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerBadge : pb::IMessage<PlayerBadge> {
+    private static readonly pb::MessageParser<PlayerBadge> _parser = new pb::MessageParser<PlayerBadge>(() => new PlayerBadge());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerBadge> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.POGOProtosDataReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerBadge() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerBadge(PlayerBadge other) : this() {
+      badgeType_ = other.badgeType_;
+      rank_ = other.rank_;
+      startValue_ = other.startValue_;
+      endValue_ = other.endValue_;
+      currentValue_ = other.currentValue_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerBadge Clone() {
+      return new PlayerBadge(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "rank" field.</summary>
+    public const int RankFieldNumber = 2;
+    private int rank_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Rank {
+      get { return rank_; }
+      set {
+        rank_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "start_value" field.</summary>
+    public const int StartValueFieldNumber = 3;
+    private int startValue_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StartValue {
+      get { return startValue_; }
+      set {
+        startValue_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "end_value" field.</summary>
+    public const int EndValueFieldNumber = 4;
+    private int endValue_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EndValue {
+      get { return endValue_; }
+      set {
+        endValue_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_value" field.</summary>
+    public const int CurrentValueFieldNumber = 5;
+    private double currentValue_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double CurrentValue {
+      get { return currentValue_; }
+      set {
+        currentValue_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerBadge);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerBadge other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      if (Rank != other.Rank) return false;
+      if (StartValue != other.StartValue) return false;
+      if (EndValue != other.EndValue) return false;
+      if (CurrentValue != other.CurrentValue) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      if (Rank != 0) hash ^= Rank.GetHashCode();
+      if (StartValue != 0) hash ^= StartValue.GetHashCode();
+      if (EndValue != 0) hash ^= EndValue.GetHashCode();
+      if (CurrentValue != 0D) hash ^= CurrentValue.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+      if (Rank != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Rank);
+      }
+      if (StartValue != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(StartValue);
+      }
+      if (EndValue != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(EndValue);
+      }
+      if (CurrentValue != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(CurrentValue);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      if (Rank != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rank);
+      }
+      if (StartValue != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StartValue);
+      }
+      if (EndValue != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EndValue);
+      }
+      if (CurrentValue != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerBadge other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+      if (other.Rank != 0) {
+        Rank = other.Rank;
+      }
+      if (other.StartValue != 0) {
+        StartValue = other.StartValue;
+      }
+      if (other.EndValue != 0) {
+        EndValue = other.EndValue;
+      }
+      if (other.CurrentValue != 0D) {
+        CurrentValue = other.CurrentValue;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Rank = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            StartValue = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            EndValue = input.ReadInt32();
+            break;
+          }
+          case 41: {
+            CurrentValue = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DownloadUrlEntry : pb::IMessage<DownloadUrlEntry> {
+    private static readonly pb::MessageParser<DownloadUrlEntry> _parser = new pb::MessageParser<DownloadUrlEntry>(() => new DownloadUrlEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadUrlEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.POGOProtosDataReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadUrlEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadUrlEntry(DownloadUrlEntry other) : this() {
+      assetId_ = other.assetId_;
+      url_ = other.url_;
+      size_ = other.size_;
+      checksum_ = other.checksum_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadUrlEntry Clone() {
+      return new DownloadUrlEntry(this);
+    }
+
+    /// <summary>Field number for the "asset_id" field.</summary>
+    public const int AssetIdFieldNumber = 1;
+    private string assetId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string AssetId {
+      get { return assetId_; }
+      set {
+        assetId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "url" field.</summary>
+    public const int UrlFieldNumber = 2;
+    private string url_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Url {
+      get { return url_; }
+      set {
+        url_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "size" field.</summary>
+    public const int SizeFieldNumber = 3;
+    private int size_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Size {
+      get { return size_; }
+      set {
+        size_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "checksum" field.</summary>
+    public const int ChecksumFieldNumber = 4;
+    private uint checksum_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint Checksum {
+      get { return checksum_; }
+      set {
+        checksum_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadUrlEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadUrlEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AssetId != other.AssetId) return false;
+      if (Url != other.Url) return false;
+      if (Size != other.Size) return false;
+      if (Checksum != other.Checksum) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AssetId.Length != 0) hash ^= AssetId.GetHashCode();
+      if (Url.Length != 0) hash ^= Url.GetHashCode();
+      if (Size != 0) hash ^= Size.GetHashCode();
+      if (Checksum != 0) hash ^= Checksum.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AssetId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(AssetId);
+      }
+      if (Url.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Url);
+      }
+      if (Size != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Size);
+      }
+      if (Checksum != 0) {
+        output.WriteRawTag(37);
+        output.WriteFixed32(Checksum);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AssetId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(AssetId);
+      }
+      if (Url.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Url);
+      }
+      if (Size != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Size);
+      }
+      if (Checksum != 0) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadUrlEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AssetId.Length != 0) {
+        AssetId = other.AssetId;
+      }
+      if (other.Url.Length != 0) {
+        Url = other.Url;
+      }
+      if (other.Size != 0) {
+        Size = other.Size;
+      }
+      if (other.Checksum != 0) {
+        Checksum = other.Checksum;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            AssetId = input.ReadString();
+            break;
+          }
+          case 18: {
+            Url = input.ReadString();
+            break;
+          }
+          case 24: {
+            Size = input.ReadInt32();
+            break;
+          }
+          case 37: {
+            Checksum = input.ReadFixed32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PokedexEntry : pb::IMessage<PokedexEntry> {
+    private static readonly pb::MessageParser<PokedexEntry> _parser = new pb::MessageParser<PokedexEntry>(() => new PokedexEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokedexEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.POGOProtosDataReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokedexEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokedexEntry(PokedexEntry other) : this() {
+      pokemonId_ = other.pokemonId_;
+      timesEncountered_ = other.timesEncountered_;
+      timesCaptured_ = other.timesCaptured_;
+      evolutionStonePieces_ = other.evolutionStonePieces_;
+      evolutionStones_ = other.evolutionStones_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokedexEntry Clone() {
+      return new PokedexEntry(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "times_encountered" field.</summary>
+    public const int TimesEncounteredFieldNumber = 2;
+    private int timesEncountered_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TimesEncountered {
+      get { return timesEncountered_; }
+      set {
+        timesEncountered_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "times_captured" field.</summary>
+    public const int TimesCapturedFieldNumber = 3;
+    private int timesCaptured_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TimesCaptured {
+      get { return timesCaptured_; }
+      set {
+        timesCaptured_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolution_stone_pieces" field.</summary>
+    public const int EvolutionStonePiecesFieldNumber = 4;
+    private int evolutionStonePieces_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EvolutionStonePieces {
+      get { return evolutionStonePieces_; }
+      set {
+        evolutionStonePieces_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolution_stones" field.</summary>
+    public const int EvolutionStonesFieldNumber = 5;
+    private int evolutionStones_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EvolutionStones {
+      get { return evolutionStones_; }
+      set {
+        evolutionStones_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokedexEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokedexEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (TimesEncountered != other.TimesEncountered) return false;
+      if (TimesCaptured != other.TimesCaptured) return false;
+      if (EvolutionStonePieces != other.EvolutionStonePieces) return false;
+      if (EvolutionStones != other.EvolutionStones) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (TimesEncountered != 0) hash ^= TimesEncountered.GetHashCode();
+      if (TimesCaptured != 0) hash ^= TimesCaptured.GetHashCode();
+      if (EvolutionStonePieces != 0) hash ^= EvolutionStonePieces.GetHashCode();
+      if (EvolutionStones != 0) hash ^= EvolutionStones.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (TimesEncountered != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(TimesEncountered);
+      }
+      if (TimesCaptured != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(TimesCaptured);
+      }
+      if (EvolutionStonePieces != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(EvolutionStonePieces);
+      }
+      if (EvolutionStones != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(EvolutionStones);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (TimesEncountered != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimesEncountered);
+      }
+      if (TimesCaptured != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimesCaptured);
+      }
+      if (EvolutionStonePieces != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionStonePieces);
+      }
+      if (EvolutionStones != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionStones);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokedexEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.TimesEncountered != 0) {
+        TimesEncountered = other.TimesEncountered;
+      }
+      if (other.TimesCaptured != 0) {
+        TimesCaptured = other.TimesCaptured;
+      }
+      if (other.EvolutionStonePieces != 0) {
+        EvolutionStonePieces = other.EvolutionStonePieces;
+      }
+      if (other.EvolutionStones != 0) {
+        EvolutionStones = other.EvolutionStones;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            TimesEncountered = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            TimesCaptured = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            EvolutionStonePieces = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            EvolutionStones = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PokemonData : pb::IMessage<PokemonData> {
+    private static readonly pb::MessageParser<PokemonData> _parser = new pb::MessageParser<PokemonData>(() => new PokemonData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokemonData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.POGOProtosDataReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonData(PokemonData other) : this() {
+      id_ = other.id_;
+      pokemonId_ = other.pokemonId_;
+      cp_ = other.cp_;
+      stamina_ = other.stamina_;
+      staminaMax_ = other.staminaMax_;
+      move1_ = other.move1_;
+      move2_ = other.move2_;
+      deployedFortId_ = other.deployedFortId_;
+      ownerName_ = other.ownerName_;
+      isEgg_ = other.isEgg_;
+      eggKmWalkedTarget_ = other.eggKmWalkedTarget_;
+      eggKmWalkedStart_ = other.eggKmWalkedStart_;
+      origin_ = other.origin_;
+      heightM_ = other.heightM_;
+      weightKg_ = other.weightKg_;
+      individualAttack_ = other.individualAttack_;
+      individualDefense_ = other.individualDefense_;
+      individualStamina_ = other.individualStamina_;
+      cpMultiplier_ = other.cpMultiplier_;
+      pokeball_ = other.pokeball_;
+      capturedCellId_ = other.capturedCellId_;
+      battlesAttacked_ = other.battlesAttacked_;
+      battlesDefended_ = other.battlesDefended_;
+      eggIncubatorId_ = other.eggIncubatorId_;
+      creationTimeMs_ = other.creationTimeMs_;
+      numUpgrades_ = other.numUpgrades_;
+      additionalCpMultiplier_ = other.additionalCpMultiplier_;
+      favorite_ = other.favorite_;
+      nickname_ = other.nickname_;
+      fromFort_ = other.fromFort_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonData Clone() {
+      return new PokemonData(this);
+    }
+
+    /// <summary>Field number for the "id" field.</summary>
+    public const int IdFieldNumber = 1;
+    private ulong id_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong Id {
+      get { return id_; }
+      set {
+        id_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cp" field.</summary>
+    public const int CpFieldNumber = 3;
+    private int cp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Cp {
+      get { return cp_; }
+      set {
+        cp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 4;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina_max" field.</summary>
+    public const int StaminaMaxFieldNumber = 5;
+    private int staminaMax_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StaminaMax {
+      get { return staminaMax_; }
+      set {
+        staminaMax_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "move_1" field.</summary>
+    public const int Move1FieldNumber = 6;
+    private global::POGOProtos.Enums.PokemonMove move1_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMove Move1 {
+      get { return move1_; }
+      set {
+        move1_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "move_2" field.</summary>
+    public const int Move2FieldNumber = 7;
+    private global::POGOProtos.Enums.PokemonMove move2_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMove Move2 {
+      get { return move2_; }
+      set {
+        move2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deployed_fort_id" field.</summary>
+    public const int DeployedFortIdFieldNumber = 8;
+    private string deployedFortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeployedFortId {
+      get { return deployedFortId_; }
+      set {
+        deployedFortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "owner_name" field.</summary>
+    public const int OwnerNameFieldNumber = 9;
+    private string ownerName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string OwnerName {
+      get { return ownerName_; }
+      set {
+        ownerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "is_egg" field.</summary>
+    public const int IsEggFieldNumber = 10;
+    private bool isEgg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsEgg {
+      get { return isEgg_; }
+      set {
+        isEgg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_km_walked_target" field.</summary>
+    public const int EggKmWalkedTargetFieldNumber = 11;
+    private double eggKmWalkedTarget_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double EggKmWalkedTarget {
+      get { return eggKmWalkedTarget_; }
+      set {
+        eggKmWalkedTarget_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_km_walked_start" field.</summary>
+    public const int EggKmWalkedStartFieldNumber = 12;
+    private double eggKmWalkedStart_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double EggKmWalkedStart {
+      get { return eggKmWalkedStart_; }
+      set {
+        eggKmWalkedStart_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "origin" field.</summary>
+    public const int OriginFieldNumber = 14;
+    private int origin_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Origin {
+      get { return origin_; }
+      set {
+        origin_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "height_m" field.</summary>
+    public const int HeightMFieldNumber = 15;
+    private float heightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float HeightM {
+      get { return heightM_; }
+      set {
+        heightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "weight_kg" field.</summary>
+    public const int WeightKgFieldNumber = 16;
+    private float weightKg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float WeightKg {
+      get { return weightKg_; }
+      set {
+        weightKg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "individual_attack" field.</summary>
+    public const int IndividualAttackFieldNumber = 17;
+    private int individualAttack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IndividualAttack {
+      get { return individualAttack_; }
+      set {
+        individualAttack_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "individual_defense" field.</summary>
+    public const int IndividualDefenseFieldNumber = 18;
+    private int individualDefense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IndividualDefense {
+      get { return individualDefense_; }
+      set {
+        individualDefense_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "individual_stamina" field.</summary>
+    public const int IndividualStaminaFieldNumber = 19;
+    private int individualStamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IndividualStamina {
+      get { return individualStamina_; }
+      set {
+        individualStamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cp_multiplier" field.</summary>
+    public const int CpMultiplierFieldNumber = 20;
+    private float cpMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CpMultiplier {
+      get { return cpMultiplier_; }
+      set {
+        cpMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeball" field.</summary>
+    public const int PokeballFieldNumber = 21;
+    private global::POGOProtos.Inventory.Item.ItemId pokeball_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId Pokeball {
+      get { return pokeball_; }
+      set {
+        pokeball_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "captured_cell_id" field.</summary>
+    public const int CapturedCellIdFieldNumber = 22;
+    private ulong capturedCellId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong CapturedCellId {
+      get { return capturedCellId_; }
+      set {
+        capturedCellId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battles_attacked" field.</summary>
+    public const int BattlesAttackedFieldNumber = 23;
+    private int battlesAttacked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattlesAttacked {
+      get { return battlesAttacked_; }
+      set {
+        battlesAttacked_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battles_defended" field.</summary>
+    public const int BattlesDefendedFieldNumber = 24;
+    private int battlesDefended_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattlesDefended {
+      get { return battlesDefended_; }
+      set {
+        battlesDefended_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubator_id" field.</summary>
+    public const int EggIncubatorIdFieldNumber = 25;
+    private string eggIncubatorId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string EggIncubatorId {
+      get { return eggIncubatorId_; }
+      set {
+        eggIncubatorId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "creation_time_ms" field.</summary>
+    public const int CreationTimeMsFieldNumber = 26;
+    private ulong creationTimeMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong CreationTimeMs {
+      get { return creationTimeMs_; }
+      set {
+        creationTimeMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "num_upgrades" field.</summary>
+    public const int NumUpgradesFieldNumber = 27;
+    private int numUpgrades_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int NumUpgrades {
+      get { return numUpgrades_; }
+      set {
+        numUpgrades_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "additional_cp_multiplier" field.</summary>
+    public const int AdditionalCpMultiplierFieldNumber = 28;
+    private float additionalCpMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AdditionalCpMultiplier {
+      get { return additionalCpMultiplier_; }
+      set {
+        additionalCpMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "favorite" field.</summary>
+    public const int FavoriteFieldNumber = 29;
+    private int favorite_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Favorite {
+      get { return favorite_; }
+      set {
+        favorite_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "nickname" field.</summary>
+    public const int NicknameFieldNumber = 30;
+    private string nickname_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Nickname {
+      get { return nickname_; }
+      set {
+        nickname_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "from_fort" field.</summary>
+    public const int FromFortFieldNumber = 31;
+    private int fromFort_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int FromFort {
+      get { return fromFort_; }
+      set {
+        fromFort_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokemonData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokemonData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Id != other.Id) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (Cp != other.Cp) return false;
+      if (Stamina != other.Stamina) return false;
+      if (StaminaMax != other.StaminaMax) return false;
+      if (Move1 != other.Move1) return false;
+      if (Move2 != other.Move2) return false;
+      if (DeployedFortId != other.DeployedFortId) return false;
+      if (OwnerName != other.OwnerName) return false;
+      if (IsEgg != other.IsEgg) return false;
+      if (EggKmWalkedTarget != other.EggKmWalkedTarget) return false;
+      if (EggKmWalkedStart != other.EggKmWalkedStart) return false;
+      if (Origin != other.Origin) return false;
+      if (HeightM != other.HeightM) return false;
+      if (WeightKg != other.WeightKg) return false;
+      if (IndividualAttack != other.IndividualAttack) return false;
+      if (IndividualDefense != other.IndividualDefense) return false;
+      if (IndividualStamina != other.IndividualStamina) return false;
+      if (CpMultiplier != other.CpMultiplier) return false;
+      if (Pokeball != other.Pokeball) return false;
+      if (CapturedCellId != other.CapturedCellId) return false;
+      if (BattlesAttacked != other.BattlesAttacked) return false;
+      if (BattlesDefended != other.BattlesDefended) return false;
+      if (EggIncubatorId != other.EggIncubatorId) return false;
+      if (CreationTimeMs != other.CreationTimeMs) return false;
+      if (NumUpgrades != other.NumUpgrades) return false;
+      if (AdditionalCpMultiplier != other.AdditionalCpMultiplier) return false;
+      if (Favorite != other.Favorite) return false;
+      if (Nickname != other.Nickname) return false;
+      if (FromFort != other.FromFort) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Id != 0UL) hash ^= Id.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (Cp != 0) hash ^= Cp.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      if (StaminaMax != 0) hash ^= StaminaMax.GetHashCode();
+      if (Move1 != 0) hash ^= Move1.GetHashCode();
+      if (Move2 != 0) hash ^= Move2.GetHashCode();
+      if (DeployedFortId.Length != 0) hash ^= DeployedFortId.GetHashCode();
+      if (OwnerName.Length != 0) hash ^= OwnerName.GetHashCode();
+      if (IsEgg != false) hash ^= IsEgg.GetHashCode();
+      if (EggKmWalkedTarget != 0D) hash ^= EggKmWalkedTarget.GetHashCode();
+      if (EggKmWalkedStart != 0D) hash ^= EggKmWalkedStart.GetHashCode();
+      if (Origin != 0) hash ^= Origin.GetHashCode();
+      if (HeightM != 0F) hash ^= HeightM.GetHashCode();
+      if (WeightKg != 0F) hash ^= WeightKg.GetHashCode();
+      if (IndividualAttack != 0) hash ^= IndividualAttack.GetHashCode();
+      if (IndividualDefense != 0) hash ^= IndividualDefense.GetHashCode();
+      if (IndividualStamina != 0) hash ^= IndividualStamina.GetHashCode();
+      if (CpMultiplier != 0F) hash ^= CpMultiplier.GetHashCode();
+      if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
+      if (CapturedCellId != 0UL) hash ^= CapturedCellId.GetHashCode();
+      if (BattlesAttacked != 0) hash ^= BattlesAttacked.GetHashCode();
+      if (BattlesDefended != 0) hash ^= BattlesDefended.GetHashCode();
+      if (EggIncubatorId.Length != 0) hash ^= EggIncubatorId.GetHashCode();
+      if (CreationTimeMs != 0UL) hash ^= CreationTimeMs.GetHashCode();
+      if (NumUpgrades != 0) hash ^= NumUpgrades.GetHashCode();
+      if (AdditionalCpMultiplier != 0F) hash ^= AdditionalCpMultiplier.GetHashCode();
+      if (Favorite != 0) hash ^= Favorite.GetHashCode();
+      if (Nickname.Length != 0) hash ^= Nickname.GetHashCode();
+      if (FromFort != 0) hash ^= FromFort.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Id != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(Id);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (Cp != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Cp);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(Stamina);
+      }
+      if (StaminaMax != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(StaminaMax);
+      }
+      if (Move1 != 0) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) Move1);
+      }
+      if (Move2 != 0) {
+        output.WriteRawTag(56);
+        output.WriteEnum((int) Move2);
+      }
+      if (DeployedFortId.Length != 0) {
+        output.WriteRawTag(66);
+        output.WriteString(DeployedFortId);
+      }
+      if (OwnerName.Length != 0) {
+        output.WriteRawTag(74);
+        output.WriteString(OwnerName);
+      }
+      if (IsEgg != false) {
+        output.WriteRawTag(80);
+        output.WriteBool(IsEgg);
+      }
+      if (EggKmWalkedTarget != 0D) {
+        output.WriteRawTag(89);
+        output.WriteDouble(EggKmWalkedTarget);
+      }
+      if (EggKmWalkedStart != 0D) {
+        output.WriteRawTag(97);
+        output.WriteDouble(EggKmWalkedStart);
+      }
+      if (Origin != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(Origin);
+      }
+      if (HeightM != 0F) {
+        output.WriteRawTag(125);
+        output.WriteFloat(HeightM);
+      }
+      if (WeightKg != 0F) {
+        output.WriteRawTag(133, 1);
+        output.WriteFloat(WeightKg);
+      }
+      if (IndividualAttack != 0) {
+        output.WriteRawTag(136, 1);
+        output.WriteInt32(IndividualAttack);
+      }
+      if (IndividualDefense != 0) {
+        output.WriteRawTag(144, 1);
+        output.WriteInt32(IndividualDefense);
+      }
+      if (IndividualStamina != 0) {
+        output.WriteRawTag(152, 1);
+        output.WriteInt32(IndividualStamina);
+      }
+      if (CpMultiplier != 0F) {
+        output.WriteRawTag(165, 1);
+        output.WriteFloat(CpMultiplier);
+      }
+      if (Pokeball != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteEnum((int) Pokeball);
+      }
+      if (CapturedCellId != 0UL) {
+        output.WriteRawTag(176, 1);
+        output.WriteUInt64(CapturedCellId);
+      }
+      if (BattlesAttacked != 0) {
+        output.WriteRawTag(184, 1);
+        output.WriteInt32(BattlesAttacked);
+      }
+      if (BattlesDefended != 0) {
+        output.WriteRawTag(192, 1);
+        output.WriteInt32(BattlesDefended);
+      }
+      if (EggIncubatorId.Length != 0) {
+        output.WriteRawTag(202, 1);
+        output.WriteString(EggIncubatorId);
+      }
+      if (CreationTimeMs != 0UL) {
+        output.WriteRawTag(208, 1);
+        output.WriteUInt64(CreationTimeMs);
+      }
+      if (NumUpgrades != 0) {
+        output.WriteRawTag(216, 1);
+        output.WriteInt32(NumUpgrades);
+      }
+      if (AdditionalCpMultiplier != 0F) {
+        output.WriteRawTag(229, 1);
+        output.WriteFloat(AdditionalCpMultiplier);
+      }
+      if (Favorite != 0) {
+        output.WriteRawTag(232, 1);
+        output.WriteInt32(Favorite);
+      }
+      if (Nickname.Length != 0) {
+        output.WriteRawTag(242, 1);
+        output.WriteString(Nickname);
+      }
+      if (FromFort != 0) {
+        output.WriteRawTag(248, 1);
+        output.WriteInt32(FromFort);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Id != 0UL) {
+        size += 1 + 8;
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (Cp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Cp);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      if (StaminaMax != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaminaMax);
+      }
+      if (Move1 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Move1);
+      }
+      if (Move2 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Move2);
+      }
+      if (DeployedFortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeployedFortId);
+      }
+      if (OwnerName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(OwnerName);
+      }
+      if (IsEgg != false) {
+        size += 1 + 1;
+      }
+      if (EggKmWalkedTarget != 0D) {
+        size += 1 + 8;
+      }
+      if (EggKmWalkedStart != 0D) {
+        size += 1 + 8;
+      }
+      if (Origin != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Origin);
+      }
+      if (HeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (WeightKg != 0F) {
+        size += 2 + 4;
+      }
+      if (IndividualAttack != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualAttack);
+      }
+      if (IndividualDefense != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualDefense);
+      }
+      if (IndividualStamina != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualStamina);
+      }
+      if (CpMultiplier != 0F) {
+        size += 2 + 4;
+      }
+      if (Pokeball != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) Pokeball);
+      }
+      if (CapturedCellId != 0UL) {
+        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CapturedCellId);
+      }
+      if (BattlesAttacked != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesAttacked);
+      }
+      if (BattlesDefended != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesDefended);
+      }
+      if (EggIncubatorId.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(EggIncubatorId);
+      }
+      if (CreationTimeMs != 0UL) {
+        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CreationTimeMs);
+      }
+      if (NumUpgrades != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(NumUpgrades);
+      }
+      if (AdditionalCpMultiplier != 0F) {
+        size += 2 + 4;
+      }
+      if (Favorite != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Favorite);
+      }
+      if (Nickname.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(Nickname);
+      }
+      if (FromFort != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FromFort);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokemonData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Id != 0UL) {
+        Id = other.Id;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.Cp != 0) {
+        Cp = other.Cp;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+      if (other.StaminaMax != 0) {
+        StaminaMax = other.StaminaMax;
+      }
+      if (other.Move1 != 0) {
+        Move1 = other.Move1;
+      }
+      if (other.Move2 != 0) {
+        Move2 = other.Move2;
+      }
+      if (other.DeployedFortId.Length != 0) {
+        DeployedFortId = other.DeployedFortId;
+      }
+      if (other.OwnerName.Length != 0) {
+        OwnerName = other.OwnerName;
+      }
+      if (other.IsEgg != false) {
+        IsEgg = other.IsEgg;
+      }
+      if (other.EggKmWalkedTarget != 0D) {
+        EggKmWalkedTarget = other.EggKmWalkedTarget;
+      }
+      if (other.EggKmWalkedStart != 0D) {
+        EggKmWalkedStart = other.EggKmWalkedStart;
+      }
+      if (other.Origin != 0) {
+        Origin = other.Origin;
+      }
+      if (other.HeightM != 0F) {
+        HeightM = other.HeightM;
+      }
+      if (other.WeightKg != 0F) {
+        WeightKg = other.WeightKg;
+      }
+      if (other.IndividualAttack != 0) {
+        IndividualAttack = other.IndividualAttack;
+      }
+      if (other.IndividualDefense != 0) {
+        IndividualDefense = other.IndividualDefense;
+      }
+      if (other.IndividualStamina != 0) {
+        IndividualStamina = other.IndividualStamina;
+      }
+      if (other.CpMultiplier != 0F) {
+        CpMultiplier = other.CpMultiplier;
+      }
+      if (other.Pokeball != 0) {
+        Pokeball = other.Pokeball;
+      }
+      if (other.CapturedCellId != 0UL) {
+        CapturedCellId = other.CapturedCellId;
+      }
+      if (other.BattlesAttacked != 0) {
+        BattlesAttacked = other.BattlesAttacked;
+      }
+      if (other.BattlesDefended != 0) {
+        BattlesDefended = other.BattlesDefended;
+      }
+      if (other.EggIncubatorId.Length != 0) {
+        EggIncubatorId = other.EggIncubatorId;
+      }
+      if (other.CreationTimeMs != 0UL) {
+        CreationTimeMs = other.CreationTimeMs;
+      }
+      if (other.NumUpgrades != 0) {
+        NumUpgrades = other.NumUpgrades;
+      }
+      if (other.AdditionalCpMultiplier != 0F) {
+        AdditionalCpMultiplier = other.AdditionalCpMultiplier;
+      }
+      if (other.Favorite != 0) {
+        Favorite = other.Favorite;
+      }
+      if (other.Nickname.Length != 0) {
+        Nickname = other.Nickname;
+      }
+      if (other.FromFort != 0) {
+        FromFort = other.FromFort;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            Id = input.ReadFixed64();
+            break;
+          }
+          case 16: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            Cp = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            StaminaMax = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            move1_ = (global::POGOProtos.Enums.PokemonMove) input.ReadEnum();
+            break;
+          }
+          case 56: {
+            move2_ = (global::POGOProtos.Enums.PokemonMove) input.ReadEnum();
+            break;
+          }
+          case 66: {
+            DeployedFortId = input.ReadString();
+            break;
+          }
+          case 74: {
+            OwnerName = input.ReadString();
+            break;
+          }
+          case 80: {
+            IsEgg = input.ReadBool();
+            break;
+          }
+          case 89: {
+            EggKmWalkedTarget = input.ReadDouble();
+            break;
+          }
+          case 97: {
+            EggKmWalkedStart = input.ReadDouble();
+            break;
+          }
+          case 112: {
+            Origin = input.ReadInt32();
+            break;
+          }
+          case 125: {
+            HeightM = input.ReadFloat();
+            break;
+          }
+          case 133: {
+            WeightKg = input.ReadFloat();
+            break;
+          }
+          case 136: {
+            IndividualAttack = input.ReadInt32();
+            break;
+          }
+          case 144: {
+            IndividualDefense = input.ReadInt32();
+            break;
+          }
+          case 152: {
+            IndividualStamina = input.ReadInt32();
+            break;
+          }
+          case 165: {
+            CpMultiplier = input.ReadFloat();
+            break;
+          }
+          case 168: {
+            pokeball_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 176: {
+            CapturedCellId = input.ReadUInt64();
+            break;
+          }
+          case 184: {
+            BattlesAttacked = input.ReadInt32();
+            break;
+          }
+          case 192: {
+            BattlesDefended = input.ReadInt32();
+            break;
+          }
+          case 202: {
+            EggIncubatorId = input.ReadString();
+            break;
+          }
+          case 208: {
+            CreationTimeMs = input.ReadUInt64();
+            break;
+          }
+          case 216: {
+            NumUpgrades = input.ReadInt32();
+            break;
+          }
+          case 229: {
+            AdditionalCpMultiplier = input.ReadFloat();
+            break;
+          }
+          case 232: {
+            Favorite = input.ReadInt32();
+            break;
+          }
+          case 242: {
+            Nickname = input.ReadString();
+            break;
+          }
+          case 248: {
+            FromFort = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class AssetDigestEntry : pb::IMessage<AssetDigestEntry> {
+    private static readonly pb::MessageParser<AssetDigestEntry> _parser = new pb::MessageParser<AssetDigestEntry>(() => new AssetDigestEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AssetDigestEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.POGOProtosDataReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AssetDigestEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AssetDigestEntry(AssetDigestEntry other) : this() {
+      assetId_ = other.assetId_;
+      bundleName_ = other.bundleName_;
+      version_ = other.version_;
+      checksum_ = other.checksum_;
+      size_ = other.size_;
+      key_ = other.key_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AssetDigestEntry Clone() {
+      return new AssetDigestEntry(this);
+    }
+
+    /// <summary>Field number for the "asset_id" field.</summary>
+    public const int AssetIdFieldNumber = 1;
+    private string assetId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string AssetId {
+      get { return assetId_; }
+      set {
+        assetId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "bundle_name" field.</summary>
+    public const int BundleNameFieldNumber = 2;
+    private string bundleName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BundleName {
+      get { return bundleName_; }
+      set {
+        bundleName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "version" field.</summary>
+    public const int VersionFieldNumber = 3;
+    private long version_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long Version {
+      get { return version_; }
+      set {
+        version_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "checksum" field.</summary>
+    public const int ChecksumFieldNumber = 4;
+    private uint checksum_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint Checksum {
+      get { return checksum_; }
+      set {
+        checksum_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "size" field.</summary>
+    public const int SizeFieldNumber = 5;
+    private int size_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Size {
+      get { return size_; }
+      set {
+        size_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "key" field.</summary>
+    public const int KeyFieldNumber = 6;
+    private pb::ByteString key_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString Key {
+      get { return key_; }
+      set {
+        key_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AssetDigestEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AssetDigestEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AssetId != other.AssetId) return false;
+      if (BundleName != other.BundleName) return false;
+      if (Version != other.Version) return false;
+      if (Checksum != other.Checksum) return false;
+      if (Size != other.Size) return false;
+      if (Key != other.Key) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AssetId.Length != 0) hash ^= AssetId.GetHashCode();
+      if (BundleName.Length != 0) hash ^= BundleName.GetHashCode();
+      if (Version != 0L) hash ^= Version.GetHashCode();
+      if (Checksum != 0) hash ^= Checksum.GetHashCode();
+      if (Size != 0) hash ^= Size.GetHashCode();
+      if (Key.Length != 0) hash ^= Key.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AssetId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(AssetId);
+      }
+      if (BundleName.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(BundleName);
+      }
+      if (Version != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(Version);
+      }
+      if (Checksum != 0) {
+        output.WriteRawTag(37);
+        output.WriteFixed32(Checksum);
+      }
+      if (Size != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(Size);
+      }
+      if (Key.Length != 0) {
+        output.WriteRawTag(50);
+        output.WriteBytes(Key);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AssetId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(AssetId);
+      }
+      if (BundleName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BundleName);
+      }
+      if (Version != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Version);
+      }
+      if (Checksum != 0) {
+        size += 1 + 4;
+      }
+      if (Size != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Size);
+      }
+      if (Key.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Key);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AssetDigestEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AssetId.Length != 0) {
+        AssetId = other.AssetId;
+      }
+      if (other.BundleName.Length != 0) {
+        BundleName = other.BundleName;
+      }
+      if (other.Version != 0L) {
+        Version = other.Version;
+      }
+      if (other.Checksum != 0) {
+        Checksum = other.Checksum;
+      }
+      if (other.Size != 0) {
+        Size = other.Size;
+      }
+      if (other.Key.Length != 0) {
+        Key = other.Key;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            AssetId = input.ReadString();
+            break;
+          }
+          case 18: {
+            BundleName = input.ReadString();
+            break;
+          }
+          case 24: {
+            Version = input.ReadInt64();
+            break;
+          }
+          case 37: {
+            Checksum = input.ReadFixed32();
+            break;
+          }
+          case 40: {
+            Size = input.ReadInt32();
+            break;
+          }
+          case 50: {
+            Key = input.ReadBytes();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerData : pb::IMessage<PlayerData> {
+    private static readonly pb::MessageParser<PlayerData> _parser = new pb::MessageParser<PlayerData>(() => new PlayerData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.POGOProtosDataReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerData(PlayerData other) : this() {
+      creationTimestampMs_ = other.creationTimestampMs_;
+      username_ = other.username_;
+      team_ = other.team_;
+      tutorialState_ = other.tutorialState_.Clone();
+      Avatar = other.avatar_ != null ? other.Avatar.Clone() : null;
+      maxPokemonStorage_ = other.maxPokemonStorage_;
+      maxItemStorage_ = other.maxItemStorage_;
+      DailyBonus = other.dailyBonus_ != null ? other.DailyBonus.Clone() : null;
+      EquippedBadge = other.equippedBadge_ != null ? other.EquippedBadge.Clone() : null;
+      ContactSettings = other.contactSettings_ != null ? other.ContactSettings.Clone() : null;
+      currencies_ = other.currencies_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerData Clone() {
+      return new PlayerData(this);
+    }
+
+    /// <summary>Field number for the "creation_timestamp_ms" field.</summary>
+    public const int CreationTimestampMsFieldNumber = 1;
+    private long creationTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CreationTimestampMs {
+      get { return creationTimestampMs_; }
+      set {
+        creationTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "username" field.</summary>
+    public const int UsernameFieldNumber = 2;
+    private string username_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Username {
+      get { return username_; }
+      set {
+        username_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "team" field.</summary>
+    public const int TeamFieldNumber = 5;
+    private global::POGOProtos.Enums.TeamColor team_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor Team {
+      get { return team_; }
+      set {
+        team_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "tutorial_state" field.</summary>
+    public const int TutorialStateFieldNumber = 7;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.TutorialState> _repeated_tutorialState_codec
+        = pb::FieldCodec.ForEnum(58, x => (int) x, x => (global::POGOProtos.Enums.TutorialState) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> tutorialState_ = new pbc::RepeatedField<global::POGOProtos.Enums.TutorialState>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> TutorialState {
+      get { return tutorialState_; }
+    }
+
+    /// <summary>Field number for the "avatar" field.</summary>
+    public const int AvatarFieldNumber = 8;
+    private global::POGOProtos.Data.Player.PlayerAvatar avatar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerAvatar Avatar {
+      get { return avatar_; }
+      set {
+        avatar_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_pokemon_storage" field.</summary>
+    public const int MaxPokemonStorageFieldNumber = 9;
+    private int maxPokemonStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxPokemonStorage {
+      get { return maxPokemonStorage_; }
+      set {
+        maxPokemonStorage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_item_storage" field.</summary>
+    public const int MaxItemStorageFieldNumber = 10;
+    private int maxItemStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxItemStorage {
+      get { return maxItemStorage_; }
+      set {
+        maxItemStorage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_bonus" field.</summary>
+    public const int DailyBonusFieldNumber = 11;
+    private global::POGOProtos.Data.Player.DailyBonus dailyBonus_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.DailyBonus DailyBonus {
+      get { return dailyBonus_; }
+      set {
+        dailyBonus_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "equipped_badge" field.</summary>
+    public const int EquippedBadgeFieldNumber = 12;
+    private global::POGOProtos.Data.Player.EquippedBadge equippedBadge_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.EquippedBadge EquippedBadge {
+      get { return equippedBadge_; }
+      set {
+        equippedBadge_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "contact_settings" field.</summary>
+    public const int ContactSettingsFieldNumber = 13;
+    private global::POGOProtos.Data.Player.ContactSettings contactSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.ContactSettings ContactSettings {
+      get { return contactSettings_; }
+      set {
+        contactSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "currencies" field.</summary>
+    public const int CurrenciesFieldNumber = 14;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Player.Currency> _repeated_currencies_codec
+        = pb::FieldCodec.ForMessage(114, global::POGOProtos.Data.Player.Currency.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> currencies_ = new pbc::RepeatedField<global::POGOProtos.Data.Player.Currency>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> Currencies {
+      get { return currencies_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (CreationTimestampMs != other.CreationTimestampMs) return false;
+      if (Username != other.Username) return false;
+      if (Team != other.Team) return false;
+      if(!tutorialState_.Equals(other.tutorialState_)) return false;
+      if (!object.Equals(Avatar, other.Avatar)) return false;
+      if (MaxPokemonStorage != other.MaxPokemonStorage) return false;
+      if (MaxItemStorage != other.MaxItemStorage) return false;
+      if (!object.Equals(DailyBonus, other.DailyBonus)) return false;
+      if (!object.Equals(EquippedBadge, other.EquippedBadge)) return false;
+      if (!object.Equals(ContactSettings, other.ContactSettings)) return false;
+      if(!currencies_.Equals(other.currencies_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (CreationTimestampMs != 0L) hash ^= CreationTimestampMs.GetHashCode();
+      if (Username.Length != 0) hash ^= Username.GetHashCode();
+      if (Team != 0) hash ^= Team.GetHashCode();
+      hash ^= tutorialState_.GetHashCode();
+      if (avatar_ != null) hash ^= Avatar.GetHashCode();
+      if (MaxPokemonStorage != 0) hash ^= MaxPokemonStorage.GetHashCode();
+      if (MaxItemStorage != 0) hash ^= MaxItemStorage.GetHashCode();
+      if (dailyBonus_ != null) hash ^= DailyBonus.GetHashCode();
+      if (equippedBadge_ != null) hash ^= EquippedBadge.GetHashCode();
+      if (contactSettings_ != null) hash ^= ContactSettings.GetHashCode();
+      hash ^= currencies_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (CreationTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(CreationTimestampMs);
+      }
+      if (Username.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Username);
+      }
+      if (Team != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) Team);
+      }
+      tutorialState_.WriteTo(output, _repeated_tutorialState_codec);
+      if (avatar_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(Avatar);
+      }
+      if (MaxPokemonStorage != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(MaxPokemonStorage);
+      }
+      if (MaxItemStorage != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(MaxItemStorage);
+      }
+      if (dailyBonus_ != null) {
+        output.WriteRawTag(90);
+        output.WriteMessage(DailyBonus);
+      }
+      if (equippedBadge_ != null) {
+        output.WriteRawTag(98);
+        output.WriteMessage(EquippedBadge);
+      }
+      if (contactSettings_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(ContactSettings);
+      }
+      currencies_.WriteTo(output, _repeated_currencies_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (CreationTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CreationTimestampMs);
+      }
+      if (Username.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Username);
+      }
+      if (Team != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Team);
+      }
+      size += tutorialState_.CalculateSize(_repeated_tutorialState_codec);
+      if (avatar_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Avatar);
+      }
+      if (MaxPokemonStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPokemonStorage);
+      }
+      if (MaxItemStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxItemStorage);
+      }
+      if (dailyBonus_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DailyBonus);
+      }
+      if (equippedBadge_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EquippedBadge);
+      }
+      if (contactSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ContactSettings);
+      }
+      size += currencies_.CalculateSize(_repeated_currencies_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.CreationTimestampMs != 0L) {
+        CreationTimestampMs = other.CreationTimestampMs;
+      }
+      if (other.Username.Length != 0) {
+        Username = other.Username;
+      }
+      if (other.Team != 0) {
+        Team = other.Team;
+      }
+      tutorialState_.Add(other.tutorialState_);
+      if (other.avatar_ != null) {
+        if (avatar_ == null) {
+          avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+        }
+        Avatar.MergeFrom(other.Avatar);
+      }
+      if (other.MaxPokemonStorage != 0) {
+        MaxPokemonStorage = other.MaxPokemonStorage;
+      }
+      if (other.MaxItemStorage != 0) {
+        MaxItemStorage = other.MaxItemStorage;
+      }
+      if (other.dailyBonus_ != null) {
+        if (dailyBonus_ == null) {
+          dailyBonus_ = new global::POGOProtos.Data.Player.DailyBonus();
+        }
+        DailyBonus.MergeFrom(other.DailyBonus);
+      }
+      if (other.equippedBadge_ != null) {
+        if (equippedBadge_ == null) {
+          equippedBadge_ = new global::POGOProtos.Data.Player.EquippedBadge();
+        }
+        EquippedBadge.MergeFrom(other.EquippedBadge);
+      }
+      if (other.contactSettings_ != null) {
+        if (contactSettings_ == null) {
+          contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+        }
+        ContactSettings.MergeFrom(other.ContactSettings);
+      }
+      currencies_.Add(other.currencies_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            CreationTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Username = input.ReadString();
+            break;
+          }
+          case 40: {
+            team_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+          case 58:
+          case 56: {
+            tutorialState_.AddEntriesFrom(input, _repeated_tutorialState_codec);
+            break;
+          }
+          case 66: {
+            if (avatar_ == null) {
+              avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+            }
+            input.ReadMessage(avatar_);
+            break;
+          }
+          case 72: {
+            MaxPokemonStorage = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            MaxItemStorage = input.ReadInt32();
+            break;
+          }
+          case 90: {
+            if (dailyBonus_ == null) {
+              dailyBonus_ = new global::POGOProtos.Data.Player.DailyBonus();
+            }
+            input.ReadMessage(dailyBonus_);
+            break;
+          }
+          case 98: {
+            if (equippedBadge_ == null) {
+              equippedBadge_ = new global::POGOProtos.Data.Player.EquippedBadge();
+            }
+            input.ReadMessage(equippedBadge_);
+            break;
+          }
+          case 106: {
+            if (contactSettings_ == null) {
+              contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+            }
+            input.ReadMessage(contactSettings_);
+            break;
+          }
+          case 114: {
+            currencies_.AddEntriesFrom(input, _repeated_currencies_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/ContactSettings.cs b/PokemonGo/POGOProtos/Data/Player/ContactSettings.cs
new file mode 100644
index 0000000..3065071
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/ContactSettings.cs
@@ -0,0 +1,188 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/ContactSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/ContactSettings.proto</summary>
+  public static partial class ContactSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/ContactSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ContactSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CixQT0dPUHJvdG9zL0RhdGEvUGxheWVyL0NvbnRhY3RTZXR0aW5ncy5wcm90",
+            "bxIWUE9HT1Byb3Rvcy5EYXRhLlBsYXllciJRCg9Db250YWN0U2V0dGluZ3MS",
+            "HQoVc2VuZF9tYXJrZXRpbmdfZW1haWxzGAEgASgIEh8KF3NlbmRfcHVzaF9u",
+            "b3RpZmljYXRpb25zGAIgASgIYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.ContactSettings), global::POGOProtos.Data.Player.ContactSettings.Parser, new[]{ "SendMarketingEmails", "SendPushNotifications" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ContactSettings : pb::IMessage<ContactSettings> {
+    private static readonly pb::MessageParser<ContactSettings> _parser = new pb::MessageParser<ContactSettings>(() => new ContactSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ContactSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.ContactSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ContactSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ContactSettings(ContactSettings other) : this() {
+      sendMarketingEmails_ = other.sendMarketingEmails_;
+      sendPushNotifications_ = other.sendPushNotifications_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ContactSettings Clone() {
+      return new ContactSettings(this);
+    }
+
+    /// <summary>Field number for the "send_marketing_emails" field.</summary>
+    public const int SendMarketingEmailsFieldNumber = 1;
+    private bool sendMarketingEmails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendMarketingEmails {
+      get { return sendMarketingEmails_; }
+      set {
+        sendMarketingEmails_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "send_push_notifications" field.</summary>
+    public const int SendPushNotificationsFieldNumber = 2;
+    private bool sendPushNotifications_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendPushNotifications {
+      get { return sendPushNotifications_; }
+      set {
+        sendPushNotifications_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ContactSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ContactSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (SendMarketingEmails != other.SendMarketingEmails) return false;
+      if (SendPushNotifications != other.SendPushNotifications) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (SendMarketingEmails != false) hash ^= SendMarketingEmails.GetHashCode();
+      if (SendPushNotifications != false) hash ^= SendPushNotifications.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (SendMarketingEmails != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(SendMarketingEmails);
+      }
+      if (SendPushNotifications != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(SendPushNotifications);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (SendMarketingEmails != false) {
+        size += 1 + 1;
+      }
+      if (SendPushNotifications != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ContactSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.SendMarketingEmails != false) {
+        SendMarketingEmails = other.SendMarketingEmails;
+      }
+      if (other.SendPushNotifications != false) {
+        SendPushNotifications = other.SendPushNotifications;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            SendMarketingEmails = input.ReadBool();
+            break;
+          }
+          case 16: {
+            SendPushNotifications = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/Currency.cs b/PokemonGo/POGOProtos/Data/Player/Currency.cs
new file mode 100644
index 0000000..8012ed6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/Currency.cs
@@ -0,0 +1,187 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/Currency.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/Currency.proto</summary>
+  public static partial class CurrencyReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/Currency.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CurrencyReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zL0RhdGEvUGxheWVyL0N1cnJlbmN5LnByb3RvEhZQT0dP",
+            "UHJvdG9zLkRhdGEuUGxheWVyIigKCEN1cnJlbmN5EgwKBG5hbWUYASABKAkS",
+            "DgoGYW1vdW50GAIgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.Currency), global::POGOProtos.Data.Player.Currency.Parser, new[]{ "Name", "Amount" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Currency : pb::IMessage<Currency> {
+    private static readonly pb::MessageParser<Currency> _parser = new pb::MessageParser<Currency>(() => new Currency());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Currency> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.CurrencyReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Currency() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Currency(Currency other) : this() {
+      name_ = other.name_;
+      amount_ = other.amount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Currency Clone() {
+      return new Currency(this);
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 1;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "amount" field.</summary>
+    public const int AmountFieldNumber = 2;
+    private int amount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Amount {
+      get { return amount_; }
+      set {
+        amount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Currency);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Currency other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Name != other.Name) return false;
+      if (Amount != other.Amount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      if (Amount != 0) hash ^= Amount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Name.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Name);
+      }
+      if (Amount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Amount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      if (Amount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Amount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Currency other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      if (other.Amount != 0) {
+        Amount = other.Amount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Name = input.ReadString();
+            break;
+          }
+          case 16: {
+            Amount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/DailyBonus.cs b/PokemonGo/POGOProtos/Data/Player/DailyBonus.cs
new file mode 100644
index 0000000..033c8c4
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/DailyBonus.cs
@@ -0,0 +1,188 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/DailyBonus.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/DailyBonus.proto</summary>
+  public static partial class DailyBonusReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/DailyBonus.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DailyBonusReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL0RhdGEvUGxheWVyL0RhaWx5Qm9udXMucHJvdG8SFlBP",
+            "R09Qcm90b3MuRGF0YS5QbGF5ZXIiYwoKRGFpbHlCb251cxIjChtuZXh0X2Nv",
+            "bGxlY3RlZF90aW1lc3RhbXBfbXMYASABKAMSMAoobmV4dF9kZWZlbmRlcl9i",
+            "b251c19jb2xsZWN0X3RpbWVzdGFtcF9tcxgCIAEoA2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.DailyBonus), global::POGOProtos.Data.Player.DailyBonus.Parser, new[]{ "NextCollectedTimestampMs", "NextDefenderBonusCollectTimestampMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DailyBonus : pb::IMessage<DailyBonus> {
+    private static readonly pb::MessageParser<DailyBonus> _parser = new pb::MessageParser<DailyBonus>(() => new DailyBonus());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DailyBonus> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.DailyBonusReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DailyBonus() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DailyBonus(DailyBonus other) : this() {
+      nextCollectedTimestampMs_ = other.nextCollectedTimestampMs_;
+      nextDefenderBonusCollectTimestampMs_ = other.nextDefenderBonusCollectTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DailyBonus Clone() {
+      return new DailyBonus(this);
+    }
+
+    /// <summary>Field number for the "next_collected_timestamp_ms" field.</summary>
+    public const int NextCollectedTimestampMsFieldNumber = 1;
+    private long nextCollectedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextCollectedTimestampMs {
+      get { return nextCollectedTimestampMs_; }
+      set {
+        nextCollectedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "next_defender_bonus_collect_timestamp_ms" field.</summary>
+    public const int NextDefenderBonusCollectTimestampMsFieldNumber = 2;
+    private long nextDefenderBonusCollectTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextDefenderBonusCollectTimestampMs {
+      get { return nextDefenderBonusCollectTimestampMs_; }
+      set {
+        nextDefenderBonusCollectTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DailyBonus);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DailyBonus other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (NextCollectedTimestampMs != other.NextCollectedTimestampMs) return false;
+      if (NextDefenderBonusCollectTimestampMs != other.NextDefenderBonusCollectTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (NextCollectedTimestampMs != 0L) hash ^= NextCollectedTimestampMs.GetHashCode();
+      if (NextDefenderBonusCollectTimestampMs != 0L) hash ^= NextDefenderBonusCollectTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (NextCollectedTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(NextCollectedTimestampMs);
+      }
+      if (NextDefenderBonusCollectTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(NextDefenderBonusCollectTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (NextCollectedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextCollectedTimestampMs);
+      }
+      if (NextDefenderBonusCollectTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextDefenderBonusCollectTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DailyBonus other) {
+      if (other == null) {
+        return;
+      }
+      if (other.NextCollectedTimestampMs != 0L) {
+        NextCollectedTimestampMs = other.NextCollectedTimestampMs;
+      }
+      if (other.NextDefenderBonusCollectTimestampMs != 0L) {
+        NextDefenderBonusCollectTimestampMs = other.NextDefenderBonusCollectTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            NextCollectedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            NextDefenderBonusCollectTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/EquippedBadge.cs b/PokemonGo/POGOProtos/Data/Player/EquippedBadge.cs
new file mode 100644
index 0000000..420d35b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/EquippedBadge.cs
@@ -0,0 +1,218 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/EquippedBadge.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/EquippedBadge.proto</summary>
+  public static partial class EquippedBadgeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/EquippedBadge.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EquippedBadgeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CipQT0dPUHJvdG9zL0RhdGEvUGxheWVyL0VxdWlwcGVkQmFkZ2UucHJvdG8S",
+            "FlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIaIFBPR09Qcm90b3MvRW51bXMvQmFk",
+            "Z2VUeXBlLnByb3RvIn8KDUVxdWlwcGVkQmFkZ2USLwoKYmFkZ2VfdHlwZRgB",
+            "IAEoDjIbLlBPR09Qcm90b3MuRW51bXMuQmFkZ2VUeXBlEg0KBWxldmVsGAIg",
+            "ASgFEi4KJm5leHRfZXF1aXBfY2hhbmdlX2FsbG93ZWRfdGltZXN0YW1wX21z",
+            "GAMgASgDYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.BadgeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.EquippedBadge), global::POGOProtos.Data.Player.EquippedBadge.Parser, new[]{ "BadgeType", "Level", "NextEquipChangeAllowedTimestampMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EquippedBadge : pb::IMessage<EquippedBadge> {
+    private static readonly pb::MessageParser<EquippedBadge> _parser = new pb::MessageParser<EquippedBadge>(() => new EquippedBadge());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquippedBadge> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.EquippedBadgeReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadge() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadge(EquippedBadge other) : this() {
+      badgeType_ = other.badgeType_;
+      level_ = other.level_;
+      nextEquipChangeAllowedTimestampMs_ = other.nextEquipChangeAllowedTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadge Clone() {
+      return new EquippedBadge(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 2;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "next_equip_change_allowed_timestamp_ms" field.</summary>
+    public const int NextEquipChangeAllowedTimestampMsFieldNumber = 3;
+    private long nextEquipChangeAllowedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextEquipChangeAllowedTimestampMs {
+      get { return nextEquipChangeAllowedTimestampMs_; }
+      set {
+        nextEquipChangeAllowedTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquippedBadge);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquippedBadge other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      if (Level != other.Level) return false;
+      if (NextEquipChangeAllowedTimestampMs != other.NextEquipChangeAllowedTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      if (Level != 0) hash ^= Level.GetHashCode();
+      if (NextEquipChangeAllowedTimestampMs != 0L) hash ^= NextEquipChangeAllowedTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+      if (Level != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Level);
+      }
+      if (NextEquipChangeAllowedTimestampMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(NextEquipChangeAllowedTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      if (NextEquipChangeAllowedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextEquipChangeAllowedTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquippedBadge other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+      if (other.NextEquipChangeAllowedTimestampMs != 0L) {
+        NextEquipChangeAllowedTimestampMs = other.NextEquipChangeAllowedTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Level = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            NextEquipChangeAllowedTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/POGOProtosDataPlayer.cs b/PokemonGo/POGOProtos/Data/Player/POGOProtosDataPlayer.cs
new file mode 100644
index 0000000..8ef7954
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/POGOProtosDataPlayer.cs
@@ -0,0 +1,2177 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Data.Player.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Data.Player.proto</summary>
+  public static partial class POGOProtosDataPlayerReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Data.Player.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosDataPlayerReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChxQT0dPUHJvdG9zLkRhdGEuUGxheWVyLnByb3RvEhZQT0dPUHJvdG9zLkRh",
+            "dGEuUGxheWVyGhZQT0dPUHJvdG9zLkVudW1zLnByb3RvIigKCEN1cnJlbmN5",
+            "EgwKBG5hbWUYASABKAkSDgoGYW1vdW50GAIgASgFIu0ECgtQbGF5ZXJTdGF0",
+            "cxINCgVsZXZlbBgBIAEoBRISCgpleHBlcmllbmNlGAIgASgDEhUKDXByZXZf",
+            "bGV2ZWxfeHAYAyABKAMSFQoNbmV4dF9sZXZlbF94cBgEIAEoAxIRCglrbV93",
+            "YWxrZWQYBSABKAISHAoUcG9rZW1vbnNfZW5jb3VudGVyZWQYBiABKAUSHgoW",
+            "dW5pcXVlX3Bva2VkZXhfZW50cmllcxgHIAEoBRIZChFwb2tlbW9uc19jYXB0",
+            "dXJlZBgIIAEoBRISCgpldm9sdXRpb25zGAkgASgFEhgKEHBva2Vfc3RvcF92",
+            "aXNpdHMYCiABKAUSGAoQcG9rZWJhbGxzX3Rocm93bhgLIAEoBRIUCgxlZ2dz",
+            "X2hhdGNoZWQYDCABKAUSGwoTYmlnX21hZ2lrYXJwX2NhdWdodBgNIAEoBRIZ",
+            "ChFiYXR0bGVfYXR0YWNrX3dvbhgOIAEoBRIbChNiYXR0bGVfYXR0YWNrX3Rv",
+            "dGFsGA8gASgFEhsKE2JhdHRsZV9kZWZlbmRlZF93b24YECABKAUSGwoTYmF0",
+            "dGxlX3RyYWluaW5nX3dvbhgRIAEoBRIdChViYXR0bGVfdHJhaW5pbmdfdG90",
+            "YWwYEiABKAUSHQoVcHJlc3RpZ2VfcmFpc2VkX3RvdGFsGBMgASgFEh4KFnBy",
+            "ZXN0aWdlX2Ryb3BwZWRfdG90YWwYFCABKAUSGAoQcG9rZW1vbl9kZXBsb3ll",
+            "ZBgVIAEoBRIeChZwb2tlbW9uX2NhdWdodF9ieV90eXBlGBYgASgMEhwKFHNt",
+            "YWxsX3JhdHRhdGFfY2F1Z2h0GBcgASgFImMKCkRhaWx5Qm9udXMSIwobbmV4",
+            "dF9jb2xsZWN0ZWRfdGltZXN0YW1wX21zGAEgASgDEjAKKG5leHRfZGVmZW5k",
+            "ZXJfYm9udXNfY29sbGVjdF90aW1lc3RhbXBfbXMYAiABKAMiKQoMUGxheWVy",
+            "Q2FtZXJhEhkKEWlzX2RlZmF1bHRfY2FtZXJhGAEgASgIIlEKD0NvbnRhY3RT",
+            "ZXR0aW5ncxIdChVzZW5kX21hcmtldGluZ19lbWFpbHMYASABKAgSHwoXc2Vu",
+            "ZF9wdXNoX25vdGlmaWNhdGlvbnMYAiABKAgiaAoTUGxheWVyUHVibGljUHJv",
+            "ZmlsZRIMCgRuYW1lGAEgASgJEg0KBWxldmVsGAIgASgFEjQKBmF2YXRhchgD",
+            "IAEoCzIkLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIuUGxheWVyQXZhdGFyIq4B",
+            "CgxQbGF5ZXJBdmF0YXISDAoEc2tpbhgCIAEoBRIMCgRoYWlyGAMgASgFEg0K",
+            "BXNoaXJ0GAQgASgFEg0KBXBhbnRzGAUgASgFEgsKA2hhdBgGIAEoBRINCgVz",
+            "aG9lcxgHIAEoBRIoCgZnZW5kZXIYCCABKA4yGC5QT0dPUHJvdG9zLkVudW1z",
+            "LkdlbmRlchIMCgRleWVzGAkgASgFEhAKCGJhY2twYWNrGAogASgFIn8KDUVx",
+            "dWlwcGVkQmFkZ2USLwoKYmFkZ2VfdHlwZRgBIAEoDjIbLlBPR09Qcm90b3Mu",
+            "RW51bXMuQmFkZ2VUeXBlEg0KBWxldmVsGAIgASgFEi4KJm5leHRfZXF1aXBf",
+            "Y2hhbmdlX2FsbG93ZWRfdGltZXN0YW1wX21zGAMgASgDIh4KDlBsYXllckN1",
+            "cnJlbmN5EgwKBGdlbXMYASABKAVQAGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.Currency), global::POGOProtos.Data.Player.Currency.Parser, new[]{ "Name", "Amount" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerStats), global::POGOProtos.Data.Player.PlayerStats.Parser, new[]{ "Level", "Experience", "PrevLevelXp", "NextLevelXp", "KmWalked", "PokemonsEncountered", "UniquePokedexEntries", "PokemonsCaptured", "Evolutions", "PokeStopVisits", "PokeballsThrown", "EggsHatched", "BigMagikarpCaught", "BattleAttackWon", "BattleAttackTotal", "BattleDefendedWon", "BattleTrainingWon", "BattleTrainingTotal", "PrestigeRaisedTotal", "PrestigeDroppedTotal", "PokemonDeployed", "PokemonCaughtByType", "SmallRattataCaught" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.DailyBonus), global::POGOProtos.Data.Player.DailyBonus.Parser, new[]{ "NextCollectedTimestampMs", "NextDefenderBonusCollectTimestampMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerCamera), global::POGOProtos.Data.Player.PlayerCamera.Parser, new[]{ "IsDefaultCamera" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.ContactSettings), global::POGOProtos.Data.Player.ContactSettings.Parser, new[]{ "SendMarketingEmails", "SendPushNotifications" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerPublicProfile), global::POGOProtos.Data.Player.PlayerPublicProfile.Parser, new[]{ "Name", "Level", "Avatar" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerAvatar), global::POGOProtos.Data.Player.PlayerAvatar.Parser, new[]{ "Skin", "Hair", "Shirt", "Pants", "Hat", "Shoes", "Gender", "Eyes", "Backpack" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.EquippedBadge), global::POGOProtos.Data.Player.EquippedBadge.Parser, new[]{ "BadgeType", "Level", "NextEquipChangeAllowedTimestampMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerCurrency), global::POGOProtos.Data.Player.PlayerCurrency.Parser, new[]{ "Gems" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Currency : pb::IMessage<Currency> {
+    private static readonly pb::MessageParser<Currency> _parser = new pb::MessageParser<Currency>(() => new Currency());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Currency> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Currency() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Currency(Currency other) : this() {
+      name_ = other.name_;
+      amount_ = other.amount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Currency Clone() {
+      return new Currency(this);
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 1;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "amount" field.</summary>
+    public const int AmountFieldNumber = 2;
+    private int amount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Amount {
+      get { return amount_; }
+      set {
+        amount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Currency);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Currency other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Name != other.Name) return false;
+      if (Amount != other.Amount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      if (Amount != 0) hash ^= Amount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Name.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Name);
+      }
+      if (Amount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Amount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      if (Amount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Amount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Currency other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      if (other.Amount != 0) {
+        Amount = other.Amount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Name = input.ReadString();
+            break;
+          }
+          case 16: {
+            Amount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerStats : pb::IMessage<PlayerStats> {
+    private static readonly pb::MessageParser<PlayerStats> _parser = new pb::MessageParser<PlayerStats>(() => new PlayerStats());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerStats> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerStats() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerStats(PlayerStats other) : this() {
+      level_ = other.level_;
+      experience_ = other.experience_;
+      prevLevelXp_ = other.prevLevelXp_;
+      nextLevelXp_ = other.nextLevelXp_;
+      kmWalked_ = other.kmWalked_;
+      pokemonsEncountered_ = other.pokemonsEncountered_;
+      uniquePokedexEntries_ = other.uniquePokedexEntries_;
+      pokemonsCaptured_ = other.pokemonsCaptured_;
+      evolutions_ = other.evolutions_;
+      pokeStopVisits_ = other.pokeStopVisits_;
+      pokeballsThrown_ = other.pokeballsThrown_;
+      eggsHatched_ = other.eggsHatched_;
+      bigMagikarpCaught_ = other.bigMagikarpCaught_;
+      battleAttackWon_ = other.battleAttackWon_;
+      battleAttackTotal_ = other.battleAttackTotal_;
+      battleDefendedWon_ = other.battleDefendedWon_;
+      battleTrainingWon_ = other.battleTrainingWon_;
+      battleTrainingTotal_ = other.battleTrainingTotal_;
+      prestigeRaisedTotal_ = other.prestigeRaisedTotal_;
+      prestigeDroppedTotal_ = other.prestigeDroppedTotal_;
+      pokemonDeployed_ = other.pokemonDeployed_;
+      pokemonCaughtByType_ = other.pokemonCaughtByType_;
+      smallRattataCaught_ = other.smallRattataCaught_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerStats Clone() {
+      return new PlayerStats(this);
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 1;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "experience" field.</summary>
+    public const int ExperienceFieldNumber = 2;
+    private long experience_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long Experience {
+      get { return experience_; }
+      set {
+        experience_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "prev_level_xp" field.</summary>
+    public const int PrevLevelXpFieldNumber = 3;
+    private long prevLevelXp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long PrevLevelXp {
+      get { return prevLevelXp_; }
+      set {
+        prevLevelXp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "next_level_xp" field.</summary>
+    public const int NextLevelXpFieldNumber = 4;
+    private long nextLevelXp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextLevelXp {
+      get { return nextLevelXp_; }
+      set {
+        nextLevelXp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "km_walked" field.</summary>
+    public const int KmWalkedFieldNumber = 5;
+    private float kmWalked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float KmWalked {
+      get { return kmWalked_; }
+      set {
+        kmWalked_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemons_encountered" field.</summary>
+    public const int PokemonsEncounteredFieldNumber = 6;
+    private int pokemonsEncountered_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonsEncountered {
+      get { return pokemonsEncountered_; }
+      set {
+        pokemonsEncountered_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unique_pokedex_entries" field.</summary>
+    public const int UniquePokedexEntriesFieldNumber = 7;
+    private int uniquePokedexEntries_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int UniquePokedexEntries {
+      get { return uniquePokedexEntries_; }
+      set {
+        uniquePokedexEntries_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemons_captured" field.</summary>
+    public const int PokemonsCapturedFieldNumber = 8;
+    private int pokemonsCaptured_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonsCaptured {
+      get { return pokemonsCaptured_; }
+      set {
+        pokemonsCaptured_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolutions" field.</summary>
+    public const int EvolutionsFieldNumber = 9;
+    private int evolutions_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Evolutions {
+      get { return evolutions_; }
+      set {
+        evolutions_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "poke_stop_visits" field.</summary>
+    public const int PokeStopVisitsFieldNumber = 10;
+    private int pokeStopVisits_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokeStopVisits {
+      get { return pokeStopVisits_; }
+      set {
+        pokeStopVisits_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeballs_thrown" field.</summary>
+    public const int PokeballsThrownFieldNumber = 11;
+    private int pokeballsThrown_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokeballsThrown {
+      get { return pokeballsThrown_; }
+      set {
+        pokeballsThrown_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "eggs_hatched" field.</summary>
+    public const int EggsHatchedFieldNumber = 12;
+    private int eggsHatched_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EggsHatched {
+      get { return eggsHatched_; }
+      set {
+        eggsHatched_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "big_magikarp_caught" field.</summary>
+    public const int BigMagikarpCaughtFieldNumber = 13;
+    private int bigMagikarpCaught_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BigMagikarpCaught {
+      get { return bigMagikarpCaught_; }
+      set {
+        bigMagikarpCaught_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_attack_won" field.</summary>
+    public const int BattleAttackWonFieldNumber = 14;
+    private int battleAttackWon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleAttackWon {
+      get { return battleAttackWon_; }
+      set {
+        battleAttackWon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_attack_total" field.</summary>
+    public const int BattleAttackTotalFieldNumber = 15;
+    private int battleAttackTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleAttackTotal {
+      get { return battleAttackTotal_; }
+      set {
+        battleAttackTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_defended_won" field.</summary>
+    public const int BattleDefendedWonFieldNumber = 16;
+    private int battleDefendedWon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleDefendedWon {
+      get { return battleDefendedWon_; }
+      set {
+        battleDefendedWon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_training_won" field.</summary>
+    public const int BattleTrainingWonFieldNumber = 17;
+    private int battleTrainingWon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleTrainingWon {
+      get { return battleTrainingWon_; }
+      set {
+        battleTrainingWon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_training_total" field.</summary>
+    public const int BattleTrainingTotalFieldNumber = 18;
+    private int battleTrainingTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleTrainingTotal {
+      get { return battleTrainingTotal_; }
+      set {
+        battleTrainingTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "prestige_raised_total" field.</summary>
+    public const int PrestigeRaisedTotalFieldNumber = 19;
+    private int prestigeRaisedTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PrestigeRaisedTotal {
+      get { return prestigeRaisedTotal_; }
+      set {
+        prestigeRaisedTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "prestige_dropped_total" field.</summary>
+    public const int PrestigeDroppedTotalFieldNumber = 20;
+    private int prestigeDroppedTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PrestigeDroppedTotal {
+      get { return prestigeDroppedTotal_; }
+      set {
+        prestigeDroppedTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_deployed" field.</summary>
+    public const int PokemonDeployedFieldNumber = 21;
+    private int pokemonDeployed_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonDeployed {
+      get { return pokemonDeployed_; }
+      set {
+        pokemonDeployed_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_caught_by_type" field.</summary>
+    public const int PokemonCaughtByTypeFieldNumber = 22;
+    private pb::ByteString pokemonCaughtByType_ = pb::ByteString.Empty;
+    /// <summary>
+    ///  TODO: repeated PokemonType ??
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString PokemonCaughtByType {
+      get { return pokemonCaughtByType_; }
+      set {
+        pokemonCaughtByType_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "small_rattata_caught" field.</summary>
+    public const int SmallRattataCaughtFieldNumber = 23;
+    private int smallRattataCaught_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int SmallRattataCaught {
+      get { return smallRattataCaught_; }
+      set {
+        smallRattataCaught_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerStats);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerStats other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Level != other.Level) return false;
+      if (Experience != other.Experience) return false;
+      if (PrevLevelXp != other.PrevLevelXp) return false;
+      if (NextLevelXp != other.NextLevelXp) return false;
+      if (KmWalked != other.KmWalked) return false;
+      if (PokemonsEncountered != other.PokemonsEncountered) return false;
+      if (UniquePokedexEntries != other.UniquePokedexEntries) return false;
+      if (PokemonsCaptured != other.PokemonsCaptured) return false;
+      if (Evolutions != other.Evolutions) return false;
+      if (PokeStopVisits != other.PokeStopVisits) return false;
+      if (PokeballsThrown != other.PokeballsThrown) return false;
+      if (EggsHatched != other.EggsHatched) return false;
+      if (BigMagikarpCaught != other.BigMagikarpCaught) return false;
+      if (BattleAttackWon != other.BattleAttackWon) return false;
+      if (BattleAttackTotal != other.BattleAttackTotal) return false;
+      if (BattleDefendedWon != other.BattleDefendedWon) return false;
+      if (BattleTrainingWon != other.BattleTrainingWon) return false;
+      if (BattleTrainingTotal != other.BattleTrainingTotal) return false;
+      if (PrestigeRaisedTotal != other.PrestigeRaisedTotal) return false;
+      if (PrestigeDroppedTotal != other.PrestigeDroppedTotal) return false;
+      if (PokemonDeployed != other.PokemonDeployed) return false;
+      if (PokemonCaughtByType != other.PokemonCaughtByType) return false;
+      if (SmallRattataCaught != other.SmallRattataCaught) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Level != 0) hash ^= Level.GetHashCode();
+      if (Experience != 0L) hash ^= Experience.GetHashCode();
+      if (PrevLevelXp != 0L) hash ^= PrevLevelXp.GetHashCode();
+      if (NextLevelXp != 0L) hash ^= NextLevelXp.GetHashCode();
+      if (KmWalked != 0F) hash ^= KmWalked.GetHashCode();
+      if (PokemonsEncountered != 0) hash ^= PokemonsEncountered.GetHashCode();
+      if (UniquePokedexEntries != 0) hash ^= UniquePokedexEntries.GetHashCode();
+      if (PokemonsCaptured != 0) hash ^= PokemonsCaptured.GetHashCode();
+      if (Evolutions != 0) hash ^= Evolutions.GetHashCode();
+      if (PokeStopVisits != 0) hash ^= PokeStopVisits.GetHashCode();
+      if (PokeballsThrown != 0) hash ^= PokeballsThrown.GetHashCode();
+      if (EggsHatched != 0) hash ^= EggsHatched.GetHashCode();
+      if (BigMagikarpCaught != 0) hash ^= BigMagikarpCaught.GetHashCode();
+      if (BattleAttackWon != 0) hash ^= BattleAttackWon.GetHashCode();
+      if (BattleAttackTotal != 0) hash ^= BattleAttackTotal.GetHashCode();
+      if (BattleDefendedWon != 0) hash ^= BattleDefendedWon.GetHashCode();
+      if (BattleTrainingWon != 0) hash ^= BattleTrainingWon.GetHashCode();
+      if (BattleTrainingTotal != 0) hash ^= BattleTrainingTotal.GetHashCode();
+      if (PrestigeRaisedTotal != 0) hash ^= PrestigeRaisedTotal.GetHashCode();
+      if (PrestigeDroppedTotal != 0) hash ^= PrestigeDroppedTotal.GetHashCode();
+      if (PokemonDeployed != 0) hash ^= PokemonDeployed.GetHashCode();
+      if (PokemonCaughtByType.Length != 0) hash ^= PokemonCaughtByType.GetHashCode();
+      if (SmallRattataCaught != 0) hash ^= SmallRattataCaught.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Level != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Level);
+      }
+      if (Experience != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(Experience);
+      }
+      if (PrevLevelXp != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(PrevLevelXp);
+      }
+      if (NextLevelXp != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(NextLevelXp);
+      }
+      if (KmWalked != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(KmWalked);
+      }
+      if (PokemonsEncountered != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(PokemonsEncountered);
+      }
+      if (UniquePokedexEntries != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(UniquePokedexEntries);
+      }
+      if (PokemonsCaptured != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(PokemonsCaptured);
+      }
+      if (Evolutions != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(Evolutions);
+      }
+      if (PokeStopVisits != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(PokeStopVisits);
+      }
+      if (PokeballsThrown != 0) {
+        output.WriteRawTag(88);
+        output.WriteInt32(PokeballsThrown);
+      }
+      if (EggsHatched != 0) {
+        output.WriteRawTag(96);
+        output.WriteInt32(EggsHatched);
+      }
+      if (BigMagikarpCaught != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(BigMagikarpCaught);
+      }
+      if (BattleAttackWon != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(BattleAttackWon);
+      }
+      if (BattleAttackTotal != 0) {
+        output.WriteRawTag(120);
+        output.WriteInt32(BattleAttackTotal);
+      }
+      if (BattleDefendedWon != 0) {
+        output.WriteRawTag(128, 1);
+        output.WriteInt32(BattleDefendedWon);
+      }
+      if (BattleTrainingWon != 0) {
+        output.WriteRawTag(136, 1);
+        output.WriteInt32(BattleTrainingWon);
+      }
+      if (BattleTrainingTotal != 0) {
+        output.WriteRawTag(144, 1);
+        output.WriteInt32(BattleTrainingTotal);
+      }
+      if (PrestigeRaisedTotal != 0) {
+        output.WriteRawTag(152, 1);
+        output.WriteInt32(PrestigeRaisedTotal);
+      }
+      if (PrestigeDroppedTotal != 0) {
+        output.WriteRawTag(160, 1);
+        output.WriteInt32(PrestigeDroppedTotal);
+      }
+      if (PokemonDeployed != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteInt32(PokemonDeployed);
+      }
+      if (PokemonCaughtByType.Length != 0) {
+        output.WriteRawTag(178, 1);
+        output.WriteBytes(PokemonCaughtByType);
+      }
+      if (SmallRattataCaught != 0) {
+        output.WriteRawTag(184, 1);
+        output.WriteInt32(SmallRattataCaught);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      if (Experience != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Experience);
+      }
+      if (PrevLevelXp != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(PrevLevelXp);
+      }
+      if (NextLevelXp != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextLevelXp);
+      }
+      if (KmWalked != 0F) {
+        size += 1 + 4;
+      }
+      if (PokemonsEncountered != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsEncountered);
+      }
+      if (UniquePokedexEntries != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(UniquePokedexEntries);
+      }
+      if (PokemonsCaptured != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsCaptured);
+      }
+      if (Evolutions != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Evolutions);
+      }
+      if (PokeStopVisits != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeStopVisits);
+      }
+      if (PokeballsThrown != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeballsThrown);
+      }
+      if (EggsHatched != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggsHatched);
+      }
+      if (BigMagikarpCaught != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BigMagikarpCaught);
+      }
+      if (BattleAttackWon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackWon);
+      }
+      if (BattleAttackTotal != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackTotal);
+      }
+      if (BattleDefendedWon != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleDefendedWon);
+      }
+      if (BattleTrainingWon != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingWon);
+      }
+      if (BattleTrainingTotal != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingTotal);
+      }
+      if (PrestigeRaisedTotal != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeRaisedTotal);
+      }
+      if (PrestigeDroppedTotal != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeDroppedTotal);
+      }
+      if (PokemonDeployed != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(PokemonDeployed);
+      }
+      if (PokemonCaughtByType.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeBytesSize(PokemonCaughtByType);
+      }
+      if (SmallRattataCaught != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(SmallRattataCaught);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerStats other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+      if (other.Experience != 0L) {
+        Experience = other.Experience;
+      }
+      if (other.PrevLevelXp != 0L) {
+        PrevLevelXp = other.PrevLevelXp;
+      }
+      if (other.NextLevelXp != 0L) {
+        NextLevelXp = other.NextLevelXp;
+      }
+      if (other.KmWalked != 0F) {
+        KmWalked = other.KmWalked;
+      }
+      if (other.PokemonsEncountered != 0) {
+        PokemonsEncountered = other.PokemonsEncountered;
+      }
+      if (other.UniquePokedexEntries != 0) {
+        UniquePokedexEntries = other.UniquePokedexEntries;
+      }
+      if (other.PokemonsCaptured != 0) {
+        PokemonsCaptured = other.PokemonsCaptured;
+      }
+      if (other.Evolutions != 0) {
+        Evolutions = other.Evolutions;
+      }
+      if (other.PokeStopVisits != 0) {
+        PokeStopVisits = other.PokeStopVisits;
+      }
+      if (other.PokeballsThrown != 0) {
+        PokeballsThrown = other.PokeballsThrown;
+      }
+      if (other.EggsHatched != 0) {
+        EggsHatched = other.EggsHatched;
+      }
+      if (other.BigMagikarpCaught != 0) {
+        BigMagikarpCaught = other.BigMagikarpCaught;
+      }
+      if (other.BattleAttackWon != 0) {
+        BattleAttackWon = other.BattleAttackWon;
+      }
+      if (other.BattleAttackTotal != 0) {
+        BattleAttackTotal = other.BattleAttackTotal;
+      }
+      if (other.BattleDefendedWon != 0) {
+        BattleDefendedWon = other.BattleDefendedWon;
+      }
+      if (other.BattleTrainingWon != 0) {
+        BattleTrainingWon = other.BattleTrainingWon;
+      }
+      if (other.BattleTrainingTotal != 0) {
+        BattleTrainingTotal = other.BattleTrainingTotal;
+      }
+      if (other.PrestigeRaisedTotal != 0) {
+        PrestigeRaisedTotal = other.PrestigeRaisedTotal;
+      }
+      if (other.PrestigeDroppedTotal != 0) {
+        PrestigeDroppedTotal = other.PrestigeDroppedTotal;
+      }
+      if (other.PokemonDeployed != 0) {
+        PokemonDeployed = other.PokemonDeployed;
+      }
+      if (other.PokemonCaughtByType.Length != 0) {
+        PokemonCaughtByType = other.PokemonCaughtByType;
+      }
+      if (other.SmallRattataCaught != 0) {
+        SmallRattataCaught = other.SmallRattataCaught;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Level = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            Experience = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            PrevLevelXp = input.ReadInt64();
+            break;
+          }
+          case 32: {
+            NextLevelXp = input.ReadInt64();
+            break;
+          }
+          case 45: {
+            KmWalked = input.ReadFloat();
+            break;
+          }
+          case 48: {
+            PokemonsEncountered = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            UniquePokedexEntries = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            PokemonsCaptured = input.ReadInt32();
+            break;
+          }
+          case 72: {
+            Evolutions = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            PokeStopVisits = input.ReadInt32();
+            break;
+          }
+          case 88: {
+            PokeballsThrown = input.ReadInt32();
+            break;
+          }
+          case 96: {
+            EggsHatched = input.ReadInt32();
+            break;
+          }
+          case 104: {
+            BigMagikarpCaught = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            BattleAttackWon = input.ReadInt32();
+            break;
+          }
+          case 120: {
+            BattleAttackTotal = input.ReadInt32();
+            break;
+          }
+          case 128: {
+            BattleDefendedWon = input.ReadInt32();
+            break;
+          }
+          case 136: {
+            BattleTrainingWon = input.ReadInt32();
+            break;
+          }
+          case 144: {
+            BattleTrainingTotal = input.ReadInt32();
+            break;
+          }
+          case 152: {
+            PrestigeRaisedTotal = input.ReadInt32();
+            break;
+          }
+          case 160: {
+            PrestigeDroppedTotal = input.ReadInt32();
+            break;
+          }
+          case 168: {
+            PokemonDeployed = input.ReadInt32();
+            break;
+          }
+          case 178: {
+            PokemonCaughtByType = input.ReadBytes();
+            break;
+          }
+          case 184: {
+            SmallRattataCaught = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DailyBonus : pb::IMessage<DailyBonus> {
+    private static readonly pb::MessageParser<DailyBonus> _parser = new pb::MessageParser<DailyBonus>(() => new DailyBonus());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DailyBonus> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DailyBonus() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DailyBonus(DailyBonus other) : this() {
+      nextCollectedTimestampMs_ = other.nextCollectedTimestampMs_;
+      nextDefenderBonusCollectTimestampMs_ = other.nextDefenderBonusCollectTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DailyBonus Clone() {
+      return new DailyBonus(this);
+    }
+
+    /// <summary>Field number for the "next_collected_timestamp_ms" field.</summary>
+    public const int NextCollectedTimestampMsFieldNumber = 1;
+    private long nextCollectedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextCollectedTimestampMs {
+      get { return nextCollectedTimestampMs_; }
+      set {
+        nextCollectedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "next_defender_bonus_collect_timestamp_ms" field.</summary>
+    public const int NextDefenderBonusCollectTimestampMsFieldNumber = 2;
+    private long nextDefenderBonusCollectTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextDefenderBonusCollectTimestampMs {
+      get { return nextDefenderBonusCollectTimestampMs_; }
+      set {
+        nextDefenderBonusCollectTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DailyBonus);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DailyBonus other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (NextCollectedTimestampMs != other.NextCollectedTimestampMs) return false;
+      if (NextDefenderBonusCollectTimestampMs != other.NextDefenderBonusCollectTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (NextCollectedTimestampMs != 0L) hash ^= NextCollectedTimestampMs.GetHashCode();
+      if (NextDefenderBonusCollectTimestampMs != 0L) hash ^= NextDefenderBonusCollectTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (NextCollectedTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(NextCollectedTimestampMs);
+      }
+      if (NextDefenderBonusCollectTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(NextDefenderBonusCollectTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (NextCollectedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextCollectedTimestampMs);
+      }
+      if (NextDefenderBonusCollectTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextDefenderBonusCollectTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DailyBonus other) {
+      if (other == null) {
+        return;
+      }
+      if (other.NextCollectedTimestampMs != 0L) {
+        NextCollectedTimestampMs = other.NextCollectedTimestampMs;
+      }
+      if (other.NextDefenderBonusCollectTimestampMs != 0L) {
+        NextDefenderBonusCollectTimestampMs = other.NextDefenderBonusCollectTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            NextCollectedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            NextDefenderBonusCollectTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerCamera : pb::IMessage<PlayerCamera> {
+    private static readonly pb::MessageParser<PlayerCamera> _parser = new pb::MessageParser<PlayerCamera>(() => new PlayerCamera());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerCamera> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCamera() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCamera(PlayerCamera other) : this() {
+      isDefaultCamera_ = other.isDefaultCamera_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCamera Clone() {
+      return new PlayerCamera(this);
+    }
+
+    /// <summary>Field number for the "is_default_camera" field.</summary>
+    public const int IsDefaultCameraFieldNumber = 1;
+    private bool isDefaultCamera_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsDefaultCamera {
+      get { return isDefaultCamera_; }
+      set {
+        isDefaultCamera_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerCamera);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerCamera other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IsDefaultCamera != other.IsDefaultCamera) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IsDefaultCamera != false) hash ^= IsDefaultCamera.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IsDefaultCamera != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(IsDefaultCamera);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IsDefaultCamera != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerCamera other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IsDefaultCamera != false) {
+        IsDefaultCamera = other.IsDefaultCamera;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            IsDefaultCamera = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ContactSettings : pb::IMessage<ContactSettings> {
+    private static readonly pb::MessageParser<ContactSettings> _parser = new pb::MessageParser<ContactSettings>(() => new ContactSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ContactSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ContactSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ContactSettings(ContactSettings other) : this() {
+      sendMarketingEmails_ = other.sendMarketingEmails_;
+      sendPushNotifications_ = other.sendPushNotifications_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ContactSettings Clone() {
+      return new ContactSettings(this);
+    }
+
+    /// <summary>Field number for the "send_marketing_emails" field.</summary>
+    public const int SendMarketingEmailsFieldNumber = 1;
+    private bool sendMarketingEmails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendMarketingEmails {
+      get { return sendMarketingEmails_; }
+      set {
+        sendMarketingEmails_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "send_push_notifications" field.</summary>
+    public const int SendPushNotificationsFieldNumber = 2;
+    private bool sendPushNotifications_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendPushNotifications {
+      get { return sendPushNotifications_; }
+      set {
+        sendPushNotifications_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ContactSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ContactSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (SendMarketingEmails != other.SendMarketingEmails) return false;
+      if (SendPushNotifications != other.SendPushNotifications) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (SendMarketingEmails != false) hash ^= SendMarketingEmails.GetHashCode();
+      if (SendPushNotifications != false) hash ^= SendPushNotifications.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (SendMarketingEmails != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(SendMarketingEmails);
+      }
+      if (SendPushNotifications != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(SendPushNotifications);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (SendMarketingEmails != false) {
+        size += 1 + 1;
+      }
+      if (SendPushNotifications != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ContactSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.SendMarketingEmails != false) {
+        SendMarketingEmails = other.SendMarketingEmails;
+      }
+      if (other.SendPushNotifications != false) {
+        SendPushNotifications = other.SendPushNotifications;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            SendMarketingEmails = input.ReadBool();
+            break;
+          }
+          case 16: {
+            SendPushNotifications = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerPublicProfile : pb::IMessage<PlayerPublicProfile> {
+    private static readonly pb::MessageParser<PlayerPublicProfile> _parser = new pb::MessageParser<PlayerPublicProfile>(() => new PlayerPublicProfile());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerPublicProfile> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerPublicProfile() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerPublicProfile(PlayerPublicProfile other) : this() {
+      name_ = other.name_;
+      level_ = other.level_;
+      Avatar = other.avatar_ != null ? other.Avatar.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerPublicProfile Clone() {
+      return new PlayerPublicProfile(this);
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 1;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 2;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "avatar" field.</summary>
+    public const int AvatarFieldNumber = 3;
+    private global::POGOProtos.Data.Player.PlayerAvatar avatar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerAvatar Avatar {
+      get { return avatar_; }
+      set {
+        avatar_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerPublicProfile);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerPublicProfile other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Name != other.Name) return false;
+      if (Level != other.Level) return false;
+      if (!object.Equals(Avatar, other.Avatar)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      if (Level != 0) hash ^= Level.GetHashCode();
+      if (avatar_ != null) hash ^= Avatar.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Name.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Name);
+      }
+      if (Level != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Level);
+      }
+      if (avatar_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(Avatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      if (avatar_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Avatar);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerPublicProfile other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+      if (other.avatar_ != null) {
+        if (avatar_ == null) {
+          avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+        }
+        Avatar.MergeFrom(other.Avatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Name = input.ReadString();
+            break;
+          }
+          case 16: {
+            Level = input.ReadInt32();
+            break;
+          }
+          case 26: {
+            if (avatar_ == null) {
+              avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+            }
+            input.ReadMessage(avatar_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerAvatar : pb::IMessage<PlayerAvatar> {
+    private static readonly pb::MessageParser<PlayerAvatar> _parser = new pb::MessageParser<PlayerAvatar>(() => new PlayerAvatar());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerAvatar> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerAvatar() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerAvatar(PlayerAvatar other) : this() {
+      skin_ = other.skin_;
+      hair_ = other.hair_;
+      shirt_ = other.shirt_;
+      pants_ = other.pants_;
+      hat_ = other.hat_;
+      shoes_ = other.shoes_;
+      gender_ = other.gender_;
+      eyes_ = other.eyes_;
+      backpack_ = other.backpack_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerAvatar Clone() {
+      return new PlayerAvatar(this);
+    }
+
+    /// <summary>Field number for the "skin" field.</summary>
+    public const int SkinFieldNumber = 2;
+    private int skin_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Skin {
+      get { return skin_; }
+      set {
+        skin_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "hair" field.</summary>
+    public const int HairFieldNumber = 3;
+    private int hair_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Hair {
+      get { return hair_; }
+      set {
+        hair_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "shirt" field.</summary>
+    public const int ShirtFieldNumber = 4;
+    private int shirt_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Shirt {
+      get { return shirt_; }
+      set {
+        shirt_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pants" field.</summary>
+    public const int PantsFieldNumber = 5;
+    private int pants_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Pants {
+      get { return pants_; }
+      set {
+        pants_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "hat" field.</summary>
+    public const int HatFieldNumber = 6;
+    private int hat_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Hat {
+      get { return hat_; }
+      set {
+        hat_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "shoes" field.</summary>
+    public const int ShoesFieldNumber = 7;
+    private int shoes_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Shoes {
+      get { return shoes_; }
+      set {
+        shoes_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gender" field.</summary>
+    public const int GenderFieldNumber = 8;
+    private global::POGOProtos.Enums.Gender gender_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.Gender Gender {
+      get { return gender_; }
+      set {
+        gender_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "eyes" field.</summary>
+    public const int EyesFieldNumber = 9;
+    private int eyes_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Eyes {
+      get { return eyes_; }
+      set {
+        eyes_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "backpack" field.</summary>
+    public const int BackpackFieldNumber = 10;
+    private int backpack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Backpack {
+      get { return backpack_; }
+      set {
+        backpack_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerAvatar);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerAvatar other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Skin != other.Skin) return false;
+      if (Hair != other.Hair) return false;
+      if (Shirt != other.Shirt) return false;
+      if (Pants != other.Pants) return false;
+      if (Hat != other.Hat) return false;
+      if (Shoes != other.Shoes) return false;
+      if (Gender != other.Gender) return false;
+      if (Eyes != other.Eyes) return false;
+      if (Backpack != other.Backpack) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Skin != 0) hash ^= Skin.GetHashCode();
+      if (Hair != 0) hash ^= Hair.GetHashCode();
+      if (Shirt != 0) hash ^= Shirt.GetHashCode();
+      if (Pants != 0) hash ^= Pants.GetHashCode();
+      if (Hat != 0) hash ^= Hat.GetHashCode();
+      if (Shoes != 0) hash ^= Shoes.GetHashCode();
+      if (Gender != 0) hash ^= Gender.GetHashCode();
+      if (Eyes != 0) hash ^= Eyes.GetHashCode();
+      if (Backpack != 0) hash ^= Backpack.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Skin != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Skin);
+      }
+      if (Hair != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Hair);
+      }
+      if (Shirt != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(Shirt);
+      }
+      if (Pants != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(Pants);
+      }
+      if (Hat != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(Hat);
+      }
+      if (Shoes != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(Shoes);
+      }
+      if (Gender != 0) {
+        output.WriteRawTag(64);
+        output.WriteEnum((int) Gender);
+      }
+      if (Eyes != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(Eyes);
+      }
+      if (Backpack != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(Backpack);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Skin != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Skin);
+      }
+      if (Hair != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Hair);
+      }
+      if (Shirt != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Shirt);
+      }
+      if (Pants != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Pants);
+      }
+      if (Hat != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Hat);
+      }
+      if (Shoes != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Shoes);
+      }
+      if (Gender != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Gender);
+      }
+      if (Eyes != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Eyes);
+      }
+      if (Backpack != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Backpack);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerAvatar other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Skin != 0) {
+        Skin = other.Skin;
+      }
+      if (other.Hair != 0) {
+        Hair = other.Hair;
+      }
+      if (other.Shirt != 0) {
+        Shirt = other.Shirt;
+      }
+      if (other.Pants != 0) {
+        Pants = other.Pants;
+      }
+      if (other.Hat != 0) {
+        Hat = other.Hat;
+      }
+      if (other.Shoes != 0) {
+        Shoes = other.Shoes;
+      }
+      if (other.Gender != 0) {
+        Gender = other.Gender;
+      }
+      if (other.Eyes != 0) {
+        Eyes = other.Eyes;
+      }
+      if (other.Backpack != 0) {
+        Backpack = other.Backpack;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 16: {
+            Skin = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            Hair = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            Shirt = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            Pants = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            Hat = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            Shoes = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            gender_ = (global::POGOProtos.Enums.Gender) input.ReadEnum();
+            break;
+          }
+          case 72: {
+            Eyes = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            Backpack = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EquippedBadge : pb::IMessage<EquippedBadge> {
+    private static readonly pb::MessageParser<EquippedBadge> _parser = new pb::MessageParser<EquippedBadge>(() => new EquippedBadge());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquippedBadge> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadge() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadge(EquippedBadge other) : this() {
+      badgeType_ = other.badgeType_;
+      level_ = other.level_;
+      nextEquipChangeAllowedTimestampMs_ = other.nextEquipChangeAllowedTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadge Clone() {
+      return new EquippedBadge(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 2;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "next_equip_change_allowed_timestamp_ms" field.</summary>
+    public const int NextEquipChangeAllowedTimestampMsFieldNumber = 3;
+    private long nextEquipChangeAllowedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextEquipChangeAllowedTimestampMs {
+      get { return nextEquipChangeAllowedTimestampMs_; }
+      set {
+        nextEquipChangeAllowedTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquippedBadge);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquippedBadge other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      if (Level != other.Level) return false;
+      if (NextEquipChangeAllowedTimestampMs != other.NextEquipChangeAllowedTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      if (Level != 0) hash ^= Level.GetHashCode();
+      if (NextEquipChangeAllowedTimestampMs != 0L) hash ^= NextEquipChangeAllowedTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+      if (Level != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Level);
+      }
+      if (NextEquipChangeAllowedTimestampMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(NextEquipChangeAllowedTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      if (NextEquipChangeAllowedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextEquipChangeAllowedTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquippedBadge other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+      if (other.NextEquipChangeAllowedTimestampMs != 0L) {
+        NextEquipChangeAllowedTimestampMs = other.NextEquipChangeAllowedTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Level = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            NextEquipChangeAllowedTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerCurrency : pb::IMessage<PlayerCurrency> {
+    private static readonly pb::MessageParser<PlayerCurrency> _parser = new pb::MessageParser<PlayerCurrency>(() => new PlayerCurrency());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerCurrency> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCurrency() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCurrency(PlayerCurrency other) : this() {
+      gems_ = other.gems_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCurrency Clone() {
+      return new PlayerCurrency(this);
+    }
+
+    /// <summary>Field number for the "gems" field.</summary>
+    public const int GemsFieldNumber = 1;
+    private int gems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Gems {
+      get { return gems_; }
+      set {
+        gems_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerCurrency);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerCurrency other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Gems != other.Gems) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Gems != 0) hash ^= Gems.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Gems != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Gems);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Gems != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Gems);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerCurrency other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Gems != 0) {
+        Gems = other.Gems;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Gems = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/PlayerAvatar.cs b/PokemonGo/POGOProtos/Data/Player/PlayerAvatar.cs
new file mode 100644
index 0000000..4c7593f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/PlayerAvatar.cs
@@ -0,0 +1,387 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/PlayerAvatar.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/PlayerAvatar.proto</summary>
+  public static partial class PlayerAvatarReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/PlayerAvatar.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerAvatarReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CilQT0dPUHJvdG9zL0RhdGEvUGxheWVyL1BsYXllckF2YXRhci5wcm90bxIW",
+            "UE9HT1Byb3Rvcy5EYXRhLlBsYXllchodUE9HT1Byb3Rvcy9FbnVtcy9HZW5k",
+            "ZXIucHJvdG8irgEKDFBsYXllckF2YXRhchIMCgRza2luGAIgASgFEgwKBGhh",
+            "aXIYAyABKAUSDQoFc2hpcnQYBCABKAUSDQoFcGFudHMYBSABKAUSCwoDaGF0",
+            "GAYgASgFEg0KBXNob2VzGAcgASgFEigKBmdlbmRlchgIIAEoDjIYLlBPR09Q",
+            "cm90b3MuRW51bXMuR2VuZGVyEgwKBGV5ZXMYCSABKAUSEAoIYmFja3BhY2sY",
+            "CiABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.GenderReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerAvatar), global::POGOProtos.Data.Player.PlayerAvatar.Parser, new[]{ "Skin", "Hair", "Shirt", "Pants", "Hat", "Shoes", "Gender", "Eyes", "Backpack" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerAvatar : pb::IMessage<PlayerAvatar> {
+    private static readonly pb::MessageParser<PlayerAvatar> _parser = new pb::MessageParser<PlayerAvatar>(() => new PlayerAvatar());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerAvatar> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.PlayerAvatarReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerAvatar() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerAvatar(PlayerAvatar other) : this() {
+      skin_ = other.skin_;
+      hair_ = other.hair_;
+      shirt_ = other.shirt_;
+      pants_ = other.pants_;
+      hat_ = other.hat_;
+      shoes_ = other.shoes_;
+      gender_ = other.gender_;
+      eyes_ = other.eyes_;
+      backpack_ = other.backpack_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerAvatar Clone() {
+      return new PlayerAvatar(this);
+    }
+
+    /// <summary>Field number for the "skin" field.</summary>
+    public const int SkinFieldNumber = 2;
+    private int skin_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Skin {
+      get { return skin_; }
+      set {
+        skin_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "hair" field.</summary>
+    public const int HairFieldNumber = 3;
+    private int hair_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Hair {
+      get { return hair_; }
+      set {
+        hair_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "shirt" field.</summary>
+    public const int ShirtFieldNumber = 4;
+    private int shirt_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Shirt {
+      get { return shirt_; }
+      set {
+        shirt_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pants" field.</summary>
+    public const int PantsFieldNumber = 5;
+    private int pants_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Pants {
+      get { return pants_; }
+      set {
+        pants_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "hat" field.</summary>
+    public const int HatFieldNumber = 6;
+    private int hat_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Hat {
+      get { return hat_; }
+      set {
+        hat_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "shoes" field.</summary>
+    public const int ShoesFieldNumber = 7;
+    private int shoes_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Shoes {
+      get { return shoes_; }
+      set {
+        shoes_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gender" field.</summary>
+    public const int GenderFieldNumber = 8;
+    private global::POGOProtos.Enums.Gender gender_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.Gender Gender {
+      get { return gender_; }
+      set {
+        gender_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "eyes" field.</summary>
+    public const int EyesFieldNumber = 9;
+    private int eyes_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Eyes {
+      get { return eyes_; }
+      set {
+        eyes_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "backpack" field.</summary>
+    public const int BackpackFieldNumber = 10;
+    private int backpack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Backpack {
+      get { return backpack_; }
+      set {
+        backpack_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerAvatar);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerAvatar other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Skin != other.Skin) return false;
+      if (Hair != other.Hair) return false;
+      if (Shirt != other.Shirt) return false;
+      if (Pants != other.Pants) return false;
+      if (Hat != other.Hat) return false;
+      if (Shoes != other.Shoes) return false;
+      if (Gender != other.Gender) return false;
+      if (Eyes != other.Eyes) return false;
+      if (Backpack != other.Backpack) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Skin != 0) hash ^= Skin.GetHashCode();
+      if (Hair != 0) hash ^= Hair.GetHashCode();
+      if (Shirt != 0) hash ^= Shirt.GetHashCode();
+      if (Pants != 0) hash ^= Pants.GetHashCode();
+      if (Hat != 0) hash ^= Hat.GetHashCode();
+      if (Shoes != 0) hash ^= Shoes.GetHashCode();
+      if (Gender != 0) hash ^= Gender.GetHashCode();
+      if (Eyes != 0) hash ^= Eyes.GetHashCode();
+      if (Backpack != 0) hash ^= Backpack.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Skin != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Skin);
+      }
+      if (Hair != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Hair);
+      }
+      if (Shirt != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(Shirt);
+      }
+      if (Pants != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(Pants);
+      }
+      if (Hat != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(Hat);
+      }
+      if (Shoes != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(Shoes);
+      }
+      if (Gender != 0) {
+        output.WriteRawTag(64);
+        output.WriteEnum((int) Gender);
+      }
+      if (Eyes != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(Eyes);
+      }
+      if (Backpack != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(Backpack);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Skin != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Skin);
+      }
+      if (Hair != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Hair);
+      }
+      if (Shirt != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Shirt);
+      }
+      if (Pants != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Pants);
+      }
+      if (Hat != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Hat);
+      }
+      if (Shoes != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Shoes);
+      }
+      if (Gender != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Gender);
+      }
+      if (Eyes != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Eyes);
+      }
+      if (Backpack != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Backpack);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerAvatar other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Skin != 0) {
+        Skin = other.Skin;
+      }
+      if (other.Hair != 0) {
+        Hair = other.Hair;
+      }
+      if (other.Shirt != 0) {
+        Shirt = other.Shirt;
+      }
+      if (other.Pants != 0) {
+        Pants = other.Pants;
+      }
+      if (other.Hat != 0) {
+        Hat = other.Hat;
+      }
+      if (other.Shoes != 0) {
+        Shoes = other.Shoes;
+      }
+      if (other.Gender != 0) {
+        Gender = other.Gender;
+      }
+      if (other.Eyes != 0) {
+        Eyes = other.Eyes;
+      }
+      if (other.Backpack != 0) {
+        Backpack = other.Backpack;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 16: {
+            Skin = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            Hair = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            Shirt = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            Pants = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            Hat = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            Shoes = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            gender_ = (global::POGOProtos.Enums.Gender) input.ReadEnum();
+            break;
+          }
+          case 72: {
+            Eyes = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            Backpack = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/PlayerCamera.cs b/PokemonGo/POGOProtos/Data/Player/PlayerCamera.cs
new file mode 100644
index 0000000..a054512
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/PlayerCamera.cs
@@ -0,0 +1,159 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/PlayerCamera.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/PlayerCamera.proto</summary>
+  public static partial class PlayerCameraReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/PlayerCamera.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerCameraReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CilQT0dPUHJvdG9zL0RhdGEvUGxheWVyL1BsYXllckNhbWVyYS5wcm90bxIW",
+            "UE9HT1Byb3Rvcy5EYXRhLlBsYXllciIpCgxQbGF5ZXJDYW1lcmESGQoRaXNf",
+            "ZGVmYXVsdF9jYW1lcmEYASABKAhiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerCamera), global::POGOProtos.Data.Player.PlayerCamera.Parser, new[]{ "IsDefaultCamera" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerCamera : pb::IMessage<PlayerCamera> {
+    private static readonly pb::MessageParser<PlayerCamera> _parser = new pb::MessageParser<PlayerCamera>(() => new PlayerCamera());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerCamera> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.PlayerCameraReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCamera() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCamera(PlayerCamera other) : this() {
+      isDefaultCamera_ = other.isDefaultCamera_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCamera Clone() {
+      return new PlayerCamera(this);
+    }
+
+    /// <summary>Field number for the "is_default_camera" field.</summary>
+    public const int IsDefaultCameraFieldNumber = 1;
+    private bool isDefaultCamera_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsDefaultCamera {
+      get { return isDefaultCamera_; }
+      set {
+        isDefaultCamera_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerCamera);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerCamera other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IsDefaultCamera != other.IsDefaultCamera) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IsDefaultCamera != false) hash ^= IsDefaultCamera.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IsDefaultCamera != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(IsDefaultCamera);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IsDefaultCamera != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerCamera other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IsDefaultCamera != false) {
+        IsDefaultCamera = other.IsDefaultCamera;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            IsDefaultCamera = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/PlayerCurrency.cs b/PokemonGo/POGOProtos/Data/Player/PlayerCurrency.cs
new file mode 100644
index 0000000..91eec75
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/PlayerCurrency.cs
@@ -0,0 +1,159 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/PlayerCurrency.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/PlayerCurrency.proto</summary>
+  public static partial class PlayerCurrencyReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/PlayerCurrency.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerCurrencyReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CitQT0dPUHJvdG9zL0RhdGEvUGxheWVyL1BsYXllckN1cnJlbmN5LnByb3Rv",
+            "EhZQT0dPUHJvdG9zLkRhdGEuUGxheWVyIh4KDlBsYXllckN1cnJlbmN5EgwK",
+            "BGdlbXMYASABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerCurrency), global::POGOProtos.Data.Player.PlayerCurrency.Parser, new[]{ "Gems" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerCurrency : pb::IMessage<PlayerCurrency> {
+    private static readonly pb::MessageParser<PlayerCurrency> _parser = new pb::MessageParser<PlayerCurrency>(() => new PlayerCurrency());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerCurrency> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.PlayerCurrencyReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCurrency() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCurrency(PlayerCurrency other) : this() {
+      gems_ = other.gems_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerCurrency Clone() {
+      return new PlayerCurrency(this);
+    }
+
+    /// <summary>Field number for the "gems" field.</summary>
+    public const int GemsFieldNumber = 1;
+    private int gems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Gems {
+      get { return gems_; }
+      set {
+        gems_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerCurrency);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerCurrency other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Gems != other.Gems) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Gems != 0) hash ^= Gems.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Gems != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Gems);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Gems != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Gems);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerCurrency other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Gems != 0) {
+        Gems = other.Gems;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Gems = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/PlayerPublicProfile.cs b/PokemonGo/POGOProtos/Data/Player/PlayerPublicProfile.cs
new file mode 100644
index 0000000..f548936
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/PlayerPublicProfile.cs
@@ -0,0 +1,224 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/PlayerPublicProfile.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/PlayerPublicProfile.proto</summary>
+  public static partial class PlayerPublicProfileReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/PlayerPublicProfile.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerPublicProfileReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjBQT0dPUHJvdG9zL0RhdGEvUGxheWVyL1BsYXllclB1YmxpY1Byb2ZpbGUu",
+            "cHJvdG8SFlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIaKVBPR09Qcm90b3MvRGF0",
+            "YS9QbGF5ZXIvUGxheWVyQXZhdGFyLnByb3RvImgKE1BsYXllclB1YmxpY1By",
+            "b2ZpbGUSDAoEbmFtZRgBIAEoCRINCgVsZXZlbBgCIAEoBRI0CgZhdmF0YXIY",
+            "AyABKAsyJC5QT0dPUHJvdG9zLkRhdGEuUGxheWVyLlBsYXllckF2YXRhcmIG",
+            "cHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Player.PlayerAvatarReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerPublicProfile), global::POGOProtos.Data.Player.PlayerPublicProfile.Parser, new[]{ "Name", "Level", "Avatar" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerPublicProfile : pb::IMessage<PlayerPublicProfile> {
+    private static readonly pb::MessageParser<PlayerPublicProfile> _parser = new pb::MessageParser<PlayerPublicProfile>(() => new PlayerPublicProfile());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerPublicProfile> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.PlayerPublicProfileReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerPublicProfile() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerPublicProfile(PlayerPublicProfile other) : this() {
+      name_ = other.name_;
+      level_ = other.level_;
+      Avatar = other.avatar_ != null ? other.Avatar.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerPublicProfile Clone() {
+      return new PlayerPublicProfile(this);
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 1;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 2;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "avatar" field.</summary>
+    public const int AvatarFieldNumber = 3;
+    private global::POGOProtos.Data.Player.PlayerAvatar avatar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerAvatar Avatar {
+      get { return avatar_; }
+      set {
+        avatar_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerPublicProfile);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerPublicProfile other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Name != other.Name) return false;
+      if (Level != other.Level) return false;
+      if (!object.Equals(Avatar, other.Avatar)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      if (Level != 0) hash ^= Level.GetHashCode();
+      if (avatar_ != null) hash ^= Avatar.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Name.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Name);
+      }
+      if (Level != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Level);
+      }
+      if (avatar_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(Avatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      if (avatar_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Avatar);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerPublicProfile other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+      if (other.avatar_ != null) {
+        if (avatar_ == null) {
+          avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+        }
+        Avatar.MergeFrom(other.Avatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Name = input.ReadString();
+            break;
+          }
+          case 16: {
+            Level = input.ReadInt32();
+            break;
+          }
+          case 26: {
+            if (avatar_ == null) {
+              avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+            }
+            input.ReadMessage(avatar_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/Player/PlayerStats.cs b/PokemonGo/POGOProtos/Data/Player/PlayerStats.cs
new file mode 100644
index 0000000..67cae47
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/Player/PlayerStats.cs
@@ -0,0 +1,791 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/Player/PlayerStats.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data.Player {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/Player/PlayerStats.proto</summary>
+  public static partial class PlayerStatsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/Player/PlayerStats.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerStatsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL0RhdGEvUGxheWVyL1BsYXllclN0YXRzLnByb3RvEhZQ",
+            "T0dPUHJvdG9zLkRhdGEuUGxheWVyIu0ECgtQbGF5ZXJTdGF0cxINCgVsZXZl",
+            "bBgBIAEoBRISCgpleHBlcmllbmNlGAIgASgDEhUKDXByZXZfbGV2ZWxfeHAY",
+            "AyABKAMSFQoNbmV4dF9sZXZlbF94cBgEIAEoAxIRCglrbV93YWxrZWQYBSAB",
+            "KAISHAoUcG9rZW1vbnNfZW5jb3VudGVyZWQYBiABKAUSHgoWdW5pcXVlX3Bv",
+            "a2VkZXhfZW50cmllcxgHIAEoBRIZChFwb2tlbW9uc19jYXB0dXJlZBgIIAEo",
+            "BRISCgpldm9sdXRpb25zGAkgASgFEhgKEHBva2Vfc3RvcF92aXNpdHMYCiAB",
+            "KAUSGAoQcG9rZWJhbGxzX3Rocm93bhgLIAEoBRIUCgxlZ2dzX2hhdGNoZWQY",
+            "DCABKAUSGwoTYmlnX21hZ2lrYXJwX2NhdWdodBgNIAEoBRIZChFiYXR0bGVf",
+            "YXR0YWNrX3dvbhgOIAEoBRIbChNiYXR0bGVfYXR0YWNrX3RvdGFsGA8gASgF",
+            "EhsKE2JhdHRsZV9kZWZlbmRlZF93b24YECABKAUSGwoTYmF0dGxlX3RyYWlu",
+            "aW5nX3dvbhgRIAEoBRIdChViYXR0bGVfdHJhaW5pbmdfdG90YWwYEiABKAUS",
+            "HQoVcHJlc3RpZ2VfcmFpc2VkX3RvdGFsGBMgASgFEh4KFnByZXN0aWdlX2Ry",
+            "b3BwZWRfdG90YWwYFCABKAUSGAoQcG9rZW1vbl9kZXBsb3llZBgVIAEoBRIe",
+            "ChZwb2tlbW9uX2NhdWdodF9ieV90eXBlGBYgASgMEhwKFHNtYWxsX3JhdHRh",
+            "dGFfY2F1Z2h0GBcgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.Player.PlayerStats), global::POGOProtos.Data.Player.PlayerStats.Parser, new[]{ "Level", "Experience", "PrevLevelXp", "NextLevelXp", "KmWalked", "PokemonsEncountered", "UniquePokedexEntries", "PokemonsCaptured", "Evolutions", "PokeStopVisits", "PokeballsThrown", "EggsHatched", "BigMagikarpCaught", "BattleAttackWon", "BattleAttackTotal", "BattleDefendedWon", "BattleTrainingWon", "BattleTrainingTotal", "PrestigeRaisedTotal", "PrestigeDroppedTotal", "PokemonDeployed", "PokemonCaughtByType", "SmallRattataCaught" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerStats : pb::IMessage<PlayerStats> {
+    private static readonly pb::MessageParser<PlayerStats> _parser = new pb::MessageParser<PlayerStats>(() => new PlayerStats());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerStats> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.Player.PlayerStatsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerStats() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerStats(PlayerStats other) : this() {
+      level_ = other.level_;
+      experience_ = other.experience_;
+      prevLevelXp_ = other.prevLevelXp_;
+      nextLevelXp_ = other.nextLevelXp_;
+      kmWalked_ = other.kmWalked_;
+      pokemonsEncountered_ = other.pokemonsEncountered_;
+      uniquePokedexEntries_ = other.uniquePokedexEntries_;
+      pokemonsCaptured_ = other.pokemonsCaptured_;
+      evolutions_ = other.evolutions_;
+      pokeStopVisits_ = other.pokeStopVisits_;
+      pokeballsThrown_ = other.pokeballsThrown_;
+      eggsHatched_ = other.eggsHatched_;
+      bigMagikarpCaught_ = other.bigMagikarpCaught_;
+      battleAttackWon_ = other.battleAttackWon_;
+      battleAttackTotal_ = other.battleAttackTotal_;
+      battleDefendedWon_ = other.battleDefendedWon_;
+      battleTrainingWon_ = other.battleTrainingWon_;
+      battleTrainingTotal_ = other.battleTrainingTotal_;
+      prestigeRaisedTotal_ = other.prestigeRaisedTotal_;
+      prestigeDroppedTotal_ = other.prestigeDroppedTotal_;
+      pokemonDeployed_ = other.pokemonDeployed_;
+      pokemonCaughtByType_ = other.pokemonCaughtByType_;
+      smallRattataCaught_ = other.smallRattataCaught_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerStats Clone() {
+      return new PlayerStats(this);
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 1;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "experience" field.</summary>
+    public const int ExperienceFieldNumber = 2;
+    private long experience_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long Experience {
+      get { return experience_; }
+      set {
+        experience_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "prev_level_xp" field.</summary>
+    public const int PrevLevelXpFieldNumber = 3;
+    private long prevLevelXp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long PrevLevelXp {
+      get { return prevLevelXp_; }
+      set {
+        prevLevelXp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "next_level_xp" field.</summary>
+    public const int NextLevelXpFieldNumber = 4;
+    private long nextLevelXp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NextLevelXp {
+      get { return nextLevelXp_; }
+      set {
+        nextLevelXp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "km_walked" field.</summary>
+    public const int KmWalkedFieldNumber = 5;
+    private float kmWalked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float KmWalked {
+      get { return kmWalked_; }
+      set {
+        kmWalked_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemons_encountered" field.</summary>
+    public const int PokemonsEncounteredFieldNumber = 6;
+    private int pokemonsEncountered_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonsEncountered {
+      get { return pokemonsEncountered_; }
+      set {
+        pokemonsEncountered_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unique_pokedex_entries" field.</summary>
+    public const int UniquePokedexEntriesFieldNumber = 7;
+    private int uniquePokedexEntries_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int UniquePokedexEntries {
+      get { return uniquePokedexEntries_; }
+      set {
+        uniquePokedexEntries_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemons_captured" field.</summary>
+    public const int PokemonsCapturedFieldNumber = 8;
+    private int pokemonsCaptured_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonsCaptured {
+      get { return pokemonsCaptured_; }
+      set {
+        pokemonsCaptured_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolutions" field.</summary>
+    public const int EvolutionsFieldNumber = 9;
+    private int evolutions_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Evolutions {
+      get { return evolutions_; }
+      set {
+        evolutions_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "poke_stop_visits" field.</summary>
+    public const int PokeStopVisitsFieldNumber = 10;
+    private int pokeStopVisits_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokeStopVisits {
+      get { return pokeStopVisits_; }
+      set {
+        pokeStopVisits_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeballs_thrown" field.</summary>
+    public const int PokeballsThrownFieldNumber = 11;
+    private int pokeballsThrown_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokeballsThrown {
+      get { return pokeballsThrown_; }
+      set {
+        pokeballsThrown_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "eggs_hatched" field.</summary>
+    public const int EggsHatchedFieldNumber = 12;
+    private int eggsHatched_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EggsHatched {
+      get { return eggsHatched_; }
+      set {
+        eggsHatched_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "big_magikarp_caught" field.</summary>
+    public const int BigMagikarpCaughtFieldNumber = 13;
+    private int bigMagikarpCaught_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BigMagikarpCaught {
+      get { return bigMagikarpCaught_; }
+      set {
+        bigMagikarpCaught_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_attack_won" field.</summary>
+    public const int BattleAttackWonFieldNumber = 14;
+    private int battleAttackWon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleAttackWon {
+      get { return battleAttackWon_; }
+      set {
+        battleAttackWon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_attack_total" field.</summary>
+    public const int BattleAttackTotalFieldNumber = 15;
+    private int battleAttackTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleAttackTotal {
+      get { return battleAttackTotal_; }
+      set {
+        battleAttackTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_defended_won" field.</summary>
+    public const int BattleDefendedWonFieldNumber = 16;
+    private int battleDefendedWon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleDefendedWon {
+      get { return battleDefendedWon_; }
+      set {
+        battleDefendedWon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_training_won" field.</summary>
+    public const int BattleTrainingWonFieldNumber = 17;
+    private int battleTrainingWon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleTrainingWon {
+      get { return battleTrainingWon_; }
+      set {
+        battleTrainingWon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_training_total" field.</summary>
+    public const int BattleTrainingTotalFieldNumber = 18;
+    private int battleTrainingTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattleTrainingTotal {
+      get { return battleTrainingTotal_; }
+      set {
+        battleTrainingTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "prestige_raised_total" field.</summary>
+    public const int PrestigeRaisedTotalFieldNumber = 19;
+    private int prestigeRaisedTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PrestigeRaisedTotal {
+      get { return prestigeRaisedTotal_; }
+      set {
+        prestigeRaisedTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "prestige_dropped_total" field.</summary>
+    public const int PrestigeDroppedTotalFieldNumber = 20;
+    private int prestigeDroppedTotal_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PrestigeDroppedTotal {
+      get { return prestigeDroppedTotal_; }
+      set {
+        prestigeDroppedTotal_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_deployed" field.</summary>
+    public const int PokemonDeployedFieldNumber = 21;
+    private int pokemonDeployed_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonDeployed {
+      get { return pokemonDeployed_; }
+      set {
+        pokemonDeployed_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_caught_by_type" field.</summary>
+    public const int PokemonCaughtByTypeFieldNumber = 22;
+    private pb::ByteString pokemonCaughtByType_ = pb::ByteString.Empty;
+    /// <summary>
+    ///  TODO: repeated PokemonType ??
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString PokemonCaughtByType {
+      get { return pokemonCaughtByType_; }
+      set {
+        pokemonCaughtByType_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "small_rattata_caught" field.</summary>
+    public const int SmallRattataCaughtFieldNumber = 23;
+    private int smallRattataCaught_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int SmallRattataCaught {
+      get { return smallRattataCaught_; }
+      set {
+        smallRattataCaught_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerStats);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerStats other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Level != other.Level) return false;
+      if (Experience != other.Experience) return false;
+      if (PrevLevelXp != other.PrevLevelXp) return false;
+      if (NextLevelXp != other.NextLevelXp) return false;
+      if (KmWalked != other.KmWalked) return false;
+      if (PokemonsEncountered != other.PokemonsEncountered) return false;
+      if (UniquePokedexEntries != other.UniquePokedexEntries) return false;
+      if (PokemonsCaptured != other.PokemonsCaptured) return false;
+      if (Evolutions != other.Evolutions) return false;
+      if (PokeStopVisits != other.PokeStopVisits) return false;
+      if (PokeballsThrown != other.PokeballsThrown) return false;
+      if (EggsHatched != other.EggsHatched) return false;
+      if (BigMagikarpCaught != other.BigMagikarpCaught) return false;
+      if (BattleAttackWon != other.BattleAttackWon) return false;
+      if (BattleAttackTotal != other.BattleAttackTotal) return false;
+      if (BattleDefendedWon != other.BattleDefendedWon) return false;
+      if (BattleTrainingWon != other.BattleTrainingWon) return false;
+      if (BattleTrainingTotal != other.BattleTrainingTotal) return false;
+      if (PrestigeRaisedTotal != other.PrestigeRaisedTotal) return false;
+      if (PrestigeDroppedTotal != other.PrestigeDroppedTotal) return false;
+      if (PokemonDeployed != other.PokemonDeployed) return false;
+      if (PokemonCaughtByType != other.PokemonCaughtByType) return false;
+      if (SmallRattataCaught != other.SmallRattataCaught) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Level != 0) hash ^= Level.GetHashCode();
+      if (Experience != 0L) hash ^= Experience.GetHashCode();
+      if (PrevLevelXp != 0L) hash ^= PrevLevelXp.GetHashCode();
+      if (NextLevelXp != 0L) hash ^= NextLevelXp.GetHashCode();
+      if (KmWalked != 0F) hash ^= KmWalked.GetHashCode();
+      if (PokemonsEncountered != 0) hash ^= PokemonsEncountered.GetHashCode();
+      if (UniquePokedexEntries != 0) hash ^= UniquePokedexEntries.GetHashCode();
+      if (PokemonsCaptured != 0) hash ^= PokemonsCaptured.GetHashCode();
+      if (Evolutions != 0) hash ^= Evolutions.GetHashCode();
+      if (PokeStopVisits != 0) hash ^= PokeStopVisits.GetHashCode();
+      if (PokeballsThrown != 0) hash ^= PokeballsThrown.GetHashCode();
+      if (EggsHatched != 0) hash ^= EggsHatched.GetHashCode();
+      if (BigMagikarpCaught != 0) hash ^= BigMagikarpCaught.GetHashCode();
+      if (BattleAttackWon != 0) hash ^= BattleAttackWon.GetHashCode();
+      if (BattleAttackTotal != 0) hash ^= BattleAttackTotal.GetHashCode();
+      if (BattleDefendedWon != 0) hash ^= BattleDefendedWon.GetHashCode();
+      if (BattleTrainingWon != 0) hash ^= BattleTrainingWon.GetHashCode();
+      if (BattleTrainingTotal != 0) hash ^= BattleTrainingTotal.GetHashCode();
+      if (PrestigeRaisedTotal != 0) hash ^= PrestigeRaisedTotal.GetHashCode();
+      if (PrestigeDroppedTotal != 0) hash ^= PrestigeDroppedTotal.GetHashCode();
+      if (PokemonDeployed != 0) hash ^= PokemonDeployed.GetHashCode();
+      if (PokemonCaughtByType.Length != 0) hash ^= PokemonCaughtByType.GetHashCode();
+      if (SmallRattataCaught != 0) hash ^= SmallRattataCaught.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Level != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Level);
+      }
+      if (Experience != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(Experience);
+      }
+      if (PrevLevelXp != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(PrevLevelXp);
+      }
+      if (NextLevelXp != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(NextLevelXp);
+      }
+      if (KmWalked != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(KmWalked);
+      }
+      if (PokemonsEncountered != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(PokemonsEncountered);
+      }
+      if (UniquePokedexEntries != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(UniquePokedexEntries);
+      }
+      if (PokemonsCaptured != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(PokemonsCaptured);
+      }
+      if (Evolutions != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(Evolutions);
+      }
+      if (PokeStopVisits != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(PokeStopVisits);
+      }
+      if (PokeballsThrown != 0) {
+        output.WriteRawTag(88);
+        output.WriteInt32(PokeballsThrown);
+      }
+      if (EggsHatched != 0) {
+        output.WriteRawTag(96);
+        output.WriteInt32(EggsHatched);
+      }
+      if (BigMagikarpCaught != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(BigMagikarpCaught);
+      }
+      if (BattleAttackWon != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(BattleAttackWon);
+      }
+      if (BattleAttackTotal != 0) {
+        output.WriteRawTag(120);
+        output.WriteInt32(BattleAttackTotal);
+      }
+      if (BattleDefendedWon != 0) {
+        output.WriteRawTag(128, 1);
+        output.WriteInt32(BattleDefendedWon);
+      }
+      if (BattleTrainingWon != 0) {
+        output.WriteRawTag(136, 1);
+        output.WriteInt32(BattleTrainingWon);
+      }
+      if (BattleTrainingTotal != 0) {
+        output.WriteRawTag(144, 1);
+        output.WriteInt32(BattleTrainingTotal);
+      }
+      if (PrestigeRaisedTotal != 0) {
+        output.WriteRawTag(152, 1);
+        output.WriteInt32(PrestigeRaisedTotal);
+      }
+      if (PrestigeDroppedTotal != 0) {
+        output.WriteRawTag(160, 1);
+        output.WriteInt32(PrestigeDroppedTotal);
+      }
+      if (PokemonDeployed != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteInt32(PokemonDeployed);
+      }
+      if (PokemonCaughtByType.Length != 0) {
+        output.WriteRawTag(178, 1);
+        output.WriteBytes(PokemonCaughtByType);
+      }
+      if (SmallRattataCaught != 0) {
+        output.WriteRawTag(184, 1);
+        output.WriteInt32(SmallRattataCaught);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      if (Experience != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Experience);
+      }
+      if (PrevLevelXp != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(PrevLevelXp);
+      }
+      if (NextLevelXp != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextLevelXp);
+      }
+      if (KmWalked != 0F) {
+        size += 1 + 4;
+      }
+      if (PokemonsEncountered != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsEncountered);
+      }
+      if (UniquePokedexEntries != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(UniquePokedexEntries);
+      }
+      if (PokemonsCaptured != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsCaptured);
+      }
+      if (Evolutions != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Evolutions);
+      }
+      if (PokeStopVisits != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeStopVisits);
+      }
+      if (PokeballsThrown != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeballsThrown);
+      }
+      if (EggsHatched != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggsHatched);
+      }
+      if (BigMagikarpCaught != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BigMagikarpCaught);
+      }
+      if (BattleAttackWon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackWon);
+      }
+      if (BattleAttackTotal != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackTotal);
+      }
+      if (BattleDefendedWon != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleDefendedWon);
+      }
+      if (BattleTrainingWon != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingWon);
+      }
+      if (BattleTrainingTotal != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingTotal);
+      }
+      if (PrestigeRaisedTotal != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeRaisedTotal);
+      }
+      if (PrestigeDroppedTotal != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeDroppedTotal);
+      }
+      if (PokemonDeployed != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(PokemonDeployed);
+      }
+      if (PokemonCaughtByType.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeBytesSize(PokemonCaughtByType);
+      }
+      if (SmallRattataCaught != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(SmallRattataCaught);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerStats other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+      if (other.Experience != 0L) {
+        Experience = other.Experience;
+      }
+      if (other.PrevLevelXp != 0L) {
+        PrevLevelXp = other.PrevLevelXp;
+      }
+      if (other.NextLevelXp != 0L) {
+        NextLevelXp = other.NextLevelXp;
+      }
+      if (other.KmWalked != 0F) {
+        KmWalked = other.KmWalked;
+      }
+      if (other.PokemonsEncountered != 0) {
+        PokemonsEncountered = other.PokemonsEncountered;
+      }
+      if (other.UniquePokedexEntries != 0) {
+        UniquePokedexEntries = other.UniquePokedexEntries;
+      }
+      if (other.PokemonsCaptured != 0) {
+        PokemonsCaptured = other.PokemonsCaptured;
+      }
+      if (other.Evolutions != 0) {
+        Evolutions = other.Evolutions;
+      }
+      if (other.PokeStopVisits != 0) {
+        PokeStopVisits = other.PokeStopVisits;
+      }
+      if (other.PokeballsThrown != 0) {
+        PokeballsThrown = other.PokeballsThrown;
+      }
+      if (other.EggsHatched != 0) {
+        EggsHatched = other.EggsHatched;
+      }
+      if (other.BigMagikarpCaught != 0) {
+        BigMagikarpCaught = other.BigMagikarpCaught;
+      }
+      if (other.BattleAttackWon != 0) {
+        BattleAttackWon = other.BattleAttackWon;
+      }
+      if (other.BattleAttackTotal != 0) {
+        BattleAttackTotal = other.BattleAttackTotal;
+      }
+      if (other.BattleDefendedWon != 0) {
+        BattleDefendedWon = other.BattleDefendedWon;
+      }
+      if (other.BattleTrainingWon != 0) {
+        BattleTrainingWon = other.BattleTrainingWon;
+      }
+      if (other.BattleTrainingTotal != 0) {
+        BattleTrainingTotal = other.BattleTrainingTotal;
+      }
+      if (other.PrestigeRaisedTotal != 0) {
+        PrestigeRaisedTotal = other.PrestigeRaisedTotal;
+      }
+      if (other.PrestigeDroppedTotal != 0) {
+        PrestigeDroppedTotal = other.PrestigeDroppedTotal;
+      }
+      if (other.PokemonDeployed != 0) {
+        PokemonDeployed = other.PokemonDeployed;
+      }
+      if (other.PokemonCaughtByType.Length != 0) {
+        PokemonCaughtByType = other.PokemonCaughtByType;
+      }
+      if (other.SmallRattataCaught != 0) {
+        SmallRattataCaught = other.SmallRattataCaught;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Level = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            Experience = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            PrevLevelXp = input.ReadInt64();
+            break;
+          }
+          case 32: {
+            NextLevelXp = input.ReadInt64();
+            break;
+          }
+          case 45: {
+            KmWalked = input.ReadFloat();
+            break;
+          }
+          case 48: {
+            PokemonsEncountered = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            UniquePokedexEntries = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            PokemonsCaptured = input.ReadInt32();
+            break;
+          }
+          case 72: {
+            Evolutions = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            PokeStopVisits = input.ReadInt32();
+            break;
+          }
+          case 88: {
+            PokeballsThrown = input.ReadInt32();
+            break;
+          }
+          case 96: {
+            EggsHatched = input.ReadInt32();
+            break;
+          }
+          case 104: {
+            BigMagikarpCaught = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            BattleAttackWon = input.ReadInt32();
+            break;
+          }
+          case 120: {
+            BattleAttackTotal = input.ReadInt32();
+            break;
+          }
+          case 128: {
+            BattleDefendedWon = input.ReadInt32();
+            break;
+          }
+          case 136: {
+            BattleTrainingWon = input.ReadInt32();
+            break;
+          }
+          case 144: {
+            BattleTrainingTotal = input.ReadInt32();
+            break;
+          }
+          case 152: {
+            PrestigeRaisedTotal = input.ReadInt32();
+            break;
+          }
+          case 160: {
+            PrestigeDroppedTotal = input.ReadInt32();
+            break;
+          }
+          case 168: {
+            PokemonDeployed = input.ReadInt32();
+            break;
+          }
+          case 178: {
+            PokemonCaughtByType = input.ReadBytes();
+            break;
+          }
+          case 184: {
+            SmallRattataCaught = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/PlayerBadge.cs b/PokemonGo/POGOProtos/Data/PlayerBadge.cs
new file mode 100644
index 0000000..48e13f6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/PlayerBadge.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/PlayerBadge.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/PlayerBadge.proto</summary>
+  public static partial class PlayerBadgeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/PlayerBadge.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerBadgeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiFQT0dPUHJvdG9zL0RhdGEvUGxheWVyQmFkZ2UucHJvdG8SD1BPR09Qcm90",
+            "b3MuRGF0YRogUE9HT1Byb3Rvcy9FbnVtcy9CYWRnZVR5cGUucHJvdG8iiwEK",
+            "C1BsYXllckJhZGdlEi8KCmJhZGdlX3R5cGUYASABKA4yGy5QT0dPUHJvdG9z",
+            "LkVudW1zLkJhZGdlVHlwZRIMCgRyYW5rGAIgASgFEhMKC3N0YXJ0X3ZhbHVl",
+            "GAMgASgFEhEKCWVuZF92YWx1ZRgEIAEoBRIVCg1jdXJyZW50X3ZhbHVlGAUg",
+            "ASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.BadgeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PlayerBadge), global::POGOProtos.Data.PlayerBadge.Parser, new[]{ "BadgeType", "Rank", "StartValue", "EndValue", "CurrentValue" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerBadge : pb::IMessage<PlayerBadge> {
+    private static readonly pb::MessageParser<PlayerBadge> _parser = new pb::MessageParser<PlayerBadge>(() => new PlayerBadge());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerBadge> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.PlayerBadgeReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerBadge() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerBadge(PlayerBadge other) : this() {
+      badgeType_ = other.badgeType_;
+      rank_ = other.rank_;
+      startValue_ = other.startValue_;
+      endValue_ = other.endValue_;
+      currentValue_ = other.currentValue_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerBadge Clone() {
+      return new PlayerBadge(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "rank" field.</summary>
+    public const int RankFieldNumber = 2;
+    private int rank_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Rank {
+      get { return rank_; }
+      set {
+        rank_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "start_value" field.</summary>
+    public const int StartValueFieldNumber = 3;
+    private int startValue_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StartValue {
+      get { return startValue_; }
+      set {
+        startValue_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "end_value" field.</summary>
+    public const int EndValueFieldNumber = 4;
+    private int endValue_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EndValue {
+      get { return endValue_; }
+      set {
+        endValue_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_value" field.</summary>
+    public const int CurrentValueFieldNumber = 5;
+    private double currentValue_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double CurrentValue {
+      get { return currentValue_; }
+      set {
+        currentValue_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerBadge);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerBadge other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      if (Rank != other.Rank) return false;
+      if (StartValue != other.StartValue) return false;
+      if (EndValue != other.EndValue) return false;
+      if (CurrentValue != other.CurrentValue) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      if (Rank != 0) hash ^= Rank.GetHashCode();
+      if (StartValue != 0) hash ^= StartValue.GetHashCode();
+      if (EndValue != 0) hash ^= EndValue.GetHashCode();
+      if (CurrentValue != 0D) hash ^= CurrentValue.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+      if (Rank != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Rank);
+      }
+      if (StartValue != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(StartValue);
+      }
+      if (EndValue != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(EndValue);
+      }
+      if (CurrentValue != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(CurrentValue);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      if (Rank != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rank);
+      }
+      if (StartValue != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StartValue);
+      }
+      if (EndValue != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EndValue);
+      }
+      if (CurrentValue != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerBadge other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+      if (other.Rank != 0) {
+        Rank = other.Rank;
+      }
+      if (other.StartValue != 0) {
+        StartValue = other.StartValue;
+      }
+      if (other.EndValue != 0) {
+        EndValue = other.EndValue;
+      }
+      if (other.CurrentValue != 0D) {
+        CurrentValue = other.CurrentValue;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Rank = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            StartValue = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            EndValue = input.ReadInt32();
+            break;
+          }
+          case 41: {
+            CurrentValue = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/PlayerData.cs b/PokemonGo/POGOProtos/Data/PlayerData.cs
new file mode 100644
index 0000000..eb9e92c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/PlayerData.cs
@@ -0,0 +1,465 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/PlayerData.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/PlayerData.proto</summary>
+  public static partial class PlayerDataReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/PlayerData.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerDataReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiBQT0dPUHJvdG9zL0RhdGEvUGxheWVyRGF0YS5wcm90bxIPUE9HT1Byb3Rv",
+            "cy5EYXRhGiRQT0dPUHJvdG9zL0VudW1zL1R1dG9yaWFsU3RhdGUucHJvdG8a",
+            "KVBPR09Qcm90b3MvRGF0YS9QbGF5ZXIvUGxheWVyQXZhdGFyLnByb3RvGidQ",
+            "T0dPUHJvdG9zL0RhdGEvUGxheWVyL0RhaWx5Qm9udXMucHJvdG8aKlBPR09Q",
+            "cm90b3MvRGF0YS9QbGF5ZXIvRXF1aXBwZWRCYWRnZS5wcm90bxosUE9HT1By",
+            "b3Rvcy9EYXRhL1BsYXllci9Db250YWN0U2V0dGluZ3MucHJvdG8aJVBPR09Q",
+            "cm90b3MvRGF0YS9QbGF5ZXIvQ3VycmVuY3kucHJvdG8aIFBPR09Qcm90b3Mv",
+            "RW51bXMvVGVhbUNvbG9yLnByb3RvIoMECgpQbGF5ZXJEYXRhEh0KFWNyZWF0",
+            "aW9uX3RpbWVzdGFtcF9tcxgBIAEoAxIQCgh1c2VybmFtZRgCIAEoCRIpCgR0",
+            "ZWFtGAUgASgOMhsuUE9HT1Byb3Rvcy5FbnVtcy5UZWFtQ29sb3ISOwoOdHV0",
+            "b3JpYWxfc3RhdGUYByADKA4yHy5QT0dPUHJvdG9zLkVudW1zLlR1dG9yaWFs",
+            "U3RhdGVCAhABEjQKBmF2YXRhchgIIAEoCzIkLlBPR09Qcm90b3MuRGF0YS5Q",
+            "bGF5ZXIuUGxheWVyQXZhdGFyEhsKE21heF9wb2tlbW9uX3N0b3JhZ2UYCSAB",
+            "KAUSGAoQbWF4X2l0ZW1fc3RvcmFnZRgKIAEoBRI3CgtkYWlseV9ib251cxgL",
+            "IAEoCzIiLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIuRGFpbHlCb251cxI9Cg5l",
+            "cXVpcHBlZF9iYWRnZRgMIAEoCzIlLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIu",
+            "RXF1aXBwZWRCYWRnZRJBChBjb250YWN0X3NldHRpbmdzGA0gASgLMicuUE9H",
+            "T1Byb3Rvcy5EYXRhLlBsYXllci5Db250YWN0U2V0dGluZ3MSNAoKY3VycmVu",
+            "Y2llcxgOIAMoCzIgLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIuQ3VycmVuY3li",
+            "BnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.TutorialStateReflection.Descriptor, global::POGOProtos.Data.Player.PlayerAvatarReflection.Descriptor, global::POGOProtos.Data.Player.DailyBonusReflection.Descriptor, global::POGOProtos.Data.Player.EquippedBadgeReflection.Descriptor, global::POGOProtos.Data.Player.ContactSettingsReflection.Descriptor, global::POGOProtos.Data.Player.CurrencyReflection.Descriptor, global::POGOProtos.Enums.TeamColorReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PlayerData), global::POGOProtos.Data.PlayerData.Parser, new[]{ "CreationTimestampMs", "Username", "Team", "TutorialState", "Avatar", "MaxPokemonStorage", "MaxItemStorage", "DailyBonus", "EquippedBadge", "ContactSettings", "Currencies" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerData : pb::IMessage<PlayerData> {
+    private static readonly pb::MessageParser<PlayerData> _parser = new pb::MessageParser<PlayerData>(() => new PlayerData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.PlayerDataReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerData(PlayerData other) : this() {
+      creationTimestampMs_ = other.creationTimestampMs_;
+      username_ = other.username_;
+      team_ = other.team_;
+      tutorialState_ = other.tutorialState_.Clone();
+      Avatar = other.avatar_ != null ? other.Avatar.Clone() : null;
+      maxPokemonStorage_ = other.maxPokemonStorage_;
+      maxItemStorage_ = other.maxItemStorage_;
+      DailyBonus = other.dailyBonus_ != null ? other.DailyBonus.Clone() : null;
+      EquippedBadge = other.equippedBadge_ != null ? other.EquippedBadge.Clone() : null;
+      ContactSettings = other.contactSettings_ != null ? other.ContactSettings.Clone() : null;
+      currencies_ = other.currencies_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerData Clone() {
+      return new PlayerData(this);
+    }
+
+    /// <summary>Field number for the "creation_timestamp_ms" field.</summary>
+    public const int CreationTimestampMsFieldNumber = 1;
+    private long creationTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CreationTimestampMs {
+      get { return creationTimestampMs_; }
+      set {
+        creationTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "username" field.</summary>
+    public const int UsernameFieldNumber = 2;
+    private string username_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Username {
+      get { return username_; }
+      set {
+        username_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "team" field.</summary>
+    public const int TeamFieldNumber = 5;
+    private global::POGOProtos.Enums.TeamColor team_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor Team {
+      get { return team_; }
+      set {
+        team_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "tutorial_state" field.</summary>
+    public const int TutorialStateFieldNumber = 7;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.TutorialState> _repeated_tutorialState_codec
+        = pb::FieldCodec.ForEnum(58, x => (int) x, x => (global::POGOProtos.Enums.TutorialState) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> tutorialState_ = new pbc::RepeatedField<global::POGOProtos.Enums.TutorialState>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> TutorialState {
+      get { return tutorialState_; }
+    }
+
+    /// <summary>Field number for the "avatar" field.</summary>
+    public const int AvatarFieldNumber = 8;
+    private global::POGOProtos.Data.Player.PlayerAvatar avatar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerAvatar Avatar {
+      get { return avatar_; }
+      set {
+        avatar_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_pokemon_storage" field.</summary>
+    public const int MaxPokemonStorageFieldNumber = 9;
+    private int maxPokemonStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxPokemonStorage {
+      get { return maxPokemonStorage_; }
+      set {
+        maxPokemonStorage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_item_storage" field.</summary>
+    public const int MaxItemStorageFieldNumber = 10;
+    private int maxItemStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxItemStorage {
+      get { return maxItemStorage_; }
+      set {
+        maxItemStorage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_bonus" field.</summary>
+    public const int DailyBonusFieldNumber = 11;
+    private global::POGOProtos.Data.Player.DailyBonus dailyBonus_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.DailyBonus DailyBonus {
+      get { return dailyBonus_; }
+      set {
+        dailyBonus_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "equipped_badge" field.</summary>
+    public const int EquippedBadgeFieldNumber = 12;
+    private global::POGOProtos.Data.Player.EquippedBadge equippedBadge_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.EquippedBadge EquippedBadge {
+      get { return equippedBadge_; }
+      set {
+        equippedBadge_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "contact_settings" field.</summary>
+    public const int ContactSettingsFieldNumber = 13;
+    private global::POGOProtos.Data.Player.ContactSettings contactSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.ContactSettings ContactSettings {
+      get { return contactSettings_; }
+      set {
+        contactSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "currencies" field.</summary>
+    public const int CurrenciesFieldNumber = 14;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Player.Currency> _repeated_currencies_codec
+        = pb::FieldCodec.ForMessage(114, global::POGOProtos.Data.Player.Currency.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> currencies_ = new pbc::RepeatedField<global::POGOProtos.Data.Player.Currency>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> Currencies {
+      get { return currencies_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (CreationTimestampMs != other.CreationTimestampMs) return false;
+      if (Username != other.Username) return false;
+      if (Team != other.Team) return false;
+      if(!tutorialState_.Equals(other.tutorialState_)) return false;
+      if (!object.Equals(Avatar, other.Avatar)) return false;
+      if (MaxPokemonStorage != other.MaxPokemonStorage) return false;
+      if (MaxItemStorage != other.MaxItemStorage) return false;
+      if (!object.Equals(DailyBonus, other.DailyBonus)) return false;
+      if (!object.Equals(EquippedBadge, other.EquippedBadge)) return false;
+      if (!object.Equals(ContactSettings, other.ContactSettings)) return false;
+      if(!currencies_.Equals(other.currencies_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (CreationTimestampMs != 0L) hash ^= CreationTimestampMs.GetHashCode();
+      if (Username.Length != 0) hash ^= Username.GetHashCode();
+      if (Team != 0) hash ^= Team.GetHashCode();
+      hash ^= tutorialState_.GetHashCode();
+      if (avatar_ != null) hash ^= Avatar.GetHashCode();
+      if (MaxPokemonStorage != 0) hash ^= MaxPokemonStorage.GetHashCode();
+      if (MaxItemStorage != 0) hash ^= MaxItemStorage.GetHashCode();
+      if (dailyBonus_ != null) hash ^= DailyBonus.GetHashCode();
+      if (equippedBadge_ != null) hash ^= EquippedBadge.GetHashCode();
+      if (contactSettings_ != null) hash ^= ContactSettings.GetHashCode();
+      hash ^= currencies_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (CreationTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(CreationTimestampMs);
+      }
+      if (Username.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Username);
+      }
+      if (Team != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) Team);
+      }
+      tutorialState_.WriteTo(output, _repeated_tutorialState_codec);
+      if (avatar_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(Avatar);
+      }
+      if (MaxPokemonStorage != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(MaxPokemonStorage);
+      }
+      if (MaxItemStorage != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(MaxItemStorage);
+      }
+      if (dailyBonus_ != null) {
+        output.WriteRawTag(90);
+        output.WriteMessage(DailyBonus);
+      }
+      if (equippedBadge_ != null) {
+        output.WriteRawTag(98);
+        output.WriteMessage(EquippedBadge);
+      }
+      if (contactSettings_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(ContactSettings);
+      }
+      currencies_.WriteTo(output, _repeated_currencies_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (CreationTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CreationTimestampMs);
+      }
+      if (Username.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Username);
+      }
+      if (Team != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Team);
+      }
+      size += tutorialState_.CalculateSize(_repeated_tutorialState_codec);
+      if (avatar_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Avatar);
+      }
+      if (MaxPokemonStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPokemonStorage);
+      }
+      if (MaxItemStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxItemStorage);
+      }
+      if (dailyBonus_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DailyBonus);
+      }
+      if (equippedBadge_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EquippedBadge);
+      }
+      if (contactSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ContactSettings);
+      }
+      size += currencies_.CalculateSize(_repeated_currencies_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.CreationTimestampMs != 0L) {
+        CreationTimestampMs = other.CreationTimestampMs;
+      }
+      if (other.Username.Length != 0) {
+        Username = other.Username;
+      }
+      if (other.Team != 0) {
+        Team = other.Team;
+      }
+      tutorialState_.Add(other.tutorialState_);
+      if (other.avatar_ != null) {
+        if (avatar_ == null) {
+          avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+        }
+        Avatar.MergeFrom(other.Avatar);
+      }
+      if (other.MaxPokemonStorage != 0) {
+        MaxPokemonStorage = other.MaxPokemonStorage;
+      }
+      if (other.MaxItemStorage != 0) {
+        MaxItemStorage = other.MaxItemStorage;
+      }
+      if (other.dailyBonus_ != null) {
+        if (dailyBonus_ == null) {
+          dailyBonus_ = new global::POGOProtos.Data.Player.DailyBonus();
+        }
+        DailyBonus.MergeFrom(other.DailyBonus);
+      }
+      if (other.equippedBadge_ != null) {
+        if (equippedBadge_ == null) {
+          equippedBadge_ = new global::POGOProtos.Data.Player.EquippedBadge();
+        }
+        EquippedBadge.MergeFrom(other.EquippedBadge);
+      }
+      if (other.contactSettings_ != null) {
+        if (contactSettings_ == null) {
+          contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+        }
+        ContactSettings.MergeFrom(other.ContactSettings);
+      }
+      currencies_.Add(other.currencies_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            CreationTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Username = input.ReadString();
+            break;
+          }
+          case 40: {
+            team_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+          case 58:
+          case 56: {
+            tutorialState_.AddEntriesFrom(input, _repeated_tutorialState_codec);
+            break;
+          }
+          case 66: {
+            if (avatar_ == null) {
+              avatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+            }
+            input.ReadMessage(avatar_);
+            break;
+          }
+          case 72: {
+            MaxPokemonStorage = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            MaxItemStorage = input.ReadInt32();
+            break;
+          }
+          case 90: {
+            if (dailyBonus_ == null) {
+              dailyBonus_ = new global::POGOProtos.Data.Player.DailyBonus();
+            }
+            input.ReadMessage(dailyBonus_);
+            break;
+          }
+          case 98: {
+            if (equippedBadge_ == null) {
+              equippedBadge_ = new global::POGOProtos.Data.Player.EquippedBadge();
+            }
+            input.ReadMessage(equippedBadge_);
+            break;
+          }
+          case 106: {
+            if (contactSettings_ == null) {
+              contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+            }
+            input.ReadMessage(contactSettings_);
+            break;
+          }
+          case 114: {
+            currencies_.AddEntriesFrom(input, _repeated_currencies_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/PokedexEntry.cs b/PokemonGo/POGOProtos/Data/PokedexEntry.cs
new file mode 100644
index 0000000..cd67927
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/PokedexEntry.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/PokedexEntry.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/PokedexEntry.proto</summary>
+  public static partial class PokedexEntryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/PokedexEntry.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokedexEntryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiJQT0dPUHJvdG9zL0RhdGEvUG9rZWRleEVudHJ5LnByb3RvEg9QT0dPUHJv",
+            "dG9zLkRhdGEaIFBPR09Qcm90b3MvRW51bXMvUG9rZW1vbklkLnByb3RvIqwB",
+            "CgxQb2tlZGV4RW50cnkSLwoKcG9rZW1vbl9pZBgBIAEoDjIbLlBPR09Qcm90",
+            "b3MuRW51bXMuUG9rZW1vbklkEhkKEXRpbWVzX2VuY291bnRlcmVkGAIgASgF",
+            "EhYKDnRpbWVzX2NhcHR1cmVkGAMgASgFEh4KFmV2b2x1dGlvbl9zdG9uZV9w",
+            "aWVjZXMYBCABKAUSGAoQZXZvbHV0aW9uX3N0b25lcxgFIAEoBWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PokedexEntry), global::POGOProtos.Data.PokedexEntry.Parser, new[]{ "PokemonId", "TimesEncountered", "TimesCaptured", "EvolutionStonePieces", "EvolutionStones" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PokedexEntry : pb::IMessage<PokedexEntry> {
+    private static readonly pb::MessageParser<PokedexEntry> _parser = new pb::MessageParser<PokedexEntry>(() => new PokedexEntry());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokedexEntry> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.PokedexEntryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokedexEntry() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokedexEntry(PokedexEntry other) : this() {
+      pokemonId_ = other.pokemonId_;
+      timesEncountered_ = other.timesEncountered_;
+      timesCaptured_ = other.timesCaptured_;
+      evolutionStonePieces_ = other.evolutionStonePieces_;
+      evolutionStones_ = other.evolutionStones_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokedexEntry Clone() {
+      return new PokedexEntry(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "times_encountered" field.</summary>
+    public const int TimesEncounteredFieldNumber = 2;
+    private int timesEncountered_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TimesEncountered {
+      get { return timesEncountered_; }
+      set {
+        timesEncountered_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "times_captured" field.</summary>
+    public const int TimesCapturedFieldNumber = 3;
+    private int timesCaptured_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TimesCaptured {
+      get { return timesCaptured_; }
+      set {
+        timesCaptured_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolution_stone_pieces" field.</summary>
+    public const int EvolutionStonePiecesFieldNumber = 4;
+    private int evolutionStonePieces_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EvolutionStonePieces {
+      get { return evolutionStonePieces_; }
+      set {
+        evolutionStonePieces_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolution_stones" field.</summary>
+    public const int EvolutionStonesFieldNumber = 5;
+    private int evolutionStones_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EvolutionStones {
+      get { return evolutionStones_; }
+      set {
+        evolutionStones_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokedexEntry);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokedexEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (TimesEncountered != other.TimesEncountered) return false;
+      if (TimesCaptured != other.TimesCaptured) return false;
+      if (EvolutionStonePieces != other.EvolutionStonePieces) return false;
+      if (EvolutionStones != other.EvolutionStones) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (TimesEncountered != 0) hash ^= TimesEncountered.GetHashCode();
+      if (TimesCaptured != 0) hash ^= TimesCaptured.GetHashCode();
+      if (EvolutionStonePieces != 0) hash ^= EvolutionStonePieces.GetHashCode();
+      if (EvolutionStones != 0) hash ^= EvolutionStones.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (TimesEncountered != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(TimesEncountered);
+      }
+      if (TimesCaptured != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(TimesCaptured);
+      }
+      if (EvolutionStonePieces != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(EvolutionStonePieces);
+      }
+      if (EvolutionStones != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(EvolutionStones);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (TimesEncountered != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimesEncountered);
+      }
+      if (TimesCaptured != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimesCaptured);
+      }
+      if (EvolutionStonePieces != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionStonePieces);
+      }
+      if (EvolutionStones != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionStones);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokedexEntry other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.TimesEncountered != 0) {
+        TimesEncountered = other.TimesEncountered;
+      }
+      if (other.TimesCaptured != 0) {
+        TimesCaptured = other.TimesCaptured;
+      }
+      if (other.EvolutionStonePieces != 0) {
+        EvolutionStonePieces = other.EvolutionStonePieces;
+      }
+      if (other.EvolutionStones != 0) {
+        EvolutionStones = other.EvolutionStones;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            TimesEncountered = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            TimesCaptured = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            EvolutionStonePieces = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            EvolutionStones = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Data/PokemonData.cs b/PokemonGo/POGOProtos/Data/PokemonData.cs
new file mode 100644
index 0000000..e5dab5a
--- /dev/null
+++ b/PokemonGo/POGOProtos/Data/PokemonData.cs
@@ -0,0 +1,990 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Data/PokemonData.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Data {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Data/PokemonData.proto</summary>
+  public static partial class PokemonDataReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Data/PokemonData.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonDataReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiFQT0dPUHJvdG9zL0RhdGEvUG9rZW1vbkRhdGEucHJvdG8SD1BPR09Qcm90",
+            "b3MuRGF0YRogUE9HT1Byb3Rvcy9FbnVtcy9Qb2tlbW9uSWQucHJvdG8aIlBP",
+            "R09Qcm90b3MvRW51bXMvUG9rZW1vbk1vdmUucHJvdG8aJlBPR09Qcm90b3Mv",
+            "SW52ZW50b3J5L0l0ZW0vSXRlbUlkLnByb3RvIpgGCgtQb2tlbW9uRGF0YRIK",
+            "CgJpZBgBIAEoBhIvCgpwb2tlbW9uX2lkGAIgASgOMhsuUE9HT1Byb3Rvcy5F",
+            "bnVtcy5Qb2tlbW9uSWQSCgoCY3AYAyABKAUSDwoHc3RhbWluYRgEIAEoBRIT",
+            "CgtzdGFtaW5hX21heBgFIAEoBRItCgZtb3ZlXzEYBiABKA4yHS5QT0dPUHJv",
+            "dG9zLkVudW1zLlBva2Vtb25Nb3ZlEi0KBm1vdmVfMhgHIAEoDjIdLlBPR09Q",
+            "cm90b3MuRW51bXMuUG9rZW1vbk1vdmUSGAoQZGVwbG95ZWRfZm9ydF9pZBgI",
+            "IAEoCRISCgpvd25lcl9uYW1lGAkgASgJEg4KBmlzX2VnZxgKIAEoCBIcChRl",
+            "Z2dfa21fd2Fsa2VkX3RhcmdldBgLIAEoARIbChNlZ2dfa21fd2Fsa2VkX3N0",
+            "YXJ0GAwgASgBEg4KBm9yaWdpbhgOIAEoBRIQCghoZWlnaHRfbRgPIAEoAhIR",
+            "Cgl3ZWlnaHRfa2cYECABKAISGQoRaW5kaXZpZHVhbF9hdHRhY2sYESABKAUS",
+            "GgoSaW5kaXZpZHVhbF9kZWZlbnNlGBIgASgFEhoKEmluZGl2aWR1YWxfc3Rh",
+            "bWluYRgTIAEoBRIVCg1jcF9tdWx0aXBsaWVyGBQgASgCEjMKCHBva2ViYWxs",
+            "GBUgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSGAoQ",
+            "Y2FwdHVyZWRfY2VsbF9pZBgWIAEoBBIYChBiYXR0bGVzX2F0dGFja2VkGBcg",
+            "ASgFEhgKEGJhdHRsZXNfZGVmZW5kZWQYGCABKAUSGAoQZWdnX2luY3ViYXRv",
+            "cl9pZBgZIAEoCRIYChBjcmVhdGlvbl90aW1lX21zGBogASgEEhQKDG51bV91",
+            "cGdyYWRlcxgbIAEoBRIgChhhZGRpdGlvbmFsX2NwX211bHRpcGxpZXIYHCAB",
+            "KAISEAoIZmF2b3JpdGUYHSABKAUSEAoIbmlja25hbWUYHiABKAkSEQoJZnJv",
+            "bV9mb3J0GB8gASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, global::POGOProtos.Enums.PokemonMoveReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Data.PokemonData), global::POGOProtos.Data.PokemonData.Parser, new[]{ "Id", "PokemonId", "Cp", "Stamina", "StaminaMax", "Move1", "Move2", "DeployedFortId", "OwnerName", "IsEgg", "EggKmWalkedTarget", "EggKmWalkedStart", "Origin", "HeightM", "WeightKg", "IndividualAttack", "IndividualDefense", "IndividualStamina", "CpMultiplier", "Pokeball", "CapturedCellId", "BattlesAttacked", "BattlesDefended", "EggIncubatorId", "CreationTimeMs", "NumUpgrades", "AdditionalCpMultiplier", "Favorite", "Nickname", "FromFort" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PokemonData : pb::IMessage<PokemonData> {
+    private static readonly pb::MessageParser<PokemonData> _parser = new pb::MessageParser<PokemonData>(() => new PokemonData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokemonData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Data.PokemonDataReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonData(PokemonData other) : this() {
+      id_ = other.id_;
+      pokemonId_ = other.pokemonId_;
+      cp_ = other.cp_;
+      stamina_ = other.stamina_;
+      staminaMax_ = other.staminaMax_;
+      move1_ = other.move1_;
+      move2_ = other.move2_;
+      deployedFortId_ = other.deployedFortId_;
+      ownerName_ = other.ownerName_;
+      isEgg_ = other.isEgg_;
+      eggKmWalkedTarget_ = other.eggKmWalkedTarget_;
+      eggKmWalkedStart_ = other.eggKmWalkedStart_;
+      origin_ = other.origin_;
+      heightM_ = other.heightM_;
+      weightKg_ = other.weightKg_;
+      individualAttack_ = other.individualAttack_;
+      individualDefense_ = other.individualDefense_;
+      individualStamina_ = other.individualStamina_;
+      cpMultiplier_ = other.cpMultiplier_;
+      pokeball_ = other.pokeball_;
+      capturedCellId_ = other.capturedCellId_;
+      battlesAttacked_ = other.battlesAttacked_;
+      battlesDefended_ = other.battlesDefended_;
+      eggIncubatorId_ = other.eggIncubatorId_;
+      creationTimeMs_ = other.creationTimeMs_;
+      numUpgrades_ = other.numUpgrades_;
+      additionalCpMultiplier_ = other.additionalCpMultiplier_;
+      favorite_ = other.favorite_;
+      nickname_ = other.nickname_;
+      fromFort_ = other.fromFort_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonData Clone() {
+      return new PokemonData(this);
+    }
+
+    /// <summary>Field number for the "id" field.</summary>
+    public const int IdFieldNumber = 1;
+    private ulong id_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong Id {
+      get { return id_; }
+      set {
+        id_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cp" field.</summary>
+    public const int CpFieldNumber = 3;
+    private int cp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Cp {
+      get { return cp_; }
+      set {
+        cp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 4;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina_max" field.</summary>
+    public const int StaminaMaxFieldNumber = 5;
+    private int staminaMax_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StaminaMax {
+      get { return staminaMax_; }
+      set {
+        staminaMax_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "move_1" field.</summary>
+    public const int Move1FieldNumber = 6;
+    private global::POGOProtos.Enums.PokemonMove move1_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMove Move1 {
+      get { return move1_; }
+      set {
+        move1_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "move_2" field.</summary>
+    public const int Move2FieldNumber = 7;
+    private global::POGOProtos.Enums.PokemonMove move2_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMove Move2 {
+      get { return move2_; }
+      set {
+        move2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deployed_fort_id" field.</summary>
+    public const int DeployedFortIdFieldNumber = 8;
+    private string deployedFortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeployedFortId {
+      get { return deployedFortId_; }
+      set {
+        deployedFortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "owner_name" field.</summary>
+    public const int OwnerNameFieldNumber = 9;
+    private string ownerName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string OwnerName {
+      get { return ownerName_; }
+      set {
+        ownerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "is_egg" field.</summary>
+    public const int IsEggFieldNumber = 10;
+    private bool isEgg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsEgg {
+      get { return isEgg_; }
+      set {
+        isEgg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_km_walked_target" field.</summary>
+    public const int EggKmWalkedTargetFieldNumber = 11;
+    private double eggKmWalkedTarget_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double EggKmWalkedTarget {
+      get { return eggKmWalkedTarget_; }
+      set {
+        eggKmWalkedTarget_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_km_walked_start" field.</summary>
+    public const int EggKmWalkedStartFieldNumber = 12;
+    private double eggKmWalkedStart_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double EggKmWalkedStart {
+      get { return eggKmWalkedStart_; }
+      set {
+        eggKmWalkedStart_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "origin" field.</summary>
+    public const int OriginFieldNumber = 14;
+    private int origin_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Origin {
+      get { return origin_; }
+      set {
+        origin_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "height_m" field.</summary>
+    public const int HeightMFieldNumber = 15;
+    private float heightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float HeightM {
+      get { return heightM_; }
+      set {
+        heightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "weight_kg" field.</summary>
+    public const int WeightKgFieldNumber = 16;
+    private float weightKg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float WeightKg {
+      get { return weightKg_; }
+      set {
+        weightKg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "individual_attack" field.</summary>
+    public const int IndividualAttackFieldNumber = 17;
+    private int individualAttack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IndividualAttack {
+      get { return individualAttack_; }
+      set {
+        individualAttack_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "individual_defense" field.</summary>
+    public const int IndividualDefenseFieldNumber = 18;
+    private int individualDefense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IndividualDefense {
+      get { return individualDefense_; }
+      set {
+        individualDefense_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "individual_stamina" field.</summary>
+    public const int IndividualStaminaFieldNumber = 19;
+    private int individualStamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IndividualStamina {
+      get { return individualStamina_; }
+      set {
+        individualStamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cp_multiplier" field.</summary>
+    public const int CpMultiplierFieldNumber = 20;
+    private float cpMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CpMultiplier {
+      get { return cpMultiplier_; }
+      set {
+        cpMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeball" field.</summary>
+    public const int PokeballFieldNumber = 21;
+    private global::POGOProtos.Inventory.Item.ItemId pokeball_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId Pokeball {
+      get { return pokeball_; }
+      set {
+        pokeball_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "captured_cell_id" field.</summary>
+    public const int CapturedCellIdFieldNumber = 22;
+    private ulong capturedCellId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong CapturedCellId {
+      get { return capturedCellId_; }
+      set {
+        capturedCellId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battles_attacked" field.</summary>
+    public const int BattlesAttackedFieldNumber = 23;
+    private int battlesAttacked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattlesAttacked {
+      get { return battlesAttacked_; }
+      set {
+        battlesAttacked_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battles_defended" field.</summary>
+    public const int BattlesDefendedFieldNumber = 24;
+    private int battlesDefended_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BattlesDefended {
+      get { return battlesDefended_; }
+      set {
+        battlesDefended_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubator_id" field.</summary>
+    public const int EggIncubatorIdFieldNumber = 25;
+    private string eggIncubatorId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string EggIncubatorId {
+      get { return eggIncubatorId_; }
+      set {
+        eggIncubatorId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "creation_time_ms" field.</summary>
+    public const int CreationTimeMsFieldNumber = 26;
+    private ulong creationTimeMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong CreationTimeMs {
+      get { return creationTimeMs_; }
+      set {
+        creationTimeMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "num_upgrades" field.</summary>
+    public const int NumUpgradesFieldNumber = 27;
+    private int numUpgrades_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int NumUpgrades {
+      get { return numUpgrades_; }
+      set {
+        numUpgrades_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "additional_cp_multiplier" field.</summary>
+    public const int AdditionalCpMultiplierFieldNumber = 28;
+    private float additionalCpMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AdditionalCpMultiplier {
+      get { return additionalCpMultiplier_; }
+      set {
+        additionalCpMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "favorite" field.</summary>
+    public const int FavoriteFieldNumber = 29;
+    private int favorite_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Favorite {
+      get { return favorite_; }
+      set {
+        favorite_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "nickname" field.</summary>
+    public const int NicknameFieldNumber = 30;
+    private string nickname_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Nickname {
+      get { return nickname_; }
+      set {
+        nickname_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "from_fort" field.</summary>
+    public const int FromFortFieldNumber = 31;
+    private int fromFort_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int FromFort {
+      get { return fromFort_; }
+      set {
+        fromFort_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokemonData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokemonData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Id != other.Id) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (Cp != other.Cp) return false;
+      if (Stamina != other.Stamina) return false;
+      if (StaminaMax != other.StaminaMax) return false;
+      if (Move1 != other.Move1) return false;
+      if (Move2 != other.Move2) return false;
+      if (DeployedFortId != other.DeployedFortId) return false;
+      if (OwnerName != other.OwnerName) return false;
+      if (IsEgg != other.IsEgg) return false;
+      if (EggKmWalkedTarget != other.EggKmWalkedTarget) return false;
+      if (EggKmWalkedStart != other.EggKmWalkedStart) return false;
+      if (Origin != other.Origin) return false;
+      if (HeightM != other.HeightM) return false;
+      if (WeightKg != other.WeightKg) return false;
+      if (IndividualAttack != other.IndividualAttack) return false;
+      if (IndividualDefense != other.IndividualDefense) return false;
+      if (IndividualStamina != other.IndividualStamina) return false;
+      if (CpMultiplier != other.CpMultiplier) return false;
+      if (Pokeball != other.Pokeball) return false;
+      if (CapturedCellId != other.CapturedCellId) return false;
+      if (BattlesAttacked != other.BattlesAttacked) return false;
+      if (BattlesDefended != other.BattlesDefended) return false;
+      if (EggIncubatorId != other.EggIncubatorId) return false;
+      if (CreationTimeMs != other.CreationTimeMs) return false;
+      if (NumUpgrades != other.NumUpgrades) return false;
+      if (AdditionalCpMultiplier != other.AdditionalCpMultiplier) return false;
+      if (Favorite != other.Favorite) return false;
+      if (Nickname != other.Nickname) return false;
+      if (FromFort != other.FromFort) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Id != 0UL) hash ^= Id.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (Cp != 0) hash ^= Cp.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      if (StaminaMax != 0) hash ^= StaminaMax.GetHashCode();
+      if (Move1 != 0) hash ^= Move1.GetHashCode();
+      if (Move2 != 0) hash ^= Move2.GetHashCode();
+      if (DeployedFortId.Length != 0) hash ^= DeployedFortId.GetHashCode();
+      if (OwnerName.Length != 0) hash ^= OwnerName.GetHashCode();
+      if (IsEgg != false) hash ^= IsEgg.GetHashCode();
+      if (EggKmWalkedTarget != 0D) hash ^= EggKmWalkedTarget.GetHashCode();
+      if (EggKmWalkedStart != 0D) hash ^= EggKmWalkedStart.GetHashCode();
+      if (Origin != 0) hash ^= Origin.GetHashCode();
+      if (HeightM != 0F) hash ^= HeightM.GetHashCode();
+      if (WeightKg != 0F) hash ^= WeightKg.GetHashCode();
+      if (IndividualAttack != 0) hash ^= IndividualAttack.GetHashCode();
+      if (IndividualDefense != 0) hash ^= IndividualDefense.GetHashCode();
+      if (IndividualStamina != 0) hash ^= IndividualStamina.GetHashCode();
+      if (CpMultiplier != 0F) hash ^= CpMultiplier.GetHashCode();
+      if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
+      if (CapturedCellId != 0UL) hash ^= CapturedCellId.GetHashCode();
+      if (BattlesAttacked != 0) hash ^= BattlesAttacked.GetHashCode();
+      if (BattlesDefended != 0) hash ^= BattlesDefended.GetHashCode();
+      if (EggIncubatorId.Length != 0) hash ^= EggIncubatorId.GetHashCode();
+      if (CreationTimeMs != 0UL) hash ^= CreationTimeMs.GetHashCode();
+      if (NumUpgrades != 0) hash ^= NumUpgrades.GetHashCode();
+      if (AdditionalCpMultiplier != 0F) hash ^= AdditionalCpMultiplier.GetHashCode();
+      if (Favorite != 0) hash ^= Favorite.GetHashCode();
+      if (Nickname.Length != 0) hash ^= Nickname.GetHashCode();
+      if (FromFort != 0) hash ^= FromFort.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Id != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(Id);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (Cp != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Cp);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(Stamina);
+      }
+      if (StaminaMax != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(StaminaMax);
+      }
+      if (Move1 != 0) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) Move1);
+      }
+      if (Move2 != 0) {
+        output.WriteRawTag(56);
+        output.WriteEnum((int) Move2);
+      }
+      if (DeployedFortId.Length != 0) {
+        output.WriteRawTag(66);
+        output.WriteString(DeployedFortId);
+      }
+      if (OwnerName.Length != 0) {
+        output.WriteRawTag(74);
+        output.WriteString(OwnerName);
+      }
+      if (IsEgg != false) {
+        output.WriteRawTag(80);
+        output.WriteBool(IsEgg);
+      }
+      if (EggKmWalkedTarget != 0D) {
+        output.WriteRawTag(89);
+        output.WriteDouble(EggKmWalkedTarget);
+      }
+      if (EggKmWalkedStart != 0D) {
+        output.WriteRawTag(97);
+        output.WriteDouble(EggKmWalkedStart);
+      }
+      if (Origin != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(Origin);
+      }
+      if (HeightM != 0F) {
+        output.WriteRawTag(125);
+        output.WriteFloat(HeightM);
+      }
+      if (WeightKg != 0F) {
+        output.WriteRawTag(133, 1);
+        output.WriteFloat(WeightKg);
+      }
+      if (IndividualAttack != 0) {
+        output.WriteRawTag(136, 1);
+        output.WriteInt32(IndividualAttack);
+      }
+      if (IndividualDefense != 0) {
+        output.WriteRawTag(144, 1);
+        output.WriteInt32(IndividualDefense);
+      }
+      if (IndividualStamina != 0) {
+        output.WriteRawTag(152, 1);
+        output.WriteInt32(IndividualStamina);
+      }
+      if (CpMultiplier != 0F) {
+        output.WriteRawTag(165, 1);
+        output.WriteFloat(CpMultiplier);
+      }
+      if (Pokeball != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteEnum((int) Pokeball);
+      }
+      if (CapturedCellId != 0UL) {
+        output.WriteRawTag(176, 1);
+        output.WriteUInt64(CapturedCellId);
+      }
+      if (BattlesAttacked != 0) {
+        output.WriteRawTag(184, 1);
+        output.WriteInt32(BattlesAttacked);
+      }
+      if (BattlesDefended != 0) {
+        output.WriteRawTag(192, 1);
+        output.WriteInt32(BattlesDefended);
+      }
+      if (EggIncubatorId.Length != 0) {
+        output.WriteRawTag(202, 1);
+        output.WriteString(EggIncubatorId);
+      }
+      if (CreationTimeMs != 0UL) {
+        output.WriteRawTag(208, 1);
+        output.WriteUInt64(CreationTimeMs);
+      }
+      if (NumUpgrades != 0) {
+        output.WriteRawTag(216, 1);
+        output.WriteInt32(NumUpgrades);
+      }
+      if (AdditionalCpMultiplier != 0F) {
+        output.WriteRawTag(229, 1);
+        output.WriteFloat(AdditionalCpMultiplier);
+      }
+      if (Favorite != 0) {
+        output.WriteRawTag(232, 1);
+        output.WriteInt32(Favorite);
+      }
+      if (Nickname.Length != 0) {
+        output.WriteRawTag(242, 1);
+        output.WriteString(Nickname);
+      }
+      if (FromFort != 0) {
+        output.WriteRawTag(248, 1);
+        output.WriteInt32(FromFort);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Id != 0UL) {
+        size += 1 + 8;
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (Cp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Cp);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      if (StaminaMax != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaminaMax);
+      }
+      if (Move1 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Move1);
+      }
+      if (Move2 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Move2);
+      }
+      if (DeployedFortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeployedFortId);
+      }
+      if (OwnerName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(OwnerName);
+      }
+      if (IsEgg != false) {
+        size += 1 + 1;
+      }
+      if (EggKmWalkedTarget != 0D) {
+        size += 1 + 8;
+      }
+      if (EggKmWalkedStart != 0D) {
+        size += 1 + 8;
+      }
+      if (Origin != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Origin);
+      }
+      if (HeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (WeightKg != 0F) {
+        size += 2 + 4;
+      }
+      if (IndividualAttack != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualAttack);
+      }
+      if (IndividualDefense != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualDefense);
+      }
+      if (IndividualStamina != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualStamina);
+      }
+      if (CpMultiplier != 0F) {
+        size += 2 + 4;
+      }
+      if (Pokeball != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) Pokeball);
+      }
+      if (CapturedCellId != 0UL) {
+        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CapturedCellId);
+      }
+      if (BattlesAttacked != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesAttacked);
+      }
+      if (BattlesDefended != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesDefended);
+      }
+      if (EggIncubatorId.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(EggIncubatorId);
+      }
+      if (CreationTimeMs != 0UL) {
+        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CreationTimeMs);
+      }
+      if (NumUpgrades != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(NumUpgrades);
+      }
+      if (AdditionalCpMultiplier != 0F) {
+        size += 2 + 4;
+      }
+      if (Favorite != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Favorite);
+      }
+      if (Nickname.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(Nickname);
+      }
+      if (FromFort != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FromFort);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokemonData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Id != 0UL) {
+        Id = other.Id;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.Cp != 0) {
+        Cp = other.Cp;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+      if (other.StaminaMax != 0) {
+        StaminaMax = other.StaminaMax;
+      }
+      if (other.Move1 != 0) {
+        Move1 = other.Move1;
+      }
+      if (other.Move2 != 0) {
+        Move2 = other.Move2;
+      }
+      if (other.DeployedFortId.Length != 0) {
+        DeployedFortId = other.DeployedFortId;
+      }
+      if (other.OwnerName.Length != 0) {
+        OwnerName = other.OwnerName;
+      }
+      if (other.IsEgg != false) {
+        IsEgg = other.IsEgg;
+      }
+      if (other.EggKmWalkedTarget != 0D) {
+        EggKmWalkedTarget = other.EggKmWalkedTarget;
+      }
+      if (other.EggKmWalkedStart != 0D) {
+        EggKmWalkedStart = other.EggKmWalkedStart;
+      }
+      if (other.Origin != 0) {
+        Origin = other.Origin;
+      }
+      if (other.HeightM != 0F) {
+        HeightM = other.HeightM;
+      }
+      if (other.WeightKg != 0F) {
+        WeightKg = other.WeightKg;
+      }
+      if (other.IndividualAttack != 0) {
+        IndividualAttack = other.IndividualAttack;
+      }
+      if (other.IndividualDefense != 0) {
+        IndividualDefense = other.IndividualDefense;
+      }
+      if (other.IndividualStamina != 0) {
+        IndividualStamina = other.IndividualStamina;
+      }
+      if (other.CpMultiplier != 0F) {
+        CpMultiplier = other.CpMultiplier;
+      }
+      if (other.Pokeball != 0) {
+        Pokeball = other.Pokeball;
+      }
+      if (other.CapturedCellId != 0UL) {
+        CapturedCellId = other.CapturedCellId;
+      }
+      if (other.BattlesAttacked != 0) {
+        BattlesAttacked = other.BattlesAttacked;
+      }
+      if (other.BattlesDefended != 0) {
+        BattlesDefended = other.BattlesDefended;
+      }
+      if (other.EggIncubatorId.Length != 0) {
+        EggIncubatorId = other.EggIncubatorId;
+      }
+      if (other.CreationTimeMs != 0UL) {
+        CreationTimeMs = other.CreationTimeMs;
+      }
+      if (other.NumUpgrades != 0) {
+        NumUpgrades = other.NumUpgrades;
+      }
+      if (other.AdditionalCpMultiplier != 0F) {
+        AdditionalCpMultiplier = other.AdditionalCpMultiplier;
+      }
+      if (other.Favorite != 0) {
+        Favorite = other.Favorite;
+      }
+      if (other.Nickname.Length != 0) {
+        Nickname = other.Nickname;
+      }
+      if (other.FromFort != 0) {
+        FromFort = other.FromFort;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            Id = input.ReadFixed64();
+            break;
+          }
+          case 16: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            Cp = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            StaminaMax = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            move1_ = (global::POGOProtos.Enums.PokemonMove) input.ReadEnum();
+            break;
+          }
+          case 56: {
+            move2_ = (global::POGOProtos.Enums.PokemonMove) input.ReadEnum();
+            break;
+          }
+          case 66: {
+            DeployedFortId = input.ReadString();
+            break;
+          }
+          case 74: {
+            OwnerName = input.ReadString();
+            break;
+          }
+          case 80: {
+            IsEgg = input.ReadBool();
+            break;
+          }
+          case 89: {
+            EggKmWalkedTarget = input.ReadDouble();
+            break;
+          }
+          case 97: {
+            EggKmWalkedStart = input.ReadDouble();
+            break;
+          }
+          case 112: {
+            Origin = input.ReadInt32();
+            break;
+          }
+          case 125: {
+            HeightM = input.ReadFloat();
+            break;
+          }
+          case 133: {
+            WeightKg = input.ReadFloat();
+            break;
+          }
+          case 136: {
+            IndividualAttack = input.ReadInt32();
+            break;
+          }
+          case 144: {
+            IndividualDefense = input.ReadInt32();
+            break;
+          }
+          case 152: {
+            IndividualStamina = input.ReadInt32();
+            break;
+          }
+          case 165: {
+            CpMultiplier = input.ReadFloat();
+            break;
+          }
+          case 168: {
+            pokeball_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 176: {
+            CapturedCellId = input.ReadUInt64();
+            break;
+          }
+          case 184: {
+            BattlesAttacked = input.ReadInt32();
+            break;
+          }
+          case 192: {
+            BattlesDefended = input.ReadInt32();
+            break;
+          }
+          case 202: {
+            EggIncubatorId = input.ReadString();
+            break;
+          }
+          case 208: {
+            CreationTimeMs = input.ReadUInt64();
+            break;
+          }
+          case 216: {
+            NumUpgrades = input.ReadInt32();
+            break;
+          }
+          case 229: {
+            AdditionalCpMultiplier = input.ReadFloat();
+            break;
+          }
+          case 232: {
+            Favorite = input.ReadInt32();
+            break;
+          }
+          case 242: {
+            Nickname = input.ReadString();
+            break;
+          }
+          case 248: {
+            FromFort = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/ActivityType.cs b/PokemonGo/POGOProtos/Enums/ActivityType.cs
new file mode 100644
index 0000000..30a91e4
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/ActivityType.cs
@@ -0,0 +1,83 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/ActivityType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/ActivityType.proto</summary>
+  public static partial class ActivityTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/ActivityType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ActivityTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiNQT0dPUHJvdG9zL0VudW1zL0FjdGl2aXR5VHlwZS5wcm90bxIQUE9HT1By",
+            "b3Rvcy5FbnVtcyrsBQoMQWN0aXZpdHlUeXBlEhQKEEFDVElWSVRZX1VOS05P",
+            "V04QABIaChZBQ1RJVklUWV9DQVRDSF9QT0tFTU9OEAESIQodQUNUSVZJVFlf",
+            "Q0FUQ0hfTEVHRU5EX1BPS0VNT04QAhIZChVBQ1RJVklUWV9GTEVFX1BPS0VN",
+            "T04QAxIYChRBQ1RJVklUWV9ERUZFQVRfRk9SVBAEEhsKF0FDVElWSVRZX0VW",
+            "T0xWRV9QT0tFTU9OEAUSFgoSQUNUSVZJVFlfSEFUQ0hfRUdHEAYSFAoQQUNU",
+            "SVZJVFlfV0FMS19LTRAHEh4KGkFDVElWSVRZX1BPS0VERVhfRU5UUllfTkVX",
+            "EAgSHgoaQUNUSVZJVFlfQ0FUQ0hfRklSU1RfVEhST1cQCRIdChlBQ1RJVklU",
+            "WV9DQVRDSF9OSUNFX1RIUk9XEAoSHgoaQUNUSVZJVFlfQ0FUQ0hfR1JFQVRf",
+            "VEhST1cQCxIiCh5BQ1RJVklUWV9DQVRDSF9FWENFTExFTlRfVEhST1cQDBIc",
+            "ChhBQ1RJVklUWV9DQVRDSF9DVVJWRUJBTEwQDRIlCiFBQ1RJVklUWV9DQVRD",
+            "SF9GSVJTVF9DQVRDSF9PRl9EQVkQDhIcChhBQ1RJVklUWV9DQVRDSF9NSUxF",
+            "U1RPTkUQDxIaChZBQ1RJVklUWV9UUkFJTl9QT0tFTU9OEBASGAoUQUNUSVZJ",
+            "VFlfU0VBUkNIX0ZPUlQQERIcChhBQ1RJVklUWV9SRUxFQVNFX1BPS0VNT04Q",
+            "EhIiCh5BQ1RJVklUWV9IQVRDSF9FR0dfU01BTExfQk9OVVMQExIjCh9BQ1RJ",
+            "VklUWV9IQVRDSF9FR0dfTUVESVVNX0JPTlVTEBQSIgoeQUNUSVZJVFlfSEFU",
+            "Q0hfRUdHX0xBUkdFX0JPTlVTEBUSIAocQUNUSVZJVFlfREVGRUFUX0dZTV9E",
+            "RUZFTkRFUhAWEh4KGkFDVElWSVRZX0RFRkVBVF9HWU1fTEVBREVSEBdiBnBy",
+            "b3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.ActivityType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ActivityType {
+    [pbr::OriginalName("ACTIVITY_UNKNOWN")] ActivityUnknown = 0,
+    [pbr::OriginalName("ACTIVITY_CATCH_POKEMON")] ActivityCatchPokemon = 1,
+    [pbr::OriginalName("ACTIVITY_CATCH_LEGEND_POKEMON")] ActivityCatchLegendPokemon = 2,
+    [pbr::OriginalName("ACTIVITY_FLEE_POKEMON")] ActivityFleePokemon = 3,
+    [pbr::OriginalName("ACTIVITY_DEFEAT_FORT")] ActivityDefeatFort = 4,
+    [pbr::OriginalName("ACTIVITY_EVOLVE_POKEMON")] ActivityEvolvePokemon = 5,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG")] ActivityHatchEgg = 6,
+    [pbr::OriginalName("ACTIVITY_WALK_KM")] ActivityWalkKm = 7,
+    [pbr::OriginalName("ACTIVITY_POKEDEX_ENTRY_NEW")] ActivityPokedexEntryNew = 8,
+    [pbr::OriginalName("ACTIVITY_CATCH_FIRST_THROW")] ActivityCatchFirstThrow = 9,
+    [pbr::OriginalName("ACTIVITY_CATCH_NICE_THROW")] ActivityCatchNiceThrow = 10,
+    [pbr::OriginalName("ACTIVITY_CATCH_GREAT_THROW")] ActivityCatchGreatThrow = 11,
+    [pbr::OriginalName("ACTIVITY_CATCH_EXCELLENT_THROW")] ActivityCatchExcellentThrow = 12,
+    [pbr::OriginalName("ACTIVITY_CATCH_CURVEBALL")] ActivityCatchCurveball = 13,
+    [pbr::OriginalName("ACTIVITY_CATCH_FIRST_CATCH_OF_DAY")] ActivityCatchFirstCatchOfDay = 14,
+    [pbr::OriginalName("ACTIVITY_CATCH_MILESTONE")] ActivityCatchMilestone = 15,
+    [pbr::OriginalName("ACTIVITY_TRAIN_POKEMON")] ActivityTrainPokemon = 16,
+    [pbr::OriginalName("ACTIVITY_SEARCH_FORT")] ActivitySearchFort = 17,
+    [pbr::OriginalName("ACTIVITY_RELEASE_POKEMON")] ActivityReleasePokemon = 18,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG_SMALL_BONUS")] ActivityHatchEggSmallBonus = 19,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG_MEDIUM_BONUS")] ActivityHatchEggMediumBonus = 20,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG_LARGE_BONUS")] ActivityHatchEggLargeBonus = 21,
+    [pbr::OriginalName("ACTIVITY_DEFEAT_GYM_DEFENDER")] ActivityDefeatGymDefender = 22,
+    [pbr::OriginalName("ACTIVITY_DEFEAT_GYM_LEADER")] ActivityDefeatGymLeader = 23,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/BadgeType.cs b/PokemonGo/POGOProtos/Enums/BadgeType.cs
new file mode 100644
index 0000000..09def84
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/BadgeType.cs
@@ -0,0 +1,101 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/BadgeType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/BadgeType.proto</summary>
+  public static partial class BadgeTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/BadgeType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BadgeTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiBQT0dPUHJvdG9zL0VudW1zL0JhZGdlVHlwZS5wcm90bxIQUE9HT1Byb3Rv",
+            "cy5FbnVtcyqhBwoJQmFkZ2VUeXBlEg8KC0JBREdFX1VOU0VUEAASEwoPQkFE",
+            "R0VfVFJBVkVMX0tNEAESGQoVQkFER0VfUE9LRURFWF9FTlRSSUVTEAISFwoT",
+            "QkFER0VfQ0FQVFVSRV9UT1RBTBADEhcKE0JBREdFX0RFRkVBVEVEX0ZPUlQQ",
+            "BBIXChNCQURHRV9FVk9MVkVEX1RPVEFMEAUSFwoTQkFER0VfSEFUQ0hFRF9U",
+            "T1RBTBAGEhsKF0JBREdFX0VOQ09VTlRFUkVEX1RPVEFMEAcSGwoXQkFER0Vf",
+            "UE9LRVNUT1BTX1ZJU0lURUQQCBIaChZCQURHRV9VTklRVUVfUE9LRVNUT1BT",
+            "EAkSGQoVQkFER0VfUE9LRUJBTExfVEhST1dOEAoSFgoSQkFER0VfQklHX01B",
+            "R0lLQVJQEAsSGAoUQkFER0VfREVQTE9ZRURfVE9UQUwQDBIbChdCQURHRV9C",
+            "QVRUTEVfQVRUQUNLX1dPThANEh0KGUJBREdFX0JBVFRMRV9UUkFJTklOR19X",
+            "T04QDhIbChdCQURHRV9CQVRUTEVfREVGRU5EX1dPThAPEhkKFUJBREdFX1BS",
+            "RVNUSUdFX1JBSVNFRBAQEhoKFkJBREdFX1BSRVNUSUdFX0RST1BQRUQQERIV",
+            "ChFCQURHRV9UWVBFX05PUk1BTBASEhcKE0JBREdFX1RZUEVfRklHSFRJTkcQ",
+            "ExIVChFCQURHRV9UWVBFX0ZMWUlORxAUEhUKEUJBREdFX1RZUEVfUE9JU09O",
+            "EBUSFQoRQkFER0VfVFlQRV9HUk9VTkQQFhITCg9CQURHRV9UWVBFX1JPQ0sQ",
+            "FxISCg5CQURHRV9UWVBFX0JVRxAYEhQKEEJBREdFX1RZUEVfR0hPU1QQGRIU",
+            "ChBCQURHRV9UWVBFX1NURUVMEBoSEwoPQkFER0VfVFlQRV9GSVJFEBsSFAoQ",
+            "QkFER0VfVFlQRV9XQVRFUhAcEhQKEEJBREdFX1RZUEVfR1JBU1MQHRIXChNC",
+            "QURHRV9UWVBFX0VMRUNUUklDEB4SFgoSQkFER0VfVFlQRV9QU1lDSElDEB8S",
+            "EgoOQkFER0VfVFlQRV9JQ0UQIBIVChFCQURHRV9UWVBFX0RSQUdPThAhEhMK",
+            "D0JBREdFX1RZUEVfREFSSxAiEhQKEEJBREdFX1RZUEVfRkFJUlkQIxIXChNC",
+            "QURHRV9TTUFMTF9SQVRUQVRBECQSEQoNQkFER0VfUElLQUNIVRAlYgZwcm90",
+            "bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.BadgeType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum BadgeType {
+    [pbr::OriginalName("BADGE_UNSET")] BadgeUnset = 0,
+    [pbr::OriginalName("BADGE_TRAVEL_KM")] BadgeTravelKm = 1,
+    [pbr::OriginalName("BADGE_POKEDEX_ENTRIES")] BadgePokedexEntries = 2,
+    [pbr::OriginalName("BADGE_CAPTURE_TOTAL")] BadgeCaptureTotal = 3,
+    [pbr::OriginalName("BADGE_DEFEATED_FORT")] BadgeDefeatedFort = 4,
+    [pbr::OriginalName("BADGE_EVOLVED_TOTAL")] BadgeEvolvedTotal = 5,
+    [pbr::OriginalName("BADGE_HATCHED_TOTAL")] BadgeHatchedTotal = 6,
+    [pbr::OriginalName("BADGE_ENCOUNTERED_TOTAL")] BadgeEncounteredTotal = 7,
+    [pbr::OriginalName("BADGE_POKESTOPS_VISITED")] BadgePokestopsVisited = 8,
+    [pbr::OriginalName("BADGE_UNIQUE_POKESTOPS")] BadgeUniquePokestops = 9,
+    [pbr::OriginalName("BADGE_POKEBALL_THROWN")] BadgePokeballThrown = 10,
+    [pbr::OriginalName("BADGE_BIG_MAGIKARP")] BadgeBigMagikarp = 11,
+    [pbr::OriginalName("BADGE_DEPLOYED_TOTAL")] BadgeDeployedTotal = 12,
+    [pbr::OriginalName("BADGE_BATTLE_ATTACK_WON")] BadgeBattleAttackWon = 13,
+    [pbr::OriginalName("BADGE_BATTLE_TRAINING_WON")] BadgeBattleTrainingWon = 14,
+    [pbr::OriginalName("BADGE_BATTLE_DEFEND_WON")] BadgeBattleDefendWon = 15,
+    [pbr::OriginalName("BADGE_PRESTIGE_RAISED")] BadgePrestigeRaised = 16,
+    [pbr::OriginalName("BADGE_PRESTIGE_DROPPED")] BadgePrestigeDropped = 17,
+    [pbr::OriginalName("BADGE_TYPE_NORMAL")] Normal = 18,
+    [pbr::OriginalName("BADGE_TYPE_FIGHTING")] Fighting = 19,
+    [pbr::OriginalName("BADGE_TYPE_FLYING")] Flying = 20,
+    [pbr::OriginalName("BADGE_TYPE_POISON")] Poison = 21,
+    [pbr::OriginalName("BADGE_TYPE_GROUND")] Ground = 22,
+    [pbr::OriginalName("BADGE_TYPE_ROCK")] Rock = 23,
+    [pbr::OriginalName("BADGE_TYPE_BUG")] Bug = 24,
+    [pbr::OriginalName("BADGE_TYPE_GHOST")] Ghost = 25,
+    [pbr::OriginalName("BADGE_TYPE_STEEL")] Steel = 26,
+    [pbr::OriginalName("BADGE_TYPE_FIRE")] Fire = 27,
+    [pbr::OriginalName("BADGE_TYPE_WATER")] Water = 28,
+    [pbr::OriginalName("BADGE_TYPE_GRASS")] Grass = 29,
+    [pbr::OriginalName("BADGE_TYPE_ELECTRIC")] Electric = 30,
+    [pbr::OriginalName("BADGE_TYPE_PSYCHIC")] Psychic = 31,
+    [pbr::OriginalName("BADGE_TYPE_ICE")] Ice = 32,
+    [pbr::OriginalName("BADGE_TYPE_DRAGON")] Dragon = 33,
+    [pbr::OriginalName("BADGE_TYPE_DARK")] Dark = 34,
+    [pbr::OriginalName("BADGE_TYPE_FAIRY")] Fairy = 35,
+    [pbr::OriginalName("BADGE_SMALL_RATTATA")] BadgeSmallRattata = 36,
+    [pbr::OriginalName("BADGE_PIKACHU")] BadgePikachu = 37,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/CameraInterpolation.cs b/PokemonGo/POGOProtos/Enums/CameraInterpolation.cs
new file mode 100644
index 0000000..4f313bd
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/CameraInterpolation.cs
@@ -0,0 +1,50 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/CameraInterpolation.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/CameraInterpolation.proto</summary>
+  public static partial class CameraInterpolationReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/CameraInterpolation.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CameraInterpolationReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CipQT0dPUHJvdG9zL0VudW1zL0NhbWVyYUludGVycG9sYXRpb24ucHJvdG8S",
+            "EFBPR09Qcm90b3MuRW51bXMqlgEKE0NhbWVyYUludGVycG9sYXRpb24SEgoO",
+            "Q0FNX0lOVEVSUF9DVVQQABIVChFDQU1fSU5URVJQX0xJTkVBUhABEhUKEUNB",
+            "TV9JTlRFUlBfU01PT1RIEAISJQohQ0FNX0lOVEVSUF9TTU9PVEhfUk9UX0xJ",
+            "TkVBUl9NT1ZFEAMSFgoSQ0FNX0lOVEVSUF9ERVBFTkRTEARiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.CameraInterpolation), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum CameraInterpolation {
+    [pbr::OriginalName("CAM_INTERP_CUT")] CamInterpCut = 0,
+    [pbr::OriginalName("CAM_INTERP_LINEAR")] CamInterpLinear = 1,
+    [pbr::OriginalName("CAM_INTERP_SMOOTH")] CamInterpSmooth = 2,
+    [pbr::OriginalName("CAM_INTERP_SMOOTH_ROT_LINEAR_MOVE")] CamInterpSmoothRotLinearMove = 3,
+    [pbr::OriginalName("CAM_INTERP_DEPENDS")] CamInterpDepends = 4,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/CameraTarget.cs b/PokemonGo/POGOProtos/Enums/CameraTarget.cs
new file mode 100644
index 0000000..a591d87
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/CameraTarget.cs
@@ -0,0 +1,67 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/CameraTarget.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/CameraTarget.proto</summary>
+  public static partial class CameraTargetReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/CameraTarget.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CameraTargetReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiNQT0dPUHJvdG9zL0VudW1zL0NhbWVyYVRhcmdldC5wcm90bxIQUE9HT1By",
+            "b3Rvcy5FbnVtcyr8AwoMQ2FtZXJhVGFyZ2V0EhcKE0NBTV9UQVJHRVRfQVRU",
+            "QUNLRVIQABIcChhDQU1fVEFSR0VUX0FUVEFDS0VSX0VER0UQARIeChpDQU1f",
+            "VEFSR0VUX0FUVEFDS0VSX0dST1VORBACEhcKE0NBTV9UQVJHRVRfREVGRU5E",
+            "RVIQAxIcChhDQU1fVEFSR0VUX0RFRkVOREVSX0VER0UQBBIeChpDQU1fVEFS",
+            "R0VUX0RFRkVOREVSX0dST1VORBAFEiAKHENBTV9UQVJHRVRfQVRUQUNLRVJf",
+            "REVGRU5ERVIQBhIlCiFDQU1fVEFSR0VUX0FUVEFDS0VSX0RFRkVOREVSX0VE",
+            "R0UQBxIgChxDQU1fVEFSR0VUX0RFRkVOREVSX0FUVEFDS0VSEAgSJQohQ0FN",
+            "X1RBUkdFVF9ERUZFTkRFUl9BVFRBQ0tFUl9FREdFEAkSJwojQ0FNX1RBUkdF",
+            "VF9BVFRBQ0tFUl9ERUZFTkRFUl9NSVJST1IQCxIpCiVDQU1fVEFSR0VUX1NI",
+            "T1VMREVSX0FUVEFDS0VSX0RFRkVOREVSEAwSMAosQ0FNX1RBUkdFVF9TSE9V",
+            "TERFUl9BVFRBQ0tFUl9ERUZFTkRFUl9NSVJST1IQDRImCiJDQU1fVEFSR0VU",
+            "X0FUVEFDS0VSX0RFRkVOREVSX1dPUkxEEA5iBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.CameraTarget), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum CameraTarget {
+    [pbr::OriginalName("CAM_TARGET_ATTACKER")] CamTargetAttacker = 0,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_EDGE")] CamTargetAttackerEdge = 1,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_GROUND")] CamTargetAttackerGround = 2,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER")] CamTargetDefender = 3,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_EDGE")] CamTargetDefenderEdge = 4,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_GROUND")] CamTargetDefenderGround = 5,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER")] CamTargetAttackerDefender = 6,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_EDGE")] CamTargetAttackerDefenderEdge = 7,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_ATTACKER")] CamTargetDefenderAttacker = 8,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_ATTACKER_EDGE")] CamTargetDefenderAttackerEdge = 9,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_MIRROR")] CamTargetAttackerDefenderMirror = 11,
+    [pbr::OriginalName("CAM_TARGET_SHOULDER_ATTACKER_DEFENDER")] CamTargetShoulderAttackerDefender = 12,
+    [pbr::OriginalName("CAM_TARGET_SHOULDER_ATTACKER_DEFENDER_MIRROR")] CamTargetShoulderAttackerDefenderMirror = 13,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_WORLD")] CamTargetAttackerDefenderWorld = 14,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/Gender.cs b/PokemonGo/POGOProtos/Enums/Gender.cs
new file mode 100644
index 0000000..c61979f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/Gender.cs
@@ -0,0 +1,44 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/Gender.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/Gender.proto</summary>
+  public static partial class GenderReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/Gender.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GenderReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch1QT0dPUHJvdG9zL0VudW1zL0dlbmRlci5wcm90bxIQUE9HT1Byb3Rvcy5F",
+            "bnVtcyoeCgZHZW5kZXISCAoETUFMRRAAEgoKBkZFTUFMRRABYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.Gender), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum Gender {
+    [pbr::OriginalName("MALE")] Male = 0,
+    [pbr::OriginalName("FEMALE")] Female = 1,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/IapItemCategory.cs b/PokemonGo/POGOProtos/Enums/IapItemCategory.cs
new file mode 100644
index 0000000..51ccfaf
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/IapItemCategory.cs
@@ -0,0 +1,50 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/IapItemCategory.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/IapItemCategory.proto</summary>
+  public static partial class IapItemCategoryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/IapItemCategory.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static IapItemCategoryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0VudW1zL0lhcEl0ZW1DYXRlZ29yeS5wcm90bxIQUE9H",
+            "T1Byb3Rvcy5FbnVtcyqUAQoTSG9sb0lhcEl0ZW1DYXRlZ29yeRIVChFJQVBf",
+            "Q0FURUdPUllfTk9ORRAAEhcKE0lBUF9DQVRFR09SWV9CVU5ETEUQARIWChJJ",
+            "QVBfQ0FURUdPUllfSVRFTVMQAhIZChVJQVBfQ0FURUdPUllfVVBHUkFERVMQ",
+            "AxIaChZJQVBfQ0FURUdPUllfUE9LRUNPSU5TEARiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.HoloIapItemCategory), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum HoloIapItemCategory {
+    [pbr::OriginalName("IAP_CATEGORY_NONE")] IapCategoryNone = 0,
+    [pbr::OriginalName("IAP_CATEGORY_BUNDLE")] IapCategoryBundle = 1,
+    [pbr::OriginalName("IAP_CATEGORY_ITEMS")] IapCategoryItems = 2,
+    [pbr::OriginalName("IAP_CATEGORY_UPGRADES")] IapCategoryUpgrades = 3,
+    [pbr::OriginalName("IAP_CATEGORY_POKECOINS")] IapCategoryPokecoins = 4,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/ItemCategory.cs b/PokemonGo/POGOProtos/Enums/ItemCategory.cs
new file mode 100644
index 0000000..f1ca059
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/ItemCategory.cs
@@ -0,0 +1,62 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/ItemCategory.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/ItemCategory.proto</summary>
+  public static partial class ItemCategoryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/ItemCategory.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemCategoryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiNQT0dPUHJvdG9zL0VudW1zL0l0ZW1DYXRlZ29yeS5wcm90bxIQUE9HT1By",
+            "b3Rvcy5FbnVtcyrWAgoMSXRlbUNhdGVnb3J5EhYKEklURU1fQ0FURUdPUllf",
+            "Tk9ORRAAEhoKFklURU1fQ0FURUdPUllfUE9LRUJBTEwQARIWChJJVEVNX0NB",
+            "VEVHT1JZX0ZPT0QQAhIaChZJVEVNX0NBVEVHT1JZX01FRElDSU5FEAMSFwoT",
+            "SVRFTV9DQVRFR09SWV9CT09TVBAEEhoKFklURU1fQ0FURUdPUllfVVRJTElU",
+            "RVMQBRIYChRJVEVNX0NBVEVHT1JZX0NBTUVSQRAGEhYKEklURU1fQ0FURUdP",
+            "UllfRElTSxAHEhsKF0lURU1fQ0FURUdPUllfSU5DVUJBVE9SEAgSGQoVSVRF",
+            "TV9DQVRFR09SWV9JTkNFTlNFEAkSGgoWSVRFTV9DQVRFR09SWV9YUF9CT09T",
+            "VBAKEiMKH0lURU1fQ0FURUdPUllfSU5WRU5UT1JZX1VQR1JBREUQC2IGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.ItemCategory), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ItemCategory {
+    [pbr::OriginalName("ITEM_CATEGORY_NONE")] None = 0,
+    [pbr::OriginalName("ITEM_CATEGORY_POKEBALL")] Pokeball = 1,
+    [pbr::OriginalName("ITEM_CATEGORY_FOOD")] Food = 2,
+    [pbr::OriginalName("ITEM_CATEGORY_MEDICINE")] Medicine = 3,
+    [pbr::OriginalName("ITEM_CATEGORY_BOOST")] Boost = 4,
+    [pbr::OriginalName("ITEM_CATEGORY_UTILITES")] Utilites = 5,
+    [pbr::OriginalName("ITEM_CATEGORY_CAMERA")] Camera = 6,
+    [pbr::OriginalName("ITEM_CATEGORY_DISK")] Disk = 7,
+    [pbr::OriginalName("ITEM_CATEGORY_INCUBATOR")] Incubator = 8,
+    [pbr::OriginalName("ITEM_CATEGORY_INCENSE")] Incense = 9,
+    [pbr::OriginalName("ITEM_CATEGORY_XP_BOOST")] XpBoost = 10,
+    [pbr::OriginalName("ITEM_CATEGORY_INVENTORY_UPGRADE")] InventoryUpgrade = 11,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/ItemEffect.cs b/PokemonGo/POGOProtos/Enums/ItemEffect.cs
new file mode 100644
index 0000000..b713b5d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/ItemEffect.cs
@@ -0,0 +1,69 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/ItemEffect.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/ItemEffect.proto</summary>
+  public static partial class ItemEffectReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/ItemEffect.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemEffectReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiFQT0dPUHJvdG9zL0VudW1zL0l0ZW1FZmZlY3QucHJvdG8SEFBPR09Qcm90",
+            "b3MuRW51bXMqmAQKCkl0ZW1FZmZlY3QSFAoQSVRFTV9FRkZFQ1RfTk9ORRAA",
+            "EhwKF0lURU1fRUZGRUNUX0NBUF9OT19GTEVFEOgHEiAKG0lURU1fRUZGRUNU",
+            "X0NBUF9OT19NT1ZFTUVOVBDqBxIeChlJVEVNX0VGRkVDVF9DQVBfTk9fVEhS",
+            "RUFUEOsHEh8KGklURU1fRUZGRUNUX0NBUF9UQVJHRVRfTUFYEOwHEiAKG0lU",
+            "RU1fRUZGRUNUX0NBUF9UQVJHRVRfU0xPVxDtBxIhChxJVEVNX0VGRkVDVF9D",
+            "QVBfQ0hBTkNFX05JR0hUEO4HEiMKHklURU1fRUZGRUNUX0NBUF9DSEFOQ0Vf",
+            "VFJBSU5FUhDvBxInCiJJVEVNX0VGRkVDVF9DQVBfQ0hBTkNFX0ZJUlNUX1RI",
+            "Uk9XEPAHEiIKHUlURU1fRUZGRUNUX0NBUF9DSEFOQ0VfTEVHRU5EEPEHEiEK",
+            "HElURU1fRUZGRUNUX0NBUF9DSEFOQ0VfSEVBVlkQ8gcSIgodSVRFTV9FRkZF",
+            "Q1RfQ0FQX0NIQU5DRV9SRVBFQVQQ8wcSJwoiSVRFTV9FRkZFQ1RfQ0FQX0NI",
+            "QU5DRV9NVUxUSV9USFJPVxD0BxIiCh1JVEVNX0VGRkVDVF9DQVBfQ0hBTkNF",
+            "X0FMV0FZUxD1BxIoCiNJVEVNX0VGRkVDVF9DQVBfQ0hBTkNFX1NJTkdMRV9U",
+            "SFJPVxD2B2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.ItemEffect), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ItemEffect {
+    [pbr::OriginalName("ITEM_EFFECT_NONE")] None = 0,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_NO_FLEE")] CapNoFlee = 1000,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_NO_MOVEMENT")] CapNoMovement = 1002,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_NO_THREAT")] CapNoThreat = 1003,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_TARGET_MAX")] CapTargetMax = 1004,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_TARGET_SLOW")] CapTargetSlow = 1005,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_NIGHT")] CapChanceNight = 1006,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_TRAINER")] CapChanceTrainer = 1007,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_FIRST_THROW")] CapChanceFirstThrow = 1008,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_LEGEND")] CapChanceLegend = 1009,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_HEAVY")] CapChanceHeavy = 1010,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_REPEAT")] CapChanceRepeat = 1011,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_MULTI_THROW")] CapChanceMultiThrow = 1012,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_ALWAYS")] CapChanceAlways = 1013,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_SINGLE_THROW")] CapChanceSingleThrow = 1014,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/POGOProtosEnums.cs b/PokemonGo/POGOProtos/Enums/POGOProtosEnums.cs
new file mode 100644
index 0000000..2eeb802
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/POGOProtosEnums.cs
@@ -0,0 +1,915 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Enums.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Enums.proto</summary>
+  public static partial class POGOProtosEnumsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Enums.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosEnumsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChZQT0dPUHJvdG9zLkVudW1zLnByb3RvEhBQT0dPUHJvdG9zLkVudW1zKpgE",
+            "CgpJdGVtRWZmZWN0EhQKEElURU1fRUZGRUNUX05PTkUQABIcChdJVEVNX0VG",
+            "RkVDVF9DQVBfTk9fRkxFRRDoBxIgChtJVEVNX0VGRkVDVF9DQVBfTk9fTU9W",
+            "RU1FTlQQ6gcSHgoZSVRFTV9FRkZFQ1RfQ0FQX05PX1RIUkVBVBDrBxIfChpJ",
+            "VEVNX0VGRkVDVF9DQVBfVEFSR0VUX01BWBDsBxIgChtJVEVNX0VGRkVDVF9D",
+            "QVBfVEFSR0VUX1NMT1cQ7QcSIQocSVRFTV9FRkZFQ1RfQ0FQX0NIQU5DRV9O",
+            "SUdIVBDuBxIjCh5JVEVNX0VGRkVDVF9DQVBfQ0hBTkNFX1RSQUlORVIQ7wcS",
+            "JwoiSVRFTV9FRkZFQ1RfQ0FQX0NIQU5DRV9GSVJTVF9USFJPVxDwBxIiCh1J",
+            "VEVNX0VGRkVDVF9DQVBfQ0hBTkNFX0xFR0VORBDxBxIhChxJVEVNX0VGRkVD",
+            "VF9DQVBfQ0hBTkNFX0hFQVZZEPIHEiIKHUlURU1fRUZGRUNUX0NBUF9DSEFO",
+            "Q0VfUkVQRUFUEPMHEicKIklURU1fRUZGRUNUX0NBUF9DSEFOQ0VfTVVMVElf",
+            "VEhST1cQ9AcSIgodSVRFTV9FRkZFQ1RfQ0FQX0NIQU5DRV9BTFdBWVMQ9QcS",
+            "KAojSVRFTV9FRkZFQ1RfQ0FQX0NIQU5DRV9TSU5HTEVfVEhST1cQ9gcqoQcK",
+            "CUJhZGdlVHlwZRIPCgtCQURHRV9VTlNFVBAAEhMKD0JBREdFX1RSQVZFTF9L",
+            "TRABEhkKFUJBREdFX1BPS0VERVhfRU5UUklFUxACEhcKE0JBREdFX0NBUFRV",
+            "UkVfVE9UQUwQAxIXChNCQURHRV9ERUZFQVRFRF9GT1JUEAQSFwoTQkFER0Vf",
+            "RVZPTFZFRF9UT1RBTBAFEhcKE0JBREdFX0hBVENIRURfVE9UQUwQBhIbChdC",
+            "QURHRV9FTkNPVU5URVJFRF9UT1RBTBAHEhsKF0JBREdFX1BPS0VTVE9QU19W",
+            "SVNJVEVEEAgSGgoWQkFER0VfVU5JUVVFX1BPS0VTVE9QUxAJEhkKFUJBREdF",
+            "X1BPS0VCQUxMX1RIUk9XThAKEhYKEkJBREdFX0JJR19NQUdJS0FSUBALEhgK",
+            "FEJBREdFX0RFUExPWUVEX1RPVEFMEAwSGwoXQkFER0VfQkFUVExFX0FUVEFD",
+            "S19XT04QDRIdChlCQURHRV9CQVRUTEVfVFJBSU5JTkdfV09OEA4SGwoXQkFE",
+            "R0VfQkFUVExFX0RFRkVORF9XT04QDxIZChVCQURHRV9QUkVTVElHRV9SQUlT",
+            "RUQQEBIaChZCQURHRV9QUkVTVElHRV9EUk9QUEVEEBESFQoRQkFER0VfVFlQ",
+            "RV9OT1JNQUwQEhIXChNCQURHRV9UWVBFX0ZJR0hUSU5HEBMSFQoRQkFER0Vf",
+            "VFlQRV9GTFlJTkcQFBIVChFCQURHRV9UWVBFX1BPSVNPThAVEhUKEUJBREdF",
+            "X1RZUEVfR1JPVU5EEBYSEwoPQkFER0VfVFlQRV9ST0NLEBcSEgoOQkFER0Vf",
+            "VFlQRV9CVUcQGBIUChBCQURHRV9UWVBFX0dIT1NUEBkSFAoQQkFER0VfVFlQ",
+            "RV9TVEVFTBAaEhMKD0JBREdFX1RZUEVfRklSRRAbEhQKEEJBREdFX1RZUEVf",
+            "V0FURVIQHBIUChBCQURHRV9UWVBFX0dSQVNTEB0SFwoTQkFER0VfVFlQRV9F",
+            "TEVDVFJJQxAeEhYKEkJBREdFX1RZUEVfUFNZQ0hJQxAfEhIKDkJBREdFX1RZ",
+            "UEVfSUNFECASFQoRQkFER0VfVFlQRV9EUkFHT04QIRITCg9CQURHRV9UWVBF",
+            "X0RBUksQIhIUChBCQURHRV9UWVBFX0ZBSVJZECMSFwoTQkFER0VfU01BTExf",
+            "UkFUVEFUQRAkEhEKDUJBREdFX1BJS0FDSFUQJSraAwoLUG9rZW1vblR5cGUS",
+            "FQoRUE9LRU1PTl9UWVBFX05PTkUQABIXChNQT0tFTU9OX1RZUEVfTk9STUFM",
+            "EAESGQoVUE9LRU1PTl9UWVBFX0ZJR0hUSU5HEAISFwoTUE9LRU1PTl9UWVBF",
+            "X0ZMWUlORxADEhcKE1BPS0VNT05fVFlQRV9QT0lTT04QBBIXChNQT0tFTU9O",
+            "X1RZUEVfR1JPVU5EEAUSFQoRUE9LRU1PTl9UWVBFX1JPQ0sQBhIUChBQT0tF",
+            "TU9OX1RZUEVfQlVHEAcSFgoSUE9LRU1PTl9UWVBFX0dIT1NUEAgSFgoSUE9L",
+            "RU1PTl9UWVBFX1NURUVMEAkSFQoRUE9LRU1PTl9UWVBFX0ZJUkUQChIWChJQ",
+            "T0tFTU9OX1RZUEVfV0FURVIQCxIWChJQT0tFTU9OX1RZUEVfR1JBU1MQDBIZ",
+            "ChVQT0tFTU9OX1RZUEVfRUxFQ1RSSUMQDRIYChRQT0tFTU9OX1RZUEVfUFNZ",
+            "Q0hJQxAOEhQKEFBPS0VNT05fVFlQRV9JQ0UQDxIXChNQT0tFTU9OX1RZUEVf",
+            "RFJBR09OEBASFQoRUE9LRU1PTl9UWVBFX0RBUksQERIWChJQT0tFTU9OX1RZ",
+            "UEVfRkFJUlkQEirkAQoNVHV0b3JpYWxTdGF0ZRIQCgxMRUdBTF9TQ1JFRU4Q",
+            "ABIUChBBVkFUQVJfU0VMRUNUSU9OEAESFAoQQUNDT1VOVF9DUkVBVElPThAC",
+            "EhMKD1BPS0VNT05fQ0FQVFVSRRADEhIKDk5BTUVfU0VMRUNUSU9OEAQSEQoN",
+            "UE9LRU1PTl9CRVJSWRAFEgwKCFVTRV9JVEVNEAYSIgoeRklSU1RfVElNRV9F",
+            "WFBFUklFTkNFX0NPTVBMRVRFEAcSFQoRUE9LRVNUT1BfVFVUT1JJQUwQCBIQ",
+            "CgxHWU1fVFVUT1JJQUwQCSr8AwoMQ2FtZXJhVGFyZ2V0EhcKE0NBTV9UQVJH",
+            "RVRfQVRUQUNLRVIQABIcChhDQU1fVEFSR0VUX0FUVEFDS0VSX0VER0UQARIe",
+            "ChpDQU1fVEFSR0VUX0FUVEFDS0VSX0dST1VORBACEhcKE0NBTV9UQVJHRVRf",
+            "REVGRU5ERVIQAxIcChhDQU1fVEFSR0VUX0RFRkVOREVSX0VER0UQBBIeChpD",
+            "QU1fVEFSR0VUX0RFRkVOREVSX0dST1VORBAFEiAKHENBTV9UQVJHRVRfQVRU",
+            "QUNLRVJfREVGRU5ERVIQBhIlCiFDQU1fVEFSR0VUX0FUVEFDS0VSX0RFRkVO",
+            "REVSX0VER0UQBxIgChxDQU1fVEFSR0VUX0RFRkVOREVSX0FUVEFDS0VSEAgS",
+            "JQohQ0FNX1RBUkdFVF9ERUZFTkRFUl9BVFRBQ0tFUl9FREdFEAkSJwojQ0FN",
+            "X1RBUkdFVF9BVFRBQ0tFUl9ERUZFTkRFUl9NSVJST1IQCxIpCiVDQU1fVEFS",
+            "R0VUX1NIT1VMREVSX0FUVEFDS0VSX0RFRkVOREVSEAwSMAosQ0FNX1RBUkdF",
+            "VF9TSE9VTERFUl9BVFRBQ0tFUl9ERUZFTkRFUl9NSVJST1IQDRImCiJDQU1f",
+            "VEFSR0VUX0FUVEFDS0VSX0RFRkVOREVSX1dPUkxEEA4qlgEKE0NhbWVyYUlu",
+            "dGVycG9sYXRpb24SEgoOQ0FNX0lOVEVSUF9DVVQQABIVChFDQU1fSU5URVJQ",
+            "X0xJTkVBUhABEhUKEUNBTV9JTlRFUlBfU01PT1RIEAISJQohQ0FNX0lOVEVS",
+            "UF9TTU9PVEhfUk9UX0xJTkVBUl9NT1ZFEAMSFgoSQ0FNX0lOVEVSUF9ERVBF",
+            "TkRTEAQqQQoIUGxhdGZvcm0SCQoFVU5TRVQQABIHCgNJT1MQARILCgdBTkRS",
+            "T0lEEAISBwoDT1NYEAMSCwoHV0lORE9XUxAEKjcKCVRlYW1Db2xvchILCgdO",
+            "RVVUUkFMEAASCAoEQkxVRRABEgcKA1JFRBACEgoKBllFTExPVxADKs4XCgtQ",
+            "b2tlbW9uTW92ZRIOCgpNT1ZFX1VOU0VUEAASEQoNVEhVTkRFUl9TSE9DSxAB",
+            "EhAKDFFVSUNLX0FUVEFDSxACEgsKB1NDUkFUQ0gQAxIJCgVFTUJFUhAEEg0K",
+            "CVZJTkVfV0hJUBAFEgoKBlRBQ0tMRRAGEg4KClJBWk9SX0xFQUYQBxINCglU",
+            "QUtFX0RPV04QCBINCglXQVRFUl9HVU4QCRIICgRCSVRFEAoSCQoFUE9VTkQQ",
+            "CxIPCgtET1VCTEVfU0xBUBAMEggKBFdSQVAQDRIOCgpIWVBFUl9CRUFNEA4S",
+            "CAoETElDSxAPEg4KCkRBUktfUFVMU0UQEBIICgRTTU9HEBESCgoGU0xVREdF",
+            "EBISDgoKTUVUQUxfQ0xBVxATEg0KCVZJQ0VfR1JJUBAUEg8KC0ZMQU1FX1dI",
+            "RUVMEBUSDAoITUVHQUhPUk4QFhIPCgtXSU5HX0FUVEFDSxAXEhAKDEZMQU1F",
+            "VEhST1dFUhAYEhAKDFNVQ0tFUl9QVU5DSBAZEgcKA0RJRxAaEgwKCExPV19L",
+            "SUNLEBsSDgoKQ1JPU1NfQ0hPUBAcEg4KClBTWUNIT19DVVQQHRILCgdQU1lC",
+            "RUFNEB4SDgoKRUFSVEhRVUFLRRAfEg4KClNUT05FX0VER0UQIBINCglJQ0Vf",
+            "UFVOQ0gQIRIPCgtIRUFSVF9TVEFNUBAiEg0KCURJU0NIQVJHRRAjEhAKDEZM",
+            "QVNIX0NBTk5PThAkEggKBFBFQ0sQJRIOCgpEUklMTF9QRUNLECYSDAoISUNF",
+            "X0JFQU0QJxIMCghCTElaWkFSRBAoEg0KCUFJUl9TTEFTSBApEg0KCUhFQVRf",
+            "V0FWRRAqEg0KCVRXSU5FRURMRRArEg4KClBPSVNPTl9KQUIQLBIOCgpBRVJJ",
+            "QUxfQUNFEC0SDQoJRFJJTExfUlVOEC4SEgoOUEVUQUxfQkxJWlpBUkQQLxIO",
+            "CgpNRUdBX0RSQUlOEDASDAoIQlVHX0JVWloQMRIPCgtQT0lTT05fRkFORxAy",
+            "Eg8KC05JR0hUX1NMQVNIEDMSCQoFU0xBU0gQNBIPCgtCVUJCTEVfQkVBTRA1",
+            "Eg4KClNVQk1JU1NJT04QNhIPCgtLQVJBVEVfQ0hPUBA3Eg0KCUxPV19TV0VF",
+            "UBA4EgwKCEFRVUFfSkVUEDkSDQoJQVFVQV9UQUlMEDoSDQoJU0VFRF9CT01C",
+            "EDsSDAoIUFNZU0hPQ0sQPBIOCgpST0NLX1RIUk9XED0SEQoNQU5DSUVOVF9Q",
+            "T1dFUhA+Eg0KCVJPQ0tfVE9NQhA/Eg4KClJPQ0tfU0xJREUQQBINCglQT1dF",
+            "Ul9HRU0QQRIQCgxTSEFET1dfU05FQUsQQhIQCgxTSEFET1dfUFVOQ0gQQxIP",
+            "CgtTSEFET1dfQ0xBVxBEEhAKDE9NSU5PVVNfV0lORBBFEg8KC1NIQURPV19C",
+            "QUxMEEYSEAoMQlVMTEVUX1BVTkNIEEcSDwoLTUFHTkVUX0JPTUIQSBIOCgpT",
+            "VEVFTF9XSU5HEEkSDQoJSVJPTl9IRUFEEEoSFAoQUEFSQUJPTElDX0NIQVJH",
+            "RRBLEgkKBVNQQVJLEEwSEQoNVEhVTkRFUl9QVU5DSBBNEgsKB1RIVU5ERVIQ",
+            "ThIPCgtUSFVOREVSQk9MVBBPEgsKB1RXSVNURVIQUBIRCg1EUkFHT05fQlJF",
+            "QVRIEFESEAoMRFJBR09OX1BVTFNFEFISDwoLRFJBR09OX0NMQVcQUxITCg9E",
+            "SVNBUk1JTkdfVk9JQ0UQVBIRCg1EUkFJTklOR19LSVNTEFUSEgoOREFaWkxJ",
+            "TkdfR0xFQU0QVhINCglNT09OQkxBU1QQVxIOCgpQTEFZX1JPVUdIEFgSEAoM",
+            "Q1JPU1NfUE9JU09OEFkSDwoLU0xVREdFX0JPTUIQWhIPCgtTTFVER0VfV0FW",
+            "RRBbEg0KCUdVTktfU0hPVBBcEgwKCE1VRF9TSE9UEF0SDQoJQk9ORV9DTFVC",
+            "EF4SDAoIQlVMTERPWkUQXxIMCghNVURfQk9NQhBgEg8KC0ZVUllfQ1VUVEVS",
+            "EGESDAoIQlVHX0JJVEUQYhIPCgtTSUdOQUxfQkVBTRBjEg0KCVhfU0NJU1NP",
+            "UhBkEhAKDEZMQU1FX0NIQVJHRRBlEg8KC0ZMQU1FX0JVUlNUEGYSDgoKRklS",
+            "RV9CTEFTVBBnEgkKBUJSSU5FEGgSDwoLV0FURVJfUFVMU0UQaRIJCgVTQ0FM",
+            "RBBqEg4KCkhZRFJPX1BVTVAQaxILCgdQU1lDSElDEGwSDQoJUFNZU1RSSUtF",
+            "EG0SDQoJSUNFX1NIQVJEEG4SDAoISUNZX1dJTkQQbxIQCgxGUk9TVF9CUkVB",
+            "VEgQcBIKCgZBQlNPUkIQcRIOCgpHSUdBX0RSQUlOEHISDgoKRklSRV9QVU5D",
+            "SBBzEg4KClNPTEFSX0JFQU0QdBIOCgpMRUFGX0JMQURFEHUSDgoKUE9XRVJf",
+            "V0hJUBB2EgoKBlNQTEFTSBB3EggKBEFDSUQQeBIOCgpBSVJfQ1VUVEVSEHkS",
+            "DQoJSFVSUklDQU5FEHoSDwoLQlJJQ0tfQlJFQUsQexIHCgNDVVQQfBIJCgVT",
+            "V0lGVBB9Eg8KC0hPUk5fQVRUQUNLEH4SCQoFU1RPTVAQfxINCghIRUFEQlVU",
+            "VBCAARIPCgpIWVBFUl9GQU5HEIEBEgkKBFNMQU0QggESDgoJQk9EWV9TTEFN",
+            "EIMBEgkKBFJFU1QQhAESDQoIU1RSVUdHTEUQhQESFAoPU0NBTERfQkxBU1RP",
+            "SVNFEIYBEhkKFEhZRFJPX1BVTVBfQkxBU1RPSVNFEIcBEg8KCldSQVBfR1JF",
+            "RU4QiAESDgoJV1JBUF9QSU5LEIkBEhUKEEZVUllfQ1VUVEVSX0ZBU1QQyAES",
+            "EgoNQlVHX0JJVEVfRkFTVBDJARIOCglCSVRFX0ZBU1QQygESFgoRU1VDS0VS",
+            "X1BVTkNIX0ZBU1QQywESFwoSRFJBR09OX0JSRUFUSF9GQVNUEMwBEhcKElRI",
+            "VU5ERVJfU0hPQ0tfRkFTVBDNARIPCgpTUEFSS19GQVNUEM4BEhIKDUxPV19L",
+            "SUNLX0ZBU1QQzwESFQoQS0FSQVRFX0NIT1BfRkFTVBDQARIPCgpFTUJFUl9G",
+            "QVNUENEBEhUKEFdJTkdfQVRUQUNLX0ZBU1QQ0gESDgoJUEVDS19GQVNUENMB",
+            "Eg4KCUxJQ0tfRkFTVBDUARIVChBTSEFET1dfQ0xBV19GQVNUENUBEhMKDlZJ",
+            "TkVfV0hJUF9GQVNUENYBEhQKD1JBWk9SX0xFQUZfRkFTVBDXARISCg1NVURf",
+            "U0hPVF9GQVNUENgBEhMKDklDRV9TSEFSRF9GQVNUENkBEhYKEUZST1NUX0JS",
+            "RUFUSF9GQVNUENoBEhYKEVFVSUNLX0FUVEFDS19GQVNUENsBEhEKDFNDUkFU",
+            "Q0hfRkFTVBDcARIQCgtUQUNLTEVfRkFTVBDdARIPCgpQT1VORF9GQVNUEN4B",
+            "Eg0KCENVVF9GQVNUEN8BEhQKD1BPSVNPTl9KQUJfRkFTVBDgARIOCglBQ0lE",
+            "X0ZBU1QQ4QESFAoPUFNZQ0hPX0NVVF9GQVNUEOIBEhQKD1JPQ0tfVEhST1df",
+            "RkFTVBDjARIUCg9NRVRBTF9DTEFXX0ZBU1QQ5AESFgoRQlVMTEVUX1BVTkNI",
+            "X0ZBU1QQ5QESEwoOV0FURVJfR1VOX0ZBU1QQ5gESEAoLU1BMQVNIX0ZBU1QQ",
+            "5wESHQoYV0FURVJfR1VOX0ZBU1RfQkxBU1RPSVNFEOgBEhIKDU1VRF9TTEFQ",
+            "X0ZBU1QQ6QESFgoRWkVOX0hFQURCVVRUX0ZBU1QQ6gESEwoOQ09ORlVTSU9O",
+            "X0ZBU1QQ6wESFgoRUE9JU09OX1NUSU5HX0ZBU1QQ7AESEAoLQlVCQkxFX0ZB",
+            "U1QQ7QESFgoRRkVJTlRfQVRUQUNLX0ZBU1QQ7gESFAoPU1RFRUxfV0lOR19G",
+            "QVNUEO8BEhMKDkZJUkVfRkFOR19GQVNUEPABEhQKD1JPQ0tfU01BU0hfRkFT",
+            "VBDxASo2Cg1Qb2tlbW9uUmFyaXR5EgoKBk5PUk1BTBAAEg0KCUxFR0VOREFS",
+            "WRABEgoKBk1ZVEhJQxACKq0BChNQb2tlbW9uTW92ZW1lbnRUeXBlEhMKD01P",
+            "VkVNRU5UX1NUQVRJQxAAEhEKDU1PVkVNRU5UX0pVTVAQARIVChFNT1ZFTUVO",
+            "VF9WRVJUSUNBTBACEhQKEE1PVkVNRU5UX1BTWUNISUMQAxIVChFNT1ZFTUVO",
+            "VF9FTEVDVFJJQxAEEhMKD01PVkVNRU5UX0ZMWUlORxAFEhUKEU1PVkVNRU5U",
+            "X0hPVkVSSU5HEAYq+gwKD1Bva2Vtb25GYW1pbHlJZBIQCgxGQU1JTFlfVU5T",
+            "RVQQABIUChBGQU1JTFlfQlVMQkFTQVVSEAESFQoRRkFNSUxZX0NIQVJNQU5E",
+            "RVIQBBITCg9GQU1JTFlfU1FVSVJUTEUQBxITCg9GQU1JTFlfQ0FURVJQSUUQ",
+            "ChIRCg1GQU1JTFlfV0VFRExFEA0SEQoNRkFNSUxZX1BJREdFWRAQEhIKDkZB",
+            "TUlMWV9SQVRUQVRBEBMSEgoORkFNSUxZX1NQRUFST1cQFRIQCgxGQU1JTFlf",
+            "RUtBTlMQFxISCg5GQU1JTFlfUElLQUNIVRAZEhQKEEZBTUlMWV9TQU5EU0hS",
+            "RVcQGxIZChVGQU1JTFlfTklET1JBTl9GRU1BTEUQHRIXChNGQU1JTFlfTklE",
+            "T1JBTl9NQUxFECASEwoPRkFNSUxZX0NMRUZBSVJZECMSEQoNRkFNSUxZX1ZV",
+            "TFBJWBAlEhUKEUZBTUlMWV9KSUdHTFlQVUZGECcSEAoMRkFNSUxZX1pVQkFU",
+            "ECkSEQoNRkFNSUxZX09ERElTSBArEhAKDEZBTUlMWV9QQVJBUxAuEhIKDkZB",
+            "TUlMWV9WRU5PTkFUEDASEgoORkFNSUxZX0RJR0xFVFQQMhIRCg1GQU1JTFlf",
+            "TUVPV1RIEDQSEgoORkFNSUxZX1BTWURVQ0sQNhIRCg1GQU1JTFlfTUFOS0VZ",
+            "EDgSFAoQRkFNSUxZX0dST1dMSVRIRRA6EhIKDkZBTUlMWV9QT0xJV0FHEDwS",
+            "DwoLRkFNSUxZX0FCUkEQPxIRCg1GQU1JTFlfTUFDSE9QEEISFQoRRkFNSUxZ",
+            "X0JFTExTUFJPVVQQRRIUChBGQU1JTFlfVEVOVEFDT09MEEgSEgoORkFNSUxZ",
+            "X0dFT0RVREUQShIRCg1GQU1JTFlfUE9OWVRBEE0SEwoPRkFNSUxZX1NMT1dQ",
+            "T0tFEE8SFAoQRkFNSUxZX01BR05FTUlURRBREhQKEEZBTUlMWV9GQVJGRVRD",
+            "SEQQUxIQCgxGQU1JTFlfRE9EVU8QVBIPCgtGQU1JTFlfU0VFTBBWEhEKDUZB",
+            "TUlMWV9HUklNRVIQWBITCg9GQU1JTFlfU0hFTExERVIQWhIRCg1GQU1JTFlf",
+            "R0FTVExZEFwSDwoLRkFNSUxZX09OSVgQXxISCg5GQU1JTFlfRFJPV1pFRRBg",
+            "EhAKDEZBTUlMWV9IWVBOTxBhEhEKDUZBTUlMWV9LUkFCQlkQYhISCg5GQU1J",
+            "TFlfVk9MVE9SQhBkEhQKEEZBTUlMWV9FWEVHR0NVVEUQZhIRCg1GQU1JTFlf",
+            "Q1VCT05FEGgSFAoQRkFNSUxZX0hJVE1PTkxFRRBqEhUKEUZBTUlMWV9ISVRN",
+            "T05DSEFOEGsSFAoQRkFNSUxZX0xJQ0tJVFVORxBsEhIKDkZBTUlMWV9LT0ZG",
+            "SU5HEG0SEgoORkFNSUxZX1JIWUhPUk4QbxISCg5GQU1JTFlfQ0hBTlNFWRBx",
+            "EhIKDkZBTUlMWV9UQU5HRUxBEHISFQoRRkFNSUxZX0tBTkdBU0tIQU4QcxIR",
+            "Cg1GQU1JTFlfSE9SU0VBEHQSEgoORkFNSUxZX0dPTERFRU4QdhIRCg1GQU1J",
+            "TFlfU1RBUllVEHgSEgoORkFNSUxZX01SX01JTUUQehISCg5GQU1JTFlfU0NZ",
+            "VEhFUhB7Eg8KC0ZBTUlMWV9KWU5YEHwSFQoRRkFNSUxZX0VMRUNUQUJVWloQ",
+            "fRIRCg1GQU1JTFlfTUFHTUFSEH4SEQoNRkFNSUxZX1BJTlNJUhB/EhIKDUZB",
+            "TUlMWV9UQVVST1MQgAESFAoPRkFNSUxZX01BR0lLQVJQEIEBEhIKDUZBTUlM",
+            "WV9MQVBSQVMQgwESEQoMRkFNSUxZX0RJVFRPEIQBEhEKDEZBTUlMWV9FRVZF",
+            "RRCFARITCg5GQU1JTFlfUE9SWUdPThCJARITCg5GQU1JTFlfT01BTllURRCK",
+            "ARISCg1GQU1JTFlfS0FCVVRPEIwBEhYKEUZBTUlMWV9BRVJPREFDVFlMEI4B",
+            "EhMKDkZBTUlMWV9TTk9STEFYEI8BEhQKD0ZBTUlMWV9BUlRJQ1VOTxCQARIS",
+            "Cg1GQU1JTFlfWkFQRE9TEJEBEhMKDkZBTUlMWV9NT0xUUkVTEJIBEhMKDkZB",
+            "TUlMWV9EUkFUSU5JEJMBEhIKDUZBTUlMWV9NRVdUV08QlgESDwoKRkFNSUxZ",
+            "X01FVxCXASrsBQoMQWN0aXZpdHlUeXBlEhQKEEFDVElWSVRZX1VOS05PV04Q",
+            "ABIaChZBQ1RJVklUWV9DQVRDSF9QT0tFTU9OEAESIQodQUNUSVZJVFlfQ0FU",
+            "Q0hfTEVHRU5EX1BPS0VNT04QAhIZChVBQ1RJVklUWV9GTEVFX1BPS0VNT04Q",
+            "AxIYChRBQ1RJVklUWV9ERUZFQVRfRk9SVBAEEhsKF0FDVElWSVRZX0VWT0xW",
+            "RV9QT0tFTU9OEAUSFgoSQUNUSVZJVFlfSEFUQ0hfRUdHEAYSFAoQQUNUSVZJ",
+            "VFlfV0FMS19LTRAHEh4KGkFDVElWSVRZX1BPS0VERVhfRU5UUllfTkVXEAgS",
+            "HgoaQUNUSVZJVFlfQ0FUQ0hfRklSU1RfVEhST1cQCRIdChlBQ1RJVklUWV9D",
+            "QVRDSF9OSUNFX1RIUk9XEAoSHgoaQUNUSVZJVFlfQ0FUQ0hfR1JFQVRfVEhS",
+            "T1cQCxIiCh5BQ1RJVklUWV9DQVRDSF9FWENFTExFTlRfVEhST1cQDBIcChhB",
+            "Q1RJVklUWV9DQVRDSF9DVVJWRUJBTEwQDRIlCiFBQ1RJVklUWV9DQVRDSF9G",
+            "SVJTVF9DQVRDSF9PRl9EQVkQDhIcChhBQ1RJVklUWV9DQVRDSF9NSUxFU1RP",
+            "TkUQDxIaChZBQ1RJVklUWV9UUkFJTl9QT0tFTU9OEBASGAoUQUNUSVZJVFlf",
+            "U0VBUkNIX0ZPUlQQERIcChhBQ1RJVklUWV9SRUxFQVNFX1BPS0VNT04QEhIi",
+            "Ch5BQ1RJVklUWV9IQVRDSF9FR0dfU01BTExfQk9OVVMQExIjCh9BQ1RJVklU",
+            "WV9IQVRDSF9FR0dfTUVESVVNX0JPTlVTEBQSIgoeQUNUSVZJVFlfSEFUQ0hf",
+            "RUdHX0xBUkdFX0JPTlVTEBUSIAocQUNUSVZJVFlfREVGRUFUX0dZTV9ERUZF",
+            "TkRFUhAWEh4KGkFDVElWSVRZX0RFRkVBVF9HWU1fTEVBREVSEBcqkxAKCVBv",
+            "a2Vtb25JZBINCglNSVNTSU5HTk8QABINCglCVUxCQVNBVVIQARILCgdJVllT",
+            "QVVSEAISDAoIVkVOVVNBVVIQAxIOCgpDSEFSTUFOREVSEAQSDgoKQ0hBUk1F",
+            "TEVPThAFEg0KCUNIQVJJWkFSRBAGEgwKCFNRVUlSVExFEAcSDQoJV0FSVE9S",
+            "VExFEAgSDQoJQkxBU1RPSVNFEAkSDAoIQ0FURVJQSUUQChILCgdNRVRBUE9E",
+            "EAsSDgoKQlVUVEVSRlJFRRAMEgoKBldFRURMRRANEgoKBktBS1VOQRAOEgwK",
+            "CEJFRURSSUxMEA8SCgoGUElER0VZEBASDQoJUElER0VPVFRPEBESCwoHUElE",
+            "R0VPVBASEgsKB1JBVFRBVEEQExIMCghSQVRJQ0FURRAUEgsKB1NQRUFST1cQ",
+            "FRIKCgZGRUFST1cQFhIJCgVFS0FOUxAXEgkKBUFSQk9LEBgSCwoHUElLQUNI",
+            "VRAZEgoKBlJBSUNIVRAaEg0KCVNBTkRTSFJFVxAbEg0KCVNBTkRTTEFTSBAc",
+            "EhIKDk5JRE9SQU5fRkVNQUxFEB0SDAoITklET1JJTkEQHhINCglOSURPUVVF",
+            "RU4QHxIQCgxOSURPUkFOX01BTEUQIBIMCghOSURPUklOTxAhEgwKCE5JRE9L",
+            "SU5HECISDAoIQ0xFRkFJUlkQIxIMCghDTEVGQUJMRRAkEgoKBlZVTFBJWBAl",
+            "Eg0KCU5JTkVUQUxFUxAmEg4KCkpJR0dMWVBVRkYQJxIOCgpXSUdHTFlUVUZG",
+            "ECgSCQoFWlVCQVQQKRIKCgZHT0xCQVQQKhIKCgZPRERJU0gQKxIJCgVHTE9P",
+            "TRAsEg0KCVZJTEVQTFVNRRAtEgkKBVBBUkFTEC4SDAoIUEFSQVNFQ1QQLxIL",
+            "CgdWRU5PTkFUEDASDAoIVkVOT01PVEgQMRILCgdESUdMRVRUEDISCwoHRFVH",
+            "VFJJTxAzEgoKBk1FT1dUSBA0EgsKB1BFUlNJQU4QNRILCgdQU1lEVUNLEDYS",
+            "CwoHR09MRFVDSxA3EgoKBk1BTktFWRA4EgwKCFBSSU1FQVBFEDkSDQoJR1JP",
+            "V0xJVEhFEDoSDAoIQVJDQU5JTkUQOxILCgdQT0xJV0FHEDwSDQoJUE9MSVdI",
+            "SVJMED0SDQoJUE9MSVdSQVRIED4SCAoEQUJSQRA/EgsKB0tBREFCUkEQQBIM",
+            "CghBTEFLQVpBTRBBEgoKBk1BQ0hPUBBCEgsKB01BQ0hPS0UQQxILCgdNQUNI",
+            "QU1QEEQSDgoKQkVMTFNQUk9VVBBFEg4KCldFRVBJTkJFTEwQRhIOCgpWSUNU",
+            "UkVFQkVMEEcSDQoJVEVOVEFDT09MEEgSDgoKVEVOVEFDUlVFTBBJEgsKB0dF",
+            "T0RVREUQShIMCghHUkFWRUxFUhBLEgkKBUdPTEVNEEwSCgoGUE9OWVRBEE0S",
+            "DAoIUkFQSURBU0gQThIMCghTTE9XUE9LRRBPEgsKB1NMT1dCUk8QUBINCglN",
+            "QUdORU1JVEUQURIMCghNQUdORVRPThBSEg0KCUZBUkZFVENIRBBTEgkKBURP",
+            "RFVPEFQSCgoGRE9EUklPEFUSCAoEU0VFTBBWEgsKB0RFV0dPTkcQVxIKCgZH",
+            "UklNRVIQWBIHCgNNVUsQWRIMCghTSEVMTERFUhBaEgwKCENMT1lTVEVSEFsS",
+            "CgoGR0FTVExZEFwSCwoHSEFVTlRFUhBdEgoKBkdFTkdBUhBeEggKBE9OSVgQ",
+            "XxILCgdEUk9XWkVFEGASCQoFSFlQTk8QYRIKCgZLUkFCQlkQYhILCgdLSU5H",
+            "TEVSEGMSCwoHVk9MVE9SQhBkEg0KCUVMRUNUUk9ERRBlEg0KCUVYRUdHQ1VU",
+            "RRBmEg0KCUVYRUdHVVRPUhBnEgoKBkNVQk9ORRBoEgsKB01BUk9XQUsQaRIN",
+            "CglISVRNT05MRUUQahIOCgpISVRNT05DSEFOEGsSDQoJTElDS0lUVU5HEGwS",
+            "CwoHS09GRklORxBtEgsKB1dFRVpJTkcQbhILCgdSSFlIT1JOEG8SCgoGUkhZ",
+            "RE9OEHASCwoHQ0hBTlNFWRBxEgsKB1RBTkdFTEEQchIOCgpLQU5HQVNLSEFO",
+            "EHMSCgoGSE9SU0VBEHQSCgoGU0VBRFJBEHUSCwoHR09MREVFThB2EgsKB1NF",
+            "QUtJTkcQdxIKCgZTVEFSWVUQeBILCgdTVEFSTUlFEHkSCwoHTVJfTUlNRRB6",
+            "EgsKB1NDWVRIRVIQexIICgRKWU5YEHwSDgoKRUxFQ1RBQlVaWhB9EgoKBk1B",
+            "R01BUhB+EgoKBlBJTlNJUhB/EgsKBlRBVVJPUxCAARINCghNQUdJS0FSUBCB",
+            "ARINCghHWUFSQURPUxCCARILCgZMQVBSQVMQgwESCgoFRElUVE8QhAESCgoF",
+            "RUVWRUUQhQESDQoIVkFQT1JFT04QhgESDAoHSk9MVEVPThCHARIMCgdGTEFS",
+            "RU9OEIgBEgwKB1BPUllHT04QiQESDAoHT01BTllURRCKARIMCgdPTUFTVEFS",
+            "EIsBEgsKBktBQlVUTxCMARINCghLQUJVVE9QUxCNARIPCgpBRVJPREFDVFlM",
+            "EI4BEgwKB1NOT1JMQVgQjwESDQoIQVJUSUNVTk8QkAESCwoGWkFQRE9TEJEB",
+            "EgwKB01PTFRSRVMQkgESDAoHRFJBVElOSRCTARIOCglEUkFHT05BSVIQlAES",
+            "DgoJRFJBR09OSVRFEJUBEgsKBk1FV1RXTxCWARIICgNNRVcQlwEqHgoGR2Vu",
+            "ZGVyEggKBE1BTEUQABIKCgZGRU1BTEUQASqUAQoTSG9sb0lhcEl0ZW1DYXRl",
+            "Z29yeRIVChFJQVBfQ0FURUdPUllfTk9ORRAAEhcKE0lBUF9DQVRFR09SWV9C",
+            "VU5ETEUQARIWChJJQVBfQ0FURUdPUllfSVRFTVMQAhIZChVJQVBfQ0FURUdP",
+            "UllfVVBHUkFERVMQAxIaChZJQVBfQ0FURUdPUllfUE9LRUNPSU5TEAQq1gIK",
+            "DEl0ZW1DYXRlZ29yeRIWChJJVEVNX0NBVEVHT1JZX05PTkUQABIaChZJVEVN",
+            "X0NBVEVHT1JZX1BPS0VCQUxMEAESFgoSSVRFTV9DQVRFR09SWV9GT09EEAIS",
+            "GgoWSVRFTV9DQVRFR09SWV9NRURJQ0lORRADEhcKE0lURU1fQ0FURUdPUllf",
+            "Qk9PU1QQBBIaChZJVEVNX0NBVEVHT1JZX1VUSUxJVEVTEAUSGAoUSVRFTV9D",
+            "QVRFR09SWV9DQU1FUkEQBhIWChJJVEVNX0NBVEVHT1JZX0RJU0sQBxIbChdJ",
+            "VEVNX0NBVEVHT1JZX0lOQ1VCQVRPUhAIEhkKFUlURU1fQ0FURUdPUllfSU5D",
+            "RU5TRRAJEhoKFklURU1fQ0FURUdPUllfWFBfQk9PU1QQChIjCh9JVEVNX0NB",
+            "VEVHT1JZX0lOVkVOVE9SWV9VUEdSQURFEAtiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.ItemEffect), typeof(global::POGOProtos.Enums.BadgeType), typeof(global::POGOProtos.Enums.PokemonType), typeof(global::POGOProtos.Enums.TutorialState), typeof(global::POGOProtos.Enums.CameraTarget), typeof(global::POGOProtos.Enums.CameraInterpolation), typeof(global::POGOProtos.Enums.Platform), typeof(global::POGOProtos.Enums.TeamColor), typeof(global::POGOProtos.Enums.PokemonMove), typeof(global::POGOProtos.Enums.PokemonRarity), typeof(global::POGOProtos.Enums.PokemonMovementType), typeof(global::POGOProtos.Enums.PokemonFamilyId), typeof(global::POGOProtos.Enums.ActivityType), typeof(global::POGOProtos.Enums.PokemonId), typeof(global::POGOProtos.Enums.Gender), typeof(global::POGOProtos.Enums.HoloIapItemCategory), typeof(global::POGOProtos.Enums.ItemCategory), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ItemEffect {
+    [pbr::OriginalName("ITEM_EFFECT_NONE")] None = 0,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_NO_FLEE")] CapNoFlee = 1000,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_NO_MOVEMENT")] CapNoMovement = 1002,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_NO_THREAT")] CapNoThreat = 1003,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_TARGET_MAX")] CapTargetMax = 1004,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_TARGET_SLOW")] CapTargetSlow = 1005,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_NIGHT")] CapChanceNight = 1006,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_TRAINER")] CapChanceTrainer = 1007,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_FIRST_THROW")] CapChanceFirstThrow = 1008,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_LEGEND")] CapChanceLegend = 1009,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_HEAVY")] CapChanceHeavy = 1010,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_REPEAT")] CapChanceRepeat = 1011,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_MULTI_THROW")] CapChanceMultiThrow = 1012,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_ALWAYS")] CapChanceAlways = 1013,
+    [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_SINGLE_THROW")] CapChanceSingleThrow = 1014,
+  }
+
+  public enum BadgeType {
+    [pbr::OriginalName("BADGE_UNSET")] BadgeUnset = 0,
+    [pbr::OriginalName("BADGE_TRAVEL_KM")] BadgeTravelKm = 1,
+    [pbr::OriginalName("BADGE_POKEDEX_ENTRIES")] BadgePokedexEntries = 2,
+    [pbr::OriginalName("BADGE_CAPTURE_TOTAL")] BadgeCaptureTotal = 3,
+    [pbr::OriginalName("BADGE_DEFEATED_FORT")] BadgeDefeatedFort = 4,
+    [pbr::OriginalName("BADGE_EVOLVED_TOTAL")] BadgeEvolvedTotal = 5,
+    [pbr::OriginalName("BADGE_HATCHED_TOTAL")] BadgeHatchedTotal = 6,
+    [pbr::OriginalName("BADGE_ENCOUNTERED_TOTAL")] BadgeEncounteredTotal = 7,
+    [pbr::OriginalName("BADGE_POKESTOPS_VISITED")] BadgePokestopsVisited = 8,
+    [pbr::OriginalName("BADGE_UNIQUE_POKESTOPS")] BadgeUniquePokestops = 9,
+    [pbr::OriginalName("BADGE_POKEBALL_THROWN")] BadgePokeballThrown = 10,
+    [pbr::OriginalName("BADGE_BIG_MAGIKARP")] BadgeBigMagikarp = 11,
+    [pbr::OriginalName("BADGE_DEPLOYED_TOTAL")] BadgeDeployedTotal = 12,
+    [pbr::OriginalName("BADGE_BATTLE_ATTACK_WON")] BadgeBattleAttackWon = 13,
+    [pbr::OriginalName("BADGE_BATTLE_TRAINING_WON")] BadgeBattleTrainingWon = 14,
+    [pbr::OriginalName("BADGE_BATTLE_DEFEND_WON")] BadgeBattleDefendWon = 15,
+    [pbr::OriginalName("BADGE_PRESTIGE_RAISED")] BadgePrestigeRaised = 16,
+    [pbr::OriginalName("BADGE_PRESTIGE_DROPPED")] BadgePrestigeDropped = 17,
+    [pbr::OriginalName("BADGE_TYPE_NORMAL")] Normal = 18,
+    [pbr::OriginalName("BADGE_TYPE_FIGHTING")] Fighting = 19,
+    [pbr::OriginalName("BADGE_TYPE_FLYING")] Flying = 20,
+    [pbr::OriginalName("BADGE_TYPE_POISON")] Poison = 21,
+    [pbr::OriginalName("BADGE_TYPE_GROUND")] Ground = 22,
+    [pbr::OriginalName("BADGE_TYPE_ROCK")] Rock = 23,
+    [pbr::OriginalName("BADGE_TYPE_BUG")] Bug = 24,
+    [pbr::OriginalName("BADGE_TYPE_GHOST")] Ghost = 25,
+    [pbr::OriginalName("BADGE_TYPE_STEEL")] Steel = 26,
+    [pbr::OriginalName("BADGE_TYPE_FIRE")] Fire = 27,
+    [pbr::OriginalName("BADGE_TYPE_WATER")] Water = 28,
+    [pbr::OriginalName("BADGE_TYPE_GRASS")] Grass = 29,
+    [pbr::OriginalName("BADGE_TYPE_ELECTRIC")] Electric = 30,
+    [pbr::OriginalName("BADGE_TYPE_PSYCHIC")] Psychic = 31,
+    [pbr::OriginalName("BADGE_TYPE_ICE")] Ice = 32,
+    [pbr::OriginalName("BADGE_TYPE_DRAGON")] Dragon = 33,
+    [pbr::OriginalName("BADGE_TYPE_DARK")] Dark = 34,
+    [pbr::OriginalName("BADGE_TYPE_FAIRY")] Fairy = 35,
+    [pbr::OriginalName("BADGE_SMALL_RATTATA")] BadgeSmallRattata = 36,
+    [pbr::OriginalName("BADGE_PIKACHU")] BadgePikachu = 37,
+  }
+
+  public enum PokemonType {
+    [pbr::OriginalName("POKEMON_TYPE_NONE")] None = 0,
+    [pbr::OriginalName("POKEMON_TYPE_NORMAL")] Normal = 1,
+    [pbr::OriginalName("POKEMON_TYPE_FIGHTING")] Fighting = 2,
+    [pbr::OriginalName("POKEMON_TYPE_FLYING")] Flying = 3,
+    [pbr::OriginalName("POKEMON_TYPE_POISON")] Poison = 4,
+    [pbr::OriginalName("POKEMON_TYPE_GROUND")] Ground = 5,
+    [pbr::OriginalName("POKEMON_TYPE_ROCK")] Rock = 6,
+    [pbr::OriginalName("POKEMON_TYPE_BUG")] Bug = 7,
+    [pbr::OriginalName("POKEMON_TYPE_GHOST")] Ghost = 8,
+    [pbr::OriginalName("POKEMON_TYPE_STEEL")] Steel = 9,
+    [pbr::OriginalName("POKEMON_TYPE_FIRE")] Fire = 10,
+    [pbr::OriginalName("POKEMON_TYPE_WATER")] Water = 11,
+    [pbr::OriginalName("POKEMON_TYPE_GRASS")] Grass = 12,
+    [pbr::OriginalName("POKEMON_TYPE_ELECTRIC")] Electric = 13,
+    [pbr::OriginalName("POKEMON_TYPE_PSYCHIC")] Psychic = 14,
+    [pbr::OriginalName("POKEMON_TYPE_ICE")] Ice = 15,
+    [pbr::OriginalName("POKEMON_TYPE_DRAGON")] Dragon = 16,
+    [pbr::OriginalName("POKEMON_TYPE_DARK")] Dark = 17,
+    [pbr::OriginalName("POKEMON_TYPE_FAIRY")] Fairy = 18,
+  }
+
+  public enum TutorialState {
+    [pbr::OriginalName("LEGAL_SCREEN")] LegalScreen = 0,
+    [pbr::OriginalName("AVATAR_SELECTION")] AvatarSelection = 1,
+    [pbr::OriginalName("ACCOUNT_CREATION")] AccountCreation = 2,
+    [pbr::OriginalName("POKEMON_CAPTURE")] PokemonCapture = 3,
+    [pbr::OriginalName("NAME_SELECTION")] NameSelection = 4,
+    [pbr::OriginalName("POKEMON_BERRY")] PokemonBerry = 5,
+    [pbr::OriginalName("USE_ITEM")] UseItem = 6,
+    [pbr::OriginalName("FIRST_TIME_EXPERIENCE_COMPLETE")] FirstTimeExperienceComplete = 7,
+    [pbr::OriginalName("POKESTOP_TUTORIAL")] PokestopTutorial = 8,
+    [pbr::OriginalName("GYM_TUTORIAL")] GymTutorial = 9,
+  }
+
+  public enum CameraTarget {
+    [pbr::OriginalName("CAM_TARGET_ATTACKER")] CamTargetAttacker = 0,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_EDGE")] CamTargetAttackerEdge = 1,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_GROUND")] CamTargetAttackerGround = 2,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER")] CamTargetDefender = 3,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_EDGE")] CamTargetDefenderEdge = 4,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_GROUND")] CamTargetDefenderGround = 5,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER")] CamTargetAttackerDefender = 6,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_EDGE")] CamTargetAttackerDefenderEdge = 7,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_ATTACKER")] CamTargetDefenderAttacker = 8,
+    [pbr::OriginalName("CAM_TARGET_DEFENDER_ATTACKER_EDGE")] CamTargetDefenderAttackerEdge = 9,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_MIRROR")] CamTargetAttackerDefenderMirror = 11,
+    [pbr::OriginalName("CAM_TARGET_SHOULDER_ATTACKER_DEFENDER")] CamTargetShoulderAttackerDefender = 12,
+    [pbr::OriginalName("CAM_TARGET_SHOULDER_ATTACKER_DEFENDER_MIRROR")] CamTargetShoulderAttackerDefenderMirror = 13,
+    [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_WORLD")] CamTargetAttackerDefenderWorld = 14,
+  }
+
+  public enum CameraInterpolation {
+    [pbr::OriginalName("CAM_INTERP_CUT")] CamInterpCut = 0,
+    [pbr::OriginalName("CAM_INTERP_LINEAR")] CamInterpLinear = 1,
+    [pbr::OriginalName("CAM_INTERP_SMOOTH")] CamInterpSmooth = 2,
+    [pbr::OriginalName("CAM_INTERP_SMOOTH_ROT_LINEAR_MOVE")] CamInterpSmoothRotLinearMove = 3,
+    [pbr::OriginalName("CAM_INTERP_DEPENDS")] CamInterpDepends = 4,
+  }
+
+  public enum Platform {
+    [pbr::OriginalName("UNSET")] Unset = 0,
+    [pbr::OriginalName("IOS")] Ios = 1,
+    [pbr::OriginalName("ANDROID")] Android = 2,
+    [pbr::OriginalName("OSX")] Osx = 3,
+    [pbr::OriginalName("WINDOWS")] Windows = 4,
+  }
+
+  public enum TeamColor {
+    [pbr::OriginalName("NEUTRAL")] Neutral = 0,
+    [pbr::OriginalName("BLUE")] Blue = 1,
+    [pbr::OriginalName("RED")] Red = 2,
+    [pbr::OriginalName("YELLOW")] Yellow = 3,
+  }
+
+  public enum PokemonMove {
+    [pbr::OriginalName("MOVE_UNSET")] MoveUnset = 0,
+    [pbr::OriginalName("THUNDER_SHOCK")] ThunderShock = 1,
+    [pbr::OriginalName("QUICK_ATTACK")] QuickAttack = 2,
+    [pbr::OriginalName("SCRATCH")] Scratch = 3,
+    [pbr::OriginalName("EMBER")] Ember = 4,
+    [pbr::OriginalName("VINE_WHIP")] VineWhip = 5,
+    [pbr::OriginalName("TACKLE")] Tackle = 6,
+    [pbr::OriginalName("RAZOR_LEAF")] RazorLeaf = 7,
+    [pbr::OriginalName("TAKE_DOWN")] TakeDown = 8,
+    [pbr::OriginalName("WATER_GUN")] WaterGun = 9,
+    [pbr::OriginalName("BITE")] Bite = 10,
+    [pbr::OriginalName("POUND")] Pound = 11,
+    [pbr::OriginalName("DOUBLE_SLAP")] DoubleSlap = 12,
+    [pbr::OriginalName("WRAP")] Wrap = 13,
+    [pbr::OriginalName("HYPER_BEAM")] HyperBeam = 14,
+    [pbr::OriginalName("LICK")] Lick = 15,
+    [pbr::OriginalName("DARK_PULSE")] DarkPulse = 16,
+    [pbr::OriginalName("SMOG")] Smog = 17,
+    [pbr::OriginalName("SLUDGE")] Sludge = 18,
+    [pbr::OriginalName("METAL_CLAW")] MetalClaw = 19,
+    [pbr::OriginalName("VICE_GRIP")] ViceGrip = 20,
+    [pbr::OriginalName("FLAME_WHEEL")] FlameWheel = 21,
+    [pbr::OriginalName("MEGAHORN")] Megahorn = 22,
+    [pbr::OriginalName("WING_ATTACK")] WingAttack = 23,
+    [pbr::OriginalName("FLAMETHROWER")] Flamethrower = 24,
+    [pbr::OriginalName("SUCKER_PUNCH")] SuckerPunch = 25,
+    [pbr::OriginalName("DIG")] Dig = 26,
+    [pbr::OriginalName("LOW_KICK")] LowKick = 27,
+    [pbr::OriginalName("CROSS_CHOP")] CrossChop = 28,
+    [pbr::OriginalName("PSYCHO_CUT")] PsychoCut = 29,
+    [pbr::OriginalName("PSYBEAM")] Psybeam = 30,
+    [pbr::OriginalName("EARTHQUAKE")] Earthquake = 31,
+    [pbr::OriginalName("STONE_EDGE")] StoneEdge = 32,
+    [pbr::OriginalName("ICE_PUNCH")] IcePunch = 33,
+    [pbr::OriginalName("HEART_STAMP")] HeartStamp = 34,
+    [pbr::OriginalName("DISCHARGE")] Discharge = 35,
+    [pbr::OriginalName("FLASH_CANNON")] FlashCannon = 36,
+    [pbr::OriginalName("PECK")] Peck = 37,
+    [pbr::OriginalName("DRILL_PECK")] DrillPeck = 38,
+    [pbr::OriginalName("ICE_BEAM")] IceBeam = 39,
+    [pbr::OriginalName("BLIZZARD")] Blizzard = 40,
+    [pbr::OriginalName("AIR_SLASH")] AirSlash = 41,
+    [pbr::OriginalName("HEAT_WAVE")] HeatWave = 42,
+    [pbr::OriginalName("TWINEEDLE")] Twineedle = 43,
+    [pbr::OriginalName("POISON_JAB")] PoisonJab = 44,
+    [pbr::OriginalName("AERIAL_ACE")] AerialAce = 45,
+    [pbr::OriginalName("DRILL_RUN")] DrillRun = 46,
+    [pbr::OriginalName("PETAL_BLIZZARD")] PetalBlizzard = 47,
+    [pbr::OriginalName("MEGA_DRAIN")] MegaDrain = 48,
+    [pbr::OriginalName("BUG_BUZZ")] BugBuzz = 49,
+    [pbr::OriginalName("POISON_FANG")] PoisonFang = 50,
+    [pbr::OriginalName("NIGHT_SLASH")] NightSlash = 51,
+    [pbr::OriginalName("SLASH")] Slash = 52,
+    [pbr::OriginalName("BUBBLE_BEAM")] BubbleBeam = 53,
+    [pbr::OriginalName("SUBMISSION")] Submission = 54,
+    [pbr::OriginalName("KARATE_CHOP")] KarateChop = 55,
+    [pbr::OriginalName("LOW_SWEEP")] LowSweep = 56,
+    [pbr::OriginalName("AQUA_JET")] AquaJet = 57,
+    [pbr::OriginalName("AQUA_TAIL")] AquaTail = 58,
+    [pbr::OriginalName("SEED_BOMB")] SeedBomb = 59,
+    [pbr::OriginalName("PSYSHOCK")] Psyshock = 60,
+    [pbr::OriginalName("ROCK_THROW")] RockThrow = 61,
+    [pbr::OriginalName("ANCIENT_POWER")] AncientPower = 62,
+    [pbr::OriginalName("ROCK_TOMB")] RockTomb = 63,
+    [pbr::OriginalName("ROCK_SLIDE")] RockSlide = 64,
+    [pbr::OriginalName("POWER_GEM")] PowerGem = 65,
+    [pbr::OriginalName("SHADOW_SNEAK")] ShadowSneak = 66,
+    [pbr::OriginalName("SHADOW_PUNCH")] ShadowPunch = 67,
+    [pbr::OriginalName("SHADOW_CLAW")] ShadowClaw = 68,
+    [pbr::OriginalName("OMINOUS_WIND")] OminousWind = 69,
+    [pbr::OriginalName("SHADOW_BALL")] ShadowBall = 70,
+    [pbr::OriginalName("BULLET_PUNCH")] BulletPunch = 71,
+    [pbr::OriginalName("MAGNET_BOMB")] MagnetBomb = 72,
+    [pbr::OriginalName("STEEL_WING")] SteelWing = 73,
+    [pbr::OriginalName("IRON_HEAD")] IronHead = 74,
+    [pbr::OriginalName("PARABOLIC_CHARGE")] ParabolicCharge = 75,
+    [pbr::OriginalName("SPARK")] Spark = 76,
+    [pbr::OriginalName("THUNDER_PUNCH")] ThunderPunch = 77,
+    [pbr::OriginalName("THUNDER")] Thunder = 78,
+    [pbr::OriginalName("THUNDERBOLT")] Thunderbolt = 79,
+    [pbr::OriginalName("TWISTER")] Twister = 80,
+    [pbr::OriginalName("DRAGON_BREATH")] DragonBreath = 81,
+    [pbr::OriginalName("DRAGON_PULSE")] DragonPulse = 82,
+    [pbr::OriginalName("DRAGON_CLAW")] DragonClaw = 83,
+    [pbr::OriginalName("DISARMING_VOICE")] DisarmingVoice = 84,
+    [pbr::OriginalName("DRAINING_KISS")] DrainingKiss = 85,
+    [pbr::OriginalName("DAZZLING_GLEAM")] DazzlingGleam = 86,
+    [pbr::OriginalName("MOONBLAST")] Moonblast = 87,
+    [pbr::OriginalName("PLAY_ROUGH")] PlayRough = 88,
+    [pbr::OriginalName("CROSS_POISON")] CrossPoison = 89,
+    [pbr::OriginalName("SLUDGE_BOMB")] SludgeBomb = 90,
+    [pbr::OriginalName("SLUDGE_WAVE")] SludgeWave = 91,
+    [pbr::OriginalName("GUNK_SHOT")] GunkShot = 92,
+    [pbr::OriginalName("MUD_SHOT")] MudShot = 93,
+    [pbr::OriginalName("BONE_CLUB")] BoneClub = 94,
+    [pbr::OriginalName("BULLDOZE")] Bulldoze = 95,
+    [pbr::OriginalName("MUD_BOMB")] MudBomb = 96,
+    [pbr::OriginalName("FURY_CUTTER")] FuryCutter = 97,
+    [pbr::OriginalName("BUG_BITE")] BugBite = 98,
+    [pbr::OriginalName("SIGNAL_BEAM")] SignalBeam = 99,
+    [pbr::OriginalName("X_SCISSOR")] XScissor = 100,
+    [pbr::OriginalName("FLAME_CHARGE")] FlameCharge = 101,
+    [pbr::OriginalName("FLAME_BURST")] FlameBurst = 102,
+    [pbr::OriginalName("FIRE_BLAST")] FireBlast = 103,
+    [pbr::OriginalName("BRINE")] Brine = 104,
+    [pbr::OriginalName("WATER_PULSE")] WaterPulse = 105,
+    [pbr::OriginalName("SCALD")] Scald = 106,
+    [pbr::OriginalName("HYDRO_PUMP")] HydroPump = 107,
+    [pbr::OriginalName("PSYCHIC")] Psychic = 108,
+    [pbr::OriginalName("PSYSTRIKE")] Psystrike = 109,
+    [pbr::OriginalName("ICE_SHARD")] IceShard = 110,
+    [pbr::OriginalName("ICY_WIND")] IcyWind = 111,
+    [pbr::OriginalName("FROST_BREATH")] FrostBreath = 112,
+    [pbr::OriginalName("ABSORB")] Absorb = 113,
+    [pbr::OriginalName("GIGA_DRAIN")] GigaDrain = 114,
+    [pbr::OriginalName("FIRE_PUNCH")] FirePunch = 115,
+    [pbr::OriginalName("SOLAR_BEAM")] SolarBeam = 116,
+    [pbr::OriginalName("LEAF_BLADE")] LeafBlade = 117,
+    [pbr::OriginalName("POWER_WHIP")] PowerWhip = 118,
+    [pbr::OriginalName("SPLASH")] Splash = 119,
+    [pbr::OriginalName("ACID")] Acid = 120,
+    [pbr::OriginalName("AIR_CUTTER")] AirCutter = 121,
+    [pbr::OriginalName("HURRICANE")] Hurricane = 122,
+    [pbr::OriginalName("BRICK_BREAK")] BrickBreak = 123,
+    [pbr::OriginalName("CUT")] Cut = 124,
+    [pbr::OriginalName("SWIFT")] Swift = 125,
+    [pbr::OriginalName("HORN_ATTACK")] HornAttack = 126,
+    [pbr::OriginalName("STOMP")] Stomp = 127,
+    [pbr::OriginalName("HEADBUTT")] Headbutt = 128,
+    [pbr::OriginalName("HYPER_FANG")] HyperFang = 129,
+    [pbr::OriginalName("SLAM")] Slam = 130,
+    [pbr::OriginalName("BODY_SLAM")] BodySlam = 131,
+    [pbr::OriginalName("REST")] Rest = 132,
+    [pbr::OriginalName("STRUGGLE")] Struggle = 133,
+    [pbr::OriginalName("SCALD_BLASTOISE")] ScaldBlastoise = 134,
+    [pbr::OriginalName("HYDRO_PUMP_BLASTOISE")] HydroPumpBlastoise = 135,
+    [pbr::OriginalName("WRAP_GREEN")] WrapGreen = 136,
+    [pbr::OriginalName("WRAP_PINK")] WrapPink = 137,
+    [pbr::OriginalName("FURY_CUTTER_FAST")] FuryCutterFast = 200,
+    [pbr::OriginalName("BUG_BITE_FAST")] BugBiteFast = 201,
+    [pbr::OriginalName("BITE_FAST")] BiteFast = 202,
+    [pbr::OriginalName("SUCKER_PUNCH_FAST")] SuckerPunchFast = 203,
+    [pbr::OriginalName("DRAGON_BREATH_FAST")] DragonBreathFast = 204,
+    [pbr::OriginalName("THUNDER_SHOCK_FAST")] ThunderShockFast = 205,
+    [pbr::OriginalName("SPARK_FAST")] SparkFast = 206,
+    [pbr::OriginalName("LOW_KICK_FAST")] LowKickFast = 207,
+    [pbr::OriginalName("KARATE_CHOP_FAST")] KarateChopFast = 208,
+    [pbr::OriginalName("EMBER_FAST")] EmberFast = 209,
+    [pbr::OriginalName("WING_ATTACK_FAST")] WingAttackFast = 210,
+    [pbr::OriginalName("PECK_FAST")] PeckFast = 211,
+    [pbr::OriginalName("LICK_FAST")] LickFast = 212,
+    [pbr::OriginalName("SHADOW_CLAW_FAST")] ShadowClawFast = 213,
+    [pbr::OriginalName("VINE_WHIP_FAST")] VineWhipFast = 214,
+    [pbr::OriginalName("RAZOR_LEAF_FAST")] RazorLeafFast = 215,
+    [pbr::OriginalName("MUD_SHOT_FAST")] MudShotFast = 216,
+    [pbr::OriginalName("ICE_SHARD_FAST")] IceShardFast = 217,
+    [pbr::OriginalName("FROST_BREATH_FAST")] FrostBreathFast = 218,
+    [pbr::OriginalName("QUICK_ATTACK_FAST")] QuickAttackFast = 219,
+    [pbr::OriginalName("SCRATCH_FAST")] ScratchFast = 220,
+    [pbr::OriginalName("TACKLE_FAST")] TackleFast = 221,
+    [pbr::OriginalName("POUND_FAST")] PoundFast = 222,
+    [pbr::OriginalName("CUT_FAST")] CutFast = 223,
+    [pbr::OriginalName("POISON_JAB_FAST")] PoisonJabFast = 224,
+    [pbr::OriginalName("ACID_FAST")] AcidFast = 225,
+    [pbr::OriginalName("PSYCHO_CUT_FAST")] PsychoCutFast = 226,
+    [pbr::OriginalName("ROCK_THROW_FAST")] RockThrowFast = 227,
+    [pbr::OriginalName("METAL_CLAW_FAST")] MetalClawFast = 228,
+    [pbr::OriginalName("BULLET_PUNCH_FAST")] BulletPunchFast = 229,
+    [pbr::OriginalName("WATER_GUN_FAST")] WaterGunFast = 230,
+    [pbr::OriginalName("SPLASH_FAST")] SplashFast = 231,
+    [pbr::OriginalName("WATER_GUN_FAST_BLASTOISE")] WaterGunFastBlastoise = 232,
+    [pbr::OriginalName("MUD_SLAP_FAST")] MudSlapFast = 233,
+    [pbr::OriginalName("ZEN_HEADBUTT_FAST")] ZenHeadbuttFast = 234,
+    [pbr::OriginalName("CONFUSION_FAST")] ConfusionFast = 235,
+    [pbr::OriginalName("POISON_STING_FAST")] PoisonStingFast = 236,
+    [pbr::OriginalName("BUBBLE_FAST")] BubbleFast = 237,
+    [pbr::OriginalName("FEINT_ATTACK_FAST")] FeintAttackFast = 238,
+    [pbr::OriginalName("STEEL_WING_FAST")] SteelWingFast = 239,
+    [pbr::OriginalName("FIRE_FANG_FAST")] FireFangFast = 240,
+    [pbr::OriginalName("ROCK_SMASH_FAST")] RockSmashFast = 241,
+  }
+
+  public enum PokemonRarity {
+    [pbr::OriginalName("NORMAL")] Normal = 0,
+    [pbr::OriginalName("LEGENDARY")] Legendary = 1,
+    [pbr::OriginalName("MYTHIC")] Mythic = 2,
+  }
+
+  public enum PokemonMovementType {
+    [pbr::OriginalName("MOVEMENT_STATIC")] MovementStatic = 0,
+    [pbr::OriginalName("MOVEMENT_JUMP")] MovementJump = 1,
+    [pbr::OriginalName("MOVEMENT_VERTICAL")] MovementVertical = 2,
+    [pbr::OriginalName("MOVEMENT_PSYCHIC")] MovementPsychic = 3,
+    [pbr::OriginalName("MOVEMENT_ELECTRIC")] MovementElectric = 4,
+    [pbr::OriginalName("MOVEMENT_FLYING")] MovementFlying = 5,
+    [pbr::OriginalName("MOVEMENT_HOVERING")] MovementHovering = 6,
+  }
+
+  public enum PokemonFamilyId {
+    [pbr::OriginalName("FAMILY_UNSET")] FamilyUnset = 0,
+    [pbr::OriginalName("FAMILY_BULBASAUR")] FamilyBulbasaur = 1,
+    [pbr::OriginalName("FAMILY_CHARMANDER")] FamilyCharmander = 4,
+    [pbr::OriginalName("FAMILY_SQUIRTLE")] FamilySquirtle = 7,
+    [pbr::OriginalName("FAMILY_CATERPIE")] FamilyCaterpie = 10,
+    [pbr::OriginalName("FAMILY_WEEDLE")] FamilyWeedle = 13,
+    [pbr::OriginalName("FAMILY_PIDGEY")] FamilyPidgey = 16,
+    [pbr::OriginalName("FAMILY_RATTATA")] FamilyRattata = 19,
+    [pbr::OriginalName("FAMILY_SPEAROW")] FamilySpearow = 21,
+    [pbr::OriginalName("FAMILY_EKANS")] FamilyEkans = 23,
+    [pbr::OriginalName("FAMILY_PIKACHU")] FamilyPikachu = 25,
+    [pbr::OriginalName("FAMILY_SANDSHREW")] FamilySandshrew = 27,
+    [pbr::OriginalName("FAMILY_NIDORAN_FEMALE")] FamilyNidoranFemale = 29,
+    [pbr::OriginalName("FAMILY_NIDORAN_MALE")] FamilyNidoranMale = 32,
+    [pbr::OriginalName("FAMILY_CLEFAIRY")] FamilyClefairy = 35,
+    [pbr::OriginalName("FAMILY_VULPIX")] FamilyVulpix = 37,
+    [pbr::OriginalName("FAMILY_JIGGLYPUFF")] FamilyJigglypuff = 39,
+    [pbr::OriginalName("FAMILY_ZUBAT")] FamilyZubat = 41,
+    [pbr::OriginalName("FAMILY_ODDISH")] FamilyOddish = 43,
+    [pbr::OriginalName("FAMILY_PARAS")] FamilyParas = 46,
+    [pbr::OriginalName("FAMILY_VENONAT")] FamilyVenonat = 48,
+    [pbr::OriginalName("FAMILY_DIGLETT")] FamilyDiglett = 50,
+    [pbr::OriginalName("FAMILY_MEOWTH")] FamilyMeowth = 52,
+    [pbr::OriginalName("FAMILY_PSYDUCK")] FamilyPsyduck = 54,
+    [pbr::OriginalName("FAMILY_MANKEY")] FamilyMankey = 56,
+    [pbr::OriginalName("FAMILY_GROWLITHE")] FamilyGrowlithe = 58,
+    [pbr::OriginalName("FAMILY_POLIWAG")] FamilyPoliwag = 60,
+    [pbr::OriginalName("FAMILY_ABRA")] FamilyAbra = 63,
+    [pbr::OriginalName("FAMILY_MACHOP")] FamilyMachop = 66,
+    [pbr::OriginalName("FAMILY_BELLSPROUT")] FamilyBellsprout = 69,
+    [pbr::OriginalName("FAMILY_TENTACOOL")] FamilyTentacool = 72,
+    [pbr::OriginalName("FAMILY_GEODUDE")] FamilyGeodude = 74,
+    [pbr::OriginalName("FAMILY_PONYTA")] FamilyPonyta = 77,
+    [pbr::OriginalName("FAMILY_SLOWPOKE")] FamilySlowpoke = 79,
+    [pbr::OriginalName("FAMILY_MAGNEMITE")] FamilyMagnemite = 81,
+    [pbr::OriginalName("FAMILY_FARFETCHD")] FamilyFarfetchd = 83,
+    [pbr::OriginalName("FAMILY_DODUO")] FamilyDoduo = 84,
+    [pbr::OriginalName("FAMILY_SEEL")] FamilySeel = 86,
+    [pbr::OriginalName("FAMILY_GRIMER")] FamilyGrimer = 88,
+    [pbr::OriginalName("FAMILY_SHELLDER")] FamilyShellder = 90,
+    [pbr::OriginalName("FAMILY_GASTLY")] FamilyGastly = 92,
+    [pbr::OriginalName("FAMILY_ONIX")] FamilyOnix = 95,
+    [pbr::OriginalName("FAMILY_DROWZEE")] FamilyDrowzee = 96,
+    [pbr::OriginalName("FAMILY_HYPNO")] FamilyHypno = 97,
+    [pbr::OriginalName("FAMILY_KRABBY")] FamilyKrabby = 98,
+    [pbr::OriginalName("FAMILY_VOLTORB")] FamilyVoltorb = 100,
+    [pbr::OriginalName("FAMILY_EXEGGCUTE")] FamilyExeggcute = 102,
+    [pbr::OriginalName("FAMILY_CUBONE")] FamilyCubone = 104,
+    [pbr::OriginalName("FAMILY_HITMONLEE")] FamilyHitmonlee = 106,
+    [pbr::OriginalName("FAMILY_HITMONCHAN")] FamilyHitmonchan = 107,
+    [pbr::OriginalName("FAMILY_LICKITUNG")] FamilyLickitung = 108,
+    [pbr::OriginalName("FAMILY_KOFFING")] FamilyKoffing = 109,
+    [pbr::OriginalName("FAMILY_RHYHORN")] FamilyRhyhorn = 111,
+    [pbr::OriginalName("FAMILY_CHANSEY")] FamilyChansey = 113,
+    [pbr::OriginalName("FAMILY_TANGELA")] FamilyTangela = 114,
+    [pbr::OriginalName("FAMILY_KANGASKHAN")] FamilyKangaskhan = 115,
+    [pbr::OriginalName("FAMILY_HORSEA")] FamilyHorsea = 116,
+    [pbr::OriginalName("FAMILY_GOLDEEN")] FamilyGoldeen = 118,
+    [pbr::OriginalName("FAMILY_STARYU")] FamilyStaryu = 120,
+    [pbr::OriginalName("FAMILY_MR_MIME")] FamilyMrMime = 122,
+    [pbr::OriginalName("FAMILY_SCYTHER")] FamilyScyther = 123,
+    [pbr::OriginalName("FAMILY_JYNX")] FamilyJynx = 124,
+    [pbr::OriginalName("FAMILY_ELECTABUZZ")] FamilyElectabuzz = 125,
+    [pbr::OriginalName("FAMILY_MAGMAR")] FamilyMagmar = 126,
+    [pbr::OriginalName("FAMILY_PINSIR")] FamilyPinsir = 127,
+    [pbr::OriginalName("FAMILY_TAUROS")] FamilyTauros = 128,
+    [pbr::OriginalName("FAMILY_MAGIKARP")] FamilyMagikarp = 129,
+    [pbr::OriginalName("FAMILY_LAPRAS")] FamilyLapras = 131,
+    [pbr::OriginalName("FAMILY_DITTO")] FamilyDitto = 132,
+    [pbr::OriginalName("FAMILY_EEVEE")] FamilyEevee = 133,
+    [pbr::OriginalName("FAMILY_PORYGON")] FamilyPorygon = 137,
+    [pbr::OriginalName("FAMILY_OMANYTE")] FamilyOmanyte = 138,
+    [pbr::OriginalName("FAMILY_KABUTO")] FamilyKabuto = 140,
+    [pbr::OriginalName("FAMILY_AERODACTYL")] FamilyAerodactyl = 142,
+    [pbr::OriginalName("FAMILY_SNORLAX")] FamilySnorlax = 143,
+    [pbr::OriginalName("FAMILY_ARTICUNO")] FamilyArticuno = 144,
+    [pbr::OriginalName("FAMILY_ZAPDOS")] FamilyZapdos = 145,
+    [pbr::OriginalName("FAMILY_MOLTRES")] FamilyMoltres = 146,
+    [pbr::OriginalName("FAMILY_DRATINI")] FamilyDratini = 147,
+    [pbr::OriginalName("FAMILY_MEWTWO")] FamilyMewtwo = 150,
+    [pbr::OriginalName("FAMILY_MEW")] FamilyMew = 151,
+  }
+
+  public enum ActivityType {
+    [pbr::OriginalName("ACTIVITY_UNKNOWN")] ActivityUnknown = 0,
+    [pbr::OriginalName("ACTIVITY_CATCH_POKEMON")] ActivityCatchPokemon = 1,
+    [pbr::OriginalName("ACTIVITY_CATCH_LEGEND_POKEMON")] ActivityCatchLegendPokemon = 2,
+    [pbr::OriginalName("ACTIVITY_FLEE_POKEMON")] ActivityFleePokemon = 3,
+    [pbr::OriginalName("ACTIVITY_DEFEAT_FORT")] ActivityDefeatFort = 4,
+    [pbr::OriginalName("ACTIVITY_EVOLVE_POKEMON")] ActivityEvolvePokemon = 5,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG")] ActivityHatchEgg = 6,
+    [pbr::OriginalName("ACTIVITY_WALK_KM")] ActivityWalkKm = 7,
+    [pbr::OriginalName("ACTIVITY_POKEDEX_ENTRY_NEW")] ActivityPokedexEntryNew = 8,
+    [pbr::OriginalName("ACTIVITY_CATCH_FIRST_THROW")] ActivityCatchFirstThrow = 9,
+    [pbr::OriginalName("ACTIVITY_CATCH_NICE_THROW")] ActivityCatchNiceThrow = 10,
+    [pbr::OriginalName("ACTIVITY_CATCH_GREAT_THROW")] ActivityCatchGreatThrow = 11,
+    [pbr::OriginalName("ACTIVITY_CATCH_EXCELLENT_THROW")] ActivityCatchExcellentThrow = 12,
+    [pbr::OriginalName("ACTIVITY_CATCH_CURVEBALL")] ActivityCatchCurveball = 13,
+    [pbr::OriginalName("ACTIVITY_CATCH_FIRST_CATCH_OF_DAY")] ActivityCatchFirstCatchOfDay = 14,
+    [pbr::OriginalName("ACTIVITY_CATCH_MILESTONE")] ActivityCatchMilestone = 15,
+    [pbr::OriginalName("ACTIVITY_TRAIN_POKEMON")] ActivityTrainPokemon = 16,
+    [pbr::OriginalName("ACTIVITY_SEARCH_FORT")] ActivitySearchFort = 17,
+    [pbr::OriginalName("ACTIVITY_RELEASE_POKEMON")] ActivityReleasePokemon = 18,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG_SMALL_BONUS")] ActivityHatchEggSmallBonus = 19,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG_MEDIUM_BONUS")] ActivityHatchEggMediumBonus = 20,
+    [pbr::OriginalName("ACTIVITY_HATCH_EGG_LARGE_BONUS")] ActivityHatchEggLargeBonus = 21,
+    [pbr::OriginalName("ACTIVITY_DEFEAT_GYM_DEFENDER")] ActivityDefeatGymDefender = 22,
+    [pbr::OriginalName("ACTIVITY_DEFEAT_GYM_LEADER")] ActivityDefeatGymLeader = 23,
+  }
+
+  public enum PokemonId {
+    [pbr::OriginalName("MISSINGNO")] Missingno = 0,
+    [pbr::OriginalName("BULBASAUR")] Bulbasaur = 1,
+    [pbr::OriginalName("IVYSAUR")] Ivysaur = 2,
+    [pbr::OriginalName("VENUSAUR")] Venusaur = 3,
+    [pbr::OriginalName("CHARMANDER")] Charmander = 4,
+    [pbr::OriginalName("CHARMELEON")] Charmeleon = 5,
+    [pbr::OriginalName("CHARIZARD")] Charizard = 6,
+    [pbr::OriginalName("SQUIRTLE")] Squirtle = 7,
+    [pbr::OriginalName("WARTORTLE")] Wartortle = 8,
+    [pbr::OriginalName("BLASTOISE")] Blastoise = 9,
+    [pbr::OriginalName("CATERPIE")] Caterpie = 10,
+    [pbr::OriginalName("METAPOD")] Metapod = 11,
+    [pbr::OriginalName("BUTTERFREE")] Butterfree = 12,
+    [pbr::OriginalName("WEEDLE")] Weedle = 13,
+    [pbr::OriginalName("KAKUNA")] Kakuna = 14,
+    [pbr::OriginalName("BEEDRILL")] Beedrill = 15,
+    [pbr::OriginalName("PIDGEY")] Pidgey = 16,
+    [pbr::OriginalName("PIDGEOTTO")] Pidgeotto = 17,
+    [pbr::OriginalName("PIDGEOT")] Pidgeot = 18,
+    [pbr::OriginalName("RATTATA")] Rattata = 19,
+    [pbr::OriginalName("RATICATE")] Raticate = 20,
+    [pbr::OriginalName("SPEAROW")] Spearow = 21,
+    [pbr::OriginalName("FEAROW")] Fearow = 22,
+    [pbr::OriginalName("EKANS")] Ekans = 23,
+    [pbr::OriginalName("ARBOK")] Arbok = 24,
+    [pbr::OriginalName("PIKACHU")] Pikachu = 25,
+    [pbr::OriginalName("RAICHU")] Raichu = 26,
+    [pbr::OriginalName("SANDSHREW")] Sandshrew = 27,
+    [pbr::OriginalName("SANDSLASH")] Sandslash = 28,
+    [pbr::OriginalName("NIDORAN_FEMALE")] NidoranFemale = 29,
+    [pbr::OriginalName("NIDORINA")] Nidorina = 30,
+    [pbr::OriginalName("NIDOQUEEN")] Nidoqueen = 31,
+    [pbr::OriginalName("NIDORAN_MALE")] NidoranMale = 32,
+    [pbr::OriginalName("NIDORINO")] Nidorino = 33,
+    [pbr::OriginalName("NIDOKING")] Nidoking = 34,
+    [pbr::OriginalName("CLEFAIRY")] Clefairy = 35,
+    [pbr::OriginalName("CLEFABLE")] Clefable = 36,
+    [pbr::OriginalName("VULPIX")] Vulpix = 37,
+    [pbr::OriginalName("NINETALES")] Ninetales = 38,
+    [pbr::OriginalName("JIGGLYPUFF")] Jigglypuff = 39,
+    [pbr::OriginalName("WIGGLYTUFF")] Wigglytuff = 40,
+    [pbr::OriginalName("ZUBAT")] Zubat = 41,
+    [pbr::OriginalName("GOLBAT")] Golbat = 42,
+    [pbr::OriginalName("ODDISH")] Oddish = 43,
+    [pbr::OriginalName("GLOOM")] Gloom = 44,
+    [pbr::OriginalName("VILEPLUME")] Vileplume = 45,
+    [pbr::OriginalName("PARAS")] Paras = 46,
+    [pbr::OriginalName("PARASECT")] Parasect = 47,
+    [pbr::OriginalName("VENONAT")] Venonat = 48,
+    [pbr::OriginalName("VENOMOTH")] Venomoth = 49,
+    [pbr::OriginalName("DIGLETT")] Diglett = 50,
+    [pbr::OriginalName("DUGTRIO")] Dugtrio = 51,
+    [pbr::OriginalName("MEOWTH")] Meowth = 52,
+    [pbr::OriginalName("PERSIAN")] Persian = 53,
+    [pbr::OriginalName("PSYDUCK")] Psyduck = 54,
+    [pbr::OriginalName("GOLDUCK")] Golduck = 55,
+    [pbr::OriginalName("MANKEY")] Mankey = 56,
+    [pbr::OriginalName("PRIMEAPE")] Primeape = 57,
+    [pbr::OriginalName("GROWLITHE")] Growlithe = 58,
+    [pbr::OriginalName("ARCANINE")] Arcanine = 59,
+    [pbr::OriginalName("POLIWAG")] Poliwag = 60,
+    [pbr::OriginalName("POLIWHIRL")] Poliwhirl = 61,
+    [pbr::OriginalName("POLIWRATH")] Poliwrath = 62,
+    [pbr::OriginalName("ABRA")] Abra = 63,
+    [pbr::OriginalName("KADABRA")] Kadabra = 64,
+    [pbr::OriginalName("ALAKAZAM")] Alakazam = 65,
+    [pbr::OriginalName("MACHOP")] Machop = 66,
+    [pbr::OriginalName("MACHOKE")] Machoke = 67,
+    [pbr::OriginalName("MACHAMP")] Machamp = 68,
+    [pbr::OriginalName("BELLSPROUT")] Bellsprout = 69,
+    [pbr::OriginalName("WEEPINBELL")] Weepinbell = 70,
+    [pbr::OriginalName("VICTREEBEL")] Victreebel = 71,
+    [pbr::OriginalName("TENTACOOL")] Tentacool = 72,
+    [pbr::OriginalName("TENTACRUEL")] Tentacruel = 73,
+    [pbr::OriginalName("GEODUDE")] Geodude = 74,
+    [pbr::OriginalName("GRAVELER")] Graveler = 75,
+    [pbr::OriginalName("GOLEM")] Golem = 76,
+    [pbr::OriginalName("PONYTA")] Ponyta = 77,
+    [pbr::OriginalName("RAPIDASH")] Rapidash = 78,
+    [pbr::OriginalName("SLOWPOKE")] Slowpoke = 79,
+    [pbr::OriginalName("SLOWBRO")] Slowbro = 80,
+    [pbr::OriginalName("MAGNEMITE")] Magnemite = 81,
+    [pbr::OriginalName("MAGNETON")] Magneton = 82,
+    [pbr::OriginalName("FARFETCHD")] Farfetchd = 83,
+    [pbr::OriginalName("DODUO")] Doduo = 84,
+    [pbr::OriginalName("DODRIO")] Dodrio = 85,
+    [pbr::OriginalName("SEEL")] Seel = 86,
+    [pbr::OriginalName("DEWGONG")] Dewgong = 87,
+    [pbr::OriginalName("GRIMER")] Grimer = 88,
+    [pbr::OriginalName("MUK")] Muk = 89,
+    [pbr::OriginalName("SHELLDER")] Shellder = 90,
+    [pbr::OriginalName("CLOYSTER")] Cloyster = 91,
+    [pbr::OriginalName("GASTLY")] Gastly = 92,
+    [pbr::OriginalName("HAUNTER")] Haunter = 93,
+    [pbr::OriginalName("GENGAR")] Gengar = 94,
+    [pbr::OriginalName("ONIX")] Onix = 95,
+    [pbr::OriginalName("DROWZEE")] Drowzee = 96,
+    [pbr::OriginalName("HYPNO")] Hypno = 97,
+    [pbr::OriginalName("KRABBY")] Krabby = 98,
+    [pbr::OriginalName("KINGLER")] Kingler = 99,
+    [pbr::OriginalName("VOLTORB")] Voltorb = 100,
+    [pbr::OriginalName("ELECTRODE")] Electrode = 101,
+    [pbr::OriginalName("EXEGGCUTE")] Exeggcute = 102,
+    [pbr::OriginalName("EXEGGUTOR")] Exeggutor = 103,
+    [pbr::OriginalName("CUBONE")] Cubone = 104,
+    [pbr::OriginalName("MAROWAK")] Marowak = 105,
+    [pbr::OriginalName("HITMONLEE")] Hitmonlee = 106,
+    [pbr::OriginalName("HITMONCHAN")] Hitmonchan = 107,
+    [pbr::OriginalName("LICKITUNG")] Lickitung = 108,
+    [pbr::OriginalName("KOFFING")] Koffing = 109,
+    [pbr::OriginalName("WEEZING")] Weezing = 110,
+    [pbr::OriginalName("RHYHORN")] Rhyhorn = 111,
+    [pbr::OriginalName("RHYDON")] Rhydon = 112,
+    [pbr::OriginalName("CHANSEY")] Chansey = 113,
+    [pbr::OriginalName("TANGELA")] Tangela = 114,
+    [pbr::OriginalName("KANGASKHAN")] Kangaskhan = 115,
+    [pbr::OriginalName("HORSEA")] Horsea = 116,
+    [pbr::OriginalName("SEADRA")] Seadra = 117,
+    [pbr::OriginalName("GOLDEEN")] Goldeen = 118,
+    [pbr::OriginalName("SEAKING")] Seaking = 119,
+    [pbr::OriginalName("STARYU")] Staryu = 120,
+    [pbr::OriginalName("STARMIE")] Starmie = 121,
+    [pbr::OriginalName("MR_MIME")] MrMime = 122,
+    [pbr::OriginalName("SCYTHER")] Scyther = 123,
+    [pbr::OriginalName("JYNX")] Jynx = 124,
+    [pbr::OriginalName("ELECTABUZZ")] Electabuzz = 125,
+    [pbr::OriginalName("MAGMAR")] Magmar = 126,
+    [pbr::OriginalName("PINSIR")] Pinsir = 127,
+    [pbr::OriginalName("TAUROS")] Tauros = 128,
+    [pbr::OriginalName("MAGIKARP")] Magikarp = 129,
+    [pbr::OriginalName("GYARADOS")] Gyarados = 130,
+    [pbr::OriginalName("LAPRAS")] Lapras = 131,
+    [pbr::OriginalName("DITTO")] Ditto = 132,
+    [pbr::OriginalName("EEVEE")] Eevee = 133,
+    [pbr::OriginalName("VAPOREON")] Vaporeon = 134,
+    [pbr::OriginalName("JOLTEON")] Jolteon = 135,
+    [pbr::OriginalName("FLAREON")] Flareon = 136,
+    [pbr::OriginalName("PORYGON")] Porygon = 137,
+    [pbr::OriginalName("OMANYTE")] Omanyte = 138,
+    [pbr::OriginalName("OMASTAR")] Omastar = 139,
+    [pbr::OriginalName("KABUTO")] Kabuto = 140,
+    [pbr::OriginalName("KABUTOPS")] Kabutops = 141,
+    [pbr::OriginalName("AERODACTYL")] Aerodactyl = 142,
+    [pbr::OriginalName("SNORLAX")] Snorlax = 143,
+    [pbr::OriginalName("ARTICUNO")] Articuno = 144,
+    [pbr::OriginalName("ZAPDOS")] Zapdos = 145,
+    [pbr::OriginalName("MOLTRES")] Moltres = 146,
+    [pbr::OriginalName("DRATINI")] Dratini = 147,
+    [pbr::OriginalName("DRAGONAIR")] Dragonair = 148,
+    [pbr::OriginalName("DRAGONITE")] Dragonite = 149,
+    [pbr::OriginalName("MEWTWO")] Mewtwo = 150,
+    [pbr::OriginalName("MEW")] Mew = 151,
+  }
+
+  public enum Gender {
+    [pbr::OriginalName("MALE")] Male = 0,
+    [pbr::OriginalName("FEMALE")] Female = 1,
+  }
+
+  public enum HoloIapItemCategory {
+    [pbr::OriginalName("IAP_CATEGORY_NONE")] IapCategoryNone = 0,
+    [pbr::OriginalName("IAP_CATEGORY_BUNDLE")] IapCategoryBundle = 1,
+    [pbr::OriginalName("IAP_CATEGORY_ITEMS")] IapCategoryItems = 2,
+    [pbr::OriginalName("IAP_CATEGORY_UPGRADES")] IapCategoryUpgrades = 3,
+    [pbr::OriginalName("IAP_CATEGORY_POKECOINS")] IapCategoryPokecoins = 4,
+  }
+
+  public enum ItemCategory {
+    [pbr::OriginalName("ITEM_CATEGORY_NONE")] None = 0,
+    [pbr::OriginalName("ITEM_CATEGORY_POKEBALL")] Pokeball = 1,
+    [pbr::OriginalName("ITEM_CATEGORY_FOOD")] Food = 2,
+    [pbr::OriginalName("ITEM_CATEGORY_MEDICINE")] Medicine = 3,
+    [pbr::OriginalName("ITEM_CATEGORY_BOOST")] Boost = 4,
+    [pbr::OriginalName("ITEM_CATEGORY_UTILITES")] Utilites = 5,
+    [pbr::OriginalName("ITEM_CATEGORY_CAMERA")] Camera = 6,
+    [pbr::OriginalName("ITEM_CATEGORY_DISK")] Disk = 7,
+    [pbr::OriginalName("ITEM_CATEGORY_INCUBATOR")] Incubator = 8,
+    [pbr::OriginalName("ITEM_CATEGORY_INCENSE")] Incense = 9,
+    [pbr::OriginalName("ITEM_CATEGORY_XP_BOOST")] XpBoost = 10,
+    [pbr::OriginalName("ITEM_CATEGORY_INVENTORY_UPGRADE")] InventoryUpgrade = 11,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/Platform.cs b/PokemonGo/POGOProtos/Enums/Platform.cs
new file mode 100644
index 0000000..93a0788
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/Platform.cs
@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/Platform.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/Platform.proto</summary>
+  public static partial class PlatformReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/Platform.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlatformReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch9QT0dPUHJvdG9zL0VudW1zL1BsYXRmb3JtLnByb3RvEhBQT0dPUHJvdG9z",
+            "LkVudW1zKkEKCFBsYXRmb3JtEgkKBVVOU0VUEAASBwoDSU9TEAESCwoHQU5E",
+            "Uk9JRBACEgcKA09TWBADEgsKB1dJTkRPV1MQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.Platform), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum Platform {
+    [pbr::OriginalName("UNSET")] Unset = 0,
+    [pbr::OriginalName("IOS")] Ios = 1,
+    [pbr::OriginalName("ANDROID")] Android = 2,
+    [pbr::OriginalName("OSX")] Osx = 3,
+    [pbr::OriginalName("WINDOWS")] Windows = 4,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/PokemonFamilyId.cs b/PokemonGo/POGOProtos/Enums/PokemonFamilyId.cs
new file mode 100644
index 0000000..3040fba
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/PokemonFamilyId.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/PokemonFamilyId.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/PokemonFamilyId.proto</summary>
+  public static partial class PokemonFamilyIdReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/PokemonFamilyId.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonFamilyIdReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25GYW1pbHlJZC5wcm90bxIQUE9H",
+            "T1Byb3Rvcy5FbnVtcyr6DAoPUG9rZW1vbkZhbWlseUlkEhAKDEZBTUlMWV9V",
+            "TlNFVBAAEhQKEEZBTUlMWV9CVUxCQVNBVVIQARIVChFGQU1JTFlfQ0hBUk1B",
+            "TkRFUhAEEhMKD0ZBTUlMWV9TUVVJUlRMRRAHEhMKD0ZBTUlMWV9DQVRFUlBJ",
+            "RRAKEhEKDUZBTUlMWV9XRUVETEUQDRIRCg1GQU1JTFlfUElER0VZEBASEgoO",
+            "RkFNSUxZX1JBVFRBVEEQExISCg5GQU1JTFlfU1BFQVJPVxAVEhAKDEZBTUlM",
+            "WV9FS0FOUxAXEhIKDkZBTUlMWV9QSUtBQ0hVEBkSFAoQRkFNSUxZX1NBTkRT",
+            "SFJFVxAbEhkKFUZBTUlMWV9OSURPUkFOX0ZFTUFMRRAdEhcKE0ZBTUlMWV9O",
+            "SURPUkFOX01BTEUQIBITCg9GQU1JTFlfQ0xFRkFJUlkQIxIRCg1GQU1JTFlf",
+            "VlVMUElYECUSFQoRRkFNSUxZX0pJR0dMWVBVRkYQJxIQCgxGQU1JTFlfWlVC",
+            "QVQQKRIRCg1GQU1JTFlfT0RESVNIECsSEAoMRkFNSUxZX1BBUkFTEC4SEgoO",
+            "RkFNSUxZX1ZFTk9OQVQQMBISCg5GQU1JTFlfRElHTEVUVBAyEhEKDUZBTUlM",
+            "WV9NRU9XVEgQNBISCg5GQU1JTFlfUFNZRFVDSxA2EhEKDUZBTUlMWV9NQU5L",
+            "RVkQOBIUChBGQU1JTFlfR1JPV0xJVEhFEDoSEgoORkFNSUxZX1BPTElXQUcQ",
+            "PBIPCgtGQU1JTFlfQUJSQRA/EhEKDUZBTUlMWV9NQUNIT1AQQhIVChFGQU1J",
+            "TFlfQkVMTFNQUk9VVBBFEhQKEEZBTUlMWV9URU5UQUNPT0wQSBISCg5GQU1J",
+            "TFlfR0VPRFVERRBKEhEKDUZBTUlMWV9QT05ZVEEQTRITCg9GQU1JTFlfU0xP",
+            "V1BPS0UQTxIUChBGQU1JTFlfTUFHTkVNSVRFEFESFAoQRkFNSUxZX0ZBUkZF",
+            "VENIRBBTEhAKDEZBTUlMWV9ET0RVTxBUEg8KC0ZBTUlMWV9TRUVMEFYSEQoN",
+            "RkFNSUxZX0dSSU1FUhBYEhMKD0ZBTUlMWV9TSEVMTERFUhBaEhEKDUZBTUlM",
+            "WV9HQVNUTFkQXBIPCgtGQU1JTFlfT05JWBBfEhIKDkZBTUlMWV9EUk9XWkVF",
+            "EGASEAoMRkFNSUxZX0hZUE5PEGESEQoNRkFNSUxZX0tSQUJCWRBiEhIKDkZB",
+            "TUlMWV9WT0xUT1JCEGQSFAoQRkFNSUxZX0VYRUdHQ1VURRBmEhEKDUZBTUlM",
+            "WV9DVUJPTkUQaBIUChBGQU1JTFlfSElUTU9OTEVFEGoSFQoRRkFNSUxZX0hJ",
+            "VE1PTkNIQU4QaxIUChBGQU1JTFlfTElDS0lUVU5HEGwSEgoORkFNSUxZX0tP",
+            "RkZJTkcQbRISCg5GQU1JTFlfUkhZSE9SThBvEhIKDkZBTUlMWV9DSEFOU0VZ",
+            "EHESEgoORkFNSUxZX1RBTkdFTEEQchIVChFGQU1JTFlfS0FOR0FTS0hBThBz",
+            "EhEKDUZBTUlMWV9IT1JTRUEQdBISCg5GQU1JTFlfR09MREVFThB2EhEKDUZB",
+            "TUlMWV9TVEFSWVUQeBISCg5GQU1JTFlfTVJfTUlNRRB6EhIKDkZBTUlMWV9T",
+            "Q1lUSEVSEHsSDwoLRkFNSUxZX0pZTlgQfBIVChFGQU1JTFlfRUxFQ1RBQlVa",
+            "WhB9EhEKDUZBTUlMWV9NQUdNQVIQfhIRCg1GQU1JTFlfUElOU0lSEH8SEgoN",
+            "RkFNSUxZX1RBVVJPUxCAARIUCg9GQU1JTFlfTUFHSUtBUlAQgQESEgoNRkFN",
+            "SUxZX0xBUFJBUxCDARIRCgxGQU1JTFlfRElUVE8QhAESEQoMRkFNSUxZX0VF",
+            "VkVFEIUBEhMKDkZBTUlMWV9QT1JZR09OEIkBEhMKDkZBTUlMWV9PTUFOWVRF",
+            "EIoBEhIKDUZBTUlMWV9LQUJVVE8QjAESFgoRRkFNSUxZX0FFUk9EQUNUWUwQ",
+            "jgESEwoORkFNSUxZX1NOT1JMQVgQjwESFAoPRkFNSUxZX0FSVElDVU5PEJAB",
+            "EhIKDUZBTUlMWV9aQVBET1MQkQESEwoORkFNSUxZX01PTFRSRVMQkgESEwoO",
+            "RkFNSUxZX0RSQVRJTkkQkwESEgoNRkFNSUxZX01FV1RXTxCWARIPCgpGQU1J",
+            "TFlfTUVXEJcBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.PokemonFamilyId), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum PokemonFamilyId {
+    [pbr::OriginalName("FAMILY_UNSET")] FamilyUnset = 0,
+    [pbr::OriginalName("FAMILY_BULBASAUR")] FamilyBulbasaur = 1,
+    [pbr::OriginalName("FAMILY_CHARMANDER")] FamilyCharmander = 4,
+    [pbr::OriginalName("FAMILY_SQUIRTLE")] FamilySquirtle = 7,
+    [pbr::OriginalName("FAMILY_CATERPIE")] FamilyCaterpie = 10,
+    [pbr::OriginalName("FAMILY_WEEDLE")] FamilyWeedle = 13,
+    [pbr::OriginalName("FAMILY_PIDGEY")] FamilyPidgey = 16,
+    [pbr::OriginalName("FAMILY_RATTATA")] FamilyRattata = 19,
+    [pbr::OriginalName("FAMILY_SPEAROW")] FamilySpearow = 21,
+    [pbr::OriginalName("FAMILY_EKANS")] FamilyEkans = 23,
+    [pbr::OriginalName("FAMILY_PIKACHU")] FamilyPikachu = 25,
+    [pbr::OriginalName("FAMILY_SANDSHREW")] FamilySandshrew = 27,
+    [pbr::OriginalName("FAMILY_NIDORAN_FEMALE")] FamilyNidoranFemale = 29,
+    [pbr::OriginalName("FAMILY_NIDORAN_MALE")] FamilyNidoranMale = 32,
+    [pbr::OriginalName("FAMILY_CLEFAIRY")] FamilyClefairy = 35,
+    [pbr::OriginalName("FAMILY_VULPIX")] FamilyVulpix = 37,
+    [pbr::OriginalName("FAMILY_JIGGLYPUFF")] FamilyJigglypuff = 39,
+    [pbr::OriginalName("FAMILY_ZUBAT")] FamilyZubat = 41,
+    [pbr::OriginalName("FAMILY_ODDISH")] FamilyOddish = 43,
+    [pbr::OriginalName("FAMILY_PARAS")] FamilyParas = 46,
+    [pbr::OriginalName("FAMILY_VENONAT")] FamilyVenonat = 48,
+    [pbr::OriginalName("FAMILY_DIGLETT")] FamilyDiglett = 50,
+    [pbr::OriginalName("FAMILY_MEOWTH")] FamilyMeowth = 52,
+    [pbr::OriginalName("FAMILY_PSYDUCK")] FamilyPsyduck = 54,
+    [pbr::OriginalName("FAMILY_MANKEY")] FamilyMankey = 56,
+    [pbr::OriginalName("FAMILY_GROWLITHE")] FamilyGrowlithe = 58,
+    [pbr::OriginalName("FAMILY_POLIWAG")] FamilyPoliwag = 60,
+    [pbr::OriginalName("FAMILY_ABRA")] FamilyAbra = 63,
+    [pbr::OriginalName("FAMILY_MACHOP")] FamilyMachop = 66,
+    [pbr::OriginalName("FAMILY_BELLSPROUT")] FamilyBellsprout = 69,
+    [pbr::OriginalName("FAMILY_TENTACOOL")] FamilyTentacool = 72,
+    [pbr::OriginalName("FAMILY_GEODUDE")] FamilyGeodude = 74,
+    [pbr::OriginalName("FAMILY_PONYTA")] FamilyPonyta = 77,
+    [pbr::OriginalName("FAMILY_SLOWPOKE")] FamilySlowpoke = 79,
+    [pbr::OriginalName("FAMILY_MAGNEMITE")] FamilyMagnemite = 81,
+    [pbr::OriginalName("FAMILY_FARFETCHD")] FamilyFarfetchd = 83,
+    [pbr::OriginalName("FAMILY_DODUO")] FamilyDoduo = 84,
+    [pbr::OriginalName("FAMILY_SEEL")] FamilySeel = 86,
+    [pbr::OriginalName("FAMILY_GRIMER")] FamilyGrimer = 88,
+    [pbr::OriginalName("FAMILY_SHELLDER")] FamilyShellder = 90,
+    [pbr::OriginalName("FAMILY_GASTLY")] FamilyGastly = 92,
+    [pbr::OriginalName("FAMILY_ONIX")] FamilyOnix = 95,
+    [pbr::OriginalName("FAMILY_DROWZEE")] FamilyDrowzee = 96,
+    [pbr::OriginalName("FAMILY_HYPNO")] FamilyHypno = 97,
+    [pbr::OriginalName("FAMILY_KRABBY")] FamilyKrabby = 98,
+    [pbr::OriginalName("FAMILY_VOLTORB")] FamilyVoltorb = 100,
+    [pbr::OriginalName("FAMILY_EXEGGCUTE")] FamilyExeggcute = 102,
+    [pbr::OriginalName("FAMILY_CUBONE")] FamilyCubone = 104,
+    [pbr::OriginalName("FAMILY_HITMONLEE")] FamilyHitmonlee = 106,
+    [pbr::OriginalName("FAMILY_HITMONCHAN")] FamilyHitmonchan = 107,
+    [pbr::OriginalName("FAMILY_LICKITUNG")] FamilyLickitung = 108,
+    [pbr::OriginalName("FAMILY_KOFFING")] FamilyKoffing = 109,
+    [pbr::OriginalName("FAMILY_RHYHORN")] FamilyRhyhorn = 111,
+    [pbr::OriginalName("FAMILY_CHANSEY")] FamilyChansey = 113,
+    [pbr::OriginalName("FAMILY_TANGELA")] FamilyTangela = 114,
+    [pbr::OriginalName("FAMILY_KANGASKHAN")] FamilyKangaskhan = 115,
+    [pbr::OriginalName("FAMILY_HORSEA")] FamilyHorsea = 116,
+    [pbr::OriginalName("FAMILY_GOLDEEN")] FamilyGoldeen = 118,
+    [pbr::OriginalName("FAMILY_STARYU")] FamilyStaryu = 120,
+    [pbr::OriginalName("FAMILY_MR_MIME")] FamilyMrMime = 122,
+    [pbr::OriginalName("FAMILY_SCYTHER")] FamilyScyther = 123,
+    [pbr::OriginalName("FAMILY_JYNX")] FamilyJynx = 124,
+    [pbr::OriginalName("FAMILY_ELECTABUZZ")] FamilyElectabuzz = 125,
+    [pbr::OriginalName("FAMILY_MAGMAR")] FamilyMagmar = 126,
+    [pbr::OriginalName("FAMILY_PINSIR")] FamilyPinsir = 127,
+    [pbr::OriginalName("FAMILY_TAUROS")] FamilyTauros = 128,
+    [pbr::OriginalName("FAMILY_MAGIKARP")] FamilyMagikarp = 129,
+    [pbr::OriginalName("FAMILY_LAPRAS")] FamilyLapras = 131,
+    [pbr::OriginalName("FAMILY_DITTO")] FamilyDitto = 132,
+    [pbr::OriginalName("FAMILY_EEVEE")] FamilyEevee = 133,
+    [pbr::OriginalName("FAMILY_PORYGON")] FamilyPorygon = 137,
+    [pbr::OriginalName("FAMILY_OMANYTE")] FamilyOmanyte = 138,
+    [pbr::OriginalName("FAMILY_KABUTO")] FamilyKabuto = 140,
+    [pbr::OriginalName("FAMILY_AERODACTYL")] FamilyAerodactyl = 142,
+    [pbr::OriginalName("FAMILY_SNORLAX")] FamilySnorlax = 143,
+    [pbr::OriginalName("FAMILY_ARTICUNO")] FamilyArticuno = 144,
+    [pbr::OriginalName("FAMILY_ZAPDOS")] FamilyZapdos = 145,
+    [pbr::OriginalName("FAMILY_MOLTRES")] FamilyMoltres = 146,
+    [pbr::OriginalName("FAMILY_DRATINI")] FamilyDratini = 147,
+    [pbr::OriginalName("FAMILY_MEWTWO")] FamilyMewtwo = 150,
+    [pbr::OriginalName("FAMILY_MEW")] FamilyMew = 151,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/PokemonId.cs b/PokemonGo/POGOProtos/Enums/PokemonId.cs
new file mode 100644
index 0000000..2d0cce3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/PokemonId.cs
@@ -0,0 +1,240 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/PokemonId.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/PokemonId.proto</summary>
+  public static partial class PokemonIdReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/PokemonId.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonIdReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiBQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25JZC5wcm90bxIQUE9HT1Byb3Rv",
+            "cy5FbnVtcyqTEAoJUG9rZW1vbklkEg0KCU1JU1NJTkdOTxAAEg0KCUJVTEJB",
+            "U0FVUhABEgsKB0lWWVNBVVIQAhIMCghWRU5VU0FVUhADEg4KCkNIQVJNQU5E",
+            "RVIQBBIOCgpDSEFSTUVMRU9OEAUSDQoJQ0hBUklaQVJEEAYSDAoIU1FVSVJU",
+            "TEUQBxINCglXQVJUT1JUTEUQCBINCglCTEFTVE9JU0UQCRIMCghDQVRFUlBJ",
+            "RRAKEgsKB01FVEFQT0QQCxIOCgpCVVRURVJGUkVFEAwSCgoGV0VFRExFEA0S",
+            "CgoGS0FLVU5BEA4SDAoIQkVFRFJJTEwQDxIKCgZQSURHRVkQEBINCglQSURH",
+            "RU9UVE8QERILCgdQSURHRU9UEBISCwoHUkFUVEFUQRATEgwKCFJBVElDQVRF",
+            "EBQSCwoHU1BFQVJPVxAVEgoKBkZFQVJPVxAWEgkKBUVLQU5TEBcSCQoFQVJC",
+            "T0sQGBILCgdQSUtBQ0hVEBkSCgoGUkFJQ0hVEBoSDQoJU0FORFNIUkVXEBsS",
+            "DQoJU0FORFNMQVNIEBwSEgoOTklET1JBTl9GRU1BTEUQHRIMCghOSURPUklO",
+            "QRAeEg0KCU5JRE9RVUVFThAfEhAKDE5JRE9SQU5fTUFMRRAgEgwKCE5JRE9S",
+            "SU5PECESDAoITklET0tJTkcQIhIMCghDTEVGQUlSWRAjEgwKCENMRUZBQkxF",
+            "ECQSCgoGVlVMUElYECUSDQoJTklORVRBTEVTECYSDgoKSklHR0xZUFVGRhAn",
+            "Eg4KCldJR0dMWVRVRkYQKBIJCgVaVUJBVBApEgoKBkdPTEJBVBAqEgoKBk9E",
+            "RElTSBArEgkKBUdMT09NECwSDQoJVklMRVBMVU1FEC0SCQoFUEFSQVMQLhIM",
+            "CghQQVJBU0VDVBAvEgsKB1ZFTk9OQVQQMBIMCghWRU5PTU9USBAxEgsKB0RJ",
+            "R0xFVFQQMhILCgdEVUdUUklPEDMSCgoGTUVPV1RIEDQSCwoHUEVSU0lBThA1",
+            "EgsKB1BTWURVQ0sQNhILCgdHT0xEVUNLEDcSCgoGTUFOS0VZEDgSDAoIUFJJ",
+            "TUVBUEUQORINCglHUk9XTElUSEUQOhIMCghBUkNBTklORRA7EgsKB1BPTElX",
+            "QUcQPBINCglQT0xJV0hJUkwQPRINCglQT0xJV1JBVEgQPhIICgRBQlJBED8S",
+            "CwoHS0FEQUJSQRBAEgwKCEFMQUtBWkFNEEESCgoGTUFDSE9QEEISCwoHTUFD",
+            "SE9LRRBDEgsKB01BQ0hBTVAQRBIOCgpCRUxMU1BST1VUEEUSDgoKV0VFUElO",
+            "QkVMTBBGEg4KClZJQ1RSRUVCRUwQRxINCglURU5UQUNPT0wQSBIOCgpURU5U",
+            "QUNSVUVMEEkSCwoHR0VPRFVERRBKEgwKCEdSQVZFTEVSEEsSCQoFR09MRU0Q",
+            "TBIKCgZQT05ZVEEQTRIMCghSQVBJREFTSBBOEgwKCFNMT1dQT0tFEE8SCwoH",
+            "U0xPV0JSTxBQEg0KCU1BR05FTUlURRBREgwKCE1BR05FVE9OEFISDQoJRkFS",
+            "RkVUQ0hEEFMSCQoFRE9EVU8QVBIKCgZET0RSSU8QVRIICgRTRUVMEFYSCwoH",
+            "REVXR09ORxBXEgoKBkdSSU1FUhBYEgcKA01VSxBZEgwKCFNIRUxMREVSEFoS",
+            "DAoIQ0xPWVNURVIQWxIKCgZHQVNUTFkQXBILCgdIQVVOVEVSEF0SCgoGR0VO",
+            "R0FSEF4SCAoET05JWBBfEgsKB0RST1daRUUQYBIJCgVIWVBOTxBhEgoKBktS",
+            "QUJCWRBiEgsKB0tJTkdMRVIQYxILCgdWT0xUT1JCEGQSDQoJRUxFQ1RST0RF",
+            "EGUSDQoJRVhFR0dDVVRFEGYSDQoJRVhFR0dVVE9SEGcSCgoGQ1VCT05FEGgS",
+            "CwoHTUFST1dBSxBpEg0KCUhJVE1PTkxFRRBqEg4KCkhJVE1PTkNIQU4QaxIN",
+            "CglMSUNLSVRVTkcQbBILCgdLT0ZGSU5HEG0SCwoHV0VFWklORxBuEgsKB1JI",
+            "WUhPUk4QbxIKCgZSSFlET04QcBILCgdDSEFOU0VZEHESCwoHVEFOR0VMQRBy",
+            "Eg4KCktBTkdBU0tIQU4QcxIKCgZIT1JTRUEQdBIKCgZTRUFEUkEQdRILCgdH",
+            "T0xERUVOEHYSCwoHU0VBS0lORxB3EgoKBlNUQVJZVRB4EgsKB1NUQVJNSUUQ",
+            "eRILCgdNUl9NSU1FEHoSCwoHU0NZVEhFUhB7EggKBEpZTlgQfBIOCgpFTEVD",
+            "VEFCVVpaEH0SCgoGTUFHTUFSEH4SCgoGUElOU0lSEH8SCwoGVEFVUk9TEIAB",
+            "Eg0KCE1BR0lLQVJQEIEBEg0KCEdZQVJBRE9TEIIBEgsKBkxBUFJBUxCDARIK",
+            "CgVESVRUTxCEARIKCgVFRVZFRRCFARINCghWQVBPUkVPThCGARIMCgdKT0xU",
+            "RU9OEIcBEgwKB0ZMQVJFT04QiAESDAoHUE9SWUdPThCJARIMCgdPTUFOWVRF",
+            "EIoBEgwKB09NQVNUQVIQiwESCwoGS0FCVVRPEIwBEg0KCEtBQlVUT1BTEI0B",
+            "Eg8KCkFFUk9EQUNUWUwQjgESDAoHU05PUkxBWBCPARINCghBUlRJQ1VOTxCQ",
+            "ARILCgZaQVBET1MQkQESDAoHTU9MVFJFUxCSARIMCgdEUkFUSU5JEJMBEg4K",
+            "CURSQUdPTkFJUhCUARIOCglEUkFHT05JVEUQlQESCwoGTUVXVFdPEJYBEggK",
+            "A01FVxCXAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.PokemonId), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum PokemonId {
+    [pbr::OriginalName("MISSINGNO")] Missingno = 0,
+    [pbr::OriginalName("BULBASAUR")] Bulbasaur = 1,
+    [pbr::OriginalName("IVYSAUR")] Ivysaur = 2,
+    [pbr::OriginalName("VENUSAUR")] Venusaur = 3,
+    [pbr::OriginalName("CHARMANDER")] Charmander = 4,
+    [pbr::OriginalName("CHARMELEON")] Charmeleon = 5,
+    [pbr::OriginalName("CHARIZARD")] Charizard = 6,
+    [pbr::OriginalName("SQUIRTLE")] Squirtle = 7,
+    [pbr::OriginalName("WARTORTLE")] Wartortle = 8,
+    [pbr::OriginalName("BLASTOISE")] Blastoise = 9,
+    [pbr::OriginalName("CATERPIE")] Caterpie = 10,
+    [pbr::OriginalName("METAPOD")] Metapod = 11,
+    [pbr::OriginalName("BUTTERFREE")] Butterfree = 12,
+    [pbr::OriginalName("WEEDLE")] Weedle = 13,
+    [pbr::OriginalName("KAKUNA")] Kakuna = 14,
+    [pbr::OriginalName("BEEDRILL")] Beedrill = 15,
+    [pbr::OriginalName("PIDGEY")] Pidgey = 16,
+    [pbr::OriginalName("PIDGEOTTO")] Pidgeotto = 17,
+    [pbr::OriginalName("PIDGEOT")] Pidgeot = 18,
+    [pbr::OriginalName("RATTATA")] Rattata = 19,
+    [pbr::OriginalName("RATICATE")] Raticate = 20,
+    [pbr::OriginalName("SPEAROW")] Spearow = 21,
+    [pbr::OriginalName("FEAROW")] Fearow = 22,
+    [pbr::OriginalName("EKANS")] Ekans = 23,
+    [pbr::OriginalName("ARBOK")] Arbok = 24,
+    [pbr::OriginalName("PIKACHU")] Pikachu = 25,
+    [pbr::OriginalName("RAICHU")] Raichu = 26,
+    [pbr::OriginalName("SANDSHREW")] Sandshrew = 27,
+    [pbr::OriginalName("SANDSLASH")] Sandslash = 28,
+    [pbr::OriginalName("NIDORAN_FEMALE")] NidoranFemale = 29,
+    [pbr::OriginalName("NIDORINA")] Nidorina = 30,
+    [pbr::OriginalName("NIDOQUEEN")] Nidoqueen = 31,
+    [pbr::OriginalName("NIDORAN_MALE")] NidoranMale = 32,
+    [pbr::OriginalName("NIDORINO")] Nidorino = 33,
+    [pbr::OriginalName("NIDOKING")] Nidoking = 34,
+    [pbr::OriginalName("CLEFAIRY")] Clefairy = 35,
+    [pbr::OriginalName("CLEFABLE")] Clefable = 36,
+    [pbr::OriginalName("VULPIX")] Vulpix = 37,
+    [pbr::OriginalName("NINETALES")] Ninetales = 38,
+    [pbr::OriginalName("JIGGLYPUFF")] Jigglypuff = 39,
+    [pbr::OriginalName("WIGGLYTUFF")] Wigglytuff = 40,
+    [pbr::OriginalName("ZUBAT")] Zubat = 41,
+    [pbr::OriginalName("GOLBAT")] Golbat = 42,
+    [pbr::OriginalName("ODDISH")] Oddish = 43,
+    [pbr::OriginalName("GLOOM")] Gloom = 44,
+    [pbr::OriginalName("VILEPLUME")] Vileplume = 45,
+    [pbr::OriginalName("PARAS")] Paras = 46,
+    [pbr::OriginalName("PARASECT")] Parasect = 47,
+    [pbr::OriginalName("VENONAT")] Venonat = 48,
+    [pbr::OriginalName("VENOMOTH")] Venomoth = 49,
+    [pbr::OriginalName("DIGLETT")] Diglett = 50,
+    [pbr::OriginalName("DUGTRIO")] Dugtrio = 51,
+    [pbr::OriginalName("MEOWTH")] Meowth = 52,
+    [pbr::OriginalName("PERSIAN")] Persian = 53,
+    [pbr::OriginalName("PSYDUCK")] Psyduck = 54,
+    [pbr::OriginalName("GOLDUCK")] Golduck = 55,
+    [pbr::OriginalName("MANKEY")] Mankey = 56,
+    [pbr::OriginalName("PRIMEAPE")] Primeape = 57,
+    [pbr::OriginalName("GROWLITHE")] Growlithe = 58,
+    [pbr::OriginalName("ARCANINE")] Arcanine = 59,
+    [pbr::OriginalName("POLIWAG")] Poliwag = 60,
+    [pbr::OriginalName("POLIWHIRL")] Poliwhirl = 61,
+    [pbr::OriginalName("POLIWRATH")] Poliwrath = 62,
+    [pbr::OriginalName("ABRA")] Abra = 63,
+    [pbr::OriginalName("KADABRA")] Kadabra = 64,
+    [pbr::OriginalName("ALAKAZAM")] Alakazam = 65,
+    [pbr::OriginalName("MACHOP")] Machop = 66,
+    [pbr::OriginalName("MACHOKE")] Machoke = 67,
+    [pbr::OriginalName("MACHAMP")] Machamp = 68,
+    [pbr::OriginalName("BELLSPROUT")] Bellsprout = 69,
+    [pbr::OriginalName("WEEPINBELL")] Weepinbell = 70,
+    [pbr::OriginalName("VICTREEBEL")] Victreebel = 71,
+    [pbr::OriginalName("TENTACOOL")] Tentacool = 72,
+    [pbr::OriginalName("TENTACRUEL")] Tentacruel = 73,
+    [pbr::OriginalName("GEODUDE")] Geodude = 74,
+    [pbr::OriginalName("GRAVELER")] Graveler = 75,
+    [pbr::OriginalName("GOLEM")] Golem = 76,
+    [pbr::OriginalName("PONYTA")] Ponyta = 77,
+    [pbr::OriginalName("RAPIDASH")] Rapidash = 78,
+    [pbr::OriginalName("SLOWPOKE")] Slowpoke = 79,
+    [pbr::OriginalName("SLOWBRO")] Slowbro = 80,
+    [pbr::OriginalName("MAGNEMITE")] Magnemite = 81,
+    [pbr::OriginalName("MAGNETON")] Magneton = 82,
+    [pbr::OriginalName("FARFETCHD")] Farfetchd = 83,
+    [pbr::OriginalName("DODUO")] Doduo = 84,
+    [pbr::OriginalName("DODRIO")] Dodrio = 85,
+    [pbr::OriginalName("SEEL")] Seel = 86,
+    [pbr::OriginalName("DEWGONG")] Dewgong = 87,
+    [pbr::OriginalName("GRIMER")] Grimer = 88,
+    [pbr::OriginalName("MUK")] Muk = 89,
+    [pbr::OriginalName("SHELLDER")] Shellder = 90,
+    [pbr::OriginalName("CLOYSTER")] Cloyster = 91,
+    [pbr::OriginalName("GASTLY")] Gastly = 92,
+    [pbr::OriginalName("HAUNTER")] Haunter = 93,
+    [pbr::OriginalName("GENGAR")] Gengar = 94,
+    [pbr::OriginalName("ONIX")] Onix = 95,
+    [pbr::OriginalName("DROWZEE")] Drowzee = 96,
+    [pbr::OriginalName("HYPNO")] Hypno = 97,
+    [pbr::OriginalName("KRABBY")] Krabby = 98,
+    [pbr::OriginalName("KINGLER")] Kingler = 99,
+    [pbr::OriginalName("VOLTORB")] Voltorb = 100,
+    [pbr::OriginalName("ELECTRODE")] Electrode = 101,
+    [pbr::OriginalName("EXEGGCUTE")] Exeggcute = 102,
+    [pbr::OriginalName("EXEGGUTOR")] Exeggutor = 103,
+    [pbr::OriginalName("CUBONE")] Cubone = 104,
+    [pbr::OriginalName("MAROWAK")] Marowak = 105,
+    [pbr::OriginalName("HITMONLEE")] Hitmonlee = 106,
+    [pbr::OriginalName("HITMONCHAN")] Hitmonchan = 107,
+    [pbr::OriginalName("LICKITUNG")] Lickitung = 108,
+    [pbr::OriginalName("KOFFING")] Koffing = 109,
+    [pbr::OriginalName("WEEZING")] Weezing = 110,
+    [pbr::OriginalName("RHYHORN")] Rhyhorn = 111,
+    [pbr::OriginalName("RHYDON")] Rhydon = 112,
+    [pbr::OriginalName("CHANSEY")] Chansey = 113,
+    [pbr::OriginalName("TANGELA")] Tangela = 114,
+    [pbr::OriginalName("KANGASKHAN")] Kangaskhan = 115,
+    [pbr::OriginalName("HORSEA")] Horsea = 116,
+    [pbr::OriginalName("SEADRA")] Seadra = 117,
+    [pbr::OriginalName("GOLDEEN")] Goldeen = 118,
+    [pbr::OriginalName("SEAKING")] Seaking = 119,
+    [pbr::OriginalName("STARYU")] Staryu = 120,
+    [pbr::OriginalName("STARMIE")] Starmie = 121,
+    [pbr::OriginalName("MR_MIME")] MrMime = 122,
+    [pbr::OriginalName("SCYTHER")] Scyther = 123,
+    [pbr::OriginalName("JYNX")] Jynx = 124,
+    [pbr::OriginalName("ELECTABUZZ")] Electabuzz = 125,
+    [pbr::OriginalName("MAGMAR")] Magmar = 126,
+    [pbr::OriginalName("PINSIR")] Pinsir = 127,
+    [pbr::OriginalName("TAUROS")] Tauros = 128,
+    [pbr::OriginalName("MAGIKARP")] Magikarp = 129,
+    [pbr::OriginalName("GYARADOS")] Gyarados = 130,
+    [pbr::OriginalName("LAPRAS")] Lapras = 131,
+    [pbr::OriginalName("DITTO")] Ditto = 132,
+    [pbr::OriginalName("EEVEE")] Eevee = 133,
+    [pbr::OriginalName("VAPOREON")] Vaporeon = 134,
+    [pbr::OriginalName("JOLTEON")] Jolteon = 135,
+    [pbr::OriginalName("FLAREON")] Flareon = 136,
+    [pbr::OriginalName("PORYGON")] Porygon = 137,
+    [pbr::OriginalName("OMANYTE")] Omanyte = 138,
+    [pbr::OriginalName("OMASTAR")] Omastar = 139,
+    [pbr::OriginalName("KABUTO")] Kabuto = 140,
+    [pbr::OriginalName("KABUTOPS")] Kabutops = 141,
+    [pbr::OriginalName("AERODACTYL")] Aerodactyl = 142,
+    [pbr::OriginalName("SNORLAX")] Snorlax = 143,
+    [pbr::OriginalName("ARTICUNO")] Articuno = 144,
+    [pbr::OriginalName("ZAPDOS")] Zapdos = 145,
+    [pbr::OriginalName("MOLTRES")] Moltres = 146,
+    [pbr::OriginalName("DRATINI")] Dratini = 147,
+    [pbr::OriginalName("DRAGONAIR")] Dragonair = 148,
+    [pbr::OriginalName("DRAGONITE")] Dragonite = 149,
+    [pbr::OriginalName("MEWTWO")] Mewtwo = 150,
+    [pbr::OriginalName("MEW")] Mew = 151,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/PokemonMove.cs b/PokemonGo/POGOProtos/Enums/PokemonMove.cs
new file mode 100644
index 0000000..a142f7f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/PokemonMove.cs
@@ -0,0 +1,289 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/PokemonMove.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/PokemonMove.proto</summary>
+  public static partial class PokemonMoveReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/PokemonMove.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonMoveReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiJQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25Nb3ZlLnByb3RvEhBQT0dPUHJv",
+            "dG9zLkVudW1zKs4XCgtQb2tlbW9uTW92ZRIOCgpNT1ZFX1VOU0VUEAASEQoN",
+            "VEhVTkRFUl9TSE9DSxABEhAKDFFVSUNLX0FUVEFDSxACEgsKB1NDUkFUQ0gQ",
+            "AxIJCgVFTUJFUhAEEg0KCVZJTkVfV0hJUBAFEgoKBlRBQ0tMRRAGEg4KClJB",
+            "Wk9SX0xFQUYQBxINCglUQUtFX0RPV04QCBINCglXQVRFUl9HVU4QCRIICgRC",
+            "SVRFEAoSCQoFUE9VTkQQCxIPCgtET1VCTEVfU0xBUBAMEggKBFdSQVAQDRIO",
+            "CgpIWVBFUl9CRUFNEA4SCAoETElDSxAPEg4KCkRBUktfUFVMU0UQEBIICgRT",
+            "TU9HEBESCgoGU0xVREdFEBISDgoKTUVUQUxfQ0xBVxATEg0KCVZJQ0VfR1JJ",
+            "UBAUEg8KC0ZMQU1FX1dIRUVMEBUSDAoITUVHQUhPUk4QFhIPCgtXSU5HX0FU",
+            "VEFDSxAXEhAKDEZMQU1FVEhST1dFUhAYEhAKDFNVQ0tFUl9QVU5DSBAZEgcK",
+            "A0RJRxAaEgwKCExPV19LSUNLEBsSDgoKQ1JPU1NfQ0hPUBAcEg4KClBTWUNI",
+            "T19DVVQQHRILCgdQU1lCRUFNEB4SDgoKRUFSVEhRVUFLRRAfEg4KClNUT05F",
+            "X0VER0UQIBINCglJQ0VfUFVOQ0gQIRIPCgtIRUFSVF9TVEFNUBAiEg0KCURJ",
+            "U0NIQVJHRRAjEhAKDEZMQVNIX0NBTk5PThAkEggKBFBFQ0sQJRIOCgpEUklM",
+            "TF9QRUNLECYSDAoISUNFX0JFQU0QJxIMCghCTElaWkFSRBAoEg0KCUFJUl9T",
+            "TEFTSBApEg0KCUhFQVRfV0FWRRAqEg0KCVRXSU5FRURMRRArEg4KClBPSVNP",
+            "Tl9KQUIQLBIOCgpBRVJJQUxfQUNFEC0SDQoJRFJJTExfUlVOEC4SEgoOUEVU",
+            "QUxfQkxJWlpBUkQQLxIOCgpNRUdBX0RSQUlOEDASDAoIQlVHX0JVWloQMRIP",
+            "CgtQT0lTT05fRkFORxAyEg8KC05JR0hUX1NMQVNIEDMSCQoFU0xBU0gQNBIP",
+            "CgtCVUJCTEVfQkVBTRA1Eg4KClNVQk1JU1NJT04QNhIPCgtLQVJBVEVfQ0hP",
+            "UBA3Eg0KCUxPV19TV0VFUBA4EgwKCEFRVUFfSkVUEDkSDQoJQVFVQV9UQUlM",
+            "EDoSDQoJU0VFRF9CT01CEDsSDAoIUFNZU0hPQ0sQPBIOCgpST0NLX1RIUk9X",
+            "ED0SEQoNQU5DSUVOVF9QT1dFUhA+Eg0KCVJPQ0tfVE9NQhA/Eg4KClJPQ0tf",
+            "U0xJREUQQBINCglQT1dFUl9HRU0QQRIQCgxTSEFET1dfU05FQUsQQhIQCgxT",
+            "SEFET1dfUFVOQ0gQQxIPCgtTSEFET1dfQ0xBVxBEEhAKDE9NSU5PVVNfV0lO",
+            "RBBFEg8KC1NIQURPV19CQUxMEEYSEAoMQlVMTEVUX1BVTkNIEEcSDwoLTUFH",
+            "TkVUX0JPTUIQSBIOCgpTVEVFTF9XSU5HEEkSDQoJSVJPTl9IRUFEEEoSFAoQ",
+            "UEFSQUJPTElDX0NIQVJHRRBLEgkKBVNQQVJLEEwSEQoNVEhVTkRFUl9QVU5D",
+            "SBBNEgsKB1RIVU5ERVIQThIPCgtUSFVOREVSQk9MVBBPEgsKB1RXSVNURVIQ",
+            "UBIRCg1EUkFHT05fQlJFQVRIEFESEAoMRFJBR09OX1BVTFNFEFISDwoLRFJB",
+            "R09OX0NMQVcQUxITCg9ESVNBUk1JTkdfVk9JQ0UQVBIRCg1EUkFJTklOR19L",
+            "SVNTEFUSEgoOREFaWkxJTkdfR0xFQU0QVhINCglNT09OQkxBU1QQVxIOCgpQ",
+            "TEFZX1JPVUdIEFgSEAoMQ1JPU1NfUE9JU09OEFkSDwoLU0xVREdFX0JPTUIQ",
+            "WhIPCgtTTFVER0VfV0FWRRBbEg0KCUdVTktfU0hPVBBcEgwKCE1VRF9TSE9U",
+            "EF0SDQoJQk9ORV9DTFVCEF4SDAoIQlVMTERPWkUQXxIMCghNVURfQk9NQhBg",
+            "Eg8KC0ZVUllfQ1VUVEVSEGESDAoIQlVHX0JJVEUQYhIPCgtTSUdOQUxfQkVB",
+            "TRBjEg0KCVhfU0NJU1NPUhBkEhAKDEZMQU1FX0NIQVJHRRBlEg8KC0ZMQU1F",
+            "X0JVUlNUEGYSDgoKRklSRV9CTEFTVBBnEgkKBUJSSU5FEGgSDwoLV0FURVJf",
+            "UFVMU0UQaRIJCgVTQ0FMRBBqEg4KCkhZRFJPX1BVTVAQaxILCgdQU1lDSElD",
+            "EGwSDQoJUFNZU1RSSUtFEG0SDQoJSUNFX1NIQVJEEG4SDAoISUNZX1dJTkQQ",
+            "bxIQCgxGUk9TVF9CUkVBVEgQcBIKCgZBQlNPUkIQcRIOCgpHSUdBX0RSQUlO",
+            "EHISDgoKRklSRV9QVU5DSBBzEg4KClNPTEFSX0JFQU0QdBIOCgpMRUFGX0JM",
+            "QURFEHUSDgoKUE9XRVJfV0hJUBB2EgoKBlNQTEFTSBB3EggKBEFDSUQQeBIO",
+            "CgpBSVJfQ1VUVEVSEHkSDQoJSFVSUklDQU5FEHoSDwoLQlJJQ0tfQlJFQUsQ",
+            "exIHCgNDVVQQfBIJCgVTV0lGVBB9Eg8KC0hPUk5fQVRUQUNLEH4SCQoFU1RP",
+            "TVAQfxINCghIRUFEQlVUVBCAARIPCgpIWVBFUl9GQU5HEIEBEgkKBFNMQU0Q",
+            "ggESDgoJQk9EWV9TTEFNEIMBEgkKBFJFU1QQhAESDQoIU1RSVUdHTEUQhQES",
+            "FAoPU0NBTERfQkxBU1RPSVNFEIYBEhkKFEhZRFJPX1BVTVBfQkxBU1RPSVNF",
+            "EIcBEg8KCldSQVBfR1JFRU4QiAESDgoJV1JBUF9QSU5LEIkBEhUKEEZVUllf",
+            "Q1VUVEVSX0ZBU1QQyAESEgoNQlVHX0JJVEVfRkFTVBDJARIOCglCSVRFX0ZB",
+            "U1QQygESFgoRU1VDS0VSX1BVTkNIX0ZBU1QQywESFwoSRFJBR09OX0JSRUFU",
+            "SF9GQVNUEMwBEhcKElRIVU5ERVJfU0hPQ0tfRkFTVBDNARIPCgpTUEFSS19G",
+            "QVNUEM4BEhIKDUxPV19LSUNLX0ZBU1QQzwESFQoQS0FSQVRFX0NIT1BfRkFT",
+            "VBDQARIPCgpFTUJFUl9GQVNUENEBEhUKEFdJTkdfQVRUQUNLX0ZBU1QQ0gES",
+            "DgoJUEVDS19GQVNUENMBEg4KCUxJQ0tfRkFTVBDUARIVChBTSEFET1dfQ0xB",
+            "V19GQVNUENUBEhMKDlZJTkVfV0hJUF9GQVNUENYBEhQKD1JBWk9SX0xFQUZf",
+            "RkFTVBDXARISCg1NVURfU0hPVF9GQVNUENgBEhMKDklDRV9TSEFSRF9GQVNU",
+            "ENkBEhYKEUZST1NUX0JSRUFUSF9GQVNUENoBEhYKEVFVSUNLX0FUVEFDS19G",
+            "QVNUENsBEhEKDFNDUkFUQ0hfRkFTVBDcARIQCgtUQUNLTEVfRkFTVBDdARIP",
+            "CgpQT1VORF9GQVNUEN4BEg0KCENVVF9GQVNUEN8BEhQKD1BPSVNPTl9KQUJf",
+            "RkFTVBDgARIOCglBQ0lEX0ZBU1QQ4QESFAoPUFNZQ0hPX0NVVF9GQVNUEOIB",
+            "EhQKD1JPQ0tfVEhST1dfRkFTVBDjARIUCg9NRVRBTF9DTEFXX0ZBU1QQ5AES",
+            "FgoRQlVMTEVUX1BVTkNIX0ZBU1QQ5QESEwoOV0FURVJfR1VOX0ZBU1QQ5gES",
+            "EAoLU1BMQVNIX0ZBU1QQ5wESHQoYV0FURVJfR1VOX0ZBU1RfQkxBU1RPSVNF",
+            "EOgBEhIKDU1VRF9TTEFQX0ZBU1QQ6QESFgoRWkVOX0hFQURCVVRUX0ZBU1QQ",
+            "6gESEwoOQ09ORlVTSU9OX0ZBU1QQ6wESFgoRUE9JU09OX1NUSU5HX0ZBU1QQ",
+            "7AESEAoLQlVCQkxFX0ZBU1QQ7QESFgoRRkVJTlRfQVRUQUNLX0ZBU1QQ7gES",
+            "FAoPU1RFRUxfV0lOR19GQVNUEO8BEhMKDkZJUkVfRkFOR19GQVNUEPABEhQK",
+            "D1JPQ0tfU01BU0hfRkFTVBDxAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.PokemonMove), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum PokemonMove {
+    [pbr::OriginalName("MOVE_UNSET")] MoveUnset = 0,
+    [pbr::OriginalName("THUNDER_SHOCK")] ThunderShock = 1,
+    [pbr::OriginalName("QUICK_ATTACK")] QuickAttack = 2,
+    [pbr::OriginalName("SCRATCH")] Scratch = 3,
+    [pbr::OriginalName("EMBER")] Ember = 4,
+    [pbr::OriginalName("VINE_WHIP")] VineWhip = 5,
+    [pbr::OriginalName("TACKLE")] Tackle = 6,
+    [pbr::OriginalName("RAZOR_LEAF")] RazorLeaf = 7,
+    [pbr::OriginalName("TAKE_DOWN")] TakeDown = 8,
+    [pbr::OriginalName("WATER_GUN")] WaterGun = 9,
+    [pbr::OriginalName("BITE")] Bite = 10,
+    [pbr::OriginalName("POUND")] Pound = 11,
+    [pbr::OriginalName("DOUBLE_SLAP")] DoubleSlap = 12,
+    [pbr::OriginalName("WRAP")] Wrap = 13,
+    [pbr::OriginalName("HYPER_BEAM")] HyperBeam = 14,
+    [pbr::OriginalName("LICK")] Lick = 15,
+    [pbr::OriginalName("DARK_PULSE")] DarkPulse = 16,
+    [pbr::OriginalName("SMOG")] Smog = 17,
+    [pbr::OriginalName("SLUDGE")] Sludge = 18,
+    [pbr::OriginalName("METAL_CLAW")] MetalClaw = 19,
+    [pbr::OriginalName("VICE_GRIP")] ViceGrip = 20,
+    [pbr::OriginalName("FLAME_WHEEL")] FlameWheel = 21,
+    [pbr::OriginalName("MEGAHORN")] Megahorn = 22,
+    [pbr::OriginalName("WING_ATTACK")] WingAttack = 23,
+    [pbr::OriginalName("FLAMETHROWER")] Flamethrower = 24,
+    [pbr::OriginalName("SUCKER_PUNCH")] SuckerPunch = 25,
+    [pbr::OriginalName("DIG")] Dig = 26,
+    [pbr::OriginalName("LOW_KICK")] LowKick = 27,
+    [pbr::OriginalName("CROSS_CHOP")] CrossChop = 28,
+    [pbr::OriginalName("PSYCHO_CUT")] PsychoCut = 29,
+    [pbr::OriginalName("PSYBEAM")] Psybeam = 30,
+    [pbr::OriginalName("EARTHQUAKE")] Earthquake = 31,
+    [pbr::OriginalName("STONE_EDGE")] StoneEdge = 32,
+    [pbr::OriginalName("ICE_PUNCH")] IcePunch = 33,
+    [pbr::OriginalName("HEART_STAMP")] HeartStamp = 34,
+    [pbr::OriginalName("DISCHARGE")] Discharge = 35,
+    [pbr::OriginalName("FLASH_CANNON")] FlashCannon = 36,
+    [pbr::OriginalName("PECK")] Peck = 37,
+    [pbr::OriginalName("DRILL_PECK")] DrillPeck = 38,
+    [pbr::OriginalName("ICE_BEAM")] IceBeam = 39,
+    [pbr::OriginalName("BLIZZARD")] Blizzard = 40,
+    [pbr::OriginalName("AIR_SLASH")] AirSlash = 41,
+    [pbr::OriginalName("HEAT_WAVE")] HeatWave = 42,
+    [pbr::OriginalName("TWINEEDLE")] Twineedle = 43,
+    [pbr::OriginalName("POISON_JAB")] PoisonJab = 44,
+    [pbr::OriginalName("AERIAL_ACE")] AerialAce = 45,
+    [pbr::OriginalName("DRILL_RUN")] DrillRun = 46,
+    [pbr::OriginalName("PETAL_BLIZZARD")] PetalBlizzard = 47,
+    [pbr::OriginalName("MEGA_DRAIN")] MegaDrain = 48,
+    [pbr::OriginalName("BUG_BUZZ")] BugBuzz = 49,
+    [pbr::OriginalName("POISON_FANG")] PoisonFang = 50,
+    [pbr::OriginalName("NIGHT_SLASH")] NightSlash = 51,
+    [pbr::OriginalName("SLASH")] Slash = 52,
+    [pbr::OriginalName("BUBBLE_BEAM")] BubbleBeam = 53,
+    [pbr::OriginalName("SUBMISSION")] Submission = 54,
+    [pbr::OriginalName("KARATE_CHOP")] KarateChop = 55,
+    [pbr::OriginalName("LOW_SWEEP")] LowSweep = 56,
+    [pbr::OriginalName("AQUA_JET")] AquaJet = 57,
+    [pbr::OriginalName("AQUA_TAIL")] AquaTail = 58,
+    [pbr::OriginalName("SEED_BOMB")] SeedBomb = 59,
+    [pbr::OriginalName("PSYSHOCK")] Psyshock = 60,
+    [pbr::OriginalName("ROCK_THROW")] RockThrow = 61,
+    [pbr::OriginalName("ANCIENT_POWER")] AncientPower = 62,
+    [pbr::OriginalName("ROCK_TOMB")] RockTomb = 63,
+    [pbr::OriginalName("ROCK_SLIDE")] RockSlide = 64,
+    [pbr::OriginalName("POWER_GEM")] PowerGem = 65,
+    [pbr::OriginalName("SHADOW_SNEAK")] ShadowSneak = 66,
+    [pbr::OriginalName("SHADOW_PUNCH")] ShadowPunch = 67,
+    [pbr::OriginalName("SHADOW_CLAW")] ShadowClaw = 68,
+    [pbr::OriginalName("OMINOUS_WIND")] OminousWind = 69,
+    [pbr::OriginalName("SHADOW_BALL")] ShadowBall = 70,
+    [pbr::OriginalName("BULLET_PUNCH")] BulletPunch = 71,
+    [pbr::OriginalName("MAGNET_BOMB")] MagnetBomb = 72,
+    [pbr::OriginalName("STEEL_WING")] SteelWing = 73,
+    [pbr::OriginalName("IRON_HEAD")] IronHead = 74,
+    [pbr::OriginalName("PARABOLIC_CHARGE")] ParabolicCharge = 75,
+    [pbr::OriginalName("SPARK")] Spark = 76,
+    [pbr::OriginalName("THUNDER_PUNCH")] ThunderPunch = 77,
+    [pbr::OriginalName("THUNDER")] Thunder = 78,
+    [pbr::OriginalName("THUNDERBOLT")] Thunderbolt = 79,
+    [pbr::OriginalName("TWISTER")] Twister = 80,
+    [pbr::OriginalName("DRAGON_BREATH")] DragonBreath = 81,
+    [pbr::OriginalName("DRAGON_PULSE")] DragonPulse = 82,
+    [pbr::OriginalName("DRAGON_CLAW")] DragonClaw = 83,
+    [pbr::OriginalName("DISARMING_VOICE")] DisarmingVoice = 84,
+    [pbr::OriginalName("DRAINING_KISS")] DrainingKiss = 85,
+    [pbr::OriginalName("DAZZLING_GLEAM")] DazzlingGleam = 86,
+    [pbr::OriginalName("MOONBLAST")] Moonblast = 87,
+    [pbr::OriginalName("PLAY_ROUGH")] PlayRough = 88,
+    [pbr::OriginalName("CROSS_POISON")] CrossPoison = 89,
+    [pbr::OriginalName("SLUDGE_BOMB")] SludgeBomb = 90,
+    [pbr::OriginalName("SLUDGE_WAVE")] SludgeWave = 91,
+    [pbr::OriginalName("GUNK_SHOT")] GunkShot = 92,
+    [pbr::OriginalName("MUD_SHOT")] MudShot = 93,
+    [pbr::OriginalName("BONE_CLUB")] BoneClub = 94,
+    [pbr::OriginalName("BULLDOZE")] Bulldoze = 95,
+    [pbr::OriginalName("MUD_BOMB")] MudBomb = 96,
+    [pbr::OriginalName("FURY_CUTTER")] FuryCutter = 97,
+    [pbr::OriginalName("BUG_BITE")] BugBite = 98,
+    [pbr::OriginalName("SIGNAL_BEAM")] SignalBeam = 99,
+    [pbr::OriginalName("X_SCISSOR")] XScissor = 100,
+    [pbr::OriginalName("FLAME_CHARGE")] FlameCharge = 101,
+    [pbr::OriginalName("FLAME_BURST")] FlameBurst = 102,
+    [pbr::OriginalName("FIRE_BLAST")] FireBlast = 103,
+    [pbr::OriginalName("BRINE")] Brine = 104,
+    [pbr::OriginalName("WATER_PULSE")] WaterPulse = 105,
+    [pbr::OriginalName("SCALD")] Scald = 106,
+    [pbr::OriginalName("HYDRO_PUMP")] HydroPump = 107,
+    [pbr::OriginalName("PSYCHIC")] Psychic = 108,
+    [pbr::OriginalName("PSYSTRIKE")] Psystrike = 109,
+    [pbr::OriginalName("ICE_SHARD")] IceShard = 110,
+    [pbr::OriginalName("ICY_WIND")] IcyWind = 111,
+    [pbr::OriginalName("FROST_BREATH")] FrostBreath = 112,
+    [pbr::OriginalName("ABSORB")] Absorb = 113,
+    [pbr::OriginalName("GIGA_DRAIN")] GigaDrain = 114,
+    [pbr::OriginalName("FIRE_PUNCH")] FirePunch = 115,
+    [pbr::OriginalName("SOLAR_BEAM")] SolarBeam = 116,
+    [pbr::OriginalName("LEAF_BLADE")] LeafBlade = 117,
+    [pbr::OriginalName("POWER_WHIP")] PowerWhip = 118,
+    [pbr::OriginalName("SPLASH")] Splash = 119,
+    [pbr::OriginalName("ACID")] Acid = 120,
+    [pbr::OriginalName("AIR_CUTTER")] AirCutter = 121,
+    [pbr::OriginalName("HURRICANE")] Hurricane = 122,
+    [pbr::OriginalName("BRICK_BREAK")] BrickBreak = 123,
+    [pbr::OriginalName("CUT")] Cut = 124,
+    [pbr::OriginalName("SWIFT")] Swift = 125,
+    [pbr::OriginalName("HORN_ATTACK")] HornAttack = 126,
+    [pbr::OriginalName("STOMP")] Stomp = 127,
+    [pbr::OriginalName("HEADBUTT")] Headbutt = 128,
+    [pbr::OriginalName("HYPER_FANG")] HyperFang = 129,
+    [pbr::OriginalName("SLAM")] Slam = 130,
+    [pbr::OriginalName("BODY_SLAM")] BodySlam = 131,
+    [pbr::OriginalName("REST")] Rest = 132,
+    [pbr::OriginalName("STRUGGLE")] Struggle = 133,
+    [pbr::OriginalName("SCALD_BLASTOISE")] ScaldBlastoise = 134,
+    [pbr::OriginalName("HYDRO_PUMP_BLASTOISE")] HydroPumpBlastoise = 135,
+    [pbr::OriginalName("WRAP_GREEN")] WrapGreen = 136,
+    [pbr::OriginalName("WRAP_PINK")] WrapPink = 137,
+    [pbr::OriginalName("FURY_CUTTER_FAST")] FuryCutterFast = 200,
+    [pbr::OriginalName("BUG_BITE_FAST")] BugBiteFast = 201,
+    [pbr::OriginalName("BITE_FAST")] BiteFast = 202,
+    [pbr::OriginalName("SUCKER_PUNCH_FAST")] SuckerPunchFast = 203,
+    [pbr::OriginalName("DRAGON_BREATH_FAST")] DragonBreathFast = 204,
+    [pbr::OriginalName("THUNDER_SHOCK_FAST")] ThunderShockFast = 205,
+    [pbr::OriginalName("SPARK_FAST")] SparkFast = 206,
+    [pbr::OriginalName("LOW_KICK_FAST")] LowKickFast = 207,
+    [pbr::OriginalName("KARATE_CHOP_FAST")] KarateChopFast = 208,
+    [pbr::OriginalName("EMBER_FAST")] EmberFast = 209,
+    [pbr::OriginalName("WING_ATTACK_FAST")] WingAttackFast = 210,
+    [pbr::OriginalName("PECK_FAST")] PeckFast = 211,
+    [pbr::OriginalName("LICK_FAST")] LickFast = 212,
+    [pbr::OriginalName("SHADOW_CLAW_FAST")] ShadowClawFast = 213,
+    [pbr::OriginalName("VINE_WHIP_FAST")] VineWhipFast = 214,
+    [pbr::OriginalName("RAZOR_LEAF_FAST")] RazorLeafFast = 215,
+    [pbr::OriginalName("MUD_SHOT_FAST")] MudShotFast = 216,
+    [pbr::OriginalName("ICE_SHARD_FAST")] IceShardFast = 217,
+    [pbr::OriginalName("FROST_BREATH_FAST")] FrostBreathFast = 218,
+    [pbr::OriginalName("QUICK_ATTACK_FAST")] QuickAttackFast = 219,
+    [pbr::OriginalName("SCRATCH_FAST")] ScratchFast = 220,
+    [pbr::OriginalName("TACKLE_FAST")] TackleFast = 221,
+    [pbr::OriginalName("POUND_FAST")] PoundFast = 222,
+    [pbr::OriginalName("CUT_FAST")] CutFast = 223,
+    [pbr::OriginalName("POISON_JAB_FAST")] PoisonJabFast = 224,
+    [pbr::OriginalName("ACID_FAST")] AcidFast = 225,
+    [pbr::OriginalName("PSYCHO_CUT_FAST")] PsychoCutFast = 226,
+    [pbr::OriginalName("ROCK_THROW_FAST")] RockThrowFast = 227,
+    [pbr::OriginalName("METAL_CLAW_FAST")] MetalClawFast = 228,
+    [pbr::OriginalName("BULLET_PUNCH_FAST")] BulletPunchFast = 229,
+    [pbr::OriginalName("WATER_GUN_FAST")] WaterGunFast = 230,
+    [pbr::OriginalName("SPLASH_FAST")] SplashFast = 231,
+    [pbr::OriginalName("WATER_GUN_FAST_BLASTOISE")] WaterGunFastBlastoise = 232,
+    [pbr::OriginalName("MUD_SLAP_FAST")] MudSlapFast = 233,
+    [pbr::OriginalName("ZEN_HEADBUTT_FAST")] ZenHeadbuttFast = 234,
+    [pbr::OriginalName("CONFUSION_FAST")] ConfusionFast = 235,
+    [pbr::OriginalName("POISON_STING_FAST")] PoisonStingFast = 236,
+    [pbr::OriginalName("BUBBLE_FAST")] BubbleFast = 237,
+    [pbr::OriginalName("FEINT_ATTACK_FAST")] FeintAttackFast = 238,
+    [pbr::OriginalName("STEEL_WING_FAST")] SteelWingFast = 239,
+    [pbr::OriginalName("FIRE_FANG_FAST")] FireFangFast = 240,
+    [pbr::OriginalName("ROCK_SMASH_FAST")] RockSmashFast = 241,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/PokemonMovementType.cs b/PokemonGo/POGOProtos/Enums/PokemonMovementType.cs
new file mode 100644
index 0000000..ff7bacf
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/PokemonMovementType.cs
@@ -0,0 +1,53 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/PokemonMovementType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/PokemonMovementType.proto</summary>
+  public static partial class PokemonMovementTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/PokemonMovementType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonMovementTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CipQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25Nb3ZlbWVudFR5cGUucHJvdG8S",
+            "EFBPR09Qcm90b3MuRW51bXMqrQEKE1Bva2Vtb25Nb3ZlbWVudFR5cGUSEwoP",
+            "TU9WRU1FTlRfU1RBVElDEAASEQoNTU9WRU1FTlRfSlVNUBABEhUKEU1PVkVN",
+            "RU5UX1ZFUlRJQ0FMEAISFAoQTU9WRU1FTlRfUFNZQ0hJQxADEhUKEU1PVkVN",
+            "RU5UX0VMRUNUUklDEAQSEwoPTU9WRU1FTlRfRkxZSU5HEAUSFQoRTU9WRU1F",
+            "TlRfSE9WRVJJTkcQBmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.PokemonMovementType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum PokemonMovementType {
+    [pbr::OriginalName("MOVEMENT_STATIC")] MovementStatic = 0,
+    [pbr::OriginalName("MOVEMENT_JUMP")] MovementJump = 1,
+    [pbr::OriginalName("MOVEMENT_VERTICAL")] MovementVertical = 2,
+    [pbr::OriginalName("MOVEMENT_PSYCHIC")] MovementPsychic = 3,
+    [pbr::OriginalName("MOVEMENT_ELECTRIC")] MovementElectric = 4,
+    [pbr::OriginalName("MOVEMENT_FLYING")] MovementFlying = 5,
+    [pbr::OriginalName("MOVEMENT_HOVERING")] MovementHovering = 6,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/PokemonRarity.cs b/PokemonGo/POGOProtos/Enums/PokemonRarity.cs
new file mode 100644
index 0000000..37aca90
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/PokemonRarity.cs
@@ -0,0 +1,46 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/PokemonRarity.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/PokemonRarity.proto</summary>
+  public static partial class PokemonRarityReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/PokemonRarity.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonRarityReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiRQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25SYXJpdHkucHJvdG8SEFBPR09Q",
+            "cm90b3MuRW51bXMqNgoNUG9rZW1vblJhcml0eRIKCgZOT1JNQUwQABINCglM",
+            "RUdFTkRBUlkQARIKCgZNWVRISUMQAmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.PokemonRarity), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum PokemonRarity {
+    [pbr::OriginalName("NORMAL")] Normal = 0,
+    [pbr::OriginalName("LEGENDARY")] Legendary = 1,
+    [pbr::OriginalName("MYTHIC")] Mythic = 2,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/PokemonType.cs b/PokemonGo/POGOProtos/Enums/PokemonType.cs
new file mode 100644
index 0000000..c2d3230
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/PokemonType.cs
@@ -0,0 +1,71 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/PokemonType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/PokemonType.proto</summary>
+  public static partial class PokemonTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/PokemonType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiJQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25UeXBlLnByb3RvEhBQT0dPUHJv",
+            "dG9zLkVudW1zKtoDCgtQb2tlbW9uVHlwZRIVChFQT0tFTU9OX1RZUEVfTk9O",
+            "RRAAEhcKE1BPS0VNT05fVFlQRV9OT1JNQUwQARIZChVQT0tFTU9OX1RZUEVf",
+            "RklHSFRJTkcQAhIXChNQT0tFTU9OX1RZUEVfRkxZSU5HEAMSFwoTUE9LRU1P",
+            "Tl9UWVBFX1BPSVNPThAEEhcKE1BPS0VNT05fVFlQRV9HUk9VTkQQBRIVChFQ",
+            "T0tFTU9OX1RZUEVfUk9DSxAGEhQKEFBPS0VNT05fVFlQRV9CVUcQBxIWChJQ",
+            "T0tFTU9OX1RZUEVfR0hPU1QQCBIWChJQT0tFTU9OX1RZUEVfU1RFRUwQCRIV",
+            "ChFQT0tFTU9OX1RZUEVfRklSRRAKEhYKElBPS0VNT05fVFlQRV9XQVRFUhAL",
+            "EhYKElBPS0VNT05fVFlQRV9HUkFTUxAMEhkKFVBPS0VNT05fVFlQRV9FTEVD",
+            "VFJJQxANEhgKFFBPS0VNT05fVFlQRV9QU1lDSElDEA4SFAoQUE9LRU1PTl9U",
+            "WVBFX0lDRRAPEhcKE1BPS0VNT05fVFlQRV9EUkFHT04QEBIVChFQT0tFTU9O",
+            "X1RZUEVfREFSSxAREhYKElBPS0VNT05fVFlQRV9GQUlSWRASYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.PokemonType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum PokemonType {
+    [pbr::OriginalName("POKEMON_TYPE_NONE")] None = 0,
+    [pbr::OriginalName("POKEMON_TYPE_NORMAL")] Normal = 1,
+    [pbr::OriginalName("POKEMON_TYPE_FIGHTING")] Fighting = 2,
+    [pbr::OriginalName("POKEMON_TYPE_FLYING")] Flying = 3,
+    [pbr::OriginalName("POKEMON_TYPE_POISON")] Poison = 4,
+    [pbr::OriginalName("POKEMON_TYPE_GROUND")] Ground = 5,
+    [pbr::OriginalName("POKEMON_TYPE_ROCK")] Rock = 6,
+    [pbr::OriginalName("POKEMON_TYPE_BUG")] Bug = 7,
+    [pbr::OriginalName("POKEMON_TYPE_GHOST")] Ghost = 8,
+    [pbr::OriginalName("POKEMON_TYPE_STEEL")] Steel = 9,
+    [pbr::OriginalName("POKEMON_TYPE_FIRE")] Fire = 10,
+    [pbr::OriginalName("POKEMON_TYPE_WATER")] Water = 11,
+    [pbr::OriginalName("POKEMON_TYPE_GRASS")] Grass = 12,
+    [pbr::OriginalName("POKEMON_TYPE_ELECTRIC")] Electric = 13,
+    [pbr::OriginalName("POKEMON_TYPE_PSYCHIC")] Psychic = 14,
+    [pbr::OriginalName("POKEMON_TYPE_ICE")] Ice = 15,
+    [pbr::OriginalName("POKEMON_TYPE_DRAGON")] Dragon = 16,
+    [pbr::OriginalName("POKEMON_TYPE_DARK")] Dark = 17,
+    [pbr::OriginalName("POKEMON_TYPE_FAIRY")] Fairy = 18,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/TeamColor.cs b/PokemonGo/POGOProtos/Enums/TeamColor.cs
new file mode 100644
index 0000000..161ec59
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/TeamColor.cs
@@ -0,0 +1,47 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/TeamColor.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/TeamColor.proto</summary>
+  public static partial class TeamColorReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/TeamColor.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static TeamColorReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiBQT0dPUHJvdG9zL0VudW1zL1RlYW1Db2xvci5wcm90bxIQUE9HT1Byb3Rv",
+            "cy5FbnVtcyo3CglUZWFtQ29sb3ISCwoHTkVVVFJBTBAAEggKBEJMVUUQARIH",
+            "CgNSRUQQAhIKCgZZRUxMT1cQA2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.TeamColor), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum TeamColor {
+    [pbr::OriginalName("NEUTRAL")] Neutral = 0,
+    [pbr::OriginalName("BLUE")] Blue = 1,
+    [pbr::OriginalName("RED")] Red = 2,
+    [pbr::OriginalName("YELLOW")] Yellow = 3,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Enums/TutorialState.cs b/PokemonGo/POGOProtos/Enums/TutorialState.cs
new file mode 100644
index 0000000..8c4cdd0
--- /dev/null
+++ b/PokemonGo/POGOProtos/Enums/TutorialState.cs
@@ -0,0 +1,57 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Enums/TutorialState.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Enums {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Enums/TutorialState.proto</summary>
+  public static partial class TutorialStateReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Enums/TutorialState.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static TutorialStateReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiRQT0dPUHJvdG9zL0VudW1zL1R1dG9yaWFsU3RhdGUucHJvdG8SEFBPR09Q",
+            "cm90b3MuRW51bXMq5AEKDVR1dG9yaWFsU3RhdGUSEAoMTEVHQUxfU0NSRUVO",
+            "EAASFAoQQVZBVEFSX1NFTEVDVElPThABEhQKEEFDQ09VTlRfQ1JFQVRJT04Q",
+            "AhITCg9QT0tFTU9OX0NBUFRVUkUQAxISCg5OQU1FX1NFTEVDVElPThAEEhEK",
+            "DVBPS0VNT05fQkVSUlkQBRIMCghVU0VfSVRFTRAGEiIKHkZJUlNUX1RJTUVf",
+            "RVhQRVJJRU5DRV9DT01QTEVURRAHEhUKEVBPS0VTVE9QX1RVVE9SSUFMEAgS",
+            "EAoMR1lNX1RVVE9SSUFMEAliBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Enums.TutorialState), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum TutorialState {
+    [pbr::OriginalName("LEGAL_SCREEN")] LegalScreen = 0,
+    [pbr::OriginalName("AVATAR_SELECTION")] AvatarSelection = 1,
+    [pbr::OriginalName("ACCOUNT_CREATION")] AccountCreation = 2,
+    [pbr::OriginalName("POKEMON_CAPTURE")] PokemonCapture = 3,
+    [pbr::OriginalName("NAME_SELECTION")] NameSelection = 4,
+    [pbr::OriginalName("POKEMON_BERRY")] PokemonBerry = 5,
+    [pbr::OriginalName("USE_ITEM")] UseItem = 6,
+    [pbr::OriginalName("FIRST_TIME_EXPERIENCE_COMPLETE")] FirstTimeExperienceComplete = 7,
+    [pbr::OriginalName("POKESTOP_TUTORIAL")] PokestopTutorial = 8,
+    [pbr::OriginalName("GYM_TUTORIAL")] GymTutorial = 9,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/AppliedItem.cs b/PokemonGo/POGOProtos/Inventory/AppliedItem.cs
new file mode 100644
index 0000000..6c633d5
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/AppliedItem.cs
@@ -0,0 +1,247 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/AppliedItem.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/AppliedItem.proto</summary>
+  public static partial class AppliedItemReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/AppliedItem.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AppliedItemReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0ludmVudG9yeS9BcHBsaWVkSXRlbS5wcm90bxIUUE9H",
+            "T1Byb3Rvcy5JbnZlbnRvcnkaJlBPR09Qcm90b3MvSW52ZW50b3J5L0l0ZW0v",
+            "SXRlbUlkLnByb3RvGihQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVtL0l0ZW1U",
+            "eXBlLnByb3RvIqABCgtBcHBsaWVkSXRlbRIyCgdpdGVtX2lkGAEgASgOMiEu",
+            "UE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSNgoJaXRlbV90eXBl",
+            "GAIgASgOMiMuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtVHlwZRIR",
+            "CglleHBpcmVfbXMYAyABKAMSEgoKYXBwbGllZF9tcxgEIAEoA2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.AppliedItem), global::POGOProtos.Inventory.AppliedItem.Parser, new[]{ "ItemId", "ItemType", "ExpireMs", "AppliedMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AppliedItem : pb::IMessage<AppliedItem> {
+    private static readonly pb::MessageParser<AppliedItem> _parser = new pb::MessageParser<AppliedItem>(() => new AppliedItem());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AppliedItem> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.AppliedItemReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItem() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItem(AppliedItem other) : this() {
+      itemId_ = other.itemId_;
+      itemType_ = other.itemType_;
+      expireMs_ = other.expireMs_;
+      appliedMs_ = other.appliedMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItem Clone() {
+      return new AppliedItem(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_type" field.</summary>
+    public const int ItemTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemType itemType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemType ItemType {
+      get { return itemType_; }
+      set {
+        itemType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "expire_ms" field.</summary>
+    public const int ExpireMsFieldNumber = 3;
+    private long expireMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ExpireMs {
+      get { return expireMs_; }
+      set {
+        expireMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_ms" field.</summary>
+    public const int AppliedMsFieldNumber = 4;
+    private long appliedMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long AppliedMs {
+      get { return appliedMs_; }
+      set {
+        appliedMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AppliedItem);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AppliedItem other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ItemType != other.ItemType) return false;
+      if (ExpireMs != other.ExpireMs) return false;
+      if (AppliedMs != other.AppliedMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ItemType != 0) hash ^= ItemType.GetHashCode();
+      if (ExpireMs != 0L) hash ^= ExpireMs.GetHashCode();
+      if (AppliedMs != 0L) hash ^= AppliedMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ItemType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) ItemType);
+      }
+      if (ExpireMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(ExpireMs);
+      }
+      if (AppliedMs != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(AppliedMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ItemType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemType);
+      }
+      if (ExpireMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpireMs);
+      }
+      if (AppliedMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(AppliedMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AppliedItem other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ItemType != 0) {
+        ItemType = other.ItemType;
+      }
+      if (other.ExpireMs != 0L) {
+        ExpireMs = other.ExpireMs;
+      }
+      if (other.AppliedMs != 0L) {
+        AppliedMs = other.AppliedMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            itemType_ = (global::POGOProtos.Inventory.Item.ItemType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            ExpireMs = input.ReadInt64();
+            break;
+          }
+          case 32: {
+            AppliedMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/AppliedItems.cs b/PokemonGo/POGOProtos/Inventory/AppliedItems.cs
new file mode 100644
index 0000000..146c870
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/AppliedItems.cs
@@ -0,0 +1,152 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/AppliedItems.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/AppliedItems.proto</summary>
+  public static partial class AppliedItemsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/AppliedItems.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AppliedItemsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL0ludmVudG9yeS9BcHBsaWVkSXRlbXMucHJvdG8SFFBP",
+            "R09Qcm90b3MuSW52ZW50b3J5GiZQT0dPUHJvdG9zL0ludmVudG9yeS9BcHBs",
+            "aWVkSXRlbS5wcm90byI/CgxBcHBsaWVkSXRlbXMSLwoEaXRlbRgEIAMoCzIh",
+            "LlBPR09Qcm90b3MuSW52ZW50b3J5LkFwcGxpZWRJdGVtYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.AppliedItemReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.AppliedItems), global::POGOProtos.Inventory.AppliedItems.Parser, new[]{ "Item" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AppliedItems : pb::IMessage<AppliedItems> {
+    private static readonly pb::MessageParser<AppliedItems> _parser = new pb::MessageParser<AppliedItems>(() => new AppliedItems());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AppliedItems> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.AppliedItemsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItems() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItems(AppliedItems other) : this() {
+      item_ = other.item_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItems Clone() {
+      return new AppliedItems(this);
+    }
+
+    /// <summary>Field number for the "item" field.</summary>
+    public const int ItemFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.AppliedItem> _repeated_item_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Inventory.AppliedItem.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.AppliedItem> item_ = new pbc::RepeatedField<global::POGOProtos.Inventory.AppliedItem>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.AppliedItem> Item {
+      get { return item_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AppliedItems);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AppliedItems other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!item_.Equals(other.item_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= item_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      item_.WriteTo(output, _repeated_item_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += item_.CalculateSize(_repeated_item_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AppliedItems other) {
+      if (other == null) {
+        return;
+      }
+      item_.Add(other.item_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 34: {
+            item_.AddEntriesFrom(input, _repeated_item_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/Candy.cs b/PokemonGo/POGOProtos/Inventory/Candy.cs
new file mode 100644
index 0000000..9384754
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/Candy.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/Candy.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/Candy.proto</summary>
+  public static partial class CandyReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/Candy.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CandyReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiBQT0dPUHJvdG9zL0ludmVudG9yeS9DYW5keS5wcm90bxIUUE9HT1Byb3Rv",
+            "cy5JbnZlbnRvcnkaJlBPR09Qcm90b3MvRW51bXMvUG9rZW1vbkZhbWlseUlk",
+            "LnByb3RvIkwKBUNhbmR5EjQKCWZhbWlseV9pZBgBIAEoDjIhLlBPR09Qcm90",
+            "b3MuRW51bXMuUG9rZW1vbkZhbWlseUlkEg0KBWNhbmR5GAIgASgFYgZwcm90",
+            "bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonFamilyIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.Candy), global::POGOProtos.Inventory.Candy.Parser, new[]{ "FamilyId", "Candy_" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Candy : pb::IMessage<Candy> {
+    private static readonly pb::MessageParser<Candy> _parser = new pb::MessageParser<Candy>(() => new Candy());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Candy> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.CandyReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Candy() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Candy(Candy other) : this() {
+      familyId_ = other.familyId_;
+      candy_ = other.candy_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Candy Clone() {
+      return new Candy(this);
+    }
+
+    /// <summary>Field number for the "family_id" field.</summary>
+    public const int FamilyIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonFamilyId familyId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonFamilyId FamilyId {
+      get { return familyId_; }
+      set {
+        familyId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy" field.</summary>
+    public const int Candy_FieldNumber = 2;
+    private int candy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Candy_ {
+      get { return candy_; }
+      set {
+        candy_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Candy);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Candy other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FamilyId != other.FamilyId) return false;
+      if (Candy_ != other.Candy_) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FamilyId != 0) hash ^= FamilyId.GetHashCode();
+      if (Candy_ != 0) hash ^= Candy_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FamilyId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) FamilyId);
+      }
+      if (Candy_ != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Candy_);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FamilyId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) FamilyId);
+      }
+      if (Candy_ != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Candy_);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Candy other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FamilyId != 0) {
+        FamilyId = other.FamilyId;
+      }
+      if (other.Candy_ != 0) {
+        Candy_ = other.Candy_;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            familyId_ = (global::POGOProtos.Enums.PokemonFamilyId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Candy_ = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/EggIncubator.cs b/PokemonGo/POGOProtos/Inventory/EggIncubator.cs
new file mode 100644
index 0000000..b426514
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/EggIncubator.cs
@@ -0,0 +1,336 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/EggIncubator.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/EggIncubator.proto</summary>
+  public static partial class EggIncubatorReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/EggIncubator.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EggIncubatorReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL0ludmVudG9yeS9FZ2dJbmN1YmF0b3IucHJvdG8SFFBP",
+            "R09Qcm90b3MuSW52ZW50b3J5GiZQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVt",
+            "L0l0ZW1JZC5wcm90bxorUE9HT1Byb3Rvcy9JbnZlbnRvcnkvRWdnSW5jdWJh",
+            "dG9yVHlwZS5wcm90byLtAQoMRWdnSW5jdWJhdG9yEgoKAmlkGAEgASgJEjIK",
+            "B2l0ZW1faWQYAiABKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0",
+            "ZW1JZBI+Cg5pbmN1YmF0b3JfdHlwZRgDIAEoDjImLlBPR09Qcm90b3MuSW52",
+            "ZW50b3J5LkVnZ0luY3ViYXRvclR5cGUSFgoOdXNlc19yZW1haW5pbmcYBCAB",
+            "KAUSEgoKcG9rZW1vbl9pZBgFIAEoBBIXCg9zdGFydF9rbV93YWxrZWQYBiAB",
+            "KAESGAoQdGFyZ2V0X2ttX3dhbGtlZBgHIAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, global::POGOProtos.Inventory.EggIncubatorTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.EggIncubator), global::POGOProtos.Inventory.EggIncubator.Parser, new[]{ "Id", "ItemId", "IncubatorType", "UsesRemaining", "PokemonId", "StartKmWalked", "TargetKmWalked" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EggIncubator : pb::IMessage<EggIncubator> {
+    private static readonly pb::MessageParser<EggIncubator> _parser = new pb::MessageParser<EggIncubator>(() => new EggIncubator());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EggIncubator> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.EggIncubatorReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubator() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubator(EggIncubator other) : this() {
+      id_ = other.id_;
+      itemId_ = other.itemId_;
+      incubatorType_ = other.incubatorType_;
+      usesRemaining_ = other.usesRemaining_;
+      pokemonId_ = other.pokemonId_;
+      startKmWalked_ = other.startKmWalked_;
+      targetKmWalked_ = other.targetKmWalked_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubator Clone() {
+      return new EggIncubator(this);
+    }
+
+    /// <summary>Field number for the "id" field.</summary>
+    public const int IdFieldNumber = 1;
+    private string id_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Id {
+      get { return id_; }
+      set {
+        id_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "incubator_type" field.</summary>
+    public const int IncubatorTypeFieldNumber = 3;
+    private global::POGOProtos.Inventory.EggIncubatorType incubatorType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubatorType IncubatorType {
+      get { return incubatorType_; }
+      set {
+        incubatorType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "uses_remaining" field.</summary>
+    public const int UsesRemainingFieldNumber = 4;
+    private int usesRemaining_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int UsesRemaining {
+      get { return usesRemaining_; }
+      set {
+        usesRemaining_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 5;
+    private ulong pokemonId_;
+    /// <summary>
+    ///  TODO: Check if is PokemonType
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "start_km_walked" field.</summary>
+    public const int StartKmWalkedFieldNumber = 6;
+    private double startKmWalked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double StartKmWalked {
+      get { return startKmWalked_; }
+      set {
+        startKmWalked_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_km_walked" field.</summary>
+    public const int TargetKmWalkedFieldNumber = 7;
+    private double targetKmWalked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double TargetKmWalked {
+      get { return targetKmWalked_; }
+      set {
+        targetKmWalked_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EggIncubator);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EggIncubator other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Id != other.Id) return false;
+      if (ItemId != other.ItemId) return false;
+      if (IncubatorType != other.IncubatorType) return false;
+      if (UsesRemaining != other.UsesRemaining) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (StartKmWalked != other.StartKmWalked) return false;
+      if (TargetKmWalked != other.TargetKmWalked) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Id.Length != 0) hash ^= Id.GetHashCode();
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (IncubatorType != 0) hash ^= IncubatorType.GetHashCode();
+      if (UsesRemaining != 0) hash ^= UsesRemaining.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (StartKmWalked != 0D) hash ^= StartKmWalked.GetHashCode();
+      if (TargetKmWalked != 0D) hash ^= TargetKmWalked.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Id.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Id);
+      }
+      if (ItemId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) ItemId);
+      }
+      if (IncubatorType != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) IncubatorType);
+      }
+      if (UsesRemaining != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(UsesRemaining);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(40);
+        output.WriteUInt64(PokemonId);
+      }
+      if (StartKmWalked != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(StartKmWalked);
+      }
+      if (TargetKmWalked != 0D) {
+        output.WriteRawTag(57);
+        output.WriteDouble(TargetKmWalked);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Id.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
+      }
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (IncubatorType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) IncubatorType);
+      }
+      if (UsesRemaining != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(UsesRemaining);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonId);
+      }
+      if (StartKmWalked != 0D) {
+        size += 1 + 8;
+      }
+      if (TargetKmWalked != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EggIncubator other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Id.Length != 0) {
+        Id = other.Id;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.IncubatorType != 0) {
+        IncubatorType = other.IncubatorType;
+      }
+      if (other.UsesRemaining != 0) {
+        UsesRemaining = other.UsesRemaining;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.StartKmWalked != 0D) {
+        StartKmWalked = other.StartKmWalked;
+      }
+      if (other.TargetKmWalked != 0D) {
+        TargetKmWalked = other.TargetKmWalked;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Id = input.ReadString();
+            break;
+          }
+          case 16: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            incubatorType_ = (global::POGOProtos.Inventory.EggIncubatorType) input.ReadEnum();
+            break;
+          }
+          case 32: {
+            UsesRemaining = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            PokemonId = input.ReadUInt64();
+            break;
+          }
+          case 49: {
+            StartKmWalked = input.ReadDouble();
+            break;
+          }
+          case 57: {
+            TargetKmWalked = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/EggIncubatorType.cs b/PokemonGo/POGOProtos/Inventory/EggIncubatorType.cs
new file mode 100644
index 0000000..4f24cd6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/EggIncubatorType.cs
@@ -0,0 +1,46 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/EggIncubatorType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/EggIncubatorType.proto</summary>
+  public static partial class EggIncubatorTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/EggIncubatorType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EggIncubatorTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CitQT0dPUHJvdG9zL0ludmVudG9yeS9FZ2dJbmN1YmF0b3JUeXBlLnByb3Rv",
+            "EhRQT0dPUHJvdG9zLkludmVudG9yeSo/ChBFZ2dJbmN1YmF0b3JUeXBlEhMK",
+            "D0lOQ1VCQVRPUl9VTlNFVBAAEhYKEklOQ1VCQVRPUl9ESVNUQU5DRRABYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Inventory.EggIncubatorType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum EggIncubatorType {
+    [pbr::OriginalName("INCUBATOR_UNSET")] IncubatorUnset = 0,
+    [pbr::OriginalName("INCUBATOR_DISTANCE")] IncubatorDistance = 1,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/EggIncubators.cs b/PokemonGo/POGOProtos/Inventory/EggIncubators.cs
new file mode 100644
index 0000000..8b00fe5
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/EggIncubators.cs
@@ -0,0 +1,153 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/EggIncubators.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/EggIncubators.proto</summary>
+  public static partial class EggIncubatorsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/EggIncubators.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EggIncubatorsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL0ludmVudG9yeS9FZ2dJbmN1YmF0b3JzLnByb3RvEhRQ",
+            "T0dPUHJvdG9zLkludmVudG9yeRonUE9HT1Byb3Rvcy9JbnZlbnRvcnkvRWdn",
+            "SW5jdWJhdG9yLnByb3RvIkoKDUVnZ0luY3ViYXRvcnMSOQoNZWdnX2luY3Vi",
+            "YXRvchgBIAMoCzIiLlBPR09Qcm90b3MuSW52ZW50b3J5LkVnZ0luY3ViYXRv",
+            "cmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.EggIncubatorReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.EggIncubators), global::POGOProtos.Inventory.EggIncubators.Parser, new[]{ "EggIncubator" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EggIncubators : pb::IMessage<EggIncubators> {
+    private static readonly pb::MessageParser<EggIncubators> _parser = new pb::MessageParser<EggIncubators>(() => new EggIncubators());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EggIncubators> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.EggIncubatorsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubators() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubators(EggIncubators other) : this() {
+      eggIncubator_ = other.eggIncubator_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubators Clone() {
+      return new EggIncubators(this);
+    }
+
+    /// <summary>Field number for the "egg_incubator" field.</summary>
+    public const int EggIncubatorFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.EggIncubator> _repeated_eggIncubator_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Inventory.EggIncubator.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.EggIncubator> eggIncubator_ = new pbc::RepeatedField<global::POGOProtos.Inventory.EggIncubator>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.EggIncubator> EggIncubator {
+      get { return eggIncubator_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EggIncubators);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EggIncubators other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!eggIncubator_.Equals(other.eggIncubator_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= eggIncubator_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      eggIncubator_.WriteTo(output, _repeated_eggIncubator_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += eggIncubator_.CalculateSize(_repeated_eggIncubator_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EggIncubators other) {
+      if (other == null) {
+        return;
+      }
+      eggIncubator_.Add(other.eggIncubator_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            eggIncubator_.AddEntriesFrom(input, _repeated_eggIncubator_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/InventoryDelta.cs b/PokemonGo/POGOProtos/Inventory/InventoryDelta.cs
new file mode 100644
index 0000000..a8da953
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/InventoryDelta.cs
@@ -0,0 +1,210 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/InventoryDelta.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/InventoryDelta.proto</summary>
+  public static partial class InventoryDeltaReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/InventoryDelta.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryDeltaReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CilQT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlEZWx0YS5wcm90bxIU",
+            "UE9HT1Byb3Rvcy5JbnZlbnRvcnkaKFBPR09Qcm90b3MvSW52ZW50b3J5L0lu",
+            "dmVudG9yeUl0ZW0ucHJvdG8ihwEKDkludmVudG9yeURlbHRhEh0KFW9yaWdp",
+            "bmFsX3RpbWVzdGFtcF9tcxgBIAEoAxIYChBuZXdfdGltZXN0YW1wX21zGAIg",
+            "ASgDEjwKD2ludmVudG9yeV9pdGVtcxgDIAMoCzIjLlBPR09Qcm90b3MuSW52",
+            "ZW50b3J5LkludmVudG9yeUl0ZW1iBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.InventoryItemReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryDelta), global::POGOProtos.Inventory.InventoryDelta.Parser, new[]{ "OriginalTimestampMs", "NewTimestampMs", "InventoryItems" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventoryDelta : pb::IMessage<InventoryDelta> {
+    private static readonly pb::MessageParser<InventoryDelta> _parser = new pb::MessageParser<InventoryDelta>(() => new InventoryDelta());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryDelta> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.InventoryDeltaReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryDelta() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryDelta(InventoryDelta other) : this() {
+      originalTimestampMs_ = other.originalTimestampMs_;
+      newTimestampMs_ = other.newTimestampMs_;
+      inventoryItems_ = other.inventoryItems_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryDelta Clone() {
+      return new InventoryDelta(this);
+    }
+
+    /// <summary>Field number for the "original_timestamp_ms" field.</summary>
+    public const int OriginalTimestampMsFieldNumber = 1;
+    private long originalTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long OriginalTimestampMs {
+      get { return originalTimestampMs_; }
+      set {
+        originalTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "new_timestamp_ms" field.</summary>
+    public const int NewTimestampMsFieldNumber = 2;
+    private long newTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NewTimestampMs {
+      get { return newTimestampMs_; }
+      set {
+        newTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_items" field.</summary>
+    public const int InventoryItemsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.InventoryItem> _repeated_inventoryItems_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Inventory.InventoryItem.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.InventoryItem> inventoryItems_ = new pbc::RepeatedField<global::POGOProtos.Inventory.InventoryItem>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.InventoryItem> InventoryItems {
+      get { return inventoryItems_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryDelta);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryDelta other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (OriginalTimestampMs != other.OriginalTimestampMs) return false;
+      if (NewTimestampMs != other.NewTimestampMs) return false;
+      if(!inventoryItems_.Equals(other.inventoryItems_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (OriginalTimestampMs != 0L) hash ^= OriginalTimestampMs.GetHashCode();
+      if (NewTimestampMs != 0L) hash ^= NewTimestampMs.GetHashCode();
+      hash ^= inventoryItems_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (OriginalTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(OriginalTimestampMs);
+      }
+      if (NewTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(NewTimestampMs);
+      }
+      inventoryItems_.WriteTo(output, _repeated_inventoryItems_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (OriginalTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(OriginalTimestampMs);
+      }
+      if (NewTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NewTimestampMs);
+      }
+      size += inventoryItems_.CalculateSize(_repeated_inventoryItems_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryDelta other) {
+      if (other == null) {
+        return;
+      }
+      if (other.OriginalTimestampMs != 0L) {
+        OriginalTimestampMs = other.OriginalTimestampMs;
+      }
+      if (other.NewTimestampMs != 0L) {
+        NewTimestampMs = other.NewTimestampMs;
+      }
+      inventoryItems_.Add(other.inventoryItems_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            OriginalTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            NewTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            inventoryItems_.AddEntriesFrom(input, _repeated_inventoryItems_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/InventoryItem.cs b/PokemonGo/POGOProtos/Inventory/InventoryItem.cs
new file mode 100644
index 0000000..d4d3048
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/InventoryItem.cs
@@ -0,0 +1,356 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/InventoryItem.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/InventoryItem.proto</summary>
+  public static partial class InventoryItemReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/InventoryItem.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryItemReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlJdGVtLnByb3RvEhRQ",
+            "T0dPUHJvdG9zLkludmVudG9yeRosUE9HT1Byb3Rvcy9JbnZlbnRvcnkvSW52",
+            "ZW50b3J5SXRlbURhdGEucHJvdG8i3gEKDUludmVudG9yeUl0ZW0SHQoVbW9k",
+            "aWZpZWRfdGltZXN0YW1wX21zGAEgASgDEkUKDGRlbGV0ZWRfaXRlbRgCIAEo",
+            "CzIvLlBPR09Qcm90b3MuSW52ZW50b3J5LkludmVudG9yeUl0ZW0uRGVsZXRl",
+            "ZEl0ZW0SRAoTaW52ZW50b3J5X2l0ZW1fZGF0YRgDIAEoCzInLlBPR09Qcm90",
+            "b3MuSW52ZW50b3J5LkludmVudG9yeUl0ZW1EYXRhGiEKC0RlbGV0ZWRJdGVt",
+            "EhIKCnBva2Vtb25faWQYASABKAZiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.InventoryItemDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryItem), global::POGOProtos.Inventory.InventoryItem.Parser, new[]{ "ModifiedTimestampMs", "DeletedItem", "InventoryItemData" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryItem.Types.DeletedItem), global::POGOProtos.Inventory.InventoryItem.Types.DeletedItem.Parser, new[]{ "PokemonId" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventoryItem : pb::IMessage<InventoryItem> {
+    private static readonly pb::MessageParser<InventoryItem> _parser = new pb::MessageParser<InventoryItem>(() => new InventoryItem());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryItem> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.InventoryItemReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItem() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItem(InventoryItem other) : this() {
+      modifiedTimestampMs_ = other.modifiedTimestampMs_;
+      DeletedItem = other.deletedItem_ != null ? other.DeletedItem.Clone() : null;
+      InventoryItemData = other.inventoryItemData_ != null ? other.InventoryItemData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItem Clone() {
+      return new InventoryItem(this);
+    }
+
+    /// <summary>Field number for the "modified_timestamp_ms" field.</summary>
+    public const int ModifiedTimestampMsFieldNumber = 1;
+    private long modifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ModifiedTimestampMs {
+      get { return modifiedTimestampMs_; }
+      set {
+        modifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deleted_item" field.</summary>
+    public const int DeletedItemFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryItem.Types.DeletedItem deletedItem_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryItem.Types.DeletedItem DeletedItem {
+      get { return deletedItem_; }
+      set {
+        deletedItem_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_item_data" field.</summary>
+    public const int InventoryItemDataFieldNumber = 3;
+    private global::POGOProtos.Inventory.InventoryItemData inventoryItemData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryItemData InventoryItemData {
+      get { return inventoryItemData_; }
+      set {
+        inventoryItemData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryItem);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryItem other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ModifiedTimestampMs != other.ModifiedTimestampMs) return false;
+      if (!object.Equals(DeletedItem, other.DeletedItem)) return false;
+      if (!object.Equals(InventoryItemData, other.InventoryItemData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ModifiedTimestampMs != 0L) hash ^= ModifiedTimestampMs.GetHashCode();
+      if (deletedItem_ != null) hash ^= DeletedItem.GetHashCode();
+      if (inventoryItemData_ != null) hash ^= InventoryItemData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ModifiedTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(ModifiedTimestampMs);
+      }
+      if (deletedItem_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(DeletedItem);
+      }
+      if (inventoryItemData_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(InventoryItemData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ModifiedTimestampMs);
+      }
+      if (deletedItem_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DeletedItem);
+      }
+      if (inventoryItemData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryItemData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryItem other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ModifiedTimestampMs != 0L) {
+        ModifiedTimestampMs = other.ModifiedTimestampMs;
+      }
+      if (other.deletedItem_ != null) {
+        if (deletedItem_ == null) {
+          deletedItem_ = new global::POGOProtos.Inventory.InventoryItem.Types.DeletedItem();
+        }
+        DeletedItem.MergeFrom(other.DeletedItem);
+      }
+      if (other.inventoryItemData_ != null) {
+        if (inventoryItemData_ == null) {
+          inventoryItemData_ = new global::POGOProtos.Inventory.InventoryItemData();
+        }
+        InventoryItemData.MergeFrom(other.InventoryItemData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            ModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            if (deletedItem_ == null) {
+              deletedItem_ = new global::POGOProtos.Inventory.InventoryItem.Types.DeletedItem();
+            }
+            input.ReadMessage(deletedItem_);
+            break;
+          }
+          case 26: {
+            if (inventoryItemData_ == null) {
+              inventoryItemData_ = new global::POGOProtos.Inventory.InventoryItemData();
+            }
+            input.ReadMessage(inventoryItemData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the InventoryItem message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class DeletedItem : pb::IMessage<DeletedItem> {
+        private static readonly pb::MessageParser<DeletedItem> _parser = new pb::MessageParser<DeletedItem>(() => new DeletedItem());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<DeletedItem> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Inventory.InventoryItem.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public DeletedItem() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public DeletedItem(DeletedItem other) : this() {
+          pokemonId_ = other.pokemonId_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public DeletedItem Clone() {
+          return new DeletedItem(this);
+        }
+
+        /// <summary>Field number for the "pokemon_id" field.</summary>
+        public const int PokemonIdFieldNumber = 1;
+        private ulong pokemonId_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong PokemonId {
+          get { return pokemonId_; }
+          set {
+            pokemonId_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as DeletedItem);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(DeletedItem other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (PokemonId != other.PokemonId) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (PokemonId != 0UL) {
+            output.WriteRawTag(9);
+            output.WriteFixed64(PokemonId);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (PokemonId != 0UL) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(DeletedItem other) {
+          if (other == null) {
+            return;
+          }
+          if (other.PokemonId != 0UL) {
+            PokemonId = other.PokemonId;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 9: {
+                PokemonId = input.ReadFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/InventoryItemData.cs b/PokemonGo/POGOProtos/Inventory/InventoryItemData.cs
new file mode 100644
index 0000000..d328a83
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/InventoryItemData.cs
@@ -0,0 +1,492 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/InventoryItemData.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/InventoryItemData.proto</summary>
+  public static partial class InventoryItemDataReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/InventoryItemData.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryItemDataReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CixQT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlJdGVtRGF0YS5wcm90",
+            "bxIUUE9HT1Byb3Rvcy5JbnZlbnRvcnkaKFBPR09Qcm90b3MvSW52ZW50b3J5",
+            "L0l0ZW0vSXRlbURhdGEucHJvdG8aJ1BPR09Qcm90b3MvSW52ZW50b3J5L0Fw",
+            "cGxpZWRJdGVtcy5wcm90bxooUE9HT1Byb3Rvcy9JbnZlbnRvcnkvRWdnSW5j",
+            "dWJhdG9ycy5wcm90bxogUE9HT1Byb3Rvcy9JbnZlbnRvcnkvQ2FuZHkucHJv",
+            "dG8aLFBPR09Qcm90b3MvSW52ZW50b3J5L0ludmVudG9yeVVwZ3JhZGVzLnBy",
+            "b3RvGiFQT0dPUHJvdG9zL0RhdGEvUG9rZW1vbkRhdGEucHJvdG8aIlBPR09Q",
+            "cm90b3MvRGF0YS9Qb2tlZGV4RW50cnkucHJvdG8aKFBPR09Qcm90b3MvRGF0",
+            "YS9QbGF5ZXIvUGxheWVyU3RhdHMucHJvdG8aK1BPR09Qcm90b3MvRGF0YS9Q",
+            "bGF5ZXIvUGxheWVyQ3VycmVuY3kucHJvdG8aKVBPR09Qcm90b3MvRGF0YS9Q",
+            "bGF5ZXIvUGxheWVyQ2FtZXJhLnByb3RvItIEChFJbnZlbnRvcnlJdGVtRGF0",
+            "YRIyCgxwb2tlbW9uX2RhdGEYASABKAsyHC5QT0dPUHJvdG9zLkRhdGEuUG9r",
+            "ZW1vbkRhdGESMQoEaXRlbRgCIAEoCzIjLlBPR09Qcm90b3MuSW52ZW50b3J5",
+            "Lkl0ZW0uSXRlbURhdGESNAoNcG9rZWRleF9lbnRyeRgDIAEoCzIdLlBPR09Q",
+            "cm90b3MuRGF0YS5Qb2tlZGV4RW50cnkSOQoMcGxheWVyX3N0YXRzGAQgASgL",
+            "MiMuUE9HT1Byb3Rvcy5EYXRhLlBsYXllci5QbGF5ZXJTdGF0cxI/Cg9wbGF5",
+            "ZXJfY3VycmVuY3kYBSABKAsyJi5QT0dPUHJvdG9zLkRhdGEuUGxheWVyLlBs",
+            "YXllckN1cnJlbmN5EjsKDXBsYXllcl9jYW1lcmEYBiABKAsyJC5QT0dPUHJv",
+            "dG9zLkRhdGEuUGxheWVyLlBsYXllckNhbWVyYRJDChJpbnZlbnRvcnlfdXBn",
+            "cmFkZXMYByABKAsyJy5QT0dPUHJvdG9zLkludmVudG9yeS5JbnZlbnRvcnlV",
+            "cGdyYWRlcxI5Cg1hcHBsaWVkX2l0ZW1zGAggASgLMiIuUE9HT1Byb3Rvcy5J",
+            "bnZlbnRvcnkuQXBwbGllZEl0ZW1zEjsKDmVnZ19pbmN1YmF0b3JzGAkgASgL",
+            "MiMuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuRWdnSW5jdWJhdG9ycxIqCgVjYW5k",
+            "eRgKIAEoCzIbLlBPR09Qcm90b3MuSW52ZW50b3J5LkNhbmR5YgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemDataReflection.Descriptor, global::POGOProtos.Inventory.AppliedItemsReflection.Descriptor, global::POGOProtos.Inventory.EggIncubatorsReflection.Descriptor, global::POGOProtos.Inventory.CandyReflection.Descriptor, global::POGOProtos.Inventory.InventoryUpgradesReflection.Descriptor, global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Data.PokedexEntryReflection.Descriptor, global::POGOProtos.Data.Player.PlayerStatsReflection.Descriptor, global::POGOProtos.Data.Player.PlayerCurrencyReflection.Descriptor, global::POGOProtos.Data.Player.PlayerCameraReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryItemData), global::POGOProtos.Inventory.InventoryItemData.Parser, new[]{ "PokemonData", "Item", "PokedexEntry", "PlayerStats", "PlayerCurrency", "PlayerCamera", "InventoryUpgrades", "AppliedItems", "EggIncubators", "Candy" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventoryItemData : pb::IMessage<InventoryItemData> {
+    private static readonly pb::MessageParser<InventoryItemData> _parser = new pb::MessageParser<InventoryItemData>(() => new InventoryItemData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryItemData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.InventoryItemDataReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItemData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItemData(InventoryItemData other) : this() {
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      Item = other.item_ != null ? other.Item.Clone() : null;
+      PokedexEntry = other.pokedexEntry_ != null ? other.PokedexEntry.Clone() : null;
+      PlayerStats = other.playerStats_ != null ? other.PlayerStats.Clone() : null;
+      PlayerCurrency = other.playerCurrency_ != null ? other.PlayerCurrency.Clone() : null;
+      PlayerCamera = other.playerCamera_ != null ? other.PlayerCamera.Clone() : null;
+      InventoryUpgrades = other.inventoryUpgrades_ != null ? other.InventoryUpgrades.Clone() : null;
+      AppliedItems = other.appliedItems_ != null ? other.AppliedItems.Clone() : null;
+      EggIncubators = other.eggIncubators_ != null ? other.EggIncubators.Clone() : null;
+      Candy = other.candy_ != null ? other.Candy.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItemData Clone() {
+      return new InventoryItemData(this);
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 1;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item" field.</summary>
+    public const int ItemFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemData item_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemData Item {
+      get { return item_; }
+      set {
+        item_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokedex_entry" field.</summary>
+    public const int PokedexEntryFieldNumber = 3;
+    private global::POGOProtos.Data.PokedexEntry pokedexEntry_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokedexEntry PokedexEntry {
+      get { return pokedexEntry_; }
+      set {
+        pokedexEntry_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_stats" field.</summary>
+    public const int PlayerStatsFieldNumber = 4;
+    private global::POGOProtos.Data.Player.PlayerStats playerStats_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerStats PlayerStats {
+      get { return playerStats_; }
+      set {
+        playerStats_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_currency" field.</summary>
+    public const int PlayerCurrencyFieldNumber = 5;
+    private global::POGOProtos.Data.Player.PlayerCurrency playerCurrency_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerCurrency PlayerCurrency {
+      get { return playerCurrency_; }
+      set {
+        playerCurrency_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_camera" field.</summary>
+    public const int PlayerCameraFieldNumber = 6;
+    private global::POGOProtos.Data.Player.PlayerCamera playerCamera_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerCamera PlayerCamera {
+      get { return playerCamera_; }
+      set {
+        playerCamera_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_upgrades" field.</summary>
+    public const int InventoryUpgradesFieldNumber = 7;
+    private global::POGOProtos.Inventory.InventoryUpgrades inventoryUpgrades_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryUpgrades InventoryUpgrades {
+      get { return inventoryUpgrades_; }
+      set {
+        inventoryUpgrades_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_items" field.</summary>
+    public const int AppliedItemsFieldNumber = 8;
+    private global::POGOProtos.Inventory.AppliedItems appliedItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.AppliedItems AppliedItems {
+      get { return appliedItems_; }
+      set {
+        appliedItems_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubators" field.</summary>
+    public const int EggIncubatorsFieldNumber = 9;
+    private global::POGOProtos.Inventory.EggIncubators eggIncubators_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubators EggIncubators {
+      get { return eggIncubators_; }
+      set {
+        eggIncubators_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy" field.</summary>
+    public const int CandyFieldNumber = 10;
+    private global::POGOProtos.Inventory.Candy candy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Candy Candy {
+      get { return candy_; }
+      set {
+        candy_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryItemData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryItemData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(Item, other.Item)) return false;
+      if (!object.Equals(PokedexEntry, other.PokedexEntry)) return false;
+      if (!object.Equals(PlayerStats, other.PlayerStats)) return false;
+      if (!object.Equals(PlayerCurrency, other.PlayerCurrency)) return false;
+      if (!object.Equals(PlayerCamera, other.PlayerCamera)) return false;
+      if (!object.Equals(InventoryUpgrades, other.InventoryUpgrades)) return false;
+      if (!object.Equals(AppliedItems, other.AppliedItems)) return false;
+      if (!object.Equals(EggIncubators, other.EggIncubators)) return false;
+      if (!object.Equals(Candy, other.Candy)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (item_ != null) hash ^= Item.GetHashCode();
+      if (pokedexEntry_ != null) hash ^= PokedexEntry.GetHashCode();
+      if (playerStats_ != null) hash ^= PlayerStats.GetHashCode();
+      if (playerCurrency_ != null) hash ^= PlayerCurrency.GetHashCode();
+      if (playerCamera_ != null) hash ^= PlayerCamera.GetHashCode();
+      if (inventoryUpgrades_ != null) hash ^= InventoryUpgrades.GetHashCode();
+      if (appliedItems_ != null) hash ^= AppliedItems.GetHashCode();
+      if (eggIncubators_ != null) hash ^= EggIncubators.GetHashCode();
+      if (candy_ != null) hash ^= Candy.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (pokemonData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PokemonData);
+      }
+      if (item_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Item);
+      }
+      if (pokedexEntry_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PokedexEntry);
+      }
+      if (playerStats_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(PlayerStats);
+      }
+      if (playerCurrency_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(PlayerCurrency);
+      }
+      if (playerCamera_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(PlayerCamera);
+      }
+      if (inventoryUpgrades_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(InventoryUpgrades);
+      }
+      if (appliedItems_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(AppliedItems);
+      }
+      if (eggIncubators_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(EggIncubators);
+      }
+      if (candy_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(Candy);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (item_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Item);
+      }
+      if (pokedexEntry_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokedexEntry);
+      }
+      if (playerStats_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerStats);
+      }
+      if (playerCurrency_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerCurrency);
+      }
+      if (playerCamera_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerCamera);
+      }
+      if (inventoryUpgrades_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryUpgrades);
+      }
+      if (appliedItems_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedItems);
+      }
+      if (eggIncubators_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubators);
+      }
+      if (candy_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Candy);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryItemData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.item_ != null) {
+        if (item_ == null) {
+          item_ = new global::POGOProtos.Inventory.Item.ItemData();
+        }
+        Item.MergeFrom(other.Item);
+      }
+      if (other.pokedexEntry_ != null) {
+        if (pokedexEntry_ == null) {
+          pokedexEntry_ = new global::POGOProtos.Data.PokedexEntry();
+        }
+        PokedexEntry.MergeFrom(other.PokedexEntry);
+      }
+      if (other.playerStats_ != null) {
+        if (playerStats_ == null) {
+          playerStats_ = new global::POGOProtos.Data.Player.PlayerStats();
+        }
+        PlayerStats.MergeFrom(other.PlayerStats);
+      }
+      if (other.playerCurrency_ != null) {
+        if (playerCurrency_ == null) {
+          playerCurrency_ = new global::POGOProtos.Data.Player.PlayerCurrency();
+        }
+        PlayerCurrency.MergeFrom(other.PlayerCurrency);
+      }
+      if (other.playerCamera_ != null) {
+        if (playerCamera_ == null) {
+          playerCamera_ = new global::POGOProtos.Data.Player.PlayerCamera();
+        }
+        PlayerCamera.MergeFrom(other.PlayerCamera);
+      }
+      if (other.inventoryUpgrades_ != null) {
+        if (inventoryUpgrades_ == null) {
+          inventoryUpgrades_ = new global::POGOProtos.Inventory.InventoryUpgrades();
+        }
+        InventoryUpgrades.MergeFrom(other.InventoryUpgrades);
+      }
+      if (other.appliedItems_ != null) {
+        if (appliedItems_ == null) {
+          appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+        }
+        AppliedItems.MergeFrom(other.AppliedItems);
+      }
+      if (other.eggIncubators_ != null) {
+        if (eggIncubators_ == null) {
+          eggIncubators_ = new global::POGOProtos.Inventory.EggIncubators();
+        }
+        EggIncubators.MergeFrom(other.EggIncubators);
+      }
+      if (other.candy_ != null) {
+        if (candy_ == null) {
+          candy_ = new global::POGOProtos.Inventory.Candy();
+        }
+        Candy.MergeFrom(other.Candy);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 18: {
+            if (item_ == null) {
+              item_ = new global::POGOProtos.Inventory.Item.ItemData();
+            }
+            input.ReadMessage(item_);
+            break;
+          }
+          case 26: {
+            if (pokedexEntry_ == null) {
+              pokedexEntry_ = new global::POGOProtos.Data.PokedexEntry();
+            }
+            input.ReadMessage(pokedexEntry_);
+            break;
+          }
+          case 34: {
+            if (playerStats_ == null) {
+              playerStats_ = new global::POGOProtos.Data.Player.PlayerStats();
+            }
+            input.ReadMessage(playerStats_);
+            break;
+          }
+          case 42: {
+            if (playerCurrency_ == null) {
+              playerCurrency_ = new global::POGOProtos.Data.Player.PlayerCurrency();
+            }
+            input.ReadMessage(playerCurrency_);
+            break;
+          }
+          case 50: {
+            if (playerCamera_ == null) {
+              playerCamera_ = new global::POGOProtos.Data.Player.PlayerCamera();
+            }
+            input.ReadMessage(playerCamera_);
+            break;
+          }
+          case 58: {
+            if (inventoryUpgrades_ == null) {
+              inventoryUpgrades_ = new global::POGOProtos.Inventory.InventoryUpgrades();
+            }
+            input.ReadMessage(inventoryUpgrades_);
+            break;
+          }
+          case 66: {
+            if (appliedItems_ == null) {
+              appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+            }
+            input.ReadMessage(appliedItems_);
+            break;
+          }
+          case 74: {
+            if (eggIncubators_ == null) {
+              eggIncubators_ = new global::POGOProtos.Inventory.EggIncubators();
+            }
+            input.ReadMessage(eggIncubators_);
+            break;
+          }
+          case 82: {
+            if (candy_ == null) {
+              candy_ = new global::POGOProtos.Inventory.Candy();
+            }
+            input.ReadMessage(candy_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/InventoryUpgrade.cs b/PokemonGo/POGOProtos/Inventory/InventoryUpgrade.cs
new file mode 100644
index 0000000..93dff08
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/InventoryUpgrade.cs
@@ -0,0 +1,220 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/InventoryUpgrade.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/InventoryUpgrade.proto</summary>
+  public static partial class InventoryUpgradeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/InventoryUpgrade.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryUpgradeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CitQT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlVcGdyYWRlLnByb3Rv",
+            "EhRQT0dPUHJvdG9zLkludmVudG9yeRomUE9HT1Byb3Rvcy9JbnZlbnRvcnkv",
+            "SXRlbS9JdGVtSWQucHJvdG8aL1BPR09Qcm90b3MvSW52ZW50b3J5L0ludmVu",
+            "dG9yeVVwZ3JhZGVUeXBlLnByb3RvIqQBChBJbnZlbnRvcnlVcGdyYWRlEjIK",
+            "B2l0ZW1faWQYASABKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0",
+            "ZW1JZBJACgx1cGdyYWRlX3R5cGUYAiABKA4yKi5QT0dPUHJvdG9zLkludmVu",
+            "dG9yeS5JbnZlbnRvcnlVcGdyYWRlVHlwZRIaChJhZGRpdGlvbmFsX3N0b3Jh",
+            "Z2UYAyABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, global::POGOProtos.Inventory.InventoryUpgradeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryUpgrade), global::POGOProtos.Inventory.InventoryUpgrade.Parser, new[]{ "ItemId", "UpgradeType", "AdditionalStorage" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventoryUpgrade : pb::IMessage<InventoryUpgrade> {
+    private static readonly pb::MessageParser<InventoryUpgrade> _parser = new pb::MessageParser<InventoryUpgrade>(() => new InventoryUpgrade());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryUpgrade> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.InventoryUpgradeReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrade() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrade(InventoryUpgrade other) : this() {
+      itemId_ = other.itemId_;
+      upgradeType_ = other.upgradeType_;
+      additionalStorage_ = other.additionalStorage_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrade Clone() {
+      return new InventoryUpgrade(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "upgrade_type" field.</summary>
+    public const int UpgradeTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryUpgradeType upgradeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryUpgradeType UpgradeType {
+      get { return upgradeType_; }
+      set {
+        upgradeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "additional_storage" field.</summary>
+    public const int AdditionalStorageFieldNumber = 3;
+    private int additionalStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AdditionalStorage {
+      get { return additionalStorage_; }
+      set {
+        additionalStorage_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryUpgrade);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryUpgrade other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (UpgradeType != other.UpgradeType) return false;
+      if (AdditionalStorage != other.AdditionalStorage) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (UpgradeType != 0) hash ^= UpgradeType.GetHashCode();
+      if (AdditionalStorage != 0) hash ^= AdditionalStorage.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (UpgradeType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) UpgradeType);
+      }
+      if (AdditionalStorage != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(AdditionalStorage);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (UpgradeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) UpgradeType);
+      }
+      if (AdditionalStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AdditionalStorage);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryUpgrade other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.UpgradeType != 0) {
+        UpgradeType = other.UpgradeType;
+      }
+      if (other.AdditionalStorage != 0) {
+        AdditionalStorage = other.AdditionalStorage;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            upgradeType_ = (global::POGOProtos.Inventory.InventoryUpgradeType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            AdditionalStorage = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/InventoryUpgradeType.cs b/PokemonGo/POGOProtos/Inventory/InventoryUpgradeType.cs
new file mode 100644
index 0000000..bad3709
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/InventoryUpgradeType.cs
@@ -0,0 +1,47 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/InventoryUpgradeType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/InventoryUpgradeType.proto</summary>
+  public static partial class InventoryUpgradeTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/InventoryUpgradeType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryUpgradeTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci9QT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlVcGdyYWRlVHlwZS5w",
+            "cm90bxIUUE9HT1Byb3Rvcy5JbnZlbnRvcnkqYgoUSW52ZW50b3J5VXBncmFk",
+            "ZVR5cGUSEQoNVVBHUkFERV9VTlNFVBAAEhkKFUlOQ1JFQVNFX0lURU1fU1RP",
+            "UkFHRRABEhwKGElOQ1JFQVNFX1BPS0VNT05fU1RPUkFHRRACYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Inventory.InventoryUpgradeType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum InventoryUpgradeType {
+    [pbr::OriginalName("UPGRADE_UNSET")] UpgradeUnset = 0,
+    [pbr::OriginalName("INCREASE_ITEM_STORAGE")] IncreaseItemStorage = 1,
+    [pbr::OriginalName("INCREASE_POKEMON_STORAGE")] IncreasePokemonStorage = 2,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/InventoryUpgrades.cs b/PokemonGo/POGOProtos/Inventory/InventoryUpgrades.cs
new file mode 100644
index 0000000..1739509
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/InventoryUpgrades.cs
@@ -0,0 +1,153 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/InventoryUpgrades.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/InventoryUpgrades.proto</summary>
+  public static partial class InventoryUpgradesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/InventoryUpgrades.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryUpgradesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CixQT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlVcGdyYWRlcy5wcm90",
+            "bxIUUE9HT1Byb3Rvcy5JbnZlbnRvcnkaK1BPR09Qcm90b3MvSW52ZW50b3J5",
+            "L0ludmVudG9yeVVwZ3JhZGUucHJvdG8iVwoRSW52ZW50b3J5VXBncmFkZXMS",
+            "QgoSaW52ZW50b3J5X3VwZ3JhZGVzGAEgAygLMiYuUE9HT1Byb3Rvcy5JbnZl",
+            "bnRvcnkuSW52ZW50b3J5VXBncmFkZWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.InventoryUpgradeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryUpgrades), global::POGOProtos.Inventory.InventoryUpgrades.Parser, new[]{ "InventoryUpgrades_" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventoryUpgrades : pb::IMessage<InventoryUpgrades> {
+    private static readonly pb::MessageParser<InventoryUpgrades> _parser = new pb::MessageParser<InventoryUpgrades>(() => new InventoryUpgrades());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryUpgrades> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.InventoryUpgradesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrades() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrades(InventoryUpgrades other) : this() {
+      inventoryUpgrades_ = other.inventoryUpgrades_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrades Clone() {
+      return new InventoryUpgrades(this);
+    }
+
+    /// <summary>Field number for the "inventory_upgrades" field.</summary>
+    public const int InventoryUpgrades_FieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.InventoryUpgrade> _repeated_inventoryUpgrades_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Inventory.InventoryUpgrade.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.InventoryUpgrade> inventoryUpgrades_ = new pbc::RepeatedField<global::POGOProtos.Inventory.InventoryUpgrade>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.InventoryUpgrade> InventoryUpgrades_ {
+      get { return inventoryUpgrades_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryUpgrades);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryUpgrades other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!inventoryUpgrades_.Equals(other.inventoryUpgrades_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= inventoryUpgrades_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      inventoryUpgrades_.WriteTo(output, _repeated_inventoryUpgrades_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += inventoryUpgrades_.CalculateSize(_repeated_inventoryUpgrades_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryUpgrades other) {
+      if (other == null) {
+        return;
+      }
+      inventoryUpgrades_.Add(other.inventoryUpgrades_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            inventoryUpgrades_.AddEntriesFrom(input, _repeated_inventoryUpgrades_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/Item/ItemAward.cs b/PokemonGo/POGOProtos/Inventory/Item/ItemAward.cs
new file mode 100644
index 0000000..21077c6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/Item/ItemAward.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/Item/ItemAward.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/Item/ItemAward.proto</summary>
+  public static partial class ItemAwardReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/Item/ItemAward.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemAwardReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CilQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVtL0l0ZW1Bd2FyZC5wcm90bxIZ",
+            "UE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbRomUE9HT1Byb3Rvcy9JbnZlbnRv",
+            "cnkvSXRlbS9JdGVtSWQucHJvdG8iUwoJSXRlbUF3YXJkEjIKB2l0ZW1faWQY",
+            "ASABKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1JZBISCgpp",
+            "dGVtX2NvdW50GAIgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.Item.ItemAward), global::POGOProtos.Inventory.Item.ItemAward.Parser, new[]{ "ItemId", "ItemCount" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ItemAward : pb::IMessage<ItemAward> {
+    private static readonly pb::MessageParser<ItemAward> _parser = new pb::MessageParser<ItemAward>(() => new ItemAward());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ItemAward> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.Item.ItemAwardReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemAward() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemAward(ItemAward other) : this() {
+      itemId_ = other.itemId_;
+      itemCount_ = other.itemCount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemAward Clone() {
+      return new ItemAward(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_count" field.</summary>
+    public const int ItemCountFieldNumber = 2;
+    private int itemCount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ItemCount {
+      get { return itemCount_; }
+      set {
+        itemCount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ItemAward);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ItemAward other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ItemCount != other.ItemCount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ItemCount != 0) hash ^= ItemCount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ItemCount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(ItemCount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ItemCount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ItemCount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ItemAward other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ItemCount != 0) {
+        ItemCount = other.ItemCount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ItemCount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/Item/ItemData.cs b/PokemonGo/POGOProtos/Inventory/Item/ItemData.cs
new file mode 100644
index 0000000..8c9f9f2
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/Item/ItemData.cs
@@ -0,0 +1,217 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/Item/ItemData.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/Item/ItemData.proto</summary>
+  public static partial class ItemDataReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/Item/ItemData.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemDataReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVtL0l0ZW1EYXRhLnByb3RvEhlQ",
+            "T0dPUHJvdG9zLkludmVudG9yeS5JdGVtGiZQT0dPUHJvdG9zL0ludmVudG9y",
+            "eS9JdGVtL0l0ZW1JZC5wcm90byJdCghJdGVtRGF0YRIyCgdpdGVtX2lkGAEg",
+            "ASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSDQoFY291",
+            "bnQYAiABKAUSDgoGdW5zZWVuGAMgASgIYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.Item.ItemData), global::POGOProtos.Inventory.Item.ItemData.Parser, new[]{ "ItemId", "Count", "Unseen" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ItemData : pb::IMessage<ItemData> {
+    private static readonly pb::MessageParser<ItemData> _parser = new pb::MessageParser<ItemData>(() => new ItemData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ItemData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.Item.ItemDataReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemData(ItemData other) : this() {
+      itemId_ = other.itemId_;
+      count_ = other.count_;
+      unseen_ = other.unseen_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemData Clone() {
+      return new ItemData(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "count" field.</summary>
+    public const int CountFieldNumber = 2;
+    private int count_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Count {
+      get { return count_; }
+      set {
+        count_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unseen" field.</summary>
+    public const int UnseenFieldNumber = 3;
+    private bool unseen_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Unseen {
+      get { return unseen_; }
+      set {
+        unseen_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ItemData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ItemData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (Count != other.Count) return false;
+      if (Unseen != other.Unseen) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (Count != 0) hash ^= Count.GetHashCode();
+      if (Unseen != false) hash ^= Unseen.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (Count != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Count);
+      }
+      if (Unseen != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(Unseen);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (Count != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
+      }
+      if (Unseen != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ItemData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.Count != 0) {
+        Count = other.Count;
+      }
+      if (other.Unseen != false) {
+        Unseen = other.Unseen;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Count = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            Unseen = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/Item/ItemId.cs b/PokemonGo/POGOProtos/Inventory/Item/ItemId.cs
new file mode 100644
index 0000000..54f2245
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/Item/ItemId.cs
@@ -0,0 +1,88 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/Item/ItemId.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/Item/ItemId.proto</summary>
+  public static partial class ItemIdReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/Item/ItemId.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemIdReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVtL0l0ZW1JZC5wcm90bxIZUE9H",
+            "T1Byb3Rvcy5JbnZlbnRvcnkuSXRlbSrHBQoGSXRlbUlkEhAKDElURU1fVU5L",
+            "Tk9XThAAEhIKDklURU1fUE9LRV9CQUxMEAESEwoPSVRFTV9HUkVBVF9CQUxM",
+            "EAISEwoPSVRFTV9VTFRSQV9CQUxMEAMSFAoQSVRFTV9NQVNURVJfQkFMTBAE",
+            "Eg8KC0lURU1fUE9USU9OEGUSFQoRSVRFTV9TVVBFUl9QT1RJT04QZhIVChFJ",
+            "VEVNX0hZUEVSX1BPVElPThBnEhMKD0lURU1fTUFYX1BPVElPThBoEhAKC0lU",
+            "RU1fUkVWSVZFEMkBEhQKD0lURU1fTUFYX1JFVklWRRDKARITCg5JVEVNX0xV",
+            "Q0tZX0VHRxCtAhIaChVJVEVNX0lOQ0VOU0VfT1JESU5BUlkQkQMSFwoSSVRF",
+            "TV9JTkNFTlNFX1NQSUNZEJIDEhYKEUlURU1fSU5DRU5TRV9DT09MEJMDEhgK",
+            "E0lURU1fSU5DRU5TRV9GTE9SQUwQlAMSEwoOSVRFTV9UUk9ZX0RJU0sQ9QMS",
+            "EgoNSVRFTV9YX0FUVEFDSxDaBBITCg5JVEVNX1hfREVGRU5TRRDbBBITCg5J",
+            "VEVNX1hfTUlSQUNMRRDcBBIUCg9JVEVNX1JBWlpfQkVSUlkQvQUSFAoPSVRF",
+            "TV9CTFVLX0JFUlJZEL4FEhUKEElURU1fTkFOQUJfQkVSUlkQvwUSFQoQSVRF",
+            "TV9XRVBBUl9CRVJSWRDABRIVChBJVEVNX1BJTkFQX0JFUlJZEMEFEhgKE0lU",
+            "RU1fU1BFQ0lBTF9DQU1FUkEQoQYSIwoeSVRFTV9JTkNVQkFUT1JfQkFTSUNf",
+            "VU5MSU1JVEVEEIUHEhkKFElURU1fSU5DVUJBVE9SX0JBU0lDEIYHEiEKHElU",
+            "RU1fUE9LRU1PTl9TVE9SQUdFX1VQR1JBREUQ6QcSHgoZSVRFTV9JVEVNX1NU",
+            "T1JBR0VfVVBHUkFERRDqB2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Inventory.Item.ItemId), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ItemId {
+    [pbr::OriginalName("ITEM_UNKNOWN")] ItemUnknown = 0,
+    [pbr::OriginalName("ITEM_POKE_BALL")] ItemPokeBall = 1,
+    [pbr::OriginalName("ITEM_GREAT_BALL")] ItemGreatBall = 2,
+    [pbr::OriginalName("ITEM_ULTRA_BALL")] ItemUltraBall = 3,
+    [pbr::OriginalName("ITEM_MASTER_BALL")] ItemMasterBall = 4,
+    [pbr::OriginalName("ITEM_POTION")] ItemPotion = 101,
+    [pbr::OriginalName("ITEM_SUPER_POTION")] ItemSuperPotion = 102,
+    [pbr::OriginalName("ITEM_HYPER_POTION")] ItemHyperPotion = 103,
+    [pbr::OriginalName("ITEM_MAX_POTION")] ItemMaxPotion = 104,
+    [pbr::OriginalName("ITEM_REVIVE")] ItemRevive = 201,
+    [pbr::OriginalName("ITEM_MAX_REVIVE")] ItemMaxRevive = 202,
+    [pbr::OriginalName("ITEM_LUCKY_EGG")] ItemLuckyEgg = 301,
+    [pbr::OriginalName("ITEM_INCENSE_ORDINARY")] ItemIncenseOrdinary = 401,
+    [pbr::OriginalName("ITEM_INCENSE_SPICY")] ItemIncenseSpicy = 402,
+    [pbr::OriginalName("ITEM_INCENSE_COOL")] ItemIncenseCool = 403,
+    [pbr::OriginalName("ITEM_INCENSE_FLORAL")] ItemIncenseFloral = 404,
+    [pbr::OriginalName("ITEM_TROY_DISK")] ItemTroyDisk = 501,
+    [pbr::OriginalName("ITEM_X_ATTACK")] ItemXAttack = 602,
+    [pbr::OriginalName("ITEM_X_DEFENSE")] ItemXDefense = 603,
+    [pbr::OriginalName("ITEM_X_MIRACLE")] ItemXMiracle = 604,
+    [pbr::OriginalName("ITEM_RAZZ_BERRY")] ItemRazzBerry = 701,
+    [pbr::OriginalName("ITEM_BLUK_BERRY")] ItemBlukBerry = 702,
+    [pbr::OriginalName("ITEM_NANAB_BERRY")] ItemNanabBerry = 703,
+    [pbr::OriginalName("ITEM_WEPAR_BERRY")] ItemWeparBerry = 704,
+    [pbr::OriginalName("ITEM_PINAP_BERRY")] ItemPinapBerry = 705,
+    [pbr::OriginalName("ITEM_SPECIAL_CAMERA")] ItemSpecialCamera = 801,
+    [pbr::OriginalName("ITEM_INCUBATOR_BASIC_UNLIMITED")] ItemIncubatorBasicUnlimited = 901,
+    [pbr::OriginalName("ITEM_INCUBATOR_BASIC")] ItemIncubatorBasic = 902,
+    [pbr::OriginalName("ITEM_POKEMON_STORAGE_UPGRADE")] ItemPokemonStorageUpgrade = 1001,
+    [pbr::OriginalName("ITEM_ITEM_STORAGE_UPGRADE")] ItemItemStorageUpgrade = 1002,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/Item/ItemType.cs b/PokemonGo/POGOProtos/Inventory/Item/ItemType.cs
new file mode 100644
index 0000000..3185cef
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/Item/ItemType.cs
@@ -0,0 +1,62 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Inventory/Item/ItemType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Inventory/Item/ItemType.proto</summary>
+  public static partial class ItemTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Inventory/Item/ItemType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVtL0l0ZW1UeXBlLnByb3RvEhlQ",
+            "T0dPUHJvdG9zLkludmVudG9yeS5JdGVtKrICCghJdGVtVHlwZRISCg5JVEVN",
+            "X1RZUEVfTk9ORRAAEhYKEklURU1fVFlQRV9QT0tFQkFMTBABEhQKEElURU1f",
+            "VFlQRV9QT1RJT04QAhIUChBJVEVNX1RZUEVfUkVWSVZFEAMSEQoNSVRFTV9U",
+            "WVBFX01BUBAEEhQKEElURU1fVFlQRV9CQVRUTEUQBRISCg5JVEVNX1RZUEVf",
+            "Rk9PRBAGEhQKEElURU1fVFlQRV9DQU1FUkEQBxISCg5JVEVNX1RZUEVfRElT",
+            "SxAIEhcKE0lURU1fVFlQRV9JTkNVQkFUT1IQCRIVChFJVEVNX1RZUEVfSU5D",
+            "RU5TRRAKEhYKEklURU1fVFlQRV9YUF9CT09TVBALEh8KG0lURU1fVFlQRV9J",
+            "TlZFTlRPUllfVVBHUkFERRAMYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Inventory.Item.ItemType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ItemType {
+    [pbr::OriginalName("ITEM_TYPE_NONE")] None = 0,
+    [pbr::OriginalName("ITEM_TYPE_POKEBALL")] Pokeball = 1,
+    [pbr::OriginalName("ITEM_TYPE_POTION")] Potion = 2,
+    [pbr::OriginalName("ITEM_TYPE_REVIVE")] Revive = 3,
+    [pbr::OriginalName("ITEM_TYPE_MAP")] Map = 4,
+    [pbr::OriginalName("ITEM_TYPE_BATTLE")] Battle = 5,
+    [pbr::OriginalName("ITEM_TYPE_FOOD")] Food = 6,
+    [pbr::OriginalName("ITEM_TYPE_CAMERA")] Camera = 7,
+    [pbr::OriginalName("ITEM_TYPE_DISK")] Disk = 8,
+    [pbr::OriginalName("ITEM_TYPE_INCUBATOR")] Incubator = 9,
+    [pbr::OriginalName("ITEM_TYPE_INCENSE")] Incense = 10,
+    [pbr::OriginalName("ITEM_TYPE_XP_BOOST")] XpBoost = 11,
+    [pbr::OriginalName("ITEM_TYPE_INVENTORY_UPGRADE")] InventoryUpgrade = 12,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/Item/POGOProtosInventoryItem.cs b/PokemonGo/POGOProtos/Inventory/Item/POGOProtosInventoryItem.cs
new file mode 100644
index 0000000..39bbc21
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/Item/POGOProtosInventoryItem.cs
@@ -0,0 +1,439 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Inventory.Item.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Inventory.Item.proto</summary>
+  public static partial class POGOProtosInventoryItemReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Inventory.Item.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosInventoryItemReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch9QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLnByb3RvEhlQT0dPUHJvdG9z",
+            "LkludmVudG9yeS5JdGVtIlMKCUl0ZW1Bd2FyZBIyCgdpdGVtX2lkGAEgASgO",
+            "MiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSEgoKaXRlbV9j",
+            "b3VudBgCIAEoBSJdCghJdGVtRGF0YRIyCgdpdGVtX2lkGAEgASgOMiEuUE9H",
+            "T1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSDQoFY291bnQYAiABKAUS",
+            "DgoGdW5zZWVuGAMgASgIKrICCghJdGVtVHlwZRISCg5JVEVNX1RZUEVfTk9O",
+            "RRAAEhYKEklURU1fVFlQRV9QT0tFQkFMTBABEhQKEElURU1fVFlQRV9QT1RJ",
+            "T04QAhIUChBJVEVNX1RZUEVfUkVWSVZFEAMSEQoNSVRFTV9UWVBFX01BUBAE",
+            "EhQKEElURU1fVFlQRV9CQVRUTEUQBRISCg5JVEVNX1RZUEVfRk9PRBAGEhQK",
+            "EElURU1fVFlQRV9DQU1FUkEQBxISCg5JVEVNX1RZUEVfRElTSxAIEhcKE0lU",
+            "RU1fVFlQRV9JTkNVQkFUT1IQCRIVChFJVEVNX1RZUEVfSU5DRU5TRRAKEhYK",
+            "EklURU1fVFlQRV9YUF9CT09TVBALEh8KG0lURU1fVFlQRV9JTlZFTlRPUllf",
+            "VVBHUkFERRAMKscFCgZJdGVtSWQSEAoMSVRFTV9VTktOT1dOEAASEgoOSVRF",
+            "TV9QT0tFX0JBTEwQARITCg9JVEVNX0dSRUFUX0JBTEwQAhITCg9JVEVNX1VM",
+            "VFJBX0JBTEwQAxIUChBJVEVNX01BU1RFUl9CQUxMEAQSDwoLSVRFTV9QT1RJ",
+            "T04QZRIVChFJVEVNX1NVUEVSX1BPVElPThBmEhUKEUlURU1fSFlQRVJfUE9U",
+            "SU9OEGcSEwoPSVRFTV9NQVhfUE9USU9OEGgSEAoLSVRFTV9SRVZJVkUQyQES",
+            "FAoPSVRFTV9NQVhfUkVWSVZFEMoBEhMKDklURU1fTFVDS1lfRUdHEK0CEhoK",
+            "FUlURU1fSU5DRU5TRV9PUkRJTkFSWRCRAxIXChJJVEVNX0lOQ0VOU0VfU1BJ",
+            "Q1kQkgMSFgoRSVRFTV9JTkNFTlNFX0NPT0wQkwMSGAoTSVRFTV9JTkNFTlNF",
+            "X0ZMT1JBTBCUAxITCg5JVEVNX1RST1lfRElTSxD1AxISCg1JVEVNX1hfQVRU",
+            "QUNLENoEEhMKDklURU1fWF9ERUZFTlNFENsEEhMKDklURU1fWF9NSVJBQ0xF",
+            "ENwEEhQKD0lURU1fUkFaWl9CRVJSWRC9BRIUCg9JVEVNX0JMVUtfQkVSUlkQ",
+            "vgUSFQoQSVRFTV9OQU5BQl9CRVJSWRC/BRIVChBJVEVNX1dFUEFSX0JFUlJZ",
+            "EMAFEhUKEElURU1fUElOQVBfQkVSUlkQwQUSGAoTSVRFTV9TUEVDSUFMX0NB",
+            "TUVSQRChBhIjCh5JVEVNX0lOQ1VCQVRPUl9CQVNJQ19VTkxJTUlURUQQhQcS",
+            "GQoUSVRFTV9JTkNVQkFUT1JfQkFTSUMQhgcSIQocSVRFTV9QT0tFTU9OX1NU",
+            "T1JBR0VfVVBHUkFERRDpBxIeChlJVEVNX0lURU1fU1RPUkFHRV9VUEdSQURF",
+            "EOoHYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Inventory.Item.ItemType), typeof(global::POGOProtos.Inventory.Item.ItemId), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.Item.ItemAward), global::POGOProtos.Inventory.Item.ItemAward.Parser, new[]{ "ItemId", "ItemCount" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.Item.ItemData), global::POGOProtos.Inventory.Item.ItemData.Parser, new[]{ "ItemId", "Count", "Unseen" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ItemType {
+    [pbr::OriginalName("ITEM_TYPE_NONE")] None = 0,
+    [pbr::OriginalName("ITEM_TYPE_POKEBALL")] Pokeball = 1,
+    [pbr::OriginalName("ITEM_TYPE_POTION")] Potion = 2,
+    [pbr::OriginalName("ITEM_TYPE_REVIVE")] Revive = 3,
+    [pbr::OriginalName("ITEM_TYPE_MAP")] Map = 4,
+    [pbr::OriginalName("ITEM_TYPE_BATTLE")] Battle = 5,
+    [pbr::OriginalName("ITEM_TYPE_FOOD")] Food = 6,
+    [pbr::OriginalName("ITEM_TYPE_CAMERA")] Camera = 7,
+    [pbr::OriginalName("ITEM_TYPE_DISK")] Disk = 8,
+    [pbr::OriginalName("ITEM_TYPE_INCUBATOR")] Incubator = 9,
+    [pbr::OriginalName("ITEM_TYPE_INCENSE")] Incense = 10,
+    [pbr::OriginalName("ITEM_TYPE_XP_BOOST")] XpBoost = 11,
+    [pbr::OriginalName("ITEM_TYPE_INVENTORY_UPGRADE")] InventoryUpgrade = 12,
+  }
+
+  public enum ItemId {
+    [pbr::OriginalName("ITEM_UNKNOWN")] ItemUnknown = 0,
+    [pbr::OriginalName("ITEM_POKE_BALL")] ItemPokeBall = 1,
+    [pbr::OriginalName("ITEM_GREAT_BALL")] ItemGreatBall = 2,
+    [pbr::OriginalName("ITEM_ULTRA_BALL")] ItemUltraBall = 3,
+    [pbr::OriginalName("ITEM_MASTER_BALL")] ItemMasterBall = 4,
+    [pbr::OriginalName("ITEM_POTION")] ItemPotion = 101,
+    [pbr::OriginalName("ITEM_SUPER_POTION")] ItemSuperPotion = 102,
+    [pbr::OriginalName("ITEM_HYPER_POTION")] ItemHyperPotion = 103,
+    [pbr::OriginalName("ITEM_MAX_POTION")] ItemMaxPotion = 104,
+    [pbr::OriginalName("ITEM_REVIVE")] ItemRevive = 201,
+    [pbr::OriginalName("ITEM_MAX_REVIVE")] ItemMaxRevive = 202,
+    [pbr::OriginalName("ITEM_LUCKY_EGG")] ItemLuckyEgg = 301,
+    [pbr::OriginalName("ITEM_INCENSE_ORDINARY")] ItemIncenseOrdinary = 401,
+    [pbr::OriginalName("ITEM_INCENSE_SPICY")] ItemIncenseSpicy = 402,
+    [pbr::OriginalName("ITEM_INCENSE_COOL")] ItemIncenseCool = 403,
+    [pbr::OriginalName("ITEM_INCENSE_FLORAL")] ItemIncenseFloral = 404,
+    [pbr::OriginalName("ITEM_TROY_DISK")] ItemTroyDisk = 501,
+    [pbr::OriginalName("ITEM_X_ATTACK")] ItemXAttack = 602,
+    [pbr::OriginalName("ITEM_X_DEFENSE")] ItemXDefense = 603,
+    [pbr::OriginalName("ITEM_X_MIRACLE")] ItemXMiracle = 604,
+    [pbr::OriginalName("ITEM_RAZZ_BERRY")] ItemRazzBerry = 701,
+    [pbr::OriginalName("ITEM_BLUK_BERRY")] ItemBlukBerry = 702,
+    [pbr::OriginalName("ITEM_NANAB_BERRY")] ItemNanabBerry = 703,
+    [pbr::OriginalName("ITEM_WEPAR_BERRY")] ItemWeparBerry = 704,
+    [pbr::OriginalName("ITEM_PINAP_BERRY")] ItemPinapBerry = 705,
+    [pbr::OriginalName("ITEM_SPECIAL_CAMERA")] ItemSpecialCamera = 801,
+    [pbr::OriginalName("ITEM_INCUBATOR_BASIC_UNLIMITED")] ItemIncubatorBasicUnlimited = 901,
+    [pbr::OriginalName("ITEM_INCUBATOR_BASIC")] ItemIncubatorBasic = 902,
+    [pbr::OriginalName("ITEM_POKEMON_STORAGE_UPGRADE")] ItemPokemonStorageUpgrade = 1001,
+    [pbr::OriginalName("ITEM_ITEM_STORAGE_UPGRADE")] ItemItemStorageUpgrade = 1002,
+  }
+
+  #endregion
+
+  #region Messages
+  public sealed partial class ItemAward : pb::IMessage<ItemAward> {
+    private static readonly pb::MessageParser<ItemAward> _parser = new pb::MessageParser<ItemAward>(() => new ItemAward());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ItemAward> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemAward() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemAward(ItemAward other) : this() {
+      itemId_ = other.itemId_;
+      itemCount_ = other.itemCount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemAward Clone() {
+      return new ItemAward(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_count" field.</summary>
+    public const int ItemCountFieldNumber = 2;
+    private int itemCount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ItemCount {
+      get { return itemCount_; }
+      set {
+        itemCount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ItemAward);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ItemAward other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ItemCount != other.ItemCount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ItemCount != 0) hash ^= ItemCount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ItemCount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(ItemCount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ItemCount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ItemCount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ItemAward other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ItemCount != 0) {
+        ItemCount = other.ItemCount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ItemCount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ItemData : pb::IMessage<ItemData> {
+    private static readonly pb::MessageParser<ItemData> _parser = new pb::MessageParser<ItemData>(() => new ItemData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ItemData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemData(ItemData other) : this() {
+      itemId_ = other.itemId_;
+      count_ = other.count_;
+      unseen_ = other.unseen_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemData Clone() {
+      return new ItemData(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "count" field.</summary>
+    public const int CountFieldNumber = 2;
+    private int count_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Count {
+      get { return count_; }
+      set {
+        count_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unseen" field.</summary>
+    public const int UnseenFieldNumber = 3;
+    private bool unseen_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Unseen {
+      get { return unseen_; }
+      set {
+        unseen_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ItemData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ItemData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (Count != other.Count) return false;
+      if (Unseen != other.Unseen) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (Count != 0) hash ^= Count.GetHashCode();
+      if (Unseen != false) hash ^= Unseen.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (Count != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Count);
+      }
+      if (Unseen != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(Unseen);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (Count != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
+      }
+      if (Unseen != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ItemData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.Count != 0) {
+        Count = other.Count;
+      }
+      if (other.Unseen != false) {
+        Unseen = other.Unseen;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Count = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            Unseen = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Inventory/POGOProtosInventory.cs b/PokemonGo/POGOProtos/Inventory/POGOProtosInventory.cs
new file mode 100644
index 0000000..7fe5047
--- /dev/null
+++ b/PokemonGo/POGOProtos/Inventory/POGOProtosInventory.cs
@@ -0,0 +1,2016 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Inventory.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Inventory {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Inventory.proto</summary>
+  public static partial class POGOProtosInventoryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Inventory.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosInventoryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChpQT0dPUHJvdG9zLkludmVudG9yeS5wcm90bxIUUE9HT1Byb3Rvcy5JbnZl",
+            "bnRvcnkaH1BPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0ucHJvdG8aFVBPR09Q",
+            "cm90b3MuRGF0YS5wcm90bxocUE9HT1Byb3Rvcy5EYXRhLlBsYXllci5wcm90",
+            "bxoWUE9HT1Byb3Rvcy5FbnVtcy5wcm90byJKCg1FZ2dJbmN1YmF0b3JzEjkK",
+            "DWVnZ19pbmN1YmF0b3IYASADKAsyIi5QT0dPUHJvdG9zLkludmVudG9yeS5F",
+            "Z2dJbmN1YmF0b3IipAEKEEludmVudG9yeVVwZ3JhZGUSMgoHaXRlbV9pZBgB",
+            "IAEoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlkEkAKDHVw",
+            "Z3JhZGVfdHlwZRgCIAEoDjIqLlBPR09Qcm90b3MuSW52ZW50b3J5LkludmVu",
+            "dG9yeVVwZ3JhZGVUeXBlEhoKEmFkZGl0aW9uYWxfc3RvcmFnZRgDIAEoBSLt",
+            "AQoMRWdnSW5jdWJhdG9yEgoKAmlkGAEgASgJEjIKB2l0ZW1faWQYAiABKA4y",
+            "IS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1JZBI+Cg5pbmN1YmF0",
+            "b3JfdHlwZRgDIAEoDjImLlBPR09Qcm90b3MuSW52ZW50b3J5LkVnZ0luY3Vi",
+            "YXRvclR5cGUSFgoOdXNlc19yZW1haW5pbmcYBCABKAUSEgoKcG9rZW1vbl9p",
+            "ZBgFIAEoBBIXCg9zdGFydF9rbV93YWxrZWQYBiABKAESGAoQdGFyZ2V0X2tt",
+            "X3dhbGtlZBgHIAEoASLSBAoRSW52ZW50b3J5SXRlbURhdGESMgoMcG9rZW1v",
+            "bl9kYXRhGAEgASgLMhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEjEK",
+            "BGl0ZW0YAiABKAsyIy5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1E",
+            "YXRhEjQKDXBva2VkZXhfZW50cnkYAyABKAsyHS5QT0dPUHJvdG9zLkRhdGEu",
+            "UG9rZWRleEVudHJ5EjkKDHBsYXllcl9zdGF0cxgEIAEoCzIjLlBPR09Qcm90",
+            "b3MuRGF0YS5QbGF5ZXIuUGxheWVyU3RhdHMSPwoPcGxheWVyX2N1cnJlbmN5",
+            "GAUgASgLMiYuUE9HT1Byb3Rvcy5EYXRhLlBsYXllci5QbGF5ZXJDdXJyZW5j",
+            "eRI7Cg1wbGF5ZXJfY2FtZXJhGAYgASgLMiQuUE9HT1Byb3Rvcy5EYXRhLlBs",
+            "YXllci5QbGF5ZXJDYW1lcmESQwoSaW52ZW50b3J5X3VwZ3JhZGVzGAcgASgL",
+            "MicuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSW52ZW50b3J5VXBncmFkZXMSOQoN",
+            "YXBwbGllZF9pdGVtcxgIIAEoCzIiLlBPR09Qcm90b3MuSW52ZW50b3J5LkFw",
+            "cGxpZWRJdGVtcxI7Cg5lZ2dfaW5jdWJhdG9ycxgJIAEoCzIjLlBPR09Qcm90",
+            "b3MuSW52ZW50b3J5LkVnZ0luY3ViYXRvcnMSKgoFY2FuZHkYCiABKAsyGy5Q",
+            "T0dPUHJvdG9zLkludmVudG9yeS5DYW5keSKHAQoOSW52ZW50b3J5RGVsdGES",
+            "HQoVb3JpZ2luYWxfdGltZXN0YW1wX21zGAEgASgDEhgKEG5ld190aW1lc3Rh",
+            "bXBfbXMYAiABKAMSPAoPaW52ZW50b3J5X2l0ZW1zGAMgAygLMiMuUE9HT1By",
+            "b3Rvcy5JbnZlbnRvcnkuSW52ZW50b3J5SXRlbSJMCgVDYW5keRI0CglmYW1p",
+            "bHlfaWQYASABKA4yIS5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25GYW1pbHlJ",
+            "ZBINCgVjYW5keRgCIAEoBSKOAQoNSW52ZW50b3J5SXRlbRIdChVtb2RpZmll",
+            "ZF90aW1lc3RhbXBfbXMYASABKAMSGAoQZGVsZXRlZF9pdGVtX2tleRgCIAEo",
+            "AxJEChNpbnZlbnRvcnlfaXRlbV9kYXRhGAMgASgLMicuUE9HT1Byb3Rvcy5J",
+            "bnZlbnRvcnkuSW52ZW50b3J5SXRlbURhdGEiPwoMQXBwbGllZEl0ZW1zEi8K",
+            "BGl0ZW0YBCADKAsyIS5QT0dPUHJvdG9zLkludmVudG9yeS5BcHBsaWVkSXRl",
+            "bSKgAQoLQXBwbGllZEl0ZW0SMgoHaXRlbV9pZBgBIAEoDjIhLlBPR09Qcm90",
+            "b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlkEjYKCWl0ZW1fdHlwZRgCIAEoDjIj",
+            "LlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbVR5cGUSEQoJZXhwaXJl",
+            "X21zGAMgASgDEhIKCmFwcGxpZWRfbXMYBCABKAMiVwoRSW52ZW50b3J5VXBn",
+            "cmFkZXMSQgoSaW52ZW50b3J5X3VwZ3JhZGVzGAEgAygLMiYuUE9HT1Byb3Rv",
+            "cy5JbnZlbnRvcnkuSW52ZW50b3J5VXBncmFkZSo/ChBFZ2dJbmN1YmF0b3JU",
+            "eXBlEhMKD0lOQ1VCQVRPUl9VTlNFVBAAEhYKEklOQ1VCQVRPUl9ESVNUQU5D",
+            "RRABKmIKFEludmVudG9yeVVwZ3JhZGVUeXBlEhEKDVVQR1JBREVfVU5TRVQQ",
+            "ABIZChVJTkNSRUFTRV9JVEVNX1NUT1JBR0UQARIcChhJTkNSRUFTRV9QT0tF",
+            "TU9OX1NUT1JBR0UQAlAAUAFQAlADYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Data.POGOProtosDataReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Inventory.EggIncubatorType), typeof(global::POGOProtos.Inventory.InventoryUpgradeType), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.EggIncubators), global::POGOProtos.Inventory.EggIncubators.Parser, new[]{ "EggIncubator" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryUpgrade), global::POGOProtos.Inventory.InventoryUpgrade.Parser, new[]{ "ItemId", "UpgradeType", "AdditionalStorage" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.EggIncubator), global::POGOProtos.Inventory.EggIncubator.Parser, new[]{ "Id", "ItemId", "IncubatorType", "UsesRemaining", "PokemonId", "StartKmWalked", "TargetKmWalked" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryItemData), global::POGOProtos.Inventory.InventoryItemData.Parser, new[]{ "PokemonData", "Item", "PokedexEntry", "PlayerStats", "PlayerCurrency", "PlayerCamera", "InventoryUpgrades", "AppliedItems", "EggIncubators", "Candy" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryDelta), global::POGOProtos.Inventory.InventoryDelta.Parser, new[]{ "OriginalTimestampMs", "NewTimestampMs", "InventoryItems" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.Candy), global::POGOProtos.Inventory.Candy.Parser, new[]{ "FamilyId", "Candy_" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryItem), global::POGOProtos.Inventory.InventoryItem.Parser, new[]{ "ModifiedTimestampMs", "DeletedItemKey", "InventoryItemData" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.AppliedItems), global::POGOProtos.Inventory.AppliedItems.Parser, new[]{ "Item" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.AppliedItem), global::POGOProtos.Inventory.AppliedItem.Parser, new[]{ "ItemId", "ItemType", "ExpireMs", "AppliedMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Inventory.InventoryUpgrades), global::POGOProtos.Inventory.InventoryUpgrades.Parser, new[]{ "InventoryUpgrades_" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum EggIncubatorType {
+    [pbr::OriginalName("INCUBATOR_UNSET")] IncubatorUnset = 0,
+    [pbr::OriginalName("INCUBATOR_DISTANCE")] IncubatorDistance = 1,
+  }
+
+  public enum InventoryUpgradeType {
+    [pbr::OriginalName("UPGRADE_UNSET")] UpgradeUnset = 0,
+    [pbr::OriginalName("INCREASE_ITEM_STORAGE")] IncreaseItemStorage = 1,
+    [pbr::OriginalName("INCREASE_POKEMON_STORAGE")] IncreasePokemonStorage = 2,
+  }
+
+  #endregion
+
+  #region Messages
+  public sealed partial class EggIncubators : pb::IMessage<EggIncubators> {
+    private static readonly pb::MessageParser<EggIncubators> _parser = new pb::MessageParser<EggIncubators>(() => new EggIncubators());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EggIncubators> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubators() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubators(EggIncubators other) : this() {
+      eggIncubator_ = other.eggIncubator_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubators Clone() {
+      return new EggIncubators(this);
+    }
+
+    /// <summary>Field number for the "egg_incubator" field.</summary>
+    public const int EggIncubatorFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.EggIncubator> _repeated_eggIncubator_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Inventory.EggIncubator.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.EggIncubator> eggIncubator_ = new pbc::RepeatedField<global::POGOProtos.Inventory.EggIncubator>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.EggIncubator> EggIncubator {
+      get { return eggIncubator_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EggIncubators);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EggIncubators other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!eggIncubator_.Equals(other.eggIncubator_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= eggIncubator_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      eggIncubator_.WriteTo(output, _repeated_eggIncubator_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += eggIncubator_.CalculateSize(_repeated_eggIncubator_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EggIncubators other) {
+      if (other == null) {
+        return;
+      }
+      eggIncubator_.Add(other.eggIncubator_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            eggIncubator_.AddEntriesFrom(input, _repeated_eggIncubator_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventoryUpgrade : pb::IMessage<InventoryUpgrade> {
+    private static readonly pb::MessageParser<InventoryUpgrade> _parser = new pb::MessageParser<InventoryUpgrade>(() => new InventoryUpgrade());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryUpgrade> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrade() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrade(InventoryUpgrade other) : this() {
+      itemId_ = other.itemId_;
+      upgradeType_ = other.upgradeType_;
+      additionalStorage_ = other.additionalStorage_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrade Clone() {
+      return new InventoryUpgrade(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "upgrade_type" field.</summary>
+    public const int UpgradeTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryUpgradeType upgradeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryUpgradeType UpgradeType {
+      get { return upgradeType_; }
+      set {
+        upgradeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "additional_storage" field.</summary>
+    public const int AdditionalStorageFieldNumber = 3;
+    private int additionalStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AdditionalStorage {
+      get { return additionalStorage_; }
+      set {
+        additionalStorage_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryUpgrade);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryUpgrade other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (UpgradeType != other.UpgradeType) return false;
+      if (AdditionalStorage != other.AdditionalStorage) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (UpgradeType != 0) hash ^= UpgradeType.GetHashCode();
+      if (AdditionalStorage != 0) hash ^= AdditionalStorage.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (UpgradeType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) UpgradeType);
+      }
+      if (AdditionalStorage != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(AdditionalStorage);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (UpgradeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) UpgradeType);
+      }
+      if (AdditionalStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AdditionalStorage);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryUpgrade other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.UpgradeType != 0) {
+        UpgradeType = other.UpgradeType;
+      }
+      if (other.AdditionalStorage != 0) {
+        AdditionalStorage = other.AdditionalStorage;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            upgradeType_ = (global::POGOProtos.Inventory.InventoryUpgradeType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            AdditionalStorage = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EggIncubator : pb::IMessage<EggIncubator> {
+    private static readonly pb::MessageParser<EggIncubator> _parser = new pb::MessageParser<EggIncubator>(() => new EggIncubator());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EggIncubator> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubator() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubator(EggIncubator other) : this() {
+      id_ = other.id_;
+      itemId_ = other.itemId_;
+      incubatorType_ = other.incubatorType_;
+      usesRemaining_ = other.usesRemaining_;
+      pokemonId_ = other.pokemonId_;
+      startKmWalked_ = other.startKmWalked_;
+      targetKmWalked_ = other.targetKmWalked_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubator Clone() {
+      return new EggIncubator(this);
+    }
+
+    /// <summary>Field number for the "id" field.</summary>
+    public const int IdFieldNumber = 1;
+    private string id_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Id {
+      get { return id_; }
+      set {
+        id_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "incubator_type" field.</summary>
+    public const int IncubatorTypeFieldNumber = 3;
+    private global::POGOProtos.Inventory.EggIncubatorType incubatorType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubatorType IncubatorType {
+      get { return incubatorType_; }
+      set {
+        incubatorType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "uses_remaining" field.</summary>
+    public const int UsesRemainingFieldNumber = 4;
+    private int usesRemaining_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int UsesRemaining {
+      get { return usesRemaining_; }
+      set {
+        usesRemaining_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 5;
+    private ulong pokemonId_;
+    /// <summary>
+    ///  TODO: Check if is PokemonType
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "start_km_walked" field.</summary>
+    public const int StartKmWalkedFieldNumber = 6;
+    private double startKmWalked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double StartKmWalked {
+      get { return startKmWalked_; }
+      set {
+        startKmWalked_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_km_walked" field.</summary>
+    public const int TargetKmWalkedFieldNumber = 7;
+    private double targetKmWalked_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double TargetKmWalked {
+      get { return targetKmWalked_; }
+      set {
+        targetKmWalked_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EggIncubator);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EggIncubator other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Id != other.Id) return false;
+      if (ItemId != other.ItemId) return false;
+      if (IncubatorType != other.IncubatorType) return false;
+      if (UsesRemaining != other.UsesRemaining) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (StartKmWalked != other.StartKmWalked) return false;
+      if (TargetKmWalked != other.TargetKmWalked) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Id.Length != 0) hash ^= Id.GetHashCode();
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (IncubatorType != 0) hash ^= IncubatorType.GetHashCode();
+      if (UsesRemaining != 0) hash ^= UsesRemaining.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (StartKmWalked != 0D) hash ^= StartKmWalked.GetHashCode();
+      if (TargetKmWalked != 0D) hash ^= TargetKmWalked.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Id.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Id);
+      }
+      if (ItemId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) ItemId);
+      }
+      if (IncubatorType != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) IncubatorType);
+      }
+      if (UsesRemaining != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(UsesRemaining);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(40);
+        output.WriteUInt64(PokemonId);
+      }
+      if (StartKmWalked != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(StartKmWalked);
+      }
+      if (TargetKmWalked != 0D) {
+        output.WriteRawTag(57);
+        output.WriteDouble(TargetKmWalked);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Id.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
+      }
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (IncubatorType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) IncubatorType);
+      }
+      if (UsesRemaining != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(UsesRemaining);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonId);
+      }
+      if (StartKmWalked != 0D) {
+        size += 1 + 8;
+      }
+      if (TargetKmWalked != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EggIncubator other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Id.Length != 0) {
+        Id = other.Id;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.IncubatorType != 0) {
+        IncubatorType = other.IncubatorType;
+      }
+      if (other.UsesRemaining != 0) {
+        UsesRemaining = other.UsesRemaining;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.StartKmWalked != 0D) {
+        StartKmWalked = other.StartKmWalked;
+      }
+      if (other.TargetKmWalked != 0D) {
+        TargetKmWalked = other.TargetKmWalked;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Id = input.ReadString();
+            break;
+          }
+          case 16: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            incubatorType_ = (global::POGOProtos.Inventory.EggIncubatorType) input.ReadEnum();
+            break;
+          }
+          case 32: {
+            UsesRemaining = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            PokemonId = input.ReadUInt64();
+            break;
+          }
+          case 49: {
+            StartKmWalked = input.ReadDouble();
+            break;
+          }
+          case 57: {
+            TargetKmWalked = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventoryItemData : pb::IMessage<InventoryItemData> {
+    private static readonly pb::MessageParser<InventoryItemData> _parser = new pb::MessageParser<InventoryItemData>(() => new InventoryItemData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryItemData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItemData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItemData(InventoryItemData other) : this() {
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      Item = other.item_ != null ? other.Item.Clone() : null;
+      PokedexEntry = other.pokedexEntry_ != null ? other.PokedexEntry.Clone() : null;
+      PlayerStats = other.playerStats_ != null ? other.PlayerStats.Clone() : null;
+      PlayerCurrency = other.playerCurrency_ != null ? other.PlayerCurrency.Clone() : null;
+      PlayerCamera = other.playerCamera_ != null ? other.PlayerCamera.Clone() : null;
+      InventoryUpgrades = other.inventoryUpgrades_ != null ? other.InventoryUpgrades.Clone() : null;
+      AppliedItems = other.appliedItems_ != null ? other.AppliedItems.Clone() : null;
+      EggIncubators = other.eggIncubators_ != null ? other.EggIncubators.Clone() : null;
+      Candy = other.candy_ != null ? other.Candy.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItemData Clone() {
+      return new InventoryItemData(this);
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 1;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item" field.</summary>
+    public const int ItemFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemData item_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemData Item {
+      get { return item_; }
+      set {
+        item_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokedex_entry" field.</summary>
+    public const int PokedexEntryFieldNumber = 3;
+    private global::POGOProtos.Data.PokedexEntry pokedexEntry_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokedexEntry PokedexEntry {
+      get { return pokedexEntry_; }
+      set {
+        pokedexEntry_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_stats" field.</summary>
+    public const int PlayerStatsFieldNumber = 4;
+    private global::POGOProtos.Data.Player.PlayerStats playerStats_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerStats PlayerStats {
+      get { return playerStats_; }
+      set {
+        playerStats_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_currency" field.</summary>
+    public const int PlayerCurrencyFieldNumber = 5;
+    private global::POGOProtos.Data.Player.PlayerCurrency playerCurrency_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerCurrency PlayerCurrency {
+      get { return playerCurrency_; }
+      set {
+        playerCurrency_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_camera" field.</summary>
+    public const int PlayerCameraFieldNumber = 6;
+    private global::POGOProtos.Data.Player.PlayerCamera playerCamera_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerCamera PlayerCamera {
+      get { return playerCamera_; }
+      set {
+        playerCamera_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_upgrades" field.</summary>
+    public const int InventoryUpgradesFieldNumber = 7;
+    private global::POGOProtos.Inventory.InventoryUpgrades inventoryUpgrades_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryUpgrades InventoryUpgrades {
+      get { return inventoryUpgrades_; }
+      set {
+        inventoryUpgrades_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_items" field.</summary>
+    public const int AppliedItemsFieldNumber = 8;
+    private global::POGOProtos.Inventory.AppliedItems appliedItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.AppliedItems AppliedItems {
+      get { return appliedItems_; }
+      set {
+        appliedItems_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubators" field.</summary>
+    public const int EggIncubatorsFieldNumber = 9;
+    private global::POGOProtos.Inventory.EggIncubators eggIncubators_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubators EggIncubators {
+      get { return eggIncubators_; }
+      set {
+        eggIncubators_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy" field.</summary>
+    public const int CandyFieldNumber = 10;
+    private global::POGOProtos.Inventory.Candy candy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Candy Candy {
+      get { return candy_; }
+      set {
+        candy_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryItemData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryItemData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(Item, other.Item)) return false;
+      if (!object.Equals(PokedexEntry, other.PokedexEntry)) return false;
+      if (!object.Equals(PlayerStats, other.PlayerStats)) return false;
+      if (!object.Equals(PlayerCurrency, other.PlayerCurrency)) return false;
+      if (!object.Equals(PlayerCamera, other.PlayerCamera)) return false;
+      if (!object.Equals(InventoryUpgrades, other.InventoryUpgrades)) return false;
+      if (!object.Equals(AppliedItems, other.AppliedItems)) return false;
+      if (!object.Equals(EggIncubators, other.EggIncubators)) return false;
+      if (!object.Equals(Candy, other.Candy)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (item_ != null) hash ^= Item.GetHashCode();
+      if (pokedexEntry_ != null) hash ^= PokedexEntry.GetHashCode();
+      if (playerStats_ != null) hash ^= PlayerStats.GetHashCode();
+      if (playerCurrency_ != null) hash ^= PlayerCurrency.GetHashCode();
+      if (playerCamera_ != null) hash ^= PlayerCamera.GetHashCode();
+      if (inventoryUpgrades_ != null) hash ^= InventoryUpgrades.GetHashCode();
+      if (appliedItems_ != null) hash ^= AppliedItems.GetHashCode();
+      if (eggIncubators_ != null) hash ^= EggIncubators.GetHashCode();
+      if (candy_ != null) hash ^= Candy.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (pokemonData_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PokemonData);
+      }
+      if (item_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Item);
+      }
+      if (pokedexEntry_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PokedexEntry);
+      }
+      if (playerStats_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(PlayerStats);
+      }
+      if (playerCurrency_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(PlayerCurrency);
+      }
+      if (playerCamera_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(PlayerCamera);
+      }
+      if (inventoryUpgrades_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(InventoryUpgrades);
+      }
+      if (appliedItems_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(AppliedItems);
+      }
+      if (eggIncubators_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(EggIncubators);
+      }
+      if (candy_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(Candy);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (item_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Item);
+      }
+      if (pokedexEntry_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokedexEntry);
+      }
+      if (playerStats_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerStats);
+      }
+      if (playerCurrency_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerCurrency);
+      }
+      if (playerCamera_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerCamera);
+      }
+      if (inventoryUpgrades_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryUpgrades);
+      }
+      if (appliedItems_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedItems);
+      }
+      if (eggIncubators_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubators);
+      }
+      if (candy_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Candy);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryItemData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.item_ != null) {
+        if (item_ == null) {
+          item_ = new global::POGOProtos.Inventory.Item.ItemData();
+        }
+        Item.MergeFrom(other.Item);
+      }
+      if (other.pokedexEntry_ != null) {
+        if (pokedexEntry_ == null) {
+          pokedexEntry_ = new global::POGOProtos.Data.PokedexEntry();
+        }
+        PokedexEntry.MergeFrom(other.PokedexEntry);
+      }
+      if (other.playerStats_ != null) {
+        if (playerStats_ == null) {
+          playerStats_ = new global::POGOProtos.Data.Player.PlayerStats();
+        }
+        PlayerStats.MergeFrom(other.PlayerStats);
+      }
+      if (other.playerCurrency_ != null) {
+        if (playerCurrency_ == null) {
+          playerCurrency_ = new global::POGOProtos.Data.Player.PlayerCurrency();
+        }
+        PlayerCurrency.MergeFrom(other.PlayerCurrency);
+      }
+      if (other.playerCamera_ != null) {
+        if (playerCamera_ == null) {
+          playerCamera_ = new global::POGOProtos.Data.Player.PlayerCamera();
+        }
+        PlayerCamera.MergeFrom(other.PlayerCamera);
+      }
+      if (other.inventoryUpgrades_ != null) {
+        if (inventoryUpgrades_ == null) {
+          inventoryUpgrades_ = new global::POGOProtos.Inventory.InventoryUpgrades();
+        }
+        InventoryUpgrades.MergeFrom(other.InventoryUpgrades);
+      }
+      if (other.appliedItems_ != null) {
+        if (appliedItems_ == null) {
+          appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+        }
+        AppliedItems.MergeFrom(other.AppliedItems);
+      }
+      if (other.eggIncubators_ != null) {
+        if (eggIncubators_ == null) {
+          eggIncubators_ = new global::POGOProtos.Inventory.EggIncubators();
+        }
+        EggIncubators.MergeFrom(other.EggIncubators);
+      }
+      if (other.candy_ != null) {
+        if (candy_ == null) {
+          candy_ = new global::POGOProtos.Inventory.Candy();
+        }
+        Candy.MergeFrom(other.Candy);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 18: {
+            if (item_ == null) {
+              item_ = new global::POGOProtos.Inventory.Item.ItemData();
+            }
+            input.ReadMessage(item_);
+            break;
+          }
+          case 26: {
+            if (pokedexEntry_ == null) {
+              pokedexEntry_ = new global::POGOProtos.Data.PokedexEntry();
+            }
+            input.ReadMessage(pokedexEntry_);
+            break;
+          }
+          case 34: {
+            if (playerStats_ == null) {
+              playerStats_ = new global::POGOProtos.Data.Player.PlayerStats();
+            }
+            input.ReadMessage(playerStats_);
+            break;
+          }
+          case 42: {
+            if (playerCurrency_ == null) {
+              playerCurrency_ = new global::POGOProtos.Data.Player.PlayerCurrency();
+            }
+            input.ReadMessage(playerCurrency_);
+            break;
+          }
+          case 50: {
+            if (playerCamera_ == null) {
+              playerCamera_ = new global::POGOProtos.Data.Player.PlayerCamera();
+            }
+            input.ReadMessage(playerCamera_);
+            break;
+          }
+          case 58: {
+            if (inventoryUpgrades_ == null) {
+              inventoryUpgrades_ = new global::POGOProtos.Inventory.InventoryUpgrades();
+            }
+            input.ReadMessage(inventoryUpgrades_);
+            break;
+          }
+          case 66: {
+            if (appliedItems_ == null) {
+              appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+            }
+            input.ReadMessage(appliedItems_);
+            break;
+          }
+          case 74: {
+            if (eggIncubators_ == null) {
+              eggIncubators_ = new global::POGOProtos.Inventory.EggIncubators();
+            }
+            input.ReadMessage(eggIncubators_);
+            break;
+          }
+          case 82: {
+            if (candy_ == null) {
+              candy_ = new global::POGOProtos.Inventory.Candy();
+            }
+            input.ReadMessage(candy_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventoryDelta : pb::IMessage<InventoryDelta> {
+    private static readonly pb::MessageParser<InventoryDelta> _parser = new pb::MessageParser<InventoryDelta>(() => new InventoryDelta());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryDelta> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryDelta() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryDelta(InventoryDelta other) : this() {
+      originalTimestampMs_ = other.originalTimestampMs_;
+      newTimestampMs_ = other.newTimestampMs_;
+      inventoryItems_ = other.inventoryItems_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryDelta Clone() {
+      return new InventoryDelta(this);
+    }
+
+    /// <summary>Field number for the "original_timestamp_ms" field.</summary>
+    public const int OriginalTimestampMsFieldNumber = 1;
+    private long originalTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long OriginalTimestampMs {
+      get { return originalTimestampMs_; }
+      set {
+        originalTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "new_timestamp_ms" field.</summary>
+    public const int NewTimestampMsFieldNumber = 2;
+    private long newTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long NewTimestampMs {
+      get { return newTimestampMs_; }
+      set {
+        newTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_items" field.</summary>
+    public const int InventoryItemsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.InventoryItem> _repeated_inventoryItems_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Inventory.InventoryItem.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.InventoryItem> inventoryItems_ = new pbc::RepeatedField<global::POGOProtos.Inventory.InventoryItem>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.InventoryItem> InventoryItems {
+      get { return inventoryItems_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryDelta);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryDelta other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (OriginalTimestampMs != other.OriginalTimestampMs) return false;
+      if (NewTimestampMs != other.NewTimestampMs) return false;
+      if(!inventoryItems_.Equals(other.inventoryItems_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (OriginalTimestampMs != 0L) hash ^= OriginalTimestampMs.GetHashCode();
+      if (NewTimestampMs != 0L) hash ^= NewTimestampMs.GetHashCode();
+      hash ^= inventoryItems_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (OriginalTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(OriginalTimestampMs);
+      }
+      if (NewTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(NewTimestampMs);
+      }
+      inventoryItems_.WriteTo(output, _repeated_inventoryItems_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (OriginalTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(OriginalTimestampMs);
+      }
+      if (NewTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(NewTimestampMs);
+      }
+      size += inventoryItems_.CalculateSize(_repeated_inventoryItems_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryDelta other) {
+      if (other == null) {
+        return;
+      }
+      if (other.OriginalTimestampMs != 0L) {
+        OriginalTimestampMs = other.OriginalTimestampMs;
+      }
+      if (other.NewTimestampMs != 0L) {
+        NewTimestampMs = other.NewTimestampMs;
+      }
+      inventoryItems_.Add(other.inventoryItems_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            OriginalTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            NewTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            inventoryItems_.AddEntriesFrom(input, _repeated_inventoryItems_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class Candy : pb::IMessage<Candy> {
+    private static readonly pb::MessageParser<Candy> _parser = new pb::MessageParser<Candy>(() => new Candy());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Candy> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Candy() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Candy(Candy other) : this() {
+      familyId_ = other.familyId_;
+      candy_ = other.candy_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Candy Clone() {
+      return new Candy(this);
+    }
+
+    /// <summary>Field number for the "family_id" field.</summary>
+    public const int FamilyIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonFamilyId familyId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonFamilyId FamilyId {
+      get { return familyId_; }
+      set {
+        familyId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy" field.</summary>
+    public const int Candy_FieldNumber = 2;
+    private int candy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Candy_ {
+      get { return candy_; }
+      set {
+        candy_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Candy);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Candy other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FamilyId != other.FamilyId) return false;
+      if (Candy_ != other.Candy_) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FamilyId != 0) hash ^= FamilyId.GetHashCode();
+      if (Candy_ != 0) hash ^= Candy_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FamilyId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) FamilyId);
+      }
+      if (Candy_ != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Candy_);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FamilyId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) FamilyId);
+      }
+      if (Candy_ != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Candy_);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Candy other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FamilyId != 0) {
+        FamilyId = other.FamilyId;
+      }
+      if (other.Candy_ != 0) {
+        Candy_ = other.Candy_;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            familyId_ = (global::POGOProtos.Enums.PokemonFamilyId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Candy_ = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventoryItem : pb::IMessage<InventoryItem> {
+    private static readonly pb::MessageParser<InventoryItem> _parser = new pb::MessageParser<InventoryItem>(() => new InventoryItem());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryItem> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItem() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItem(InventoryItem other) : this() {
+      modifiedTimestampMs_ = other.modifiedTimestampMs_;
+      deletedItemKey_ = other.deletedItemKey_;
+      InventoryItemData = other.inventoryItemData_ != null ? other.InventoryItemData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryItem Clone() {
+      return new InventoryItem(this);
+    }
+
+    /// <summary>Field number for the "modified_timestamp_ms" field.</summary>
+    public const int ModifiedTimestampMsFieldNumber = 1;
+    private long modifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ModifiedTimestampMs {
+      get { return modifiedTimestampMs_; }
+      set {
+        modifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deleted_item_key" field.</summary>
+    public const int DeletedItemKeyFieldNumber = 2;
+    private long deletedItemKey_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DeletedItemKey {
+      get { return deletedItemKey_; }
+      set {
+        deletedItemKey_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_item_data" field.</summary>
+    public const int InventoryItemDataFieldNumber = 3;
+    private global::POGOProtos.Inventory.InventoryItemData inventoryItemData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryItemData InventoryItemData {
+      get { return inventoryItemData_; }
+      set {
+        inventoryItemData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryItem);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryItem other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ModifiedTimestampMs != other.ModifiedTimestampMs) return false;
+      if (DeletedItemKey != other.DeletedItemKey) return false;
+      if (!object.Equals(InventoryItemData, other.InventoryItemData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ModifiedTimestampMs != 0L) hash ^= ModifiedTimestampMs.GetHashCode();
+      if (DeletedItemKey != 0L) hash ^= DeletedItemKey.GetHashCode();
+      if (inventoryItemData_ != null) hash ^= InventoryItemData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ModifiedTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(ModifiedTimestampMs);
+      }
+      if (DeletedItemKey != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(DeletedItemKey);
+      }
+      if (inventoryItemData_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(InventoryItemData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ModifiedTimestampMs);
+      }
+      if (DeletedItemKey != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DeletedItemKey);
+      }
+      if (inventoryItemData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryItemData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryItem other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ModifiedTimestampMs != 0L) {
+        ModifiedTimestampMs = other.ModifiedTimestampMs;
+      }
+      if (other.DeletedItemKey != 0L) {
+        DeletedItemKey = other.DeletedItemKey;
+      }
+      if (other.inventoryItemData_ != null) {
+        if (inventoryItemData_ == null) {
+          inventoryItemData_ = new global::POGOProtos.Inventory.InventoryItemData();
+        }
+        InventoryItemData.MergeFrom(other.InventoryItemData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            ModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            DeletedItemKey = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            if (inventoryItemData_ == null) {
+              inventoryItemData_ = new global::POGOProtos.Inventory.InventoryItemData();
+            }
+            input.ReadMessage(inventoryItemData_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class AppliedItems : pb::IMessage<AppliedItems> {
+    private static readonly pb::MessageParser<AppliedItems> _parser = new pb::MessageParser<AppliedItems>(() => new AppliedItems());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AppliedItems> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItems() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItems(AppliedItems other) : this() {
+      item_ = other.item_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItems Clone() {
+      return new AppliedItems(this);
+    }
+
+    /// <summary>Field number for the "item" field.</summary>
+    public const int ItemFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.AppliedItem> _repeated_item_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Inventory.AppliedItem.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.AppliedItem> item_ = new pbc::RepeatedField<global::POGOProtos.Inventory.AppliedItem>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.AppliedItem> Item {
+      get { return item_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AppliedItems);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AppliedItems other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!item_.Equals(other.item_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= item_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      item_.WriteTo(output, _repeated_item_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += item_.CalculateSize(_repeated_item_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AppliedItems other) {
+      if (other == null) {
+        return;
+      }
+      item_.Add(other.item_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 34: {
+            item_.AddEntriesFrom(input, _repeated_item_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class AppliedItem : pb::IMessage<AppliedItem> {
+    private static readonly pb::MessageParser<AppliedItem> _parser = new pb::MessageParser<AppliedItem>(() => new AppliedItem());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AppliedItem> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItem() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItem(AppliedItem other) : this() {
+      itemId_ = other.itemId_;
+      itemType_ = other.itemType_;
+      expireMs_ = other.expireMs_;
+      appliedMs_ = other.appliedMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AppliedItem Clone() {
+      return new AppliedItem(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_type" field.</summary>
+    public const int ItemTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemType itemType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemType ItemType {
+      get { return itemType_; }
+      set {
+        itemType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "expire_ms" field.</summary>
+    public const int ExpireMsFieldNumber = 3;
+    private long expireMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ExpireMs {
+      get { return expireMs_; }
+      set {
+        expireMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_ms" field.</summary>
+    public const int AppliedMsFieldNumber = 4;
+    private long appliedMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long AppliedMs {
+      get { return appliedMs_; }
+      set {
+        appliedMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AppliedItem);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AppliedItem other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ItemType != other.ItemType) return false;
+      if (ExpireMs != other.ExpireMs) return false;
+      if (AppliedMs != other.AppliedMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ItemType != 0) hash ^= ItemType.GetHashCode();
+      if (ExpireMs != 0L) hash ^= ExpireMs.GetHashCode();
+      if (AppliedMs != 0L) hash ^= AppliedMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ItemType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) ItemType);
+      }
+      if (ExpireMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(ExpireMs);
+      }
+      if (AppliedMs != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(AppliedMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ItemType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemType);
+      }
+      if (ExpireMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpireMs);
+      }
+      if (AppliedMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(AppliedMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AppliedItem other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ItemType != 0) {
+        ItemType = other.ItemType;
+      }
+      if (other.ExpireMs != 0L) {
+        ExpireMs = other.ExpireMs;
+      }
+      if (other.AppliedMs != 0L) {
+        AppliedMs = other.AppliedMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            itemType_ = (global::POGOProtos.Inventory.Item.ItemType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            ExpireMs = input.ReadInt64();
+            break;
+          }
+          case 32: {
+            AppliedMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventoryUpgrades : pb::IMessage<InventoryUpgrades> {
+    private static readonly pb::MessageParser<InventoryUpgrades> _parser = new pb::MessageParser<InventoryUpgrades>(() => new InventoryUpgrades());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryUpgrades> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor.MessageTypes[9]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrades() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrades(InventoryUpgrades other) : this() {
+      inventoryUpgrades_ = other.inventoryUpgrades_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgrades Clone() {
+      return new InventoryUpgrades(this);
+    }
+
+    /// <summary>Field number for the "inventory_upgrades" field.</summary>
+    public const int InventoryUpgrades_FieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.InventoryUpgrade> _repeated_inventoryUpgrades_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Inventory.InventoryUpgrade.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.InventoryUpgrade> inventoryUpgrades_ = new pbc::RepeatedField<global::POGOProtos.Inventory.InventoryUpgrade>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.InventoryUpgrade> InventoryUpgrades_ {
+      get { return inventoryUpgrades_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryUpgrades);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryUpgrades other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!inventoryUpgrades_.Equals(other.inventoryUpgrades_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= inventoryUpgrades_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      inventoryUpgrades_.WriteTo(output, _repeated_inventoryUpgrades_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += inventoryUpgrades_.CalculateSize(_repeated_inventoryUpgrades_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryUpgrades other) {
+      if (other == null) {
+        return;
+      }
+      inventoryUpgrades_.Add(other.inventoryUpgrades_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            inventoryUpgrades_.AddEntriesFrom(input, _repeated_inventoryUpgrades_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortData.cs b/PokemonGo/POGOProtos/Map/Fort/FortData.cs
new file mode 100644
index 0000000..0b1e7a2
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortData.cs
@@ -0,0 +1,620 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortData.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortData.proto</summary>
+  public static partial class FortDataReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortData.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortDataReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiJQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnREYXRhLnByb3RvEhNQT0dPUHJv",
+            "dG9zLk1hcC5Gb3J0GiBQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25JZC5wcm90",
+            "bxogUE9HT1Byb3Rvcy9FbnVtcy9UZWFtQ29sb3IucHJvdG8aIlBPR09Qcm90",
+            "b3MvTWFwL0ZvcnQvRm9ydFR5cGUucHJvdG8aJVBPR09Qcm90b3MvTWFwL0Zv",
+            "cnQvRm9ydFNwb25zb3IucHJvdG8aK1BPR09Qcm90b3MvTWFwL0ZvcnQvRm9y",
+            "dFJlbmRlcmluZ1R5cGUucHJvdG8aJlBPR09Qcm90b3MvTWFwL0ZvcnQvRm9y",
+            "dEx1cmVJbmZvLnByb3RvIrsECghGb3J0RGF0YRIKCgJpZBgBIAEoCRIiChps",
+            "YXN0X21vZGlmaWVkX3RpbWVzdGFtcF9tcxgCIAEoAxIQCghsYXRpdHVkZRgD",
+            "IAEoARIRCglsb25naXR1ZGUYBCABKAESDwoHZW5hYmxlZBgIIAEoCBIrCgR0",
+            "eXBlGAkgASgOMh0uUE9HT1Byb3Rvcy5NYXAuRm9ydC5Gb3J0VHlwZRIyCg1v",
+            "d25lZF9ieV90ZWFtGAUgASgOMhsuUE9HT1Byb3Rvcy5FbnVtcy5UZWFtQ29s",
+            "b3ISNQoQZ3VhcmRfcG9rZW1vbl9pZBgGIAEoDjIbLlBPR09Qcm90b3MuRW51",
+            "bXMuUG9rZW1vbklkEhgKEGd1YXJkX3Bva2Vtb25fY3AYByABKAUSEgoKZ3lt",
+            "X3BvaW50cxgKIAEoAxIUCgxpc19pbl9iYXR0bGUYCyABKAgSJgoeY29vbGRv",
+            "d25fY29tcGxldGVfdGltZXN0YW1wX21zGA4gASgDEjEKB3Nwb25zb3IYDyAB",
+            "KA4yIC5QT0dPUHJvdG9zLk1hcC5Gb3J0LkZvcnRTcG9uc29yEj4KDnJlbmRl",
+            "cmluZ190eXBlGBAgASgOMiYuUE9HT1Byb3Rvcy5NYXAuRm9ydC5Gb3J0UmVu",
+            "ZGVyaW5nVHlwZRIcChRhY3RpdmVfZm9ydF9tb2RpZmllchgMIAEoDBI0Cgls",
+            "dXJlX2luZm8YDSABKAsyIS5QT0dPUHJvdG9zLk1hcC5Gb3J0LkZvcnRMdXJl",
+            "SW5mb2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, global::POGOProtos.Enums.TeamColorReflection.Descriptor, global::POGOProtos.Map.Fort.FortTypeReflection.Descriptor, global::POGOProtos.Map.Fort.FortSponsorReflection.Descriptor, global::POGOProtos.Map.Fort.FortRenderingTypeReflection.Descriptor, global::POGOProtos.Map.Fort.FortLureInfoReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortData), global::POGOProtos.Map.Fort.FortData.Parser, new[]{ "Id", "LastModifiedTimestampMs", "Latitude", "Longitude", "Enabled", "Type", "OwnedByTeam", "GuardPokemonId", "GuardPokemonCp", "GymPoints", "IsInBattle", "CooldownCompleteTimestampMs", "Sponsor", "RenderingType", "ActiveFortModifier", "LureInfo" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortData : pb::IMessage<FortData> {
+    private static readonly pb::MessageParser<FortData> _parser = new pb::MessageParser<FortData>(() => new FortData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.FortDataReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortData(FortData other) : this() {
+      id_ = other.id_;
+      lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      enabled_ = other.enabled_;
+      type_ = other.type_;
+      ownedByTeam_ = other.ownedByTeam_;
+      guardPokemonId_ = other.guardPokemonId_;
+      guardPokemonCp_ = other.guardPokemonCp_;
+      gymPoints_ = other.gymPoints_;
+      isInBattle_ = other.isInBattle_;
+      cooldownCompleteTimestampMs_ = other.cooldownCompleteTimestampMs_;
+      sponsor_ = other.sponsor_;
+      renderingType_ = other.renderingType_;
+      activeFortModifier_ = other.activeFortModifier_;
+      LureInfo = other.lureInfo_ != null ? other.LureInfo.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortData Clone() {
+      return new FortData(this);
+    }
+
+    /// <summary>Field number for the "id" field.</summary>
+    public const int IdFieldNumber = 1;
+    private string id_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Id {
+      get { return id_; }
+      set {
+        id_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
+    public const int LastModifiedTimestampMsFieldNumber = 2;
+    private long lastModifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastModifiedTimestampMs {
+      get { return lastModifiedTimestampMs_; }
+      set {
+        lastModifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "enabled" field.</summary>
+    public const int EnabledFieldNumber = 8;
+    private bool enabled_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Enabled {
+      get { return enabled_; }
+      set {
+        enabled_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type" field.</summary>
+    public const int TypeFieldNumber = 9;
+    private global::POGOProtos.Map.Fort.FortType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "owned_by_team" field.</summary>
+    public const int OwnedByTeamFieldNumber = 5;
+    private global::POGOProtos.Enums.TeamColor ownedByTeam_ = 0;
+    /// <summary>
+    ///  Team that owns the gym
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor OwnedByTeam {
+      get { return ownedByTeam_; }
+      set {
+        ownedByTeam_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "guard_pokemon_id" field.</summary>
+    public const int GuardPokemonIdFieldNumber = 6;
+    private global::POGOProtos.Enums.PokemonId guardPokemonId_ = 0;
+    /// <summary>
+    ///  Highest CP Pokemon at the gym
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId GuardPokemonId {
+      get { return guardPokemonId_; }
+      set {
+        guardPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "guard_pokemon_cp" field.</summary>
+    public const int GuardPokemonCpFieldNumber = 7;
+    private int guardPokemonCp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GuardPokemonCp {
+      get { return guardPokemonCp_; }
+      set {
+        guardPokemonCp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_points" field.</summary>
+    public const int GymPointsFieldNumber = 10;
+    private long gymPoints_;
+    /// <summary>
+    ///  Prestigate / experience of the gym
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long GymPoints {
+      get { return gymPoints_; }
+      set {
+        gymPoints_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "is_in_battle" field.</summary>
+    public const int IsInBattleFieldNumber = 11;
+    private bool isInBattle_;
+    /// <summary>
+    ///  Whether someone is battling at the gym currently
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsInBattle {
+      get { return isInBattle_; }
+      set {
+        isInBattle_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cooldown_complete_timestamp_ms" field.</summary>
+    public const int CooldownCompleteTimestampMsFieldNumber = 14;
+    private long cooldownCompleteTimestampMs_;
+    /// <summary>
+    ///  Timestamp when the pokestop can be activated again to get items / xp
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CooldownCompleteTimestampMs {
+      get { return cooldownCompleteTimestampMs_; }
+      set {
+        cooldownCompleteTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sponsor" field.</summary>
+    public const int SponsorFieldNumber = 15;
+    private global::POGOProtos.Map.Fort.FortSponsor sponsor_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortSponsor Sponsor {
+      get { return sponsor_; }
+      set {
+        sponsor_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "rendering_type" field.</summary>
+    public const int RenderingTypeFieldNumber = 16;
+    private global::POGOProtos.Map.Fort.FortRenderingType renderingType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortRenderingType RenderingType {
+      get { return renderingType_; }
+      set {
+        renderingType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_fort_modifier" field.</summary>
+    public const int ActiveFortModifierFieldNumber = 12;
+    private pb::ByteString activeFortModifier_ = pb::ByteString.Empty;
+    /// <summary>
+    ///  Might represent the type of item applied to the pokestop, right now only lures can be applied
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString ActiveFortModifier {
+      get { return activeFortModifier_; }
+      set {
+        activeFortModifier_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "lure_info" field.</summary>
+    public const int LureInfoFieldNumber = 13;
+    private global::POGOProtos.Map.Fort.FortLureInfo lureInfo_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortLureInfo LureInfo {
+      get { return lureInfo_; }
+      set {
+        lureInfo_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Id != other.Id) return false;
+      if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (Enabled != other.Enabled) return false;
+      if (Type != other.Type) return false;
+      if (OwnedByTeam != other.OwnedByTeam) return false;
+      if (GuardPokemonId != other.GuardPokemonId) return false;
+      if (GuardPokemonCp != other.GuardPokemonCp) return false;
+      if (GymPoints != other.GymPoints) return false;
+      if (IsInBattle != other.IsInBattle) return false;
+      if (CooldownCompleteTimestampMs != other.CooldownCompleteTimestampMs) return false;
+      if (Sponsor != other.Sponsor) return false;
+      if (RenderingType != other.RenderingType) return false;
+      if (ActiveFortModifier != other.ActiveFortModifier) return false;
+      if (!object.Equals(LureInfo, other.LureInfo)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Id.Length != 0) hash ^= Id.GetHashCode();
+      if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (Enabled != false) hash ^= Enabled.GetHashCode();
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (OwnedByTeam != 0) hash ^= OwnedByTeam.GetHashCode();
+      if (GuardPokemonId != 0) hash ^= GuardPokemonId.GetHashCode();
+      if (GuardPokemonCp != 0) hash ^= GuardPokemonCp.GetHashCode();
+      if (GymPoints != 0L) hash ^= GymPoints.GetHashCode();
+      if (IsInBattle != false) hash ^= IsInBattle.GetHashCode();
+      if (CooldownCompleteTimestampMs != 0L) hash ^= CooldownCompleteTimestampMs.GetHashCode();
+      if (Sponsor != 0) hash ^= Sponsor.GetHashCode();
+      if (RenderingType != 0) hash ^= RenderingType.GetHashCode();
+      if (ActiveFortModifier.Length != 0) hash ^= ActiveFortModifier.GetHashCode();
+      if (lureInfo_ != null) hash ^= LureInfo.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Id.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Id);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+      if (OwnedByTeam != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) OwnedByTeam);
+      }
+      if (GuardPokemonId != 0) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) GuardPokemonId);
+      }
+      if (GuardPokemonCp != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(GuardPokemonCp);
+      }
+      if (Enabled != false) {
+        output.WriteRawTag(64);
+        output.WriteBool(Enabled);
+      }
+      if (Type != 0) {
+        output.WriteRawTag(72);
+        output.WriteEnum((int) Type);
+      }
+      if (GymPoints != 0L) {
+        output.WriteRawTag(80);
+        output.WriteInt64(GymPoints);
+      }
+      if (IsInBattle != false) {
+        output.WriteRawTag(88);
+        output.WriteBool(IsInBattle);
+      }
+      if (ActiveFortModifier.Length != 0) {
+        output.WriteRawTag(98);
+        output.WriteBytes(ActiveFortModifier);
+      }
+      if (lureInfo_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(LureInfo);
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        output.WriteRawTag(112);
+        output.WriteInt64(CooldownCompleteTimestampMs);
+      }
+      if (Sponsor != 0) {
+        output.WriteRawTag(120);
+        output.WriteEnum((int) Sponsor);
+      }
+      if (RenderingType != 0) {
+        output.WriteRawTag(128, 1);
+        output.WriteEnum((int) RenderingType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Id.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Enabled != false) {
+        size += 1 + 1;
+      }
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (OwnedByTeam != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) OwnedByTeam);
+      }
+      if (GuardPokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) GuardPokemonId);
+      }
+      if (GuardPokemonCp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GuardPokemonCp);
+      }
+      if (GymPoints != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(GymPoints);
+      }
+      if (IsInBattle != false) {
+        size += 1 + 1;
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CooldownCompleteTimestampMs);
+      }
+      if (Sponsor != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Sponsor);
+      }
+      if (RenderingType != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) RenderingType);
+      }
+      if (ActiveFortModifier.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(ActiveFortModifier);
+      }
+      if (lureInfo_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LureInfo);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Id.Length != 0) {
+        Id = other.Id;
+      }
+      if (other.LastModifiedTimestampMs != 0L) {
+        LastModifiedTimestampMs = other.LastModifiedTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.Enabled != false) {
+        Enabled = other.Enabled;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.OwnedByTeam != 0) {
+        OwnedByTeam = other.OwnedByTeam;
+      }
+      if (other.GuardPokemonId != 0) {
+        GuardPokemonId = other.GuardPokemonId;
+      }
+      if (other.GuardPokemonCp != 0) {
+        GuardPokemonCp = other.GuardPokemonCp;
+      }
+      if (other.GymPoints != 0L) {
+        GymPoints = other.GymPoints;
+      }
+      if (other.IsInBattle != false) {
+        IsInBattle = other.IsInBattle;
+      }
+      if (other.CooldownCompleteTimestampMs != 0L) {
+        CooldownCompleteTimestampMs = other.CooldownCompleteTimestampMs;
+      }
+      if (other.Sponsor != 0) {
+        Sponsor = other.Sponsor;
+      }
+      if (other.RenderingType != 0) {
+        RenderingType = other.RenderingType;
+      }
+      if (other.ActiveFortModifier.Length != 0) {
+        ActiveFortModifier = other.ActiveFortModifier;
+      }
+      if (other.lureInfo_ != null) {
+        if (lureInfo_ == null) {
+          lureInfo_ = new global::POGOProtos.Map.Fort.FortLureInfo();
+        }
+        LureInfo.MergeFrom(other.LureInfo);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Id = input.ReadString();
+            break;
+          }
+          case 16: {
+            LastModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 40: {
+            ownedByTeam_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+          case 48: {
+            guardPokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 56: {
+            GuardPokemonCp = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            Enabled = input.ReadBool();
+            break;
+          }
+          case 72: {
+            type_ = (global::POGOProtos.Map.Fort.FortType) input.ReadEnum();
+            break;
+          }
+          case 80: {
+            GymPoints = input.ReadInt64();
+            break;
+          }
+          case 88: {
+            IsInBattle = input.ReadBool();
+            break;
+          }
+          case 98: {
+            ActiveFortModifier = input.ReadBytes();
+            break;
+          }
+          case 106: {
+            if (lureInfo_ == null) {
+              lureInfo_ = new global::POGOProtos.Map.Fort.FortLureInfo();
+            }
+            input.ReadMessage(lureInfo_);
+            break;
+          }
+          case 112: {
+            CooldownCompleteTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 120: {
+            sponsor_ = (global::POGOProtos.Map.Fort.FortSponsor) input.ReadEnum();
+            break;
+          }
+          case 128: {
+            renderingType_ = (global::POGOProtos.Map.Fort.FortRenderingType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortLureInfo.cs b/PokemonGo/POGOProtos/Map/Fort/FortLureInfo.cs
new file mode 100644
index 0000000..15c993d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortLureInfo.cs
@@ -0,0 +1,246 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortLureInfo.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortLureInfo.proto</summary>
+  public static partial class FortLureInfoReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortLureInfo.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortLureInfoReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnRMdXJlSW5mby5wcm90bxITUE9H",
+            "T1Byb3Rvcy5NYXAuRm9ydBogUE9HT1Byb3Rvcy9FbnVtcy9Qb2tlbW9uSWQu",
+            "cHJvdG8ikAEKDEZvcnRMdXJlSW5mbxIPCgdmb3J0X2lkGAEgASgJEhQKDGVu",
+            "Y291bnRlcl9pZBgCIAEoBhI2ChFhY3RpdmVfcG9rZW1vbl9pZBgDIAEoDjIb",
+            "LlBPR09Qcm90b3MuRW51bXMuUG9rZW1vbklkEiEKGWx1cmVfZXhwaXJlc190",
+            "aW1lc3RhbXBfbXMYBCABKANiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortLureInfo), global::POGOProtos.Map.Fort.FortLureInfo.Parser, new[]{ "FortId", "EncounterId", "ActivePokemonId", "LureExpiresTimestampMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortLureInfo : pb::IMessage<FortLureInfo> {
+    private static readonly pb::MessageParser<FortLureInfo> _parser = new pb::MessageParser<FortLureInfo>(() => new FortLureInfo());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortLureInfo> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.FortLureInfoReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortLureInfo() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortLureInfo(FortLureInfo other) : this() {
+      fortId_ = other.fortId_;
+      encounterId_ = other.encounterId_;
+      activePokemonId_ = other.activePokemonId_;
+      lureExpiresTimestampMs_ = other.lureExpiresTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortLureInfo Clone() {
+      return new FortLureInfo(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 2;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_pokemon_id" field.</summary>
+    public const int ActivePokemonIdFieldNumber = 3;
+    private global::POGOProtos.Enums.PokemonId activePokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId ActivePokemonId {
+      get { return activePokemonId_; }
+      set {
+        activePokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "lure_expires_timestamp_ms" field.</summary>
+    public const int LureExpiresTimestampMsFieldNumber = 4;
+    private long lureExpiresTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LureExpiresTimestampMs {
+      get { return lureExpiresTimestampMs_; }
+      set {
+        lureExpiresTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortLureInfo);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortLureInfo other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (ActivePokemonId != other.ActivePokemonId) return false;
+      if (LureExpiresTimestampMs != other.LureExpiresTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (ActivePokemonId != 0) hash ^= ActivePokemonId.GetHashCode();
+      if (LureExpiresTimestampMs != 0L) hash ^= LureExpiresTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(EncounterId);
+      }
+      if (ActivePokemonId != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) ActivePokemonId);
+      }
+      if (LureExpiresTimestampMs != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(LureExpiresTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (ActivePokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ActivePokemonId);
+      }
+      if (LureExpiresTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LureExpiresTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortLureInfo other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.ActivePokemonId != 0) {
+        ActivePokemonId = other.ActivePokemonId;
+      }
+      if (other.LureExpiresTimestampMs != 0L) {
+        LureExpiresTimestampMs = other.LureExpiresTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 24: {
+            activePokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 32: {
+            LureExpiresTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortModifier.cs b/PokemonGo/POGOProtos/Map/Fort/FortModifier.cs
new file mode 100644
index 0000000..d768b28
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortModifier.cs
@@ -0,0 +1,218 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortModifier.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortModifier.proto</summary>
+  public static partial class FortModifierReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortModifier.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortModifierReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnRNb2RpZmllci5wcm90bxITUE9H",
+            "T1Byb3Rvcy5NYXAuRm9ydBomUE9HT1Byb3Rvcy9JbnZlbnRvcnkvSXRlbS9J",
+            "dGVtSWQucHJvdG8ihQEKDEZvcnRNb2RpZmllchIyCgdpdGVtX2lkGAEgASgO",
+            "MiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSHwoXZXhwaXJh",
+            "dGlvbl90aW1lc3RhbXBfbXMYAiABKAMSIAoYZGVwbG95ZXJfcGxheWVyX2Nv",
+            "ZGVuYW1lGAMgASgJYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortModifier), global::POGOProtos.Map.Fort.FortModifier.Parser, new[]{ "ItemId", "ExpirationTimestampMs", "DeployerPlayerCodename" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortModifier : pb::IMessage<FortModifier> {
+    private static readonly pb::MessageParser<FortModifier> _parser = new pb::MessageParser<FortModifier>(() => new FortModifier());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortModifier> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.FortModifierReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifier() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifier(FortModifier other) : this() {
+      itemId_ = other.itemId_;
+      expirationTimestampMs_ = other.expirationTimestampMs_;
+      deployerPlayerCodename_ = other.deployerPlayerCodename_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifier Clone() {
+      return new FortModifier(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "expiration_timestamp_ms" field.</summary>
+    public const int ExpirationTimestampMsFieldNumber = 2;
+    private long expirationTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ExpirationTimestampMs {
+      get { return expirationTimestampMs_; }
+      set {
+        expirationTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deployer_player_codename" field.</summary>
+    public const int DeployerPlayerCodenameFieldNumber = 3;
+    private string deployerPlayerCodename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeployerPlayerCodename {
+      get { return deployerPlayerCodename_; }
+      set {
+        deployerPlayerCodename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortModifier);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortModifier other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ExpirationTimestampMs != other.ExpirationTimestampMs) return false;
+      if (DeployerPlayerCodename != other.DeployerPlayerCodename) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ExpirationTimestampMs != 0L) hash ^= ExpirationTimestampMs.GetHashCode();
+      if (DeployerPlayerCodename.Length != 0) hash ^= DeployerPlayerCodename.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(ExpirationTimestampMs);
+      }
+      if (DeployerPlayerCodename.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(DeployerPlayerCodename);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpirationTimestampMs);
+      }
+      if (DeployerPlayerCodename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeployerPlayerCodename);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortModifier other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ExpirationTimestampMs != 0L) {
+        ExpirationTimestampMs = other.ExpirationTimestampMs;
+      }
+      if (other.DeployerPlayerCodename.Length != 0) {
+        DeployerPlayerCodename = other.DeployerPlayerCodename;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ExpirationTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            DeployerPlayerCodename = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortRenderingType.cs b/PokemonGo/POGOProtos/Map/Fort/FortRenderingType.cs
new file mode 100644
index 0000000..e3bd458
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortRenderingType.cs
@@ -0,0 +1,45 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortRenderingType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortRenderingType.proto</summary>
+  public static partial class FortRenderingTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortRenderingType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortRenderingTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CitQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnRSZW5kZXJpbmdUeXBlLnByb3Rv",
+            "EhNQT0dPUHJvdG9zLk1hcC5Gb3J0KjMKEUZvcnRSZW5kZXJpbmdUeXBlEgsK",
+            "B0RFRkFVTFQQABIRCg1JTlRFUk5BTF9URVNUEAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Map.Fort.FortRenderingType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum FortRenderingType {
+    [pbr::OriginalName("DEFAULT")] Default = 0,
+    [pbr::OriginalName("INTERNAL_TEST")] InternalTest = 1,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortSponsor.cs b/PokemonGo/POGOProtos/Map/Fort/FortSponsor.cs
new file mode 100644
index 0000000..768f8a3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortSponsor.cs
@@ -0,0 +1,47 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortSponsor.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortSponsor.proto</summary>
+  public static partial class FortSponsorReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortSponsor.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortSponsorReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnRTcG9uc29yLnByb3RvEhNQT0dP",
+            "UHJvdG9zLk1hcC5Gb3J0KkIKC0ZvcnRTcG9uc29yEhEKDVVOU0VUX1NQT05T",
+            "T1IQABINCglNQ0RPTkFMRFMQARIRCg1QT0tFTU9OX1NUT1JFEAJiBnByb3Rv",
+            "Mw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Map.Fort.FortSponsor), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum FortSponsor {
+    [pbr::OriginalName("UNSET_SPONSOR")] UnsetSponsor = 0,
+    [pbr::OriginalName("MCDONALDS")] Mcdonalds = 1,
+    [pbr::OriginalName("POKEMON_STORE")] PokemonStore = 2,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortSummary.cs b/PokemonGo/POGOProtos/Map/Fort/FortSummary.cs
new file mode 100644
index 0000000..7f3ead5
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortSummary.cs
@@ -0,0 +1,245 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortSummary.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortSummary.proto</summary>
+  public static partial class FortSummaryReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortSummary.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortSummaryReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnRTdW1tYXJ5LnByb3RvEhNQT0dP",
+            "UHJvdG9zLk1hcC5Gb3J0Im8KC0ZvcnRTdW1tYXJ5EhcKD2ZvcnRfc3VtbWFy",
+            "eV9pZBgBIAEoCRIiChpsYXN0X21vZGlmaWVkX3RpbWVzdGFtcF9tcxgCIAEo",
+            "AxIQCghsYXRpdHVkZRgDIAEoARIRCglsb25naXR1ZGUYBCABKAFiBnByb3Rv",
+            "Mw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortSummary), global::POGOProtos.Map.Fort.FortSummary.Parser, new[]{ "FortSummaryId", "LastModifiedTimestampMs", "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortSummary : pb::IMessage<FortSummary> {
+    private static readonly pb::MessageParser<FortSummary> _parser = new pb::MessageParser<FortSummary>(() => new FortSummary());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSummary> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.FortSummaryReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSummary() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSummary(FortSummary other) : this() {
+      fortSummaryId_ = other.fortSummaryId_;
+      lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSummary Clone() {
+      return new FortSummary(this);
+    }
+
+    /// <summary>Field number for the "fort_summary_id" field.</summary>
+    public const int FortSummaryIdFieldNumber = 1;
+    private string fortSummaryId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortSummaryId {
+      get { return fortSummaryId_; }
+      set {
+        fortSummaryId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
+    public const int LastModifiedTimestampMsFieldNumber = 2;
+    private long lastModifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastModifiedTimestampMs {
+      get { return lastModifiedTimestampMs_; }
+      set {
+        lastModifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSummary);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSummary other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortSummaryId != other.FortSummaryId) return false;
+      if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortSummaryId.Length != 0) hash ^= FortSummaryId.GetHashCode();
+      if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortSummaryId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortSummaryId);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortSummaryId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortSummaryId);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSummary other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortSummaryId.Length != 0) {
+        FortSummaryId = other.FortSummaryId;
+      }
+      if (other.LastModifiedTimestampMs != 0L) {
+        LastModifiedTimestampMs = other.LastModifiedTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortSummaryId = input.ReadString();
+            break;
+          }
+          case 16: {
+            LastModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/FortType.cs b/PokemonGo/POGOProtos/Map/Fort/FortType.cs
new file mode 100644
index 0000000..a063901
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/FortType.cs
@@ -0,0 +1,45 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Fort/FortType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Fort/FortType.proto</summary>
+  public static partial class FortTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Fort/FortType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiJQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnRUeXBlLnByb3RvEhNQT0dPUHJv",
+            "dG9zLk1hcC5Gb3J0KiMKCEZvcnRUeXBlEgcKA0dZTRAAEg4KCkNIRUNLUE9J",
+            "TlQQAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Map.Fort.FortType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum FortType {
+    [pbr::OriginalName("GYM")] Gym = 0,
+    [pbr::OriginalName("CHECKPOINT")] Checkpoint = 1,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Fort/POGOProtosMapFort.cs b/PokemonGo/POGOProtos/Map/Fort/POGOProtosMapFort.cs
new file mode 100644
index 0000000..e4b107e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Fort/POGOProtosMapFort.cs
@@ -0,0 +1,1225 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Map.Fort.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Fort {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Map.Fort.proto</summary>
+  public static partial class POGOProtosMapFortReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Map.Fort.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosMapFortReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChlQT0dPUHJvdG9zLk1hcC5Gb3J0LnByb3RvEhNQT0dPUHJvdG9zLk1hcC5G",
+            "b3J0Gh9QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLnByb3RvGhZQT0dPUHJv",
+            "dG9zLkVudW1zLnByb3RvIm8KC0ZvcnRTdW1tYXJ5EhcKD2ZvcnRfc3VtbWFy",
+            "eV9pZBgBIAEoCRIiChpsYXN0X21vZGlmaWVkX3RpbWVzdGFtcF9tcxgCIAEo",
+            "AxIQCghsYXRpdHVkZRgDIAEoARIRCglsb25naXR1ZGUYBCABKAEihQEKDEZv",
+            "cnRNb2RpZmllchIyCgdpdGVtX2lkGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZl",
+            "bnRvcnkuSXRlbS5JdGVtSWQSHwoXZXhwaXJhdGlvbl90aW1lc3RhbXBfbXMY",
+            "AiABKAMSIAoYZGVwbG95ZXJfcGxheWVyX2NvZGVuYW1lGAMgASgJIpABCgxG",
+            "b3J0THVyZUluZm8SDwoHZm9ydF9pZBgBIAEoCRIUCgxlbmNvdW50ZXJfaWQY",
+            "AiABKAYSNgoRYWN0aXZlX3Bva2Vtb25faWQYAyABKA4yGy5QT0dPUHJvdG9z",
+            "LkVudW1zLlBva2Vtb25JZBIhChlsdXJlX2V4cGlyZXNfdGltZXN0YW1wX21z",
+            "GAQgASgDIrsECghGb3J0RGF0YRIKCgJpZBgBIAEoCRIiChpsYXN0X21vZGlm",
+            "aWVkX3RpbWVzdGFtcF9tcxgCIAEoAxIQCghsYXRpdHVkZRgDIAEoARIRCgls",
+            "b25naXR1ZGUYBCABKAESDwoHZW5hYmxlZBgIIAEoCBIrCgR0eXBlGAkgASgO",
+            "Mh0uUE9HT1Byb3Rvcy5NYXAuRm9ydC5Gb3J0VHlwZRIyCg1vd25lZF9ieV90",
+            "ZWFtGAUgASgOMhsuUE9HT1Byb3Rvcy5FbnVtcy5UZWFtQ29sb3ISNQoQZ3Vh",
+            "cmRfcG9rZW1vbl9pZBgGIAEoDjIbLlBPR09Qcm90b3MuRW51bXMuUG9rZW1v",
+            "bklkEhgKEGd1YXJkX3Bva2Vtb25fY3AYByABKAUSEgoKZ3ltX3BvaW50cxgK",
+            "IAEoAxIUCgxpc19pbl9iYXR0bGUYCyABKAgSJgoeY29vbGRvd25fY29tcGxl",
+            "dGVfdGltZXN0YW1wX21zGA4gASgDEjEKB3Nwb25zb3IYDyABKA4yIC5QT0dP",
+            "UHJvdG9zLk1hcC5Gb3J0LkZvcnRTcG9uc29yEj4KDnJlbmRlcmluZ190eXBl",
+            "GBAgASgOMiYuUE9HT1Byb3Rvcy5NYXAuRm9ydC5Gb3J0UmVuZGVyaW5nVHlw",
+            "ZRIcChRhY3RpdmVfZm9ydF9tb2RpZmllchgMIAEoDBI0CglsdXJlX2luZm8Y",
+            "DSABKAsyIS5QT0dPUHJvdG9zLk1hcC5Gb3J0LkZvcnRMdXJlSW5mbypCCgtG",
+            "b3J0U3BvbnNvchIRCg1VTlNFVF9TUE9OU09SEAASDQoJTUNET05BTERTEAES",
+            "EQoNUE9LRU1PTl9TVE9SRRACKjMKEUZvcnRSZW5kZXJpbmdUeXBlEgsKB0RF",
+            "RkFVTFQQABIRCg1JTlRFUk5BTF9URVNUEAEqIwoIRm9ydFR5cGUSBwoDR1lN",
+            "EAASDgoKQ0hFQ0tQT0lOVBABUABQAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Map.Fort.FortSponsor), typeof(global::POGOProtos.Map.Fort.FortRenderingType), typeof(global::POGOProtos.Map.Fort.FortType), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortSummary), global::POGOProtos.Map.Fort.FortSummary.Parser, new[]{ "FortSummaryId", "LastModifiedTimestampMs", "Latitude", "Longitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortModifier), global::POGOProtos.Map.Fort.FortModifier.Parser, new[]{ "ItemId", "ExpirationTimestampMs", "DeployerPlayerCodename" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortLureInfo), global::POGOProtos.Map.Fort.FortLureInfo.Parser, new[]{ "FortId", "EncounterId", "ActivePokemonId", "LureExpiresTimestampMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Fort.FortData), global::POGOProtos.Map.Fort.FortData.Parser, new[]{ "Id", "LastModifiedTimestampMs", "Latitude", "Longitude", "Enabled", "Type", "OwnedByTeam", "GuardPokemonId", "GuardPokemonCp", "GymPoints", "IsInBattle", "CooldownCompleteTimestampMs", "Sponsor", "RenderingType", "ActiveFortModifier", "LureInfo" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum FortSponsor {
+    [pbr::OriginalName("UNSET_SPONSOR")] UnsetSponsor = 0,
+    [pbr::OriginalName("MCDONALDS")] Mcdonalds = 1,
+    [pbr::OriginalName("POKEMON_STORE")] PokemonStore = 2,
+  }
+
+  public enum FortRenderingType {
+    [pbr::OriginalName("DEFAULT")] Default = 0,
+    [pbr::OriginalName("INTERNAL_TEST")] InternalTest = 1,
+  }
+
+  public enum FortType {
+    [pbr::OriginalName("GYM")] Gym = 0,
+    [pbr::OriginalName("CHECKPOINT")] Checkpoint = 1,
+  }
+
+  #endregion
+
+  #region Messages
+  public sealed partial class FortSummary : pb::IMessage<FortSummary> {
+    private static readonly pb::MessageParser<FortSummary> _parser = new pb::MessageParser<FortSummary>(() => new FortSummary());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSummary> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSummary() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSummary(FortSummary other) : this() {
+      fortSummaryId_ = other.fortSummaryId_;
+      lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSummary Clone() {
+      return new FortSummary(this);
+    }
+
+    /// <summary>Field number for the "fort_summary_id" field.</summary>
+    public const int FortSummaryIdFieldNumber = 1;
+    private string fortSummaryId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortSummaryId {
+      get { return fortSummaryId_; }
+      set {
+        fortSummaryId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
+    public const int LastModifiedTimestampMsFieldNumber = 2;
+    private long lastModifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastModifiedTimestampMs {
+      get { return lastModifiedTimestampMs_; }
+      set {
+        lastModifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSummary);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSummary other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortSummaryId != other.FortSummaryId) return false;
+      if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortSummaryId.Length != 0) hash ^= FortSummaryId.GetHashCode();
+      if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortSummaryId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortSummaryId);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortSummaryId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortSummaryId);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSummary other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortSummaryId.Length != 0) {
+        FortSummaryId = other.FortSummaryId;
+      }
+      if (other.LastModifiedTimestampMs != 0L) {
+        LastModifiedTimestampMs = other.LastModifiedTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortSummaryId = input.ReadString();
+            break;
+          }
+          case 16: {
+            LastModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortModifier : pb::IMessage<FortModifier> {
+    private static readonly pb::MessageParser<FortModifier> _parser = new pb::MessageParser<FortModifier>(() => new FortModifier());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortModifier> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifier() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifier(FortModifier other) : this() {
+      itemId_ = other.itemId_;
+      expirationTimestampMs_ = other.expirationTimestampMs_;
+      deployerPlayerCodename_ = other.deployerPlayerCodename_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifier Clone() {
+      return new FortModifier(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "expiration_timestamp_ms" field.</summary>
+    public const int ExpirationTimestampMsFieldNumber = 2;
+    private long expirationTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ExpirationTimestampMs {
+      get { return expirationTimestampMs_; }
+      set {
+        expirationTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deployer_player_codename" field.</summary>
+    public const int DeployerPlayerCodenameFieldNumber = 3;
+    private string deployerPlayerCodename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeployerPlayerCodename {
+      get { return deployerPlayerCodename_; }
+      set {
+        deployerPlayerCodename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortModifier);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortModifier other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ExpirationTimestampMs != other.ExpirationTimestampMs) return false;
+      if (DeployerPlayerCodename != other.DeployerPlayerCodename) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ExpirationTimestampMs != 0L) hash ^= ExpirationTimestampMs.GetHashCode();
+      if (DeployerPlayerCodename.Length != 0) hash ^= DeployerPlayerCodename.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(ExpirationTimestampMs);
+      }
+      if (DeployerPlayerCodename.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(DeployerPlayerCodename);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpirationTimestampMs);
+      }
+      if (DeployerPlayerCodename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeployerPlayerCodename);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortModifier other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ExpirationTimestampMs != 0L) {
+        ExpirationTimestampMs = other.ExpirationTimestampMs;
+      }
+      if (other.DeployerPlayerCodename.Length != 0) {
+        DeployerPlayerCodename = other.DeployerPlayerCodename;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ExpirationTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            DeployerPlayerCodename = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortLureInfo : pb::IMessage<FortLureInfo> {
+    private static readonly pb::MessageParser<FortLureInfo> _parser = new pb::MessageParser<FortLureInfo>(() => new FortLureInfo());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortLureInfo> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortLureInfo() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortLureInfo(FortLureInfo other) : this() {
+      fortId_ = other.fortId_;
+      encounterId_ = other.encounterId_;
+      activePokemonId_ = other.activePokemonId_;
+      lureExpiresTimestampMs_ = other.lureExpiresTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortLureInfo Clone() {
+      return new FortLureInfo(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 2;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_pokemon_id" field.</summary>
+    public const int ActivePokemonIdFieldNumber = 3;
+    private global::POGOProtos.Enums.PokemonId activePokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId ActivePokemonId {
+      get { return activePokemonId_; }
+      set {
+        activePokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "lure_expires_timestamp_ms" field.</summary>
+    public const int LureExpiresTimestampMsFieldNumber = 4;
+    private long lureExpiresTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LureExpiresTimestampMs {
+      get { return lureExpiresTimestampMs_; }
+      set {
+        lureExpiresTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortLureInfo);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortLureInfo other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (ActivePokemonId != other.ActivePokemonId) return false;
+      if (LureExpiresTimestampMs != other.LureExpiresTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (ActivePokemonId != 0) hash ^= ActivePokemonId.GetHashCode();
+      if (LureExpiresTimestampMs != 0L) hash ^= LureExpiresTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(EncounterId);
+      }
+      if (ActivePokemonId != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) ActivePokemonId);
+      }
+      if (LureExpiresTimestampMs != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(LureExpiresTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (ActivePokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ActivePokemonId);
+      }
+      if (LureExpiresTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LureExpiresTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortLureInfo other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.ActivePokemonId != 0) {
+        ActivePokemonId = other.ActivePokemonId;
+      }
+      if (other.LureExpiresTimestampMs != 0L) {
+        LureExpiresTimestampMs = other.LureExpiresTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 24: {
+            activePokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 32: {
+            LureExpiresTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortData : pb::IMessage<FortData> {
+    private static readonly pb::MessageParser<FortData> _parser = new pb::MessageParser<FortData>(() => new FortData());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortData> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortData() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortData(FortData other) : this() {
+      id_ = other.id_;
+      lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      enabled_ = other.enabled_;
+      type_ = other.type_;
+      ownedByTeam_ = other.ownedByTeam_;
+      guardPokemonId_ = other.guardPokemonId_;
+      guardPokemonCp_ = other.guardPokemonCp_;
+      gymPoints_ = other.gymPoints_;
+      isInBattle_ = other.isInBattle_;
+      cooldownCompleteTimestampMs_ = other.cooldownCompleteTimestampMs_;
+      sponsor_ = other.sponsor_;
+      renderingType_ = other.renderingType_;
+      activeFortModifier_ = other.activeFortModifier_;
+      LureInfo = other.lureInfo_ != null ? other.LureInfo.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortData Clone() {
+      return new FortData(this);
+    }
+
+    /// <summary>Field number for the "id" field.</summary>
+    public const int IdFieldNumber = 1;
+    private string id_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Id {
+      get { return id_; }
+      set {
+        id_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
+    public const int LastModifiedTimestampMsFieldNumber = 2;
+    private long lastModifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastModifiedTimestampMs {
+      get { return lastModifiedTimestampMs_; }
+      set {
+        lastModifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "enabled" field.</summary>
+    public const int EnabledFieldNumber = 8;
+    private bool enabled_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Enabled {
+      get { return enabled_; }
+      set {
+        enabled_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type" field.</summary>
+    public const int TypeFieldNumber = 9;
+    private global::POGOProtos.Map.Fort.FortType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "owned_by_team" field.</summary>
+    public const int OwnedByTeamFieldNumber = 5;
+    private global::POGOProtos.Enums.TeamColor ownedByTeam_ = 0;
+    /// <summary>
+    ///  Team that owns the gym
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor OwnedByTeam {
+      get { return ownedByTeam_; }
+      set {
+        ownedByTeam_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "guard_pokemon_id" field.</summary>
+    public const int GuardPokemonIdFieldNumber = 6;
+    private global::POGOProtos.Enums.PokemonId guardPokemonId_ = 0;
+    /// <summary>
+    ///  Highest CP Pokemon at the gym
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId GuardPokemonId {
+      get { return guardPokemonId_; }
+      set {
+        guardPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "guard_pokemon_cp" field.</summary>
+    public const int GuardPokemonCpFieldNumber = 7;
+    private int guardPokemonCp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GuardPokemonCp {
+      get { return guardPokemonCp_; }
+      set {
+        guardPokemonCp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_points" field.</summary>
+    public const int GymPointsFieldNumber = 10;
+    private long gymPoints_;
+    /// <summary>
+    ///  Prestigate / experience of the gym
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long GymPoints {
+      get { return gymPoints_; }
+      set {
+        gymPoints_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "is_in_battle" field.</summary>
+    public const int IsInBattleFieldNumber = 11;
+    private bool isInBattle_;
+    /// <summary>
+    ///  Whether someone is battling at the gym currently
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsInBattle {
+      get { return isInBattle_; }
+      set {
+        isInBattle_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cooldown_complete_timestamp_ms" field.</summary>
+    public const int CooldownCompleteTimestampMsFieldNumber = 14;
+    private long cooldownCompleteTimestampMs_;
+    /// <summary>
+    ///  Timestamp when the pokestop can be activated again to get items / xp
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CooldownCompleteTimestampMs {
+      get { return cooldownCompleteTimestampMs_; }
+      set {
+        cooldownCompleteTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sponsor" field.</summary>
+    public const int SponsorFieldNumber = 15;
+    private global::POGOProtos.Map.Fort.FortSponsor sponsor_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortSponsor Sponsor {
+      get { return sponsor_; }
+      set {
+        sponsor_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "rendering_type" field.</summary>
+    public const int RenderingTypeFieldNumber = 16;
+    private global::POGOProtos.Map.Fort.FortRenderingType renderingType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortRenderingType RenderingType {
+      get { return renderingType_; }
+      set {
+        renderingType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_fort_modifier" field.</summary>
+    public const int ActiveFortModifierFieldNumber = 12;
+    private pb::ByteString activeFortModifier_ = pb::ByteString.Empty;
+    /// <summary>
+    ///  Might represent the type of item applied to the pokestop, right now only lures can be applied
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString ActiveFortModifier {
+      get { return activeFortModifier_; }
+      set {
+        activeFortModifier_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "lure_info" field.</summary>
+    public const int LureInfoFieldNumber = 13;
+    private global::POGOProtos.Map.Fort.FortLureInfo lureInfo_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortLureInfo LureInfo {
+      get { return lureInfo_; }
+      set {
+        lureInfo_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortData);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortData other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Id != other.Id) return false;
+      if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (Enabled != other.Enabled) return false;
+      if (Type != other.Type) return false;
+      if (OwnedByTeam != other.OwnedByTeam) return false;
+      if (GuardPokemonId != other.GuardPokemonId) return false;
+      if (GuardPokemonCp != other.GuardPokemonCp) return false;
+      if (GymPoints != other.GymPoints) return false;
+      if (IsInBattle != other.IsInBattle) return false;
+      if (CooldownCompleteTimestampMs != other.CooldownCompleteTimestampMs) return false;
+      if (Sponsor != other.Sponsor) return false;
+      if (RenderingType != other.RenderingType) return false;
+      if (ActiveFortModifier != other.ActiveFortModifier) return false;
+      if (!object.Equals(LureInfo, other.LureInfo)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Id.Length != 0) hash ^= Id.GetHashCode();
+      if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (Enabled != false) hash ^= Enabled.GetHashCode();
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (OwnedByTeam != 0) hash ^= OwnedByTeam.GetHashCode();
+      if (GuardPokemonId != 0) hash ^= GuardPokemonId.GetHashCode();
+      if (GuardPokemonCp != 0) hash ^= GuardPokemonCp.GetHashCode();
+      if (GymPoints != 0L) hash ^= GymPoints.GetHashCode();
+      if (IsInBattle != false) hash ^= IsInBattle.GetHashCode();
+      if (CooldownCompleteTimestampMs != 0L) hash ^= CooldownCompleteTimestampMs.GetHashCode();
+      if (Sponsor != 0) hash ^= Sponsor.GetHashCode();
+      if (RenderingType != 0) hash ^= RenderingType.GetHashCode();
+      if (ActiveFortModifier.Length != 0) hash ^= ActiveFortModifier.GetHashCode();
+      if (lureInfo_ != null) hash ^= LureInfo.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Id.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Id);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+      if (OwnedByTeam != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) OwnedByTeam);
+      }
+      if (GuardPokemonId != 0) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) GuardPokemonId);
+      }
+      if (GuardPokemonCp != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(GuardPokemonCp);
+      }
+      if (Enabled != false) {
+        output.WriteRawTag(64);
+        output.WriteBool(Enabled);
+      }
+      if (Type != 0) {
+        output.WriteRawTag(72);
+        output.WriteEnum((int) Type);
+      }
+      if (GymPoints != 0L) {
+        output.WriteRawTag(80);
+        output.WriteInt64(GymPoints);
+      }
+      if (IsInBattle != false) {
+        output.WriteRawTag(88);
+        output.WriteBool(IsInBattle);
+      }
+      if (ActiveFortModifier.Length != 0) {
+        output.WriteRawTag(98);
+        output.WriteBytes(ActiveFortModifier);
+      }
+      if (lureInfo_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(LureInfo);
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        output.WriteRawTag(112);
+        output.WriteInt64(CooldownCompleteTimestampMs);
+      }
+      if (Sponsor != 0) {
+        output.WriteRawTag(120);
+        output.WriteEnum((int) Sponsor);
+      }
+      if (RenderingType != 0) {
+        output.WriteRawTag(128, 1);
+        output.WriteEnum((int) RenderingType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Id.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Enabled != false) {
+        size += 1 + 1;
+      }
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (OwnedByTeam != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) OwnedByTeam);
+      }
+      if (GuardPokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) GuardPokemonId);
+      }
+      if (GuardPokemonCp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GuardPokemonCp);
+      }
+      if (GymPoints != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(GymPoints);
+      }
+      if (IsInBattle != false) {
+        size += 1 + 1;
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CooldownCompleteTimestampMs);
+      }
+      if (Sponsor != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Sponsor);
+      }
+      if (RenderingType != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) RenderingType);
+      }
+      if (ActiveFortModifier.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(ActiveFortModifier);
+      }
+      if (lureInfo_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LureInfo);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortData other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Id.Length != 0) {
+        Id = other.Id;
+      }
+      if (other.LastModifiedTimestampMs != 0L) {
+        LastModifiedTimestampMs = other.LastModifiedTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.Enabled != false) {
+        Enabled = other.Enabled;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.OwnedByTeam != 0) {
+        OwnedByTeam = other.OwnedByTeam;
+      }
+      if (other.GuardPokemonId != 0) {
+        GuardPokemonId = other.GuardPokemonId;
+      }
+      if (other.GuardPokemonCp != 0) {
+        GuardPokemonCp = other.GuardPokemonCp;
+      }
+      if (other.GymPoints != 0L) {
+        GymPoints = other.GymPoints;
+      }
+      if (other.IsInBattle != false) {
+        IsInBattle = other.IsInBattle;
+      }
+      if (other.CooldownCompleteTimestampMs != 0L) {
+        CooldownCompleteTimestampMs = other.CooldownCompleteTimestampMs;
+      }
+      if (other.Sponsor != 0) {
+        Sponsor = other.Sponsor;
+      }
+      if (other.RenderingType != 0) {
+        RenderingType = other.RenderingType;
+      }
+      if (other.ActiveFortModifier.Length != 0) {
+        ActiveFortModifier = other.ActiveFortModifier;
+      }
+      if (other.lureInfo_ != null) {
+        if (lureInfo_ == null) {
+          lureInfo_ = new global::POGOProtos.Map.Fort.FortLureInfo();
+        }
+        LureInfo.MergeFrom(other.LureInfo);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Id = input.ReadString();
+            break;
+          }
+          case 16: {
+            LastModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 40: {
+            ownedByTeam_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+          case 48: {
+            guardPokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 56: {
+            GuardPokemonCp = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            Enabled = input.ReadBool();
+            break;
+          }
+          case 72: {
+            type_ = (global::POGOProtos.Map.Fort.FortType) input.ReadEnum();
+            break;
+          }
+          case 80: {
+            GymPoints = input.ReadInt64();
+            break;
+          }
+          case 88: {
+            IsInBattle = input.ReadBool();
+            break;
+          }
+          case 98: {
+            ActiveFortModifier = input.ReadBytes();
+            break;
+          }
+          case 106: {
+            if (lureInfo_ == null) {
+              lureInfo_ = new global::POGOProtos.Map.Fort.FortLureInfo();
+            }
+            input.ReadMessage(lureInfo_);
+            break;
+          }
+          case 112: {
+            CooldownCompleteTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 120: {
+            sponsor_ = (global::POGOProtos.Map.Fort.FortSponsor) input.ReadEnum();
+            break;
+          }
+          case 128: {
+            renderingType_ = (global::POGOProtos.Map.Fort.FortRenderingType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/MapCell.cs b/PokemonGo/POGOProtos/Map/MapCell.cs
new file mode 100644
index 0000000..53c70ae
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/MapCell.cs
@@ -0,0 +1,405 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/MapCell.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/MapCell.proto</summary>
+  public static partial class MapCellReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/MapCell.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MapCellReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChxQT0dPUHJvdG9zL01hcC9NYXBDZWxsLnByb3RvEg5QT0dPUHJvdG9zLk1h",
+            "cBofUE9HT1Byb3Rvcy9NYXAvU3Bhd25Qb2ludC5wcm90bxoiUE9HT1Byb3Rv",
+            "cy9NYXAvRm9ydC9Gb3J0RGF0YS5wcm90bxolUE9HT1Byb3Rvcy9NYXAvRm9y",
+            "dC9Gb3J0U3VtbWFyeS5wcm90bxoqUE9HT1Byb3Rvcy9NYXAvUG9rZW1vbi9O",
+            "ZWFyYnlQb2tlbW9uLnByb3RvGihQT0dPUHJvdG9zL01hcC9Qb2tlbW9uL1dp",
+            "bGRQb2tlbW9uLnByb3RvGidQT0dPUHJvdG9zL01hcC9Qb2tlbW9uL01hcFBv",
+            "a2Vtb24ucHJvdG8igQQKB01hcENlbGwSEgoKczJfY2VsbF9pZBgBIAEoBBIc",
+            "ChRjdXJyZW50X3RpbWVzdGFtcF9tcxgCIAEoAxIsCgVmb3J0cxgDIAMoCzId",
+            "LlBPR09Qcm90b3MuTWFwLkZvcnQuRm9ydERhdGESMAoMc3Bhd25fcG9pbnRz",
+            "GAQgAygLMhouUE9HT1Byb3Rvcy5NYXAuU3Bhd25Qb2ludBIXCg9kZWxldGVk",
+            "X29iamVjdHMYBiADKAkSGQoRaXNfdHJ1bmNhdGVkX2xpc3QYByABKAgSOAoO",
+            "Zm9ydF9zdW1tYXJpZXMYCCADKAsyIC5QT0dPUHJvdG9zLk1hcC5Gb3J0LkZv",
+            "cnRTdW1tYXJ5EjoKFmRlY2ltYXRlZF9zcGF3bl9wb2ludHMYCSADKAsyGi5Q",
+            "T0dPUHJvdG9zLk1hcC5TcGF3blBvaW50EjoKDXdpbGRfcG9rZW1vbnMYBSAD",
+            "KAsyIy5QT0dPUHJvdG9zLk1hcC5Qb2tlbW9uLldpbGRQb2tlbW9uEj4KEmNh",
+            "dGNoYWJsZV9wb2tlbW9ucxgKIAMoCzIiLlBPR09Qcm90b3MuTWFwLlBva2Vt",
+            "b24uTWFwUG9rZW1vbhI+Cg9uZWFyYnlfcG9rZW1vbnMYCyADKAsyJS5QT0dP",
+            "UHJvdG9zLk1hcC5Qb2tlbW9uLk5lYXJieVBva2Vtb25iBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Map.SpawnPointReflection.Descriptor, global::POGOProtos.Map.Fort.FortDataReflection.Descriptor, global::POGOProtos.Map.Fort.FortSummaryReflection.Descriptor, global::POGOProtos.Map.Pokemon.NearbyPokemonReflection.Descriptor, global::POGOProtos.Map.Pokemon.WildPokemonReflection.Descriptor, global::POGOProtos.Map.Pokemon.MapPokemonReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.MapCell), global::POGOProtos.Map.MapCell.Parser, new[]{ "S2CellId", "CurrentTimestampMs", "Forts", "SpawnPoints", "DeletedObjects", "IsTruncatedList", "FortSummaries", "DecimatedSpawnPoints", "WildPokemons", "CatchablePokemons", "NearbyPokemons" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  A cell is a geographical "zone" containing objects like pokemon, gyms, and pokestops.
+  /// </summary>
+  public sealed partial class MapCell : pb::IMessage<MapCell> {
+    private static readonly pb::MessageParser<MapCell> _parser = new pb::MessageParser<MapCell>(() => new MapCell());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MapCell> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.MapCellReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapCell() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapCell(MapCell other) : this() {
+      s2CellId_ = other.s2CellId_;
+      currentTimestampMs_ = other.currentTimestampMs_;
+      forts_ = other.forts_.Clone();
+      spawnPoints_ = other.spawnPoints_.Clone();
+      deletedObjects_ = other.deletedObjects_.Clone();
+      isTruncatedList_ = other.isTruncatedList_;
+      fortSummaries_ = other.fortSummaries_.Clone();
+      decimatedSpawnPoints_ = other.decimatedSpawnPoints_.Clone();
+      wildPokemons_ = other.wildPokemons_.Clone();
+      catchablePokemons_ = other.catchablePokemons_.Clone();
+      nearbyPokemons_ = other.nearbyPokemons_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapCell Clone() {
+      return new MapCell(this);
+    }
+
+    /// <summary>Field number for the "s2_cell_id" field.</summary>
+    public const int S2CellIdFieldNumber = 1;
+    private ulong s2CellId_;
+    /// <summary>
+    ///  S2 geographic area that the cell covers (http://s2map.com/) (https://code.google.com/archive/p/s2-geometry-library/)
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong S2CellId {
+      get { return s2CellId_; }
+      set {
+        s2CellId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_timestamp_ms" field.</summary>
+    public const int CurrentTimestampMsFieldNumber = 2;
+    private long currentTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CurrentTimestampMs {
+      get { return currentTimestampMs_; }
+      set {
+        currentTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "forts" field.</summary>
+    public const int FortsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortData> _repeated_forts_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Map.Fort.FortData.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> forts_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> Forts {
+      get { return forts_; }
+    }
+
+    /// <summary>Field number for the "spawn_points" field.</summary>
+    public const int SpawnPointsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.SpawnPoint> _repeated_spawnPoints_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Map.SpawnPoint.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> spawnPoints_ = new pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> SpawnPoints {
+      get { return spawnPoints_; }
+    }
+
+    /// <summary>Field number for the "deleted_objects" field.</summary>
+    public const int DeletedObjectsFieldNumber = 6;
+    private static readonly pb::FieldCodec<string> _repeated_deletedObjects_codec
+        = pb::FieldCodec.ForString(50);
+    private readonly pbc::RepeatedField<string> deletedObjects_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> DeletedObjects {
+      get { return deletedObjects_; }
+    }
+
+    /// <summary>Field number for the "is_truncated_list" field.</summary>
+    public const int IsTruncatedListFieldNumber = 7;
+    private bool isTruncatedList_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsTruncatedList {
+      get { return isTruncatedList_; }
+      set {
+        isTruncatedList_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_summaries" field.</summary>
+    public const int FortSummariesFieldNumber = 8;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortSummary> _repeated_fortSummaries_codec
+        = pb::FieldCodec.ForMessage(66, global::POGOProtos.Map.Fort.FortSummary.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortSummary> fortSummaries_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortSummary>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortSummary> FortSummaries {
+      get { return fortSummaries_; }
+    }
+
+    /// <summary>Field number for the "decimated_spawn_points" field.</summary>
+    public const int DecimatedSpawnPointsFieldNumber = 9;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.SpawnPoint> _repeated_decimatedSpawnPoints_codec
+        = pb::FieldCodec.ForMessage(74, global::POGOProtos.Map.SpawnPoint.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> decimatedSpawnPoints_ = new pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> DecimatedSpawnPoints {
+      get { return decimatedSpawnPoints_; }
+    }
+
+    /// <summary>Field number for the "wild_pokemons" field.</summary>
+    public const int WildPokemonsFieldNumber = 5;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.WildPokemon> _repeated_wildPokemons_codec
+        = pb::FieldCodec.ForMessage(42, global::POGOProtos.Map.Pokemon.WildPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> wildPokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon>();
+    /// <summary>
+    ///  Pokemon within 2 steps or less.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> WildPokemons {
+      get { return wildPokemons_; }
+    }
+
+    /// <summary>Field number for the "catchable_pokemons" field.</summary>
+    public const int CatchablePokemonsFieldNumber = 10;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.MapPokemon> _repeated_catchablePokemons_codec
+        = pb::FieldCodec.ForMessage(82, global::POGOProtos.Map.Pokemon.MapPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.MapPokemon> catchablePokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.MapPokemon>();
+    /// <summary>
+    ///  Pokemon within 1 step or none.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.MapPokemon> CatchablePokemons {
+      get { return catchablePokemons_; }
+    }
+
+    /// <summary>Field number for the "nearby_pokemons" field.</summary>
+    public const int NearbyPokemonsFieldNumber = 11;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.NearbyPokemon> _repeated_nearbyPokemons_codec
+        = pb::FieldCodec.ForMessage(90, global::POGOProtos.Map.Pokemon.NearbyPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.NearbyPokemon> nearbyPokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.NearbyPokemon>();
+    /// <summary>
+    ///  Pokemon farther away than 2 steps, but still in the area.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.NearbyPokemon> NearbyPokemons {
+      get { return nearbyPokemons_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MapCell);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MapCell other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (S2CellId != other.S2CellId) return false;
+      if (CurrentTimestampMs != other.CurrentTimestampMs) return false;
+      if(!forts_.Equals(other.forts_)) return false;
+      if(!spawnPoints_.Equals(other.spawnPoints_)) return false;
+      if(!deletedObjects_.Equals(other.deletedObjects_)) return false;
+      if (IsTruncatedList != other.IsTruncatedList) return false;
+      if(!fortSummaries_.Equals(other.fortSummaries_)) return false;
+      if(!decimatedSpawnPoints_.Equals(other.decimatedSpawnPoints_)) return false;
+      if(!wildPokemons_.Equals(other.wildPokemons_)) return false;
+      if(!catchablePokemons_.Equals(other.catchablePokemons_)) return false;
+      if(!nearbyPokemons_.Equals(other.nearbyPokemons_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (S2CellId != 0UL) hash ^= S2CellId.GetHashCode();
+      if (CurrentTimestampMs != 0L) hash ^= CurrentTimestampMs.GetHashCode();
+      hash ^= forts_.GetHashCode();
+      hash ^= spawnPoints_.GetHashCode();
+      hash ^= deletedObjects_.GetHashCode();
+      if (IsTruncatedList != false) hash ^= IsTruncatedList.GetHashCode();
+      hash ^= fortSummaries_.GetHashCode();
+      hash ^= decimatedSpawnPoints_.GetHashCode();
+      hash ^= wildPokemons_.GetHashCode();
+      hash ^= catchablePokemons_.GetHashCode();
+      hash ^= nearbyPokemons_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (S2CellId != 0UL) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(S2CellId);
+      }
+      if (CurrentTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(CurrentTimestampMs);
+      }
+      forts_.WriteTo(output, _repeated_forts_codec);
+      spawnPoints_.WriteTo(output, _repeated_spawnPoints_codec);
+      wildPokemons_.WriteTo(output, _repeated_wildPokemons_codec);
+      deletedObjects_.WriteTo(output, _repeated_deletedObjects_codec);
+      if (IsTruncatedList != false) {
+        output.WriteRawTag(56);
+        output.WriteBool(IsTruncatedList);
+      }
+      fortSummaries_.WriteTo(output, _repeated_fortSummaries_codec);
+      decimatedSpawnPoints_.WriteTo(output, _repeated_decimatedSpawnPoints_codec);
+      catchablePokemons_.WriteTo(output, _repeated_catchablePokemons_codec);
+      nearbyPokemons_.WriteTo(output, _repeated_nearbyPokemons_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (S2CellId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(S2CellId);
+      }
+      if (CurrentTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CurrentTimestampMs);
+      }
+      size += forts_.CalculateSize(_repeated_forts_codec);
+      size += spawnPoints_.CalculateSize(_repeated_spawnPoints_codec);
+      size += deletedObjects_.CalculateSize(_repeated_deletedObjects_codec);
+      if (IsTruncatedList != false) {
+        size += 1 + 1;
+      }
+      size += fortSummaries_.CalculateSize(_repeated_fortSummaries_codec);
+      size += decimatedSpawnPoints_.CalculateSize(_repeated_decimatedSpawnPoints_codec);
+      size += wildPokemons_.CalculateSize(_repeated_wildPokemons_codec);
+      size += catchablePokemons_.CalculateSize(_repeated_catchablePokemons_codec);
+      size += nearbyPokemons_.CalculateSize(_repeated_nearbyPokemons_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MapCell other) {
+      if (other == null) {
+        return;
+      }
+      if (other.S2CellId != 0UL) {
+        S2CellId = other.S2CellId;
+      }
+      if (other.CurrentTimestampMs != 0L) {
+        CurrentTimestampMs = other.CurrentTimestampMs;
+      }
+      forts_.Add(other.forts_);
+      spawnPoints_.Add(other.spawnPoints_);
+      deletedObjects_.Add(other.deletedObjects_);
+      if (other.IsTruncatedList != false) {
+        IsTruncatedList = other.IsTruncatedList;
+      }
+      fortSummaries_.Add(other.fortSummaries_);
+      decimatedSpawnPoints_.Add(other.decimatedSpawnPoints_);
+      wildPokemons_.Add(other.wildPokemons_);
+      catchablePokemons_.Add(other.catchablePokemons_);
+      nearbyPokemons_.Add(other.nearbyPokemons_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            S2CellId = input.ReadUInt64();
+            break;
+          }
+          case 16: {
+            CurrentTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            forts_.AddEntriesFrom(input, _repeated_forts_codec);
+            break;
+          }
+          case 34: {
+            spawnPoints_.AddEntriesFrom(input, _repeated_spawnPoints_codec);
+            break;
+          }
+          case 42: {
+            wildPokemons_.AddEntriesFrom(input, _repeated_wildPokemons_codec);
+            break;
+          }
+          case 50: {
+            deletedObjects_.AddEntriesFrom(input, _repeated_deletedObjects_codec);
+            break;
+          }
+          case 56: {
+            IsTruncatedList = input.ReadBool();
+            break;
+          }
+          case 66: {
+            fortSummaries_.AddEntriesFrom(input, _repeated_fortSummaries_codec);
+            break;
+          }
+          case 74: {
+            decimatedSpawnPoints_.AddEntriesFrom(input, _repeated_decimatedSpawnPoints_codec);
+            break;
+          }
+          case 82: {
+            catchablePokemons_.AddEntriesFrom(input, _repeated_catchablePokemons_codec);
+            break;
+          }
+          case 90: {
+            nearbyPokemons_.AddEntriesFrom(input, _repeated_nearbyPokemons_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/MapObjectsStatus.cs b/PokemonGo/POGOProtos/Map/MapObjectsStatus.cs
new file mode 100644
index 0000000..0b73bfa
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/MapObjectsStatus.cs
@@ -0,0 +1,46 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/MapObjectsStatus.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/MapObjectsStatus.proto</summary>
+  public static partial class MapObjectsStatusReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/MapObjectsStatus.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MapObjectsStatusReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zL01hcC9NYXBPYmplY3RzU3RhdHVzLnByb3RvEg5QT0dP",
+            "UHJvdG9zLk1hcCpFChBNYXBPYmplY3RzU3RhdHVzEhAKDFVOU0VUX1NUQVRV",
+            "UxAAEgsKB1NVQ0NFU1MQARISCg5MT0NBVElPTl9VTlNFVBACYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Map.MapObjectsStatus), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum MapObjectsStatus {
+    [pbr::OriginalName("UNSET_STATUS")] UnsetStatus = 0,
+    [pbr::OriginalName("SUCCESS")] Success = 1,
+    [pbr::OriginalName("LOCATION_UNSET")] LocationUnset = 2,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/POGOProtosMap.cs b/PokemonGo/POGOProtos/Map/POGOProtosMap.cs
new file mode 100644
index 0000000..f193222
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/POGOProtosMap.cs
@@ -0,0 +1,556 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Map.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Map.proto</summary>
+  public static partial class POGOProtosMapReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Map.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosMapReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChRQT0dPUHJvdG9zLk1hcC5wcm90bxIOUE9HT1Byb3Rvcy5NYXAaGVBPR09Q",
+            "cm90b3MuTWFwLkZvcnQucHJvdG8aHFBPR09Qcm90b3MuTWFwLlBva2Vtb24u",
+            "cHJvdG8igQQKB01hcENlbGwSEgoKczJfY2VsbF9pZBgBIAEoBBIcChRjdXJy",
+            "ZW50X3RpbWVzdGFtcF9tcxgCIAEoAxIsCgVmb3J0cxgDIAMoCzIdLlBPR09Q",
+            "cm90b3MuTWFwLkZvcnQuRm9ydERhdGESMAoMc3Bhd25fcG9pbnRzGAQgAygL",
+            "MhouUE9HT1Byb3Rvcy5NYXAuU3Bhd25Qb2ludBIXCg9kZWxldGVkX29iamVj",
+            "dHMYBiADKAkSGQoRaXNfdHJ1bmNhdGVkX2xpc3QYByABKAgSOAoOZm9ydF9z",
+            "dW1tYXJpZXMYCCADKAsyIC5QT0dPUHJvdG9zLk1hcC5Gb3J0LkZvcnRTdW1t",
+            "YXJ5EjoKFmRlY2ltYXRlZF9zcGF3bl9wb2ludHMYCSADKAsyGi5QT0dPUHJv",
+            "dG9zLk1hcC5TcGF3blBvaW50EjoKDXdpbGRfcG9rZW1vbnMYBSADKAsyIy5Q",
+            "T0dPUHJvdG9zLk1hcC5Qb2tlbW9uLldpbGRQb2tlbW9uEj4KEmNhdGNoYWJs",
+            "ZV9wb2tlbW9ucxgKIAMoCzIiLlBPR09Qcm90b3MuTWFwLlBva2Vtb24uTWFw",
+            "UG9rZW1vbhI+Cg9uZWFyYnlfcG9rZW1vbnMYCyADKAsyJS5QT0dPUHJvdG9z",
+            "Lk1hcC5Qb2tlbW9uLk5lYXJieVBva2Vtb24iMQoKU3Bhd25Qb2ludBIQCghs",
+            "YXRpdHVkZRgCIAEoARIRCglsb25naXR1ZGUYAyABKAEqRQoQTWFwT2JqZWN0",
+            "c1N0YXR1cxIQCgxVTlNFVF9TVEFUVVMQABILCgdTVUNDRVNTEAESEgoOTE9D",
+            "QVRJT05fVU5TRVQQAlAAUAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor, global::POGOProtos.Map.Pokemon.POGOProtosMapPokemonReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Map.MapObjectsStatus), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.MapCell), global::POGOProtos.Map.MapCell.Parser, new[]{ "S2CellId", "CurrentTimestampMs", "Forts", "SpawnPoints", "DeletedObjects", "IsTruncatedList", "FortSummaries", "DecimatedSpawnPoints", "WildPokemons", "CatchablePokemons", "NearbyPokemons" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.SpawnPoint), global::POGOProtos.Map.SpawnPoint.Parser, new[]{ "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum MapObjectsStatus {
+    [pbr::OriginalName("UNSET_STATUS")] UnsetStatus = 0,
+    [pbr::OriginalName("SUCCESS")] Success = 1,
+    [pbr::OriginalName("LOCATION_UNSET")] LocationUnset = 2,
+  }
+
+  #endregion
+
+  #region Messages
+  public sealed partial class MapCell : pb::IMessage<MapCell> {
+    private static readonly pb::MessageParser<MapCell> _parser = new pb::MessageParser<MapCell>(() => new MapCell());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MapCell> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.POGOProtosMapReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapCell() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapCell(MapCell other) : this() {
+      s2CellId_ = other.s2CellId_;
+      currentTimestampMs_ = other.currentTimestampMs_;
+      forts_ = other.forts_.Clone();
+      spawnPoints_ = other.spawnPoints_.Clone();
+      deletedObjects_ = other.deletedObjects_.Clone();
+      isTruncatedList_ = other.isTruncatedList_;
+      fortSummaries_ = other.fortSummaries_.Clone();
+      decimatedSpawnPoints_ = other.decimatedSpawnPoints_.Clone();
+      wildPokemons_ = other.wildPokemons_.Clone();
+      catchablePokemons_ = other.catchablePokemons_.Clone();
+      nearbyPokemons_ = other.nearbyPokemons_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapCell Clone() {
+      return new MapCell(this);
+    }
+
+    /// <summary>Field number for the "s2_cell_id" field.</summary>
+    public const int S2CellIdFieldNumber = 1;
+    private ulong s2CellId_;
+    /// <summary>
+    ///  S2 geographic area that the cell covers (http://s2map.com/) (https://code.google.com/archive/p/s2-geometry-library/)
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong S2CellId {
+      get { return s2CellId_; }
+      set {
+        s2CellId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "current_timestamp_ms" field.</summary>
+    public const int CurrentTimestampMsFieldNumber = 2;
+    private long currentTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CurrentTimestampMs {
+      get { return currentTimestampMs_; }
+      set {
+        currentTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "forts" field.</summary>
+    public const int FortsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortData> _repeated_forts_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Map.Fort.FortData.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> forts_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> Forts {
+      get { return forts_; }
+    }
+
+    /// <summary>Field number for the "spawn_points" field.</summary>
+    public const int SpawnPointsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.SpawnPoint> _repeated_spawnPoints_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Map.SpawnPoint.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> spawnPoints_ = new pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> SpawnPoints {
+      get { return spawnPoints_; }
+    }
+
+    /// <summary>Field number for the "deleted_objects" field.</summary>
+    public const int DeletedObjectsFieldNumber = 6;
+    private static readonly pb::FieldCodec<string> _repeated_deletedObjects_codec
+        = pb::FieldCodec.ForString(50);
+    private readonly pbc::RepeatedField<string> deletedObjects_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> DeletedObjects {
+      get { return deletedObjects_; }
+    }
+
+    /// <summary>Field number for the "is_truncated_list" field.</summary>
+    public const int IsTruncatedListFieldNumber = 7;
+    private bool isTruncatedList_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsTruncatedList {
+      get { return isTruncatedList_; }
+      set {
+        isTruncatedList_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_summaries" field.</summary>
+    public const int FortSummariesFieldNumber = 8;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortSummary> _repeated_fortSummaries_codec
+        = pb::FieldCodec.ForMessage(66, global::POGOProtos.Map.Fort.FortSummary.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortSummary> fortSummaries_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortSummary>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortSummary> FortSummaries {
+      get { return fortSummaries_; }
+    }
+
+    /// <summary>Field number for the "decimated_spawn_points" field.</summary>
+    public const int DecimatedSpawnPointsFieldNumber = 9;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.SpawnPoint> _repeated_decimatedSpawnPoints_codec
+        = pb::FieldCodec.ForMessage(74, global::POGOProtos.Map.SpawnPoint.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> decimatedSpawnPoints_ = new pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.SpawnPoint> DecimatedSpawnPoints {
+      get { return decimatedSpawnPoints_; }
+    }
+
+    /// <summary>Field number for the "wild_pokemons" field.</summary>
+    public const int WildPokemonsFieldNumber = 5;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.WildPokemon> _repeated_wildPokemons_codec
+        = pb::FieldCodec.ForMessage(42, global::POGOProtos.Map.Pokemon.WildPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> wildPokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon>();
+    /// <summary>
+    ///  Pokemon within 2 steps or less.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> WildPokemons {
+      get { return wildPokemons_; }
+    }
+
+    /// <summary>Field number for the "catchable_pokemons" field.</summary>
+    public const int CatchablePokemonsFieldNumber = 10;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.MapPokemon> _repeated_catchablePokemons_codec
+        = pb::FieldCodec.ForMessage(82, global::POGOProtos.Map.Pokemon.MapPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.MapPokemon> catchablePokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.MapPokemon>();
+    /// <summary>
+    ///  Pokemon within 1 step or none.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.MapPokemon> CatchablePokemons {
+      get { return catchablePokemons_; }
+    }
+
+    /// <summary>Field number for the "nearby_pokemons" field.</summary>
+    public const int NearbyPokemonsFieldNumber = 11;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.NearbyPokemon> _repeated_nearbyPokemons_codec
+        = pb::FieldCodec.ForMessage(90, global::POGOProtos.Map.Pokemon.NearbyPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.NearbyPokemon> nearbyPokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.NearbyPokemon>();
+    /// <summary>
+    ///  Pokemon farther away than 2 steps, but still in the area.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.NearbyPokemon> NearbyPokemons {
+      get { return nearbyPokemons_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MapCell);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MapCell other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (S2CellId != other.S2CellId) return false;
+      if (CurrentTimestampMs != other.CurrentTimestampMs) return false;
+      if(!forts_.Equals(other.forts_)) return false;
+      if(!spawnPoints_.Equals(other.spawnPoints_)) return false;
+      if(!deletedObjects_.Equals(other.deletedObjects_)) return false;
+      if (IsTruncatedList != other.IsTruncatedList) return false;
+      if(!fortSummaries_.Equals(other.fortSummaries_)) return false;
+      if(!decimatedSpawnPoints_.Equals(other.decimatedSpawnPoints_)) return false;
+      if(!wildPokemons_.Equals(other.wildPokemons_)) return false;
+      if(!catchablePokemons_.Equals(other.catchablePokemons_)) return false;
+      if(!nearbyPokemons_.Equals(other.nearbyPokemons_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (S2CellId != 0UL) hash ^= S2CellId.GetHashCode();
+      if (CurrentTimestampMs != 0L) hash ^= CurrentTimestampMs.GetHashCode();
+      hash ^= forts_.GetHashCode();
+      hash ^= spawnPoints_.GetHashCode();
+      hash ^= deletedObjects_.GetHashCode();
+      if (IsTruncatedList != false) hash ^= IsTruncatedList.GetHashCode();
+      hash ^= fortSummaries_.GetHashCode();
+      hash ^= decimatedSpawnPoints_.GetHashCode();
+      hash ^= wildPokemons_.GetHashCode();
+      hash ^= catchablePokemons_.GetHashCode();
+      hash ^= nearbyPokemons_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (S2CellId != 0UL) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(S2CellId);
+      }
+      if (CurrentTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(CurrentTimestampMs);
+      }
+      forts_.WriteTo(output, _repeated_forts_codec);
+      spawnPoints_.WriteTo(output, _repeated_spawnPoints_codec);
+      wildPokemons_.WriteTo(output, _repeated_wildPokemons_codec);
+      deletedObjects_.WriteTo(output, _repeated_deletedObjects_codec);
+      if (IsTruncatedList != false) {
+        output.WriteRawTag(56);
+        output.WriteBool(IsTruncatedList);
+      }
+      fortSummaries_.WriteTo(output, _repeated_fortSummaries_codec);
+      decimatedSpawnPoints_.WriteTo(output, _repeated_decimatedSpawnPoints_codec);
+      catchablePokemons_.WriteTo(output, _repeated_catchablePokemons_codec);
+      nearbyPokemons_.WriteTo(output, _repeated_nearbyPokemons_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (S2CellId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(S2CellId);
+      }
+      if (CurrentTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CurrentTimestampMs);
+      }
+      size += forts_.CalculateSize(_repeated_forts_codec);
+      size += spawnPoints_.CalculateSize(_repeated_spawnPoints_codec);
+      size += deletedObjects_.CalculateSize(_repeated_deletedObjects_codec);
+      if (IsTruncatedList != false) {
+        size += 1 + 1;
+      }
+      size += fortSummaries_.CalculateSize(_repeated_fortSummaries_codec);
+      size += decimatedSpawnPoints_.CalculateSize(_repeated_decimatedSpawnPoints_codec);
+      size += wildPokemons_.CalculateSize(_repeated_wildPokemons_codec);
+      size += catchablePokemons_.CalculateSize(_repeated_catchablePokemons_codec);
+      size += nearbyPokemons_.CalculateSize(_repeated_nearbyPokemons_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MapCell other) {
+      if (other == null) {
+        return;
+      }
+      if (other.S2CellId != 0UL) {
+        S2CellId = other.S2CellId;
+      }
+      if (other.CurrentTimestampMs != 0L) {
+        CurrentTimestampMs = other.CurrentTimestampMs;
+      }
+      forts_.Add(other.forts_);
+      spawnPoints_.Add(other.spawnPoints_);
+      deletedObjects_.Add(other.deletedObjects_);
+      if (other.IsTruncatedList != false) {
+        IsTruncatedList = other.IsTruncatedList;
+      }
+      fortSummaries_.Add(other.fortSummaries_);
+      decimatedSpawnPoints_.Add(other.decimatedSpawnPoints_);
+      wildPokemons_.Add(other.wildPokemons_);
+      catchablePokemons_.Add(other.catchablePokemons_);
+      nearbyPokemons_.Add(other.nearbyPokemons_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            S2CellId = input.ReadUInt64();
+            break;
+          }
+          case 16: {
+            CurrentTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            forts_.AddEntriesFrom(input, _repeated_forts_codec);
+            break;
+          }
+          case 34: {
+            spawnPoints_.AddEntriesFrom(input, _repeated_spawnPoints_codec);
+            break;
+          }
+          case 42: {
+            wildPokemons_.AddEntriesFrom(input, _repeated_wildPokemons_codec);
+            break;
+          }
+          case 50: {
+            deletedObjects_.AddEntriesFrom(input, _repeated_deletedObjects_codec);
+            break;
+          }
+          case 56: {
+            IsTruncatedList = input.ReadBool();
+            break;
+          }
+          case 66: {
+            fortSummaries_.AddEntriesFrom(input, _repeated_fortSummaries_codec);
+            break;
+          }
+          case 74: {
+            decimatedSpawnPoints_.AddEntriesFrom(input, _repeated_decimatedSpawnPoints_codec);
+            break;
+          }
+          case 82: {
+            catchablePokemons_.AddEntriesFrom(input, _repeated_catchablePokemons_codec);
+            break;
+          }
+          case 90: {
+            nearbyPokemons_.AddEntriesFrom(input, _repeated_nearbyPokemons_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SpawnPoint : pb::IMessage<SpawnPoint> {
+    private static readonly pb::MessageParser<SpawnPoint> _parser = new pb::MessageParser<SpawnPoint>(() => new SpawnPoint());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SpawnPoint> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.POGOProtosMapReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SpawnPoint() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SpawnPoint(SpawnPoint other) : this() {
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SpawnPoint Clone() {
+      return new SpawnPoint(this);
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 2;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 3;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SpawnPoint);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SpawnPoint other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Latitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SpawnPoint other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 17: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Pokemon/MapPokemon.cs b/PokemonGo/POGOProtos/Map/Pokemon/MapPokemon.cs
new file mode 100644
index 0000000..b029e18
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Pokemon/MapPokemon.cs
@@ -0,0 +1,306 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Pokemon/MapPokemon.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Pokemon/MapPokemon.proto</summary>
+  public static partial class MapPokemonReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Pokemon/MapPokemon.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MapPokemonReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL01hcC9Qb2tlbW9uL01hcFBva2Vtb24ucHJvdG8SFlBP",
+            "R09Qcm90b3MuTWFwLlBva2Vtb24aIFBPR09Qcm90b3MvRW51bXMvUG9rZW1v",
+            "bklkLnByb3RvIrEBCgpNYXBQb2tlbW9uEhYKDnNwYXduX3BvaW50X2lkGAEg",
+            "ASgJEhQKDGVuY291bnRlcl9pZBgCIAEoBhIvCgpwb2tlbW9uX2lkGAMgASgO",
+            "MhsuUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uSWQSHwoXZXhwaXJhdGlvbl90",
+            "aW1lc3RhbXBfbXMYBCABKAMSEAoIbGF0aXR1ZGUYBSABKAESEQoJbG9uZ2l0",
+            "dWRlGAYgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Pokemon.MapPokemon), global::POGOProtos.Map.Pokemon.MapPokemon.Parser, new[]{ "SpawnPointId", "EncounterId", "PokemonId", "ExpirationTimestampMs", "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MapPokemon : pb::IMessage<MapPokemon> {
+    private static readonly pb::MessageParser<MapPokemon> _parser = new pb::MessageParser<MapPokemon>(() => new MapPokemon());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MapPokemon> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Pokemon.MapPokemonReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapPokemon() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapPokemon(MapPokemon other) : this() {
+      spawnPointId_ = other.spawnPointId_;
+      encounterId_ = other.encounterId_;
+      pokemonId_ = other.pokemonId_;
+      expirationTimestampMs_ = other.expirationTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapPokemon Clone() {
+      return new MapPokemon(this);
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 1;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 2;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 3;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "expiration_timestamp_ms" field.</summary>
+    public const int ExpirationTimestampMsFieldNumber = 4;
+    private long expirationTimestampMs_;
+    /// <summary>
+    ///  After this timestamp, the pokemon will be gone.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ExpirationTimestampMs {
+      get { return expirationTimestampMs_; }
+      set {
+        expirationTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 5;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 6;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MapPokemon);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MapPokemon other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (ExpirationTimestampMs != other.ExpirationTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (ExpirationTimestampMs != 0L) hash ^= ExpirationTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(SpawnPointId);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(EncounterId);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(ExpirationTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpirationTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MapPokemon other) {
+      if (other == null) {
+        return;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.ExpirationTimestampMs != 0L) {
+        ExpirationTimestampMs = other.ExpirationTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 17: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 24: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 32: {
+            ExpirationTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 41: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 49: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Pokemon/NearbyPokemon.cs b/PokemonGo/POGOProtos/Map/Pokemon/NearbyPokemon.cs
new file mode 100644
index 0000000..3e65f71
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Pokemon/NearbyPokemon.cs
@@ -0,0 +1,218 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Pokemon/NearbyPokemon.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Pokemon/NearbyPokemon.proto</summary>
+  public static partial class NearbyPokemonReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Pokemon/NearbyPokemon.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static NearbyPokemonReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CipQT0dPUHJvdG9zL01hcC9Qb2tlbW9uL05lYXJieVBva2Vtb24ucHJvdG8S",
+            "FlBPR09Qcm90b3MuTWFwLlBva2Vtb24aIFBPR09Qcm90b3MvRW51bXMvUG9r",
+            "ZW1vbklkLnByb3RvInIKDU5lYXJieVBva2Vtb24SLwoKcG9rZW1vbl9pZBgB",
+            "IAEoDjIbLlBPR09Qcm90b3MuRW51bXMuUG9rZW1vbklkEhoKEmRpc3RhbmNl",
+            "X2luX21ldGVycxgCIAEoAhIUCgxlbmNvdW50ZXJfaWQYAyABKAZiBnByb3Rv",
+            "Mw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Pokemon.NearbyPokemon), global::POGOProtos.Map.Pokemon.NearbyPokemon.Parser, new[]{ "PokemonId", "DistanceInMeters", "EncounterId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class NearbyPokemon : pb::IMessage<NearbyPokemon> {
+    private static readonly pb::MessageParser<NearbyPokemon> _parser = new pb::MessageParser<NearbyPokemon>(() => new NearbyPokemon());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<NearbyPokemon> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Pokemon.NearbyPokemonReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NearbyPokemon() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NearbyPokemon(NearbyPokemon other) : this() {
+      pokemonId_ = other.pokemonId_;
+      distanceInMeters_ = other.distanceInMeters_;
+      encounterId_ = other.encounterId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NearbyPokemon Clone() {
+      return new NearbyPokemon(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "distance_in_meters" field.</summary>
+    public const int DistanceInMetersFieldNumber = 2;
+    private float distanceInMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DistanceInMeters {
+      get { return distanceInMeters_; }
+      set {
+        distanceInMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 3;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as NearbyPokemon);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(NearbyPokemon other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (DistanceInMeters != other.DistanceInMeters) return false;
+      if (EncounterId != other.EncounterId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (DistanceInMeters != 0F) hash ^= DistanceInMeters.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (DistanceInMeters != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(DistanceInMeters);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(25);
+        output.WriteFixed64(EncounterId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (DistanceInMeters != 0F) {
+        size += 1 + 4;
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(NearbyPokemon other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.DistanceInMeters != 0F) {
+        DistanceInMeters = other.DistanceInMeters;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 21: {
+            DistanceInMeters = input.ReadFloat();
+            break;
+          }
+          case 25: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Pokemon/POGOProtosMapPokemon.cs b/PokemonGo/POGOProtos/Map/Pokemon/POGOProtosMapPokemon.cs
new file mode 100644
index 0000000..40f8022
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Pokemon/POGOProtosMapPokemon.cs
@@ -0,0 +1,779 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Map.Pokemon.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Map.Pokemon.proto</summary>
+  public static partial class POGOProtosMapPokemonReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Map.Pokemon.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosMapPokemonReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChxQT0dPUHJvdG9zLk1hcC5Qb2tlbW9uLnByb3RvEhZQT0dPUHJvdG9zLk1h",
+            "cC5Qb2tlbW9uGhZQT0dPUHJvdG9zLkVudW1zLnByb3RvGhVQT0dPUHJvdG9z",
+            "LkRhdGEucHJvdG8isQEKCk1hcFBva2Vtb24SFgoOc3Bhd25fcG9pbnRfaWQY",
+            "ASABKAkSFAoMZW5jb3VudGVyX2lkGAIgASgGEi8KCnBva2Vtb25faWQYAyAB",
+            "KA4yGy5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25JZBIfChdleHBpcmF0aW9u",
+            "X3RpbWVzdGFtcF9tcxgEIAEoAxIQCghsYXRpdHVkZRgFIAEoARIRCglsb25n",
+            "aXR1ZGUYBiABKAEicgoNTmVhcmJ5UG9rZW1vbhIvCgpwb2tlbW9uX2lkGAEg",
+            "ASgOMhsuUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uSWQSGgoSZGlzdGFuY2Vf",
+            "aW5fbWV0ZXJzGAIgASgCEhQKDGVuY291bnRlcl9pZBgDIAEoBiLVAQoLV2ls",
+            "ZFBva2Vtb24SFAoMZW5jb3VudGVyX2lkGAEgASgGEiIKGmxhc3RfbW9kaWZp",
+            "ZWRfdGltZXN0YW1wX21zGAIgASgDEhAKCGxhdGl0dWRlGAMgASgBEhEKCWxv",
+            "bmdpdHVkZRgEIAEoARIWCg5zcGF3bl9wb2ludF9pZBgFIAEoCRIyCgxwb2tl",
+            "bW9uX2RhdGEYByABKAsyHC5QT0dPUHJvdG9zLkRhdGEuUG9rZW1vbkRhdGES",
+            "GwoTdGltZV90aWxsX2hpZGRlbl9tcxgLIAEoBVAAUAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Data.POGOProtosDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Pokemon.MapPokemon), global::POGOProtos.Map.Pokemon.MapPokemon.Parser, new[]{ "SpawnPointId", "EncounterId", "PokemonId", "ExpirationTimestampMs", "Latitude", "Longitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Pokemon.NearbyPokemon), global::POGOProtos.Map.Pokemon.NearbyPokemon.Parser, new[]{ "PokemonId", "DistanceInMeters", "EncounterId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Pokemon.WildPokemon), global::POGOProtos.Map.Pokemon.WildPokemon.Parser, new[]{ "EncounterId", "LastModifiedTimestampMs", "Latitude", "Longitude", "SpawnPointId", "PokemonData", "TimeTillHiddenMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MapPokemon : pb::IMessage<MapPokemon> {
+    private static readonly pb::MessageParser<MapPokemon> _parser = new pb::MessageParser<MapPokemon>(() => new MapPokemon());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MapPokemon> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Pokemon.POGOProtosMapPokemonReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapPokemon() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapPokemon(MapPokemon other) : this() {
+      spawnPointId_ = other.spawnPointId_;
+      encounterId_ = other.encounterId_;
+      pokemonId_ = other.pokemonId_;
+      expirationTimestampMs_ = other.expirationTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapPokemon Clone() {
+      return new MapPokemon(this);
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 1;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 2;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 3;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "expiration_timestamp_ms" field.</summary>
+    public const int ExpirationTimestampMsFieldNumber = 4;
+    private long expirationTimestampMs_;
+    /// <summary>
+    ///  After this timestamp, the pokemon will be gone.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long ExpirationTimestampMs {
+      get { return expirationTimestampMs_; }
+      set {
+        expirationTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 5;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 6;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MapPokemon);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MapPokemon other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (ExpirationTimestampMs != other.ExpirationTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (ExpirationTimestampMs != 0L) hash ^= ExpirationTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(SpawnPointId);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(EncounterId);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        output.WriteRawTag(32);
+        output.WriteInt64(ExpirationTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (ExpirationTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpirationTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MapPokemon other) {
+      if (other == null) {
+        return;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.ExpirationTimestampMs != 0L) {
+        ExpirationTimestampMs = other.ExpirationTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 17: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 24: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 32: {
+            ExpirationTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 41: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 49: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class NearbyPokemon : pb::IMessage<NearbyPokemon> {
+    private static readonly pb::MessageParser<NearbyPokemon> _parser = new pb::MessageParser<NearbyPokemon>(() => new NearbyPokemon());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<NearbyPokemon> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Pokemon.POGOProtosMapPokemonReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NearbyPokemon() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NearbyPokemon(NearbyPokemon other) : this() {
+      pokemonId_ = other.pokemonId_;
+      distanceInMeters_ = other.distanceInMeters_;
+      encounterId_ = other.encounterId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NearbyPokemon Clone() {
+      return new NearbyPokemon(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "distance_in_meters" field.</summary>
+    public const int DistanceInMetersFieldNumber = 2;
+    private float distanceInMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DistanceInMeters {
+      get { return distanceInMeters_; }
+      set {
+        distanceInMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 3;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as NearbyPokemon);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(NearbyPokemon other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (DistanceInMeters != other.DistanceInMeters) return false;
+      if (EncounterId != other.EncounterId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (DistanceInMeters != 0F) hash ^= DistanceInMeters.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (DistanceInMeters != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(DistanceInMeters);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(25);
+        output.WriteFixed64(EncounterId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (DistanceInMeters != 0F) {
+        size += 1 + 4;
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(NearbyPokemon other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.DistanceInMeters != 0F) {
+        DistanceInMeters = other.DistanceInMeters;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 21: {
+            DistanceInMeters = input.ReadFloat();
+            break;
+          }
+          case 25: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class WildPokemon : pb::IMessage<WildPokemon> {
+    private static readonly pb::MessageParser<WildPokemon> _parser = new pb::MessageParser<WildPokemon>(() => new WildPokemon());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<WildPokemon> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Pokemon.POGOProtosMapPokemonReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public WildPokemon() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public WildPokemon(WildPokemon other) : this() {
+      encounterId_ = other.encounterId_;
+      lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      spawnPointId_ = other.spawnPointId_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      timeTillHiddenMs_ = other.timeTillHiddenMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public WildPokemon Clone() {
+      return new WildPokemon(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
+    public const int LastModifiedTimestampMsFieldNumber = 2;
+    private long lastModifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastModifiedTimestampMs {
+      get { return lastModifiedTimestampMs_; }
+      set {
+        lastModifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 5;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 7;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "time_till_hidden_ms" field.</summary>
+    public const int TimeTillHiddenMsFieldNumber = 11;
+    private int timeTillHiddenMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TimeTillHiddenMs {
+      get { return timeTillHiddenMs_; }
+      set {
+        timeTillHiddenMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as WildPokemon);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(WildPokemon other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (TimeTillHiddenMs != other.TimeTillHiddenMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (TimeTillHiddenMs != 0) hash ^= TimeTillHiddenMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(EncounterId);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(42);
+        output.WriteString(SpawnPointId);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(PokemonData);
+      }
+      if (TimeTillHiddenMs != 0) {
+        output.WriteRawTag(88);
+        output.WriteInt32(TimeTillHiddenMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (TimeTillHiddenMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimeTillHiddenMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(WildPokemon other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.LastModifiedTimestampMs != 0L) {
+        LastModifiedTimestampMs = other.LastModifiedTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.TimeTillHiddenMs != 0) {
+        TimeTillHiddenMs = other.TimeTillHiddenMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 16: {
+            LastModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 42: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 58: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 88: {
+            TimeTillHiddenMs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/Pokemon/WildPokemon.cs b/PokemonGo/POGOProtos/Map/Pokemon/WildPokemon.cs
new file mode 100644
index 0000000..beab772
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/Pokemon/WildPokemon.cs
@@ -0,0 +1,338 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/Pokemon/WildPokemon.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/Pokemon/WildPokemon.proto</summary>
+  public static partial class WildPokemonReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/Pokemon/WildPokemon.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static WildPokemonReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL01hcC9Qb2tlbW9uL1dpbGRQb2tlbW9uLnByb3RvEhZQ",
+            "T0dPUHJvdG9zLk1hcC5Qb2tlbW9uGiFQT0dPUHJvdG9zL0RhdGEvUG9rZW1v",
+            "bkRhdGEucHJvdG8i1QEKC1dpbGRQb2tlbW9uEhQKDGVuY291bnRlcl9pZBgB",
+            "IAEoBhIiChpsYXN0X21vZGlmaWVkX3RpbWVzdGFtcF9tcxgCIAEoAxIQCghs",
+            "YXRpdHVkZRgDIAEoARIRCglsb25naXR1ZGUYBCABKAESFgoOc3Bhd25fcG9p",
+            "bnRfaWQYBSABKAkSMgoMcG9rZW1vbl9kYXRhGAcgASgLMhwuUE9HT1Byb3Rv",
+            "cy5EYXRhLlBva2Vtb25EYXRhEhsKE3RpbWVfdGlsbF9oaWRkZW5fbXMYCyAB",
+            "KAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.Pokemon.WildPokemon), global::POGOProtos.Map.Pokemon.WildPokemon.Parser, new[]{ "EncounterId", "LastModifiedTimestampMs", "Latitude", "Longitude", "SpawnPointId", "PokemonData", "TimeTillHiddenMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class WildPokemon : pb::IMessage<WildPokemon> {
+    private static readonly pb::MessageParser<WildPokemon> _parser = new pb::MessageParser<WildPokemon>(() => new WildPokemon());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<WildPokemon> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.Pokemon.WildPokemonReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public WildPokemon() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public WildPokemon(WildPokemon other) : this() {
+      encounterId_ = other.encounterId_;
+      lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      spawnPointId_ = other.spawnPointId_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      timeTillHiddenMs_ = other.timeTillHiddenMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public WildPokemon Clone() {
+      return new WildPokemon(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
+    public const int LastModifiedTimestampMsFieldNumber = 2;
+    private long lastModifiedTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastModifiedTimestampMs {
+      get { return lastModifiedTimestampMs_; }
+      set {
+        lastModifiedTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 5;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 7;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "time_till_hidden_ms" field.</summary>
+    public const int TimeTillHiddenMsFieldNumber = 11;
+    private int timeTillHiddenMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TimeTillHiddenMs {
+      get { return timeTillHiddenMs_; }
+      set {
+        timeTillHiddenMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as WildPokemon);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(WildPokemon other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (TimeTillHiddenMs != other.TimeTillHiddenMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (TimeTillHiddenMs != 0) hash ^= TimeTillHiddenMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(EncounterId);
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(42);
+        output.WriteString(SpawnPointId);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(PokemonData);
+      }
+      if (TimeTillHiddenMs != 0) {
+        output.WriteRawTag(88);
+        output.WriteInt32(TimeTillHiddenMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (LastModifiedTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (TimeTillHiddenMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimeTillHiddenMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(WildPokemon other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.LastModifiedTimestampMs != 0L) {
+        LastModifiedTimestampMs = other.LastModifiedTimestampMs;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.TimeTillHiddenMs != 0) {
+        TimeTillHiddenMs = other.TimeTillHiddenMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 16: {
+            LastModifiedTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 42: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 58: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 88: {
+            TimeTillHiddenMs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Map/SpawnPoint.cs b/PokemonGo/POGOProtos/Map/SpawnPoint.cs
new file mode 100644
index 0000000..9162cb8
--- /dev/null
+++ b/PokemonGo/POGOProtos/Map/SpawnPoint.cs
@@ -0,0 +1,187 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Map/SpawnPoint.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Map {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Map/SpawnPoint.proto</summary>
+  public static partial class SpawnPointReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Map/SpawnPoint.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SpawnPointReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch9QT0dPUHJvdG9zL01hcC9TcGF3blBvaW50LnByb3RvEg5QT0dPUHJvdG9z",
+            "Lk1hcCIxCgpTcGF3blBvaW50EhAKCGxhdGl0dWRlGAIgASgBEhEKCWxvbmdp",
+            "dHVkZRgDIAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Map.SpawnPoint), global::POGOProtos.Map.SpawnPoint.Parser, new[]{ "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SpawnPoint : pb::IMessage<SpawnPoint> {
+    private static readonly pb::MessageParser<SpawnPoint> _parser = new pb::MessageParser<SpawnPoint>(() => new SpawnPoint());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SpawnPoint> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Map.SpawnPointReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SpawnPoint() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SpawnPoint(SpawnPoint other) : this() {
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SpawnPoint Clone() {
+      return new SpawnPoint(this);
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 2;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 3;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SpawnPoint);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SpawnPoint other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Latitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SpawnPoint other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 17: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Envelopes/AuthTicket.cs b/PokemonGo/POGOProtos/Networking/Envelopes/AuthTicket.cs
new file mode 100644
index 0000000..517b864
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Envelopes/AuthTicket.cs
@@ -0,0 +1,216 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Envelopes/AuthTicket.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Envelopes {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Envelopes/AuthTicket.proto</summary>
+  public static partial class AuthTicketReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Envelopes/AuthTicket.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AuthTicketReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjBQT0dPUHJvdG9zL05ldHdvcmtpbmcvRW52ZWxvcGVzL0F1dGhUaWNrZXQu",
+            "cHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMiRQoKQXV0",
+            "aFRpY2tldBINCgVzdGFydBgBIAEoDBIbChNleHBpcmVfdGltZXN0YW1wX21z",
+            "GAIgASgEEgsKA2VuZBgDIAEoDGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.AuthTicket), global::POGOProtos.Networking.Envelopes.AuthTicket.Parser, new[]{ "Start", "ExpireTimestampMs", "End" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AuthTicket : pb::IMessage<AuthTicket> {
+    private static readonly pb::MessageParser<AuthTicket> _parser = new pb::MessageParser<AuthTicket>(() => new AuthTicket());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AuthTicket> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.AuthTicketReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AuthTicket() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AuthTicket(AuthTicket other) : this() {
+      start_ = other.start_;
+      expireTimestampMs_ = other.expireTimestampMs_;
+      end_ = other.end_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AuthTicket Clone() {
+      return new AuthTicket(this);
+    }
+
+    /// <summary>Field number for the "start" field.</summary>
+    public const int StartFieldNumber = 1;
+    private pb::ByteString start_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString Start {
+      get { return start_; }
+      set {
+        start_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "expire_timestamp_ms" field.</summary>
+    public const int ExpireTimestampMsFieldNumber = 2;
+    private ulong expireTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong ExpireTimestampMs {
+      get { return expireTimestampMs_; }
+      set {
+        expireTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "end" field.</summary>
+    public const int EndFieldNumber = 3;
+    private pb::ByteString end_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString End {
+      get { return end_; }
+      set {
+        end_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AuthTicket);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AuthTicket other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Start != other.Start) return false;
+      if (ExpireTimestampMs != other.ExpireTimestampMs) return false;
+      if (End != other.End) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Start.Length != 0) hash ^= Start.GetHashCode();
+      if (ExpireTimestampMs != 0UL) hash ^= ExpireTimestampMs.GetHashCode();
+      if (End.Length != 0) hash ^= End.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Start.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteBytes(Start);
+      }
+      if (ExpireTimestampMs != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(ExpireTimestampMs);
+      }
+      if (End.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteBytes(End);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Start.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Start);
+      }
+      if (ExpireTimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(ExpireTimestampMs);
+      }
+      if (End.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(End);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AuthTicket other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Start.Length != 0) {
+        Start = other.Start;
+      }
+      if (other.ExpireTimestampMs != 0UL) {
+        ExpireTimestampMs = other.ExpireTimestampMs;
+      }
+      if (other.End.Length != 0) {
+        End = other.End;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Start = input.ReadBytes();
+            break;
+          }
+          case 16: {
+            ExpireTimestampMs = input.ReadUInt64();
+            break;
+          }
+          case 26: {
+            End = input.ReadBytes();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Envelopes/POGOProtosNetworkingEnvelopes.cs b/PokemonGo/POGOProtos/Networking/Envelopes/POGOProtosNetworkingEnvelopes.cs
new file mode 100644
index 0000000..bad1355
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Envelopes/POGOProtosNetworkingEnvelopes.cs
@@ -0,0 +1,2504 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Networking.Envelopes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Envelopes {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Networking.Envelopes.proto</summary>
+  public static partial class POGOProtosNetworkingEnvelopesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Networking.Envelopes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosNetworkingEnvelopesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzLnByb3RvEh9QT0dP",
+            "UHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzGiRQT0dPUHJvdG9zLk5ldHdv",
+            "cmtpbmcuUmVxdWVzdHMucHJvdG8aHFBPR09Qcm90b3MuRGF0YS5QbGF5ZXIu",
+            "cHJvdG8aH1BPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0ucHJvdG8iRQoKQXV0",
+            "aFRpY2tldBINCgVzdGFydBgBIAEoDBIbChNleHBpcmVfdGltZXN0YW1wX21z",
+            "GAIgASgEEgsKA2VuZBgDIAEoDCKkBAoPUmVxdWVzdEVudmVsb3BlEhMKC3N0",
+            "YXR1c19jb2RlGAEgASgFEhIKCnJlcXVlc3RfaWQYAyABKAQSOQoIcmVxdWVz",
+            "dHMYBCADKAsyJy5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVxdWVzdHMuUmVx",
+            "dWVzdBI7Cgh1bmtub3duNhgGIAMoCzIpLlBPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5FbnZlbG9wZXMuVW5rbm93bjYSEAoIbGF0aXR1ZGUYByABKAESEQoJbG9u",
+            "Z2l0dWRlGAggASgBEhAKCGFsdGl0dWRlGAkgASgBEkwKCWF1dGhfaW5mbxgK",
+            "IAEoCzI5LlBPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMuUmVxdWVz",
+            "dEVudmVsb3BlLkF1dGhJbmZvEkAKC2F1dGhfdGlja2V0GAsgASgLMisuUE9H",
+            "T1Byb3Rvcy5OZXR3b3JraW5nLkVudmVsb3Blcy5BdXRoVGlja2V0EhEKCXVu",
+            "a25vd24xMhgMIAEoAxqVAQoIQXV0aEluZm8SEAoIcHJvdmlkZXIYASABKAkS",
+            "TAoFdG9rZW4YAiABKAsyPS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxv",
+            "cGVzLlJlcXVlc3RFbnZlbG9wZS5BdXRoSW5mby5KV1QaKQoDSldUEhAKCGNv",
+            "bnRlbnRzGAEgASgJEhAKCHVua25vd24yGAIgASgFIrgCChBSZXNwb25zZUVu",
+            "dmVsb3BlEhMKC3N0YXR1c19jb2RlGAEgASgFEhIKCnJlcXVlc3RfaWQYAiAB",
+            "KAQSDwoHYXBpX3VybBgDIAEoCRJDCgh1bmtub3duNhgGIAMoCzIxLlBPR09Q",
+            "cm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMuVW5rbm93bjZSZXNwb25zZRJA",
+            "CgthdXRoX3RpY2tldBgHIAEoCzIrLlBPR09Qcm90b3MuTmV0d29ya2luZy5F",
+            "bnZlbG9wZXMuQXV0aFRpY2tldBIPCgdyZXR1cm5zGGQgAygMEg0KBWVycm9y",
+            "GGUgASgJGkMKCFVua25vd243EhEKCXVua25vd243MRgBIAEoDBIRCgl1bmtu",
+            "b3duNzIYAiABKAMSEQoJdW5rbm93bjczGAMgASgMIqYFChBVbmtub3duNlJl",
+            "c3BvbnNlEhUKDXJlc3BvbnNlX3R5cGUYASABKAUSTAoIdW5rbm93bjIYAiAB",
+            "KAsyOi5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzLlVua25vd242",
+            "UmVzcG9uc2UuVW5rbm93bjIarAQKCFVua25vd24yEhAKCHVua25vd24xGAEg",
+            "ASgEElMKBWl0ZW1zGAIgAygLMkQuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLkVu",
+            "dmVsb3Blcy5Vbmtub3duNlJlc3BvbnNlLlVua25vd24yLlN0b3JlSXRlbRI7",
+            "ChFwbGF5ZXJfY3VycmVuY2llcxgDIAMoCzIgLlBPR09Qcm90b3MuRGF0YS5Q",
+            "bGF5ZXIuQ3VycmVuY3kSEAoIdW5rbm93bjQYBCABKAka6QIKCVN0b3JlSXRl",
+            "bRIPCgdpdGVtX2lkGAEgASgJEg4KBmlzX2lhcBgCIAEoCBI5Cg9jdXJyZW5j",
+            "eV90b19idXkYAyABKAsyIC5QT0dPUHJvdG9zLkRhdGEuUGxheWVyLkN1cnJl",
+            "bmN5EjkKD3lpZWxkc19jdXJyZW5jeRgEIAEoCzIgLlBPR09Qcm90b3MuRGF0",
+            "YS5QbGF5ZXIuQ3VycmVuY3kSOAoLeWllbGRzX2l0ZW0YBSABKAsyIy5QT0dP",
+            "UHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1EYXRhElYKBHRhZ3MYBiADKAsy",
+            "SC5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzLlVua25vd242UmVz",
+            "cG9uc2UuVW5rbm93bjIuU3RvcmVJdGVtLlRhZxIQCgh1bmtub3duNxgHIAEo",
+            "BRohCgNUYWcSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIoQBCghVbmtu",
+            "b3duNhIUCgxyZXF1ZXN0X3R5cGUYASABKAUSRAoIdW5rbm93bjIYAiABKAsy",
+            "Mi5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzLlVua25vd242LlVu",
+            "a25vd24yGhwKCFVua25vd24yEhAKCHVua25vd24xGAEgASgMUABQAVACYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Networking.Requests.POGOProtosNetworkingRequestsReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.AuthTicket), global::POGOProtos.Networking.Envelopes.AuthTicket.Parser, new[]{ "Start", "ExpireTimestampMs", "End" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.RequestEnvelope), global::POGOProtos.Networking.Envelopes.RequestEnvelope.Parser, new[]{ "StatusCode", "RequestId", "Requests", "Unknown6", "Latitude", "Longitude", "Altitude", "AuthInfo", "AuthTicket", "Unknown12" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo), global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Parser, new[]{ "Provider", "Token" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT), global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT.Parser, new[]{ "Contents", "Unknown2" }, null, null, null)})}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.ResponseEnvelope), global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Parser, new[]{ "StatusCode", "RequestId", "ApiUrl", "Unknown6", "AuthTicket", "Returns", "Error" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Types.Unknown7), global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Types.Unknown7.Parser, new[]{ "Unknown71", "Unknown72", "Unknown73" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response), global::POGOProtos.Networking.Envelopes.Unknown6Response.Parser, new[]{ "ResponseType", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2), global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Parser, new[]{ "Unknown1", "Items", "PlayerCurrencies", "Unknown4" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem), global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Parser, new[]{ "ItemId", "IsIap", "CurrencyToBuy", "YieldsCurrency", "YieldsItem", "Tags", "Unknown7" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag), global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag.Parser, new[]{ "Key", "Value" }, null, null, null)})})}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6), global::POGOProtos.Networking.Envelopes.Unknown6.Parser, new[]{ "RequestType", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2), global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2.Parser, new[]{ "Unknown1" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AuthTicket : pb::IMessage<AuthTicket> {
+    private static readonly pb::MessageParser<AuthTicket> _parser = new pb::MessageParser<AuthTicket>(() => new AuthTicket());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AuthTicket> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.POGOProtosNetworkingEnvelopesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AuthTicket() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AuthTicket(AuthTicket other) : this() {
+      start_ = other.start_;
+      expireTimestampMs_ = other.expireTimestampMs_;
+      end_ = other.end_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AuthTicket Clone() {
+      return new AuthTicket(this);
+    }
+
+    /// <summary>Field number for the "start" field.</summary>
+    public const int StartFieldNumber = 1;
+    private pb::ByteString start_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString Start {
+      get { return start_; }
+      set {
+        start_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "expire_timestamp_ms" field.</summary>
+    public const int ExpireTimestampMsFieldNumber = 2;
+    private ulong expireTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong ExpireTimestampMs {
+      get { return expireTimestampMs_; }
+      set {
+        expireTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "end" field.</summary>
+    public const int EndFieldNumber = 3;
+    private pb::ByteString end_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString End {
+      get { return end_; }
+      set {
+        end_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AuthTicket);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AuthTicket other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Start != other.Start) return false;
+      if (ExpireTimestampMs != other.ExpireTimestampMs) return false;
+      if (End != other.End) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Start.Length != 0) hash ^= Start.GetHashCode();
+      if (ExpireTimestampMs != 0UL) hash ^= ExpireTimestampMs.GetHashCode();
+      if (End.Length != 0) hash ^= End.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Start.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteBytes(Start);
+      }
+      if (ExpireTimestampMs != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(ExpireTimestampMs);
+      }
+      if (End.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteBytes(End);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Start.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Start);
+      }
+      if (ExpireTimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(ExpireTimestampMs);
+      }
+      if (End.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(End);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AuthTicket other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Start.Length != 0) {
+        Start = other.Start;
+      }
+      if (other.ExpireTimestampMs != 0UL) {
+        ExpireTimestampMs = other.ExpireTimestampMs;
+      }
+      if (other.End.Length != 0) {
+        End = other.End;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Start = input.ReadBytes();
+            break;
+          }
+          case 16: {
+            ExpireTimestampMs = input.ReadUInt64();
+            break;
+          }
+          case 26: {
+            End = input.ReadBytes();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class RequestEnvelope : pb::IMessage<RequestEnvelope> {
+    private static readonly pb::MessageParser<RequestEnvelope> _parser = new pb::MessageParser<RequestEnvelope>(() => new RequestEnvelope());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<RequestEnvelope> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.POGOProtosNetworkingEnvelopesReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RequestEnvelope() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RequestEnvelope(RequestEnvelope other) : this() {
+      statusCode_ = other.statusCode_;
+      requestId_ = other.requestId_;
+      requests_ = other.requests_.Clone();
+      unknown6_ = other.unknown6_.Clone();
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      altitude_ = other.altitude_;
+      AuthInfo = other.authInfo_ != null ? other.AuthInfo.Clone() : null;
+      AuthTicket = other.authTicket_ != null ? other.AuthTicket.Clone() : null;
+      unknown12_ = other.unknown12_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RequestEnvelope Clone() {
+      return new RequestEnvelope(this);
+    }
+
+    /// <summary>Field number for the "status_code" field.</summary>
+    public const int StatusCodeFieldNumber = 1;
+    private int statusCode_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StatusCode {
+      get { return statusCode_; }
+      set {
+        statusCode_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_id" field.</summary>
+    public const int RequestIdFieldNumber = 3;
+    private ulong requestId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong RequestId {
+      get { return requestId_; }
+      set {
+        requestId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "requests" field.</summary>
+    public const int RequestsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Requests.Request> _repeated_requests_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Networking.Requests.Request.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Requests.Request> requests_ = new pbc::RepeatedField<global::POGOProtos.Networking.Requests.Request>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Requests.Request> Requests {
+      get { return requests_; }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6> _repeated_unknown6_codec
+        = pb::FieldCodec.ForMessage(50, global::POGOProtos.Networking.Envelopes.Unknown6.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6> unknown6_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6> Unknown6 {
+      get { return unknown6_; }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 7;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 8;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "altitude" field.</summary>
+    public const int AltitudeFieldNumber = 9;
+    private double altitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Altitude {
+      get { return altitude_; }
+      set {
+        altitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "auth_info" field.</summary>
+    public const int AuthInfoFieldNumber = 10;
+    private global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo authInfo_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo AuthInfo {
+      get { return authInfo_; }
+      set {
+        authInfo_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "auth_ticket" field.</summary>
+    public const int AuthTicketFieldNumber = 11;
+    private global::POGOProtos.Networking.Envelopes.AuthTicket authTicket_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.AuthTicket AuthTicket {
+      get { return authTicket_; }
+      set {
+        authTicket_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown12" field.</summary>
+    public const int Unknown12FieldNumber = 12;
+    private long unknown12_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long Unknown12 {
+      get { return unknown12_; }
+      set {
+        unknown12_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as RequestEnvelope);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(RequestEnvelope other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StatusCode != other.StatusCode) return false;
+      if (RequestId != other.RequestId) return false;
+      if(!requests_.Equals(other.requests_)) return false;
+      if(!unknown6_.Equals(other.unknown6_)) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (Altitude != other.Altitude) return false;
+      if (!object.Equals(AuthInfo, other.AuthInfo)) return false;
+      if (!object.Equals(AuthTicket, other.AuthTicket)) return false;
+      if (Unknown12 != other.Unknown12) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StatusCode != 0) hash ^= StatusCode.GetHashCode();
+      if (RequestId != 0UL) hash ^= RequestId.GetHashCode();
+      hash ^= requests_.GetHashCode();
+      hash ^= unknown6_.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (Altitude != 0D) hash ^= Altitude.GetHashCode();
+      if (authInfo_ != null) hash ^= AuthInfo.GetHashCode();
+      if (authTicket_ != null) hash ^= AuthTicket.GetHashCode();
+      if (Unknown12 != 0L) hash ^= Unknown12.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StatusCode != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        output.WriteRawTag(24);
+        output.WriteUInt64(RequestId);
+      }
+      requests_.WriteTo(output, _repeated_requests_codec);
+      unknown6_.WriteTo(output, _repeated_unknown6_codec);
+      if (Latitude != 0D) {
+        output.WriteRawTag(57);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(65);
+        output.WriteDouble(Longitude);
+      }
+      if (Altitude != 0D) {
+        output.WriteRawTag(73);
+        output.WriteDouble(Altitude);
+      }
+      if (authInfo_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(AuthInfo);
+      }
+      if (authTicket_ != null) {
+        output.WriteRawTag(90);
+        output.WriteMessage(AuthTicket);
+      }
+      if (Unknown12 != 0L) {
+        output.WriteRawTag(96);
+        output.WriteInt64(Unknown12);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StatusCode != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(RequestId);
+      }
+      size += requests_.CalculateSize(_repeated_requests_codec);
+      size += unknown6_.CalculateSize(_repeated_unknown6_codec);
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Altitude != 0D) {
+        size += 1 + 8;
+      }
+      if (authInfo_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AuthInfo);
+      }
+      if (authTicket_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AuthTicket);
+      }
+      if (Unknown12 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown12);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(RequestEnvelope other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StatusCode != 0) {
+        StatusCode = other.StatusCode;
+      }
+      if (other.RequestId != 0UL) {
+        RequestId = other.RequestId;
+      }
+      requests_.Add(other.requests_);
+      unknown6_.Add(other.unknown6_);
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.Altitude != 0D) {
+        Altitude = other.Altitude;
+      }
+      if (other.authInfo_ != null) {
+        if (authInfo_ == null) {
+          authInfo_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo();
+        }
+        AuthInfo.MergeFrom(other.AuthInfo);
+      }
+      if (other.authTicket_ != null) {
+        if (authTicket_ == null) {
+          authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+        }
+        AuthTicket.MergeFrom(other.AuthTicket);
+      }
+      if (other.Unknown12 != 0L) {
+        Unknown12 = other.Unknown12;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            StatusCode = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            RequestId = input.ReadUInt64();
+            break;
+          }
+          case 34: {
+            requests_.AddEntriesFrom(input, _repeated_requests_codec);
+            break;
+          }
+          case 50: {
+            unknown6_.AddEntriesFrom(input, _repeated_unknown6_codec);
+            break;
+          }
+          case 57: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 65: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 73: {
+            Altitude = input.ReadDouble();
+            break;
+          }
+          case 82: {
+            if (authInfo_ == null) {
+              authInfo_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo();
+            }
+            input.ReadMessage(authInfo_);
+            break;
+          }
+          case 90: {
+            if (authTicket_ == null) {
+              authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+            }
+            input.ReadMessage(authTicket_);
+            break;
+          }
+          case 96: {
+            Unknown12 = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the RequestEnvelope message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class AuthInfo : pb::IMessage<AuthInfo> {
+        private static readonly pb::MessageParser<AuthInfo> _parser = new pb::MessageParser<AuthInfo>(() => new AuthInfo());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<AuthInfo> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.RequestEnvelope.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public AuthInfo() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public AuthInfo(AuthInfo other) : this() {
+          provider_ = other.provider_;
+          Token = other.token_ != null ? other.Token.Clone() : null;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public AuthInfo Clone() {
+          return new AuthInfo(this);
+        }
+
+        /// <summary>Field number for the "provider" field.</summary>
+        public const int ProviderFieldNumber = 1;
+        private string provider_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string Provider {
+          get { return provider_; }
+          set {
+            provider_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "token" field.</summary>
+        public const int TokenFieldNumber = 2;
+        private global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT token_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT Token {
+          get { return token_; }
+          set {
+            token_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as AuthInfo);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(AuthInfo other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Provider != other.Provider) return false;
+          if (!object.Equals(Token, other.Token)) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Provider.Length != 0) hash ^= Provider.GetHashCode();
+          if (token_ != null) hash ^= Token.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Provider.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(Provider);
+          }
+          if (token_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Token);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Provider.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Provider);
+          }
+          if (token_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Token);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(AuthInfo other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Provider.Length != 0) {
+            Provider = other.Provider;
+          }
+          if (other.token_ != null) {
+            if (token_ == null) {
+              token_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT();
+            }
+            Token.MergeFrom(other.Token);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Provider = input.ReadString();
+                break;
+              }
+              case 18: {
+                if (token_ == null) {
+                  token_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT();
+                }
+                input.ReadMessage(token_);
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the AuthInfo message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static partial class Types {
+          public sealed partial class JWT : pb::IMessage<JWT> {
+            private static readonly pb::MessageParser<JWT> _parser = new pb::MessageParser<JWT>(() => new JWT());
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pb::MessageParser<JWT> Parser { get { return _parser; } }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Descriptor.NestedTypes[0]; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public JWT() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public JWT(JWT other) : this() {
+              contents_ = other.contents_;
+              unknown2_ = other.unknown2_;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public JWT Clone() {
+              return new JWT(this);
+            }
+
+            /// <summary>Field number for the "contents" field.</summary>
+            public const int ContentsFieldNumber = 1;
+            private string contents_ = "";
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public string Contents {
+              get { return contents_; }
+              set {
+                contents_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            /// <summary>Field number for the "unknown2" field.</summary>
+            public const int Unknown2FieldNumber = 2;
+            private int unknown2_;
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int Unknown2 {
+              get { return unknown2_; }
+              set {
+                unknown2_ = value;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override bool Equals(object other) {
+              return Equals(other as JWT);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public bool Equals(JWT other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (Contents != other.Contents) return false;
+              if (Unknown2 != other.Unknown2) return false;
+              return true;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override int GetHashCode() {
+              int hash = 1;
+              if (Contents.Length != 0) hash ^= Contents.GetHashCode();
+              if (Unknown2 != 0) hash ^= Unknown2.GetHashCode();
+              return hash;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (Contents.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteString(Contents);
+              }
+              if (Unknown2 != 0) {
+                output.WriteRawTag(16);
+                output.WriteInt32(Unknown2);
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int CalculateSize() {
+              int size = 0;
+              if (Contents.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeStringSize(Contents);
+              }
+              if (Unknown2 != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown2);
+              }
+              return size;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(JWT other) {
+              if (other == null) {
+                return;
+              }
+              if (other.Contents.Length != 0) {
+                Contents = other.Contents;
+              }
+              if (other.Unknown2 != 0) {
+                Unknown2 = other.Unknown2;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    Contents = input.ReadString();
+                    break;
+                  }
+                  case 16: {
+                    Unknown2 = input.ReadInt32();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+        }
+        #endregion
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class ResponseEnvelope : pb::IMessage<ResponseEnvelope> {
+    private static readonly pb::MessageParser<ResponseEnvelope> _parser = new pb::MessageParser<ResponseEnvelope>(() => new ResponseEnvelope());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ResponseEnvelope> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.POGOProtosNetworkingEnvelopesReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ResponseEnvelope() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ResponseEnvelope(ResponseEnvelope other) : this() {
+      statusCode_ = other.statusCode_;
+      requestId_ = other.requestId_;
+      apiUrl_ = other.apiUrl_;
+      unknown6_ = other.unknown6_.Clone();
+      AuthTicket = other.authTicket_ != null ? other.AuthTicket.Clone() : null;
+      returns_ = other.returns_.Clone();
+      error_ = other.error_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ResponseEnvelope Clone() {
+      return new ResponseEnvelope(this);
+    }
+
+    /// <summary>Field number for the "status_code" field.</summary>
+    public const int StatusCodeFieldNumber = 1;
+    private int statusCode_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StatusCode {
+      get { return statusCode_; }
+      set {
+        statusCode_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_id" field.</summary>
+    public const int RequestIdFieldNumber = 2;
+    private ulong requestId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong RequestId {
+      get { return requestId_; }
+      set {
+        requestId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "api_url" field.</summary>
+    public const int ApiUrlFieldNumber = 3;
+    private string apiUrl_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string ApiUrl {
+      get { return apiUrl_; }
+      set {
+        apiUrl_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6Response> _repeated_unknown6_codec
+        = pb::FieldCodec.ForMessage(50, global::POGOProtos.Networking.Envelopes.Unknown6Response.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response> unknown6_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response> Unknown6 {
+      get { return unknown6_; }
+    }
+
+    /// <summary>Field number for the "auth_ticket" field.</summary>
+    public const int AuthTicketFieldNumber = 7;
+    private global::POGOProtos.Networking.Envelopes.AuthTicket authTicket_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.AuthTicket AuthTicket {
+      get { return authTicket_; }
+      set {
+        authTicket_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "returns" field.</summary>
+    public const int ReturnsFieldNumber = 100;
+    private static readonly pb::FieldCodec<pb::ByteString> _repeated_returns_codec
+        = pb::FieldCodec.ForBytes(802);
+    private readonly pbc::RepeatedField<pb::ByteString> returns_ = new pbc::RepeatedField<pb::ByteString>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<pb::ByteString> Returns {
+      get { return returns_; }
+    }
+
+    /// <summary>Field number for the "error" field.</summary>
+    public const int ErrorFieldNumber = 101;
+    private string error_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Error {
+      get { return error_; }
+      set {
+        error_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ResponseEnvelope);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ResponseEnvelope other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StatusCode != other.StatusCode) return false;
+      if (RequestId != other.RequestId) return false;
+      if (ApiUrl != other.ApiUrl) return false;
+      if(!unknown6_.Equals(other.unknown6_)) return false;
+      if (!object.Equals(AuthTicket, other.AuthTicket)) return false;
+      if(!returns_.Equals(other.returns_)) return false;
+      if (Error != other.Error) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StatusCode != 0) hash ^= StatusCode.GetHashCode();
+      if (RequestId != 0UL) hash ^= RequestId.GetHashCode();
+      if (ApiUrl.Length != 0) hash ^= ApiUrl.GetHashCode();
+      hash ^= unknown6_.GetHashCode();
+      if (authTicket_ != null) hash ^= AuthTicket.GetHashCode();
+      hash ^= returns_.GetHashCode();
+      if (Error.Length != 0) hash ^= Error.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StatusCode != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(RequestId);
+      }
+      if (ApiUrl.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(ApiUrl);
+      }
+      unknown6_.WriteTo(output, _repeated_unknown6_codec);
+      if (authTicket_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(AuthTicket);
+      }
+      returns_.WriteTo(output, _repeated_returns_codec);
+      if (Error.Length != 0) {
+        output.WriteRawTag(170, 6);
+        output.WriteString(Error);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StatusCode != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(RequestId);
+      }
+      if (ApiUrl.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ApiUrl);
+      }
+      size += unknown6_.CalculateSize(_repeated_unknown6_codec);
+      if (authTicket_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AuthTicket);
+      }
+      size += returns_.CalculateSize(_repeated_returns_codec);
+      if (Error.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(Error);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ResponseEnvelope other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StatusCode != 0) {
+        StatusCode = other.StatusCode;
+      }
+      if (other.RequestId != 0UL) {
+        RequestId = other.RequestId;
+      }
+      if (other.ApiUrl.Length != 0) {
+        ApiUrl = other.ApiUrl;
+      }
+      unknown6_.Add(other.unknown6_);
+      if (other.authTicket_ != null) {
+        if (authTicket_ == null) {
+          authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+        }
+        AuthTicket.MergeFrom(other.AuthTicket);
+      }
+      returns_.Add(other.returns_);
+      if (other.Error.Length != 0) {
+        Error = other.Error;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            StatusCode = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            RequestId = input.ReadUInt64();
+            break;
+          }
+          case 26: {
+            ApiUrl = input.ReadString();
+            break;
+          }
+          case 50: {
+            unknown6_.AddEntriesFrom(input, _repeated_unknown6_codec);
+            break;
+          }
+          case 58: {
+            if (authTicket_ == null) {
+              authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+            }
+            input.ReadMessage(authTicket_);
+            break;
+          }
+          case 802: {
+            returns_.AddEntriesFrom(input, _repeated_returns_codec);
+            break;
+          }
+          case 810: {
+            Error = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the ResponseEnvelope message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class Unknown7 : pb::IMessage<Unknown7> {
+        private static readonly pb::MessageParser<Unknown7> _parser = new pb::MessageParser<Unknown7>(() => new Unknown7());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown7> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown7() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown7(Unknown7 other) : this() {
+          unknown71_ = other.unknown71_;
+          unknown72_ = other.unknown72_;
+          unknown73_ = other.unknown73_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown7 Clone() {
+          return new Unknown7(this);
+        }
+
+        /// <summary>Field number for the "unknown71" field.</summary>
+        public const int Unknown71FieldNumber = 1;
+        private pb::ByteString unknown71_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unknown71 {
+          get { return unknown71_; }
+          set {
+            unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unknown72" field.</summary>
+        public const int Unknown72FieldNumber = 2;
+        private long unknown72_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public long Unknown72 {
+          get { return unknown72_; }
+          set {
+            unknown72_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown73" field.</summary>
+        public const int Unknown73FieldNumber = 3;
+        private pb::ByteString unknown73_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unknown73 {
+          get { return unknown73_; }
+          set {
+            unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown7);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown7 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown71 != other.Unknown71) return false;
+          if (Unknown72 != other.Unknown72) return false;
+          if (Unknown73 != other.Unknown73) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
+          if (Unknown72 != 0L) hash ^= Unknown72.GetHashCode();
+          if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown71.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            output.WriteRawTag(26);
+            output.WriteBytes(Unknown73);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown71.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown7 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown71.Length != 0) {
+            Unknown71 = other.Unknown71;
+          }
+          if (other.Unknown72 != 0L) {
+            Unknown72 = other.Unknown72;
+          }
+          if (other.Unknown73.Length != 0) {
+            Unknown73 = other.Unknown73;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown71 = input.ReadBytes();
+                break;
+              }
+              case 16: {
+                Unknown72 = input.ReadInt64();
+                break;
+              }
+              case 26: {
+                Unknown73 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class Unknown6Response : pb::IMessage<Unknown6Response> {
+    private static readonly pb::MessageParser<Unknown6Response> _parser = new pb::MessageParser<Unknown6Response>(() => new Unknown6Response());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Unknown6Response> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.POGOProtosNetworkingEnvelopesReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6Response() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6Response(Unknown6Response other) : this() {
+      responseType_ = other.responseType_;
+      Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6Response Clone() {
+      return new Unknown6Response(this);
+    }
+
+    /// <summary>Field number for the "response_type" field.</summary>
+    public const int ResponseTypeFieldNumber = 1;
+    private int responseType_;
+    /// <summary>
+    ///  Still don't know what 6 is, but 5 lists items available via IAPs.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ResponseType {
+      get { return responseType_; }
+      set {
+        responseType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2 unknown2_;
+    /// <summary>
+    ///  Response data
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2 Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Unknown6Response);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Unknown6Response other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ResponseType != other.ResponseType) return false;
+      if (!object.Equals(Unknown2, other.Unknown2)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ResponseType != 0) hash ^= ResponseType.GetHashCode();
+      if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ResponseType != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(ResponseType);
+      }
+      if (unknown2_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ResponseType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ResponseType);
+      }
+      if (unknown2_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Unknown6Response other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ResponseType != 0) {
+        ResponseType = other.ResponseType;
+      }
+      if (other.unknown2_ != null) {
+        if (unknown2_ == null) {
+          unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2();
+        }
+        Unknown2.MergeFrom(other.Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            ResponseType = input.ReadInt32();
+            break;
+          }
+          case 18: {
+            if (unknown2_ == null) {
+              unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2();
+            }
+            input.ReadMessage(unknown2_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the Unknown6Response message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+        private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.Unknown6Response.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2(Unknown2 other) : this() {
+          unknown1_ = other.unknown1_;
+          items_ = other.items_.Clone();
+          playerCurrencies_ = other.playerCurrencies_.Clone();
+          unknown4_ = other.unknown4_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2 Clone() {
+          return new Unknown2(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private ulong unknown1_;
+        /// <summary>
+        ///  Maybe status? It's always 1 (success), so it's probably that.
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "items" field.</summary>
+        public const int ItemsFieldNumber = 2;
+        private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem> _repeated_items_codec
+            = pb::FieldCodec.ForMessage(18, global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Parser);
+        private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem> items_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem>();
+        /// <summary>
+        ///  Items to show in the shop
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem> Items {
+          get { return items_; }
+        }
+
+        /// <summary>Field number for the "player_currencies" field.</summary>
+        public const int PlayerCurrenciesFieldNumber = 3;
+        private static readonly pb::FieldCodec<global::POGOProtos.Data.Player.Currency> _repeated_playerCurrencies_codec
+            = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.Player.Currency.Parser);
+        private readonly pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> playerCurrencies_ = new pbc::RepeatedField<global::POGOProtos.Data.Player.Currency>();
+        /// <summary>
+        ///  currencies that player has at the moment
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> PlayerCurrencies {
+          get { return playerCurrencies_; }
+        }
+
+        /// <summary>Field number for the "unknown4" field.</summary>
+        public const int Unknown4FieldNumber = 4;
+        private string unknown4_ = "";
+        /// <summary>
+        ///  Some base64 encoded stuff...
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string Unknown4 {
+          get { return unknown4_; }
+          set {
+            unknown4_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown2);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown2 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          if(!items_.Equals(other.items_)) return false;
+          if(!playerCurrencies_.Equals(other.playerCurrencies_)) return false;
+          if (Unknown4 != other.Unknown4) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1 != 0UL) hash ^= Unknown1.GetHashCode();
+          hash ^= items_.GetHashCode();
+          hash ^= playerCurrencies_.GetHashCode();
+          if (Unknown4.Length != 0) hash ^= Unknown4.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1 != 0UL) {
+            output.WriteRawTag(8);
+            output.WriteUInt64(Unknown1);
+          }
+          items_.WriteTo(output, _repeated_items_codec);
+          playerCurrencies_.WriteTo(output, _repeated_playerCurrencies_codec);
+          if (Unknown4.Length != 0) {
+            output.WriteRawTag(34);
+            output.WriteString(Unknown4);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unknown1);
+          }
+          size += items_.CalculateSize(_repeated_items_codec);
+          size += playerCurrencies_.CalculateSize(_repeated_playerCurrencies_codec);
+          if (Unknown4.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Unknown4);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown2 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1 != 0UL) {
+            Unknown1 = other.Unknown1;
+          }
+          items_.Add(other.items_);
+          playerCurrencies_.Add(other.playerCurrencies_);
+          if (other.Unknown4.Length != 0) {
+            Unknown4 = other.Unknown4;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Unknown1 = input.ReadUInt64();
+                break;
+              }
+              case 18: {
+                items_.AddEntriesFrom(input, _repeated_items_codec);
+                break;
+              }
+              case 26: {
+                playerCurrencies_.AddEntriesFrom(input, _repeated_playerCurrencies_codec);
+                break;
+              }
+              case 34: {
+                Unknown4 = input.ReadString();
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Unknown2 message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static partial class Types {
+          public sealed partial class StoreItem : pb::IMessage<StoreItem> {
+            private static readonly pb::MessageParser<StoreItem> _parser = new pb::MessageParser<StoreItem>(() => new StoreItem());
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pb::MessageParser<StoreItem> Parser { get { return _parser; } }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Descriptor.NestedTypes[0]; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public StoreItem() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public StoreItem(StoreItem other) : this() {
+              itemId_ = other.itemId_;
+              isIap_ = other.isIap_;
+              CurrencyToBuy = other.currencyToBuy_ != null ? other.CurrencyToBuy.Clone() : null;
+              YieldsCurrency = other.yieldsCurrency_ != null ? other.YieldsCurrency.Clone() : null;
+              YieldsItem = other.yieldsItem_ != null ? other.YieldsItem.Clone() : null;
+              tags_ = other.tags_.Clone();
+              unknown7_ = other.unknown7_;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public StoreItem Clone() {
+              return new StoreItem(this);
+            }
+
+            /// <summary>Field number for the "item_id" field.</summary>
+            public const int ItemIdFieldNumber = 1;
+            private string itemId_ = "";
+            /// <summary>
+            ///  Internal ID (probably for Google Play/App Store) example: "pgorelease.incenseordinary.1"
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public string ItemId {
+              get { return itemId_; }
+              set {
+                itemId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            /// <summary>Field number for the "is_iap" field.</summary>
+            public const int IsIapFieldNumber = 2;
+            private bool isIap_;
+            /// <summary>
+            ///  If true, this item is bought with real currency (USD, etc.) through the Play/App Store instead of Pokecoins
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public bool IsIap {
+              get { return isIap_; }
+              set {
+                isIap_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "currency_to_buy" field.</summary>
+            public const int CurrencyToBuyFieldNumber = 3;
+            private global::POGOProtos.Data.Player.Currency currencyToBuy_;
+            /// <summary>
+            ///  This defines how much the item costs (with the exception of items that cost real money like Pokecoins, that's defined in the respective store)
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public global::POGOProtos.Data.Player.Currency CurrencyToBuy {
+              get { return currencyToBuy_; }
+              set {
+                currencyToBuy_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "yields_currency" field.</summary>
+            public const int YieldsCurrencyFieldNumber = 4;
+            private global::POGOProtos.Data.Player.Currency yieldsCurrency_;
+            /// <summary>
+            ///  When bought, this IAP will yield this much currency
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public global::POGOProtos.Data.Player.Currency YieldsCurrency {
+              get { return yieldsCurrency_; }
+              set {
+                yieldsCurrency_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "yields_item" field.</summary>
+            public const int YieldsItemFieldNumber = 5;
+            private global::POGOProtos.Inventory.Item.ItemData yieldsItem_;
+            /// <summary>
+            ///  The item and count of such item that this IAP will yield
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public global::POGOProtos.Inventory.Item.ItemData YieldsItem {
+              get { return yieldsItem_; }
+              set {
+                yieldsItem_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "tags" field.</summary>
+            public const int TagsFieldNumber = 6;
+            private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag> _repeated_tags_codec
+                = pb::FieldCodec.ForMessage(50, global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag.Parser);
+            private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag> tags_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag>();
+            /// <summary>
+            ///  Stuff like SORT:12, CATEGORY:ITEMS
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag> Tags {
+              get { return tags_; }
+            }
+
+            /// <summary>Field number for the "unknown7" field.</summary>
+            public const int Unknown7FieldNumber = 7;
+            private int unknown7_;
+            /// <summary>
+            ///  Possibly something to toggle visibility in the store/purchasibility?
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int Unknown7 {
+              get { return unknown7_; }
+              set {
+                unknown7_ = value;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override bool Equals(object other) {
+              return Equals(other as StoreItem);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public bool Equals(StoreItem other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (ItemId != other.ItemId) return false;
+              if (IsIap != other.IsIap) return false;
+              if (!object.Equals(CurrencyToBuy, other.CurrencyToBuy)) return false;
+              if (!object.Equals(YieldsCurrency, other.YieldsCurrency)) return false;
+              if (!object.Equals(YieldsItem, other.YieldsItem)) return false;
+              if(!tags_.Equals(other.tags_)) return false;
+              if (Unknown7 != other.Unknown7) return false;
+              return true;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override int GetHashCode() {
+              int hash = 1;
+              if (ItemId.Length != 0) hash ^= ItemId.GetHashCode();
+              if (IsIap != false) hash ^= IsIap.GetHashCode();
+              if (currencyToBuy_ != null) hash ^= CurrencyToBuy.GetHashCode();
+              if (yieldsCurrency_ != null) hash ^= YieldsCurrency.GetHashCode();
+              if (yieldsItem_ != null) hash ^= YieldsItem.GetHashCode();
+              hash ^= tags_.GetHashCode();
+              if (Unknown7 != 0) hash ^= Unknown7.GetHashCode();
+              return hash;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (ItemId.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteString(ItemId);
+              }
+              if (IsIap != false) {
+                output.WriteRawTag(16);
+                output.WriteBool(IsIap);
+              }
+              if (currencyToBuy_ != null) {
+                output.WriteRawTag(26);
+                output.WriteMessage(CurrencyToBuy);
+              }
+              if (yieldsCurrency_ != null) {
+                output.WriteRawTag(34);
+                output.WriteMessage(YieldsCurrency);
+              }
+              if (yieldsItem_ != null) {
+                output.WriteRawTag(42);
+                output.WriteMessage(YieldsItem);
+              }
+              tags_.WriteTo(output, _repeated_tags_codec);
+              if (Unknown7 != 0) {
+                output.WriteRawTag(56);
+                output.WriteInt32(Unknown7);
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int CalculateSize() {
+              int size = 0;
+              if (ItemId.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeStringSize(ItemId);
+              }
+              if (IsIap != false) {
+                size += 1 + 1;
+              }
+              if (currencyToBuy_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(CurrencyToBuy);
+              }
+              if (yieldsCurrency_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(YieldsCurrency);
+              }
+              if (yieldsItem_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(YieldsItem);
+              }
+              size += tags_.CalculateSize(_repeated_tags_codec);
+              if (Unknown7 != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown7);
+              }
+              return size;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(StoreItem other) {
+              if (other == null) {
+                return;
+              }
+              if (other.ItemId.Length != 0) {
+                ItemId = other.ItemId;
+              }
+              if (other.IsIap != false) {
+                IsIap = other.IsIap;
+              }
+              if (other.currencyToBuy_ != null) {
+                if (currencyToBuy_ == null) {
+                  currencyToBuy_ = new global::POGOProtos.Data.Player.Currency();
+                }
+                CurrencyToBuy.MergeFrom(other.CurrencyToBuy);
+              }
+              if (other.yieldsCurrency_ != null) {
+                if (yieldsCurrency_ == null) {
+                  yieldsCurrency_ = new global::POGOProtos.Data.Player.Currency();
+                }
+                YieldsCurrency.MergeFrom(other.YieldsCurrency);
+              }
+              if (other.yieldsItem_ != null) {
+                if (yieldsItem_ == null) {
+                  yieldsItem_ = new global::POGOProtos.Inventory.Item.ItemData();
+                }
+                YieldsItem.MergeFrom(other.YieldsItem);
+              }
+              tags_.Add(other.tags_);
+              if (other.Unknown7 != 0) {
+                Unknown7 = other.Unknown7;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    ItemId = input.ReadString();
+                    break;
+                  }
+                  case 16: {
+                    IsIap = input.ReadBool();
+                    break;
+                  }
+                  case 26: {
+                    if (currencyToBuy_ == null) {
+                      currencyToBuy_ = new global::POGOProtos.Data.Player.Currency();
+                    }
+                    input.ReadMessage(currencyToBuy_);
+                    break;
+                  }
+                  case 34: {
+                    if (yieldsCurrency_ == null) {
+                      yieldsCurrency_ = new global::POGOProtos.Data.Player.Currency();
+                    }
+                    input.ReadMessage(yieldsCurrency_);
+                    break;
+                  }
+                  case 42: {
+                    if (yieldsItem_ == null) {
+                      yieldsItem_ = new global::POGOProtos.Inventory.Item.ItemData();
+                    }
+                    input.ReadMessage(yieldsItem_);
+                    break;
+                  }
+                  case 50: {
+                    tags_.AddEntriesFrom(input, _repeated_tags_codec);
+                    break;
+                  }
+                  case 56: {
+                    Unknown7 = input.ReadInt32();
+                    break;
+                  }
+                }
+              }
+            }
+
+            #region Nested types
+            /// <summary>Container for nested types declared in the StoreItem message type.</summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static partial class Types {
+              public sealed partial class Tag : pb::IMessage<Tag> {
+                private static readonly pb::MessageParser<Tag> _parser = new pb::MessageParser<Tag>(() => new Tag());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<Tag> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor {
+                  get { return global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Descriptor.NestedTypes[0]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor {
+                  get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public Tag() {
+                  OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public Tag(Tag other) : this() {
+                  key_ = other.key_;
+                  value_ = other.value_;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public Tag Clone() {
+                  return new Tag(this);
+                }
+
+                /// <summary>Field number for the "key" field.</summary>
+                public const int KeyFieldNumber = 1;
+                private string key_ = "";
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string Key {
+                  get { return key_; }
+                  set {
+                    key_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                  }
+                }
+
+                /// <summary>Field number for the "value" field.</summary>
+                public const int ValueFieldNumber = 2;
+                private string value_ = "";
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string Value {
+                  get { return value_; }
+                  set {
+                    value_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                  }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other) {
+                  return Equals(other as Tag);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(Tag other) {
+                  if (ReferenceEquals(other, null)) {
+                    return false;
+                  }
+                  if (ReferenceEquals(other, this)) {
+                    return true;
+                  }
+                  if (Key != other.Key) return false;
+                  if (Value != other.Value) return false;
+                  return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode() {
+                  int hash = 1;
+                  if (Key.Length != 0) hash ^= Key.GetHashCode();
+                  if (Value.Length != 0) hash ^= Value.GetHashCode();
+                  return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString() {
+                  return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output) {
+                  if (Key.Length != 0) {
+                    output.WriteRawTag(10);
+                    output.WriteString(Key);
+                  }
+                  if (Value.Length != 0) {
+                    output.WriteRawTag(18);
+                    output.WriteString(Value);
+                  }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize() {
+                  int size = 0;
+                  if (Key.Length != 0) {
+                    size += 1 + pb::CodedOutputStream.ComputeStringSize(Key);
+                  }
+                  if (Value.Length != 0) {
+                    size += 1 + pb::CodedOutputStream.ComputeStringSize(Value);
+                  }
+                  return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(Tag other) {
+                  if (other == null) {
+                    return;
+                  }
+                  if (other.Key.Length != 0) {
+                    Key = other.Key;
+                  }
+                  if (other.Value.Length != 0) {
+                    Value = other.Value;
+                  }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input) {
+                  uint tag;
+                  while ((tag = input.ReadTag()) != 0) {
+                    switch(tag) {
+                      default:
+                        input.SkipLastField();
+                        break;
+                      case 10: {
+                        Key = input.ReadString();
+                        break;
+                      }
+                      case 18: {
+                        Value = input.ReadString();
+                        break;
+                      }
+                    }
+                  }
+                }
+
+              }
+
+            }
+            #endregion
+
+          }
+
+        }
+        #endregion
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class Unknown6 : pb::IMessage<Unknown6> {
+    private static readonly pb::MessageParser<Unknown6> _parser = new pb::MessageParser<Unknown6>(() => new Unknown6());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Unknown6> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.POGOProtosNetworkingEnvelopesReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6(Unknown6 other) : this() {
+      requestType_ = other.requestType_;
+      Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6 Clone() {
+      return new Unknown6(this);
+    }
+
+    /// <summary>Field number for the "request_type" field.</summary>
+    public const int RequestTypeFieldNumber = 1;
+    private int requestType_;
+    /// <summary>
+    ///  5 for IAPs, 6 is unknown still
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int RequestType {
+      get { return requestType_; }
+      set {
+        requestType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2 unknown2_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2 Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Unknown6);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Unknown6 other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (RequestType != other.RequestType) return false;
+      if (!object.Equals(Unknown2, other.Unknown2)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (RequestType != 0) hash ^= RequestType.GetHashCode();
+      if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (RequestType != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(RequestType);
+      }
+      if (unknown2_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (RequestType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(RequestType);
+      }
+      if (unknown2_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Unknown6 other) {
+      if (other == null) {
+        return;
+      }
+      if (other.RequestType != 0) {
+        RequestType = other.RequestType;
+      }
+      if (other.unknown2_ != null) {
+        if (unknown2_ == null) {
+          unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2();
+        }
+        Unknown2.MergeFrom(other.Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            RequestType = input.ReadInt32();
+            break;
+          }
+          case 18: {
+            if (unknown2_ == null) {
+              unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2();
+            }
+            input.ReadMessage(unknown2_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+        private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.Unknown6.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2(Unknown2 other) : this() {
+          unknown1_ = other.unknown1_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2 Clone() {
+          return new Unknown2(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private pb::ByteString unknown1_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown2);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown2 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown1);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown2 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1.Length != 0) {
+            Unknown1 = other.Unknown1;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown1 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Envelopes/RequestEnvelope.cs b/PokemonGo/POGOProtos/Networking/Envelopes/RequestEnvelope.cs
new file mode 100644
index 0000000..cfde21b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Envelopes/RequestEnvelope.cs
@@ -0,0 +1,732 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Envelopes/RequestEnvelope.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Envelopes {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Envelopes/RequestEnvelope.proto</summary>
+  public static partial class RequestEnvelopeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Envelopes/RequestEnvelope.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static RequestEnvelopeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjVQT0dPUHJvdG9zL05ldHdvcmtpbmcvRW52ZWxvcGVzL1JlcXVlc3RFbnZl",
+            "bG9wZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLkVudmVsb3Blcxos",
+            "UE9HT1Byb3Rvcy9OZXR3b3JraW5nL1JlcXVlc3RzL1JlcXVlc3QucHJvdG8a",
+            "MFBPR09Qcm90b3MvTmV0d29ya2luZy9FbnZlbG9wZXMvQXV0aFRpY2tldC5w",
+            "cm90bxouUE9HT1Byb3Rvcy9OZXR3b3JraW5nL0VudmVsb3Blcy9Vbmtub3du",
+            "Ni5wcm90byKkBAoPUmVxdWVzdEVudmVsb3BlEhMKC3N0YXR1c19jb2RlGAEg",
+            "ASgFEhIKCnJlcXVlc3RfaWQYAyABKAQSOQoIcmVxdWVzdHMYBCADKAsyJy5Q",
+            "T0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVxdWVzdHMuUmVxdWVzdBI7Cgh1bmtu",
+            "b3duNhgGIAMoCzIpLlBPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMu",
+            "VW5rbm93bjYSEAoIbGF0aXR1ZGUYByABKAESEQoJbG9uZ2l0dWRlGAggASgB",
+            "EhAKCGFsdGl0dWRlGAkgASgBEkwKCWF1dGhfaW5mbxgKIAEoCzI5LlBPR09Q",
+            "cm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMuUmVxdWVzdEVudmVsb3BlLkF1",
+            "dGhJbmZvEkAKC2F1dGhfdGlja2V0GAsgASgLMisuUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLkVudmVsb3Blcy5BdXRoVGlja2V0EhEKCXVua25vd24xMhgMIAEo",
+            "AxqVAQoIQXV0aEluZm8SEAoIcHJvdmlkZXIYASABKAkSTAoFdG9rZW4YAiAB",
+            "KAsyPS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzLlJlcXVlc3RF",
+            "bnZlbG9wZS5BdXRoSW5mby5KV1QaKQoDSldUEhAKCGNvbnRlbnRzGAEgASgJ",
+            "EhAKCHVua25vd24yGAIgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Networking.Requests.RequestReflection.Descriptor, global::POGOProtos.Networking.Envelopes.AuthTicketReflection.Descriptor, global::POGOProtos.Networking.Envelopes.Unknown6Reflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.RequestEnvelope), global::POGOProtos.Networking.Envelopes.RequestEnvelope.Parser, new[]{ "StatusCode", "RequestId", "Requests", "Unknown6", "Latitude", "Longitude", "Altitude", "AuthInfo", "AuthTicket", "Unknown12" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo), global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Parser, new[]{ "Provider", "Token" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT), global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT.Parser, new[]{ "Contents", "Unknown2" }, null, null, null)})})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class RequestEnvelope : pb::IMessage<RequestEnvelope> {
+    private static readonly pb::MessageParser<RequestEnvelope> _parser = new pb::MessageParser<RequestEnvelope>(() => new RequestEnvelope());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<RequestEnvelope> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.RequestEnvelopeReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RequestEnvelope() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RequestEnvelope(RequestEnvelope other) : this() {
+      statusCode_ = other.statusCode_;
+      requestId_ = other.requestId_;
+      requests_ = other.requests_.Clone();
+      unknown6_ = other.unknown6_.Clone();
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      altitude_ = other.altitude_;
+      AuthInfo = other.authInfo_ != null ? other.AuthInfo.Clone() : null;
+      AuthTicket = other.authTicket_ != null ? other.AuthTicket.Clone() : null;
+      unknown12_ = other.unknown12_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RequestEnvelope Clone() {
+      return new RequestEnvelope(this);
+    }
+
+    /// <summary>Field number for the "status_code" field.</summary>
+    public const int StatusCodeFieldNumber = 1;
+    private int statusCode_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StatusCode {
+      get { return statusCode_; }
+      set {
+        statusCode_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_id" field.</summary>
+    public const int RequestIdFieldNumber = 3;
+    private ulong requestId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong RequestId {
+      get { return requestId_; }
+      set {
+        requestId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "requests" field.</summary>
+    public const int RequestsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Requests.Request> _repeated_requests_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Networking.Requests.Request.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Requests.Request> requests_ = new pbc::RepeatedField<global::POGOProtos.Networking.Requests.Request>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Requests.Request> Requests {
+      get { return requests_; }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6> _repeated_unknown6_codec
+        = pb::FieldCodec.ForMessage(50, global::POGOProtos.Networking.Envelopes.Unknown6.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6> unknown6_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6> Unknown6 {
+      get { return unknown6_; }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 7;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 8;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "altitude" field.</summary>
+    public const int AltitudeFieldNumber = 9;
+    private double altitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Altitude {
+      get { return altitude_; }
+      set {
+        altitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "auth_info" field.</summary>
+    public const int AuthInfoFieldNumber = 10;
+    private global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo authInfo_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo AuthInfo {
+      get { return authInfo_; }
+      set {
+        authInfo_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "auth_ticket" field.</summary>
+    public const int AuthTicketFieldNumber = 11;
+    private global::POGOProtos.Networking.Envelopes.AuthTicket authTicket_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.AuthTicket AuthTicket {
+      get { return authTicket_; }
+      set {
+        authTicket_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown12" field.</summary>
+    public const int Unknown12FieldNumber = 12;
+    private long unknown12_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long Unknown12 {
+      get { return unknown12_; }
+      set {
+        unknown12_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as RequestEnvelope);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(RequestEnvelope other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StatusCode != other.StatusCode) return false;
+      if (RequestId != other.RequestId) return false;
+      if(!requests_.Equals(other.requests_)) return false;
+      if(!unknown6_.Equals(other.unknown6_)) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (Altitude != other.Altitude) return false;
+      if (!object.Equals(AuthInfo, other.AuthInfo)) return false;
+      if (!object.Equals(AuthTicket, other.AuthTicket)) return false;
+      if (Unknown12 != other.Unknown12) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StatusCode != 0) hash ^= StatusCode.GetHashCode();
+      if (RequestId != 0UL) hash ^= RequestId.GetHashCode();
+      hash ^= requests_.GetHashCode();
+      hash ^= unknown6_.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (Altitude != 0D) hash ^= Altitude.GetHashCode();
+      if (authInfo_ != null) hash ^= AuthInfo.GetHashCode();
+      if (authTicket_ != null) hash ^= AuthTicket.GetHashCode();
+      if (Unknown12 != 0L) hash ^= Unknown12.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StatusCode != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        output.WriteRawTag(24);
+        output.WriteUInt64(RequestId);
+      }
+      requests_.WriteTo(output, _repeated_requests_codec);
+      unknown6_.WriteTo(output, _repeated_unknown6_codec);
+      if (Latitude != 0D) {
+        output.WriteRawTag(57);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(65);
+        output.WriteDouble(Longitude);
+      }
+      if (Altitude != 0D) {
+        output.WriteRawTag(73);
+        output.WriteDouble(Altitude);
+      }
+      if (authInfo_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(AuthInfo);
+      }
+      if (authTicket_ != null) {
+        output.WriteRawTag(90);
+        output.WriteMessage(AuthTicket);
+      }
+      if (Unknown12 != 0L) {
+        output.WriteRawTag(96);
+        output.WriteInt64(Unknown12);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StatusCode != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(RequestId);
+      }
+      size += requests_.CalculateSize(_repeated_requests_codec);
+      size += unknown6_.CalculateSize(_repeated_unknown6_codec);
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Altitude != 0D) {
+        size += 1 + 8;
+      }
+      if (authInfo_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AuthInfo);
+      }
+      if (authTicket_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AuthTicket);
+      }
+      if (Unknown12 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown12);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(RequestEnvelope other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StatusCode != 0) {
+        StatusCode = other.StatusCode;
+      }
+      if (other.RequestId != 0UL) {
+        RequestId = other.RequestId;
+      }
+      requests_.Add(other.requests_);
+      unknown6_.Add(other.unknown6_);
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.Altitude != 0D) {
+        Altitude = other.Altitude;
+      }
+      if (other.authInfo_ != null) {
+        if (authInfo_ == null) {
+          authInfo_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo();
+        }
+        AuthInfo.MergeFrom(other.AuthInfo);
+      }
+      if (other.authTicket_ != null) {
+        if (authTicket_ == null) {
+          authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+        }
+        AuthTicket.MergeFrom(other.AuthTicket);
+      }
+      if (other.Unknown12 != 0L) {
+        Unknown12 = other.Unknown12;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            StatusCode = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            RequestId = input.ReadUInt64();
+            break;
+          }
+          case 34: {
+            requests_.AddEntriesFrom(input, _repeated_requests_codec);
+            break;
+          }
+          case 50: {
+            unknown6_.AddEntriesFrom(input, _repeated_unknown6_codec);
+            break;
+          }
+          case 57: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 65: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 73: {
+            Altitude = input.ReadDouble();
+            break;
+          }
+          case 82: {
+            if (authInfo_ == null) {
+              authInfo_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo();
+            }
+            input.ReadMessage(authInfo_);
+            break;
+          }
+          case 90: {
+            if (authTicket_ == null) {
+              authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+            }
+            input.ReadMessage(authTicket_);
+            break;
+          }
+          case 96: {
+            Unknown12 = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the RequestEnvelope message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class AuthInfo : pb::IMessage<AuthInfo> {
+        private static readonly pb::MessageParser<AuthInfo> _parser = new pb::MessageParser<AuthInfo>(() => new AuthInfo());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<AuthInfo> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.RequestEnvelope.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public AuthInfo() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public AuthInfo(AuthInfo other) : this() {
+          provider_ = other.provider_;
+          Token = other.token_ != null ? other.Token.Clone() : null;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public AuthInfo Clone() {
+          return new AuthInfo(this);
+        }
+
+        /// <summary>Field number for the "provider" field.</summary>
+        public const int ProviderFieldNumber = 1;
+        private string provider_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string Provider {
+          get { return provider_; }
+          set {
+            provider_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "token" field.</summary>
+        public const int TokenFieldNumber = 2;
+        private global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT token_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT Token {
+          get { return token_; }
+          set {
+            token_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as AuthInfo);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(AuthInfo other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Provider != other.Provider) return false;
+          if (!object.Equals(Token, other.Token)) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Provider.Length != 0) hash ^= Provider.GetHashCode();
+          if (token_ != null) hash ^= Token.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Provider.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(Provider);
+          }
+          if (token_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Token);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Provider.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Provider);
+          }
+          if (token_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Token);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(AuthInfo other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Provider.Length != 0) {
+            Provider = other.Provider;
+          }
+          if (other.token_ != null) {
+            if (token_ == null) {
+              token_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT();
+            }
+            Token.MergeFrom(other.Token);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Provider = input.ReadString();
+                break;
+              }
+              case 18: {
+                if (token_ == null) {
+                  token_ = new global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT();
+                }
+                input.ReadMessage(token_);
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the AuthInfo message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static partial class Types {
+          public sealed partial class JWT : pb::IMessage<JWT> {
+            private static readonly pb::MessageParser<JWT> _parser = new pb::MessageParser<JWT>(() => new JWT());
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pb::MessageParser<JWT> Parser { get { return _parser; } }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Descriptor.NestedTypes[0]; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public JWT() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public JWT(JWT other) : this() {
+              contents_ = other.contents_;
+              unknown2_ = other.unknown2_;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public JWT Clone() {
+              return new JWT(this);
+            }
+
+            /// <summary>Field number for the "contents" field.</summary>
+            public const int ContentsFieldNumber = 1;
+            private string contents_ = "";
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public string Contents {
+              get { return contents_; }
+              set {
+                contents_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            /// <summary>Field number for the "unknown2" field.</summary>
+            public const int Unknown2FieldNumber = 2;
+            private int unknown2_;
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int Unknown2 {
+              get { return unknown2_; }
+              set {
+                unknown2_ = value;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override bool Equals(object other) {
+              return Equals(other as JWT);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public bool Equals(JWT other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (Contents != other.Contents) return false;
+              if (Unknown2 != other.Unknown2) return false;
+              return true;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override int GetHashCode() {
+              int hash = 1;
+              if (Contents.Length != 0) hash ^= Contents.GetHashCode();
+              if (Unknown2 != 0) hash ^= Unknown2.GetHashCode();
+              return hash;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (Contents.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteString(Contents);
+              }
+              if (Unknown2 != 0) {
+                output.WriteRawTag(16);
+                output.WriteInt32(Unknown2);
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int CalculateSize() {
+              int size = 0;
+              if (Contents.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeStringSize(Contents);
+              }
+              if (Unknown2 != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown2);
+              }
+              return size;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(JWT other) {
+              if (other == null) {
+                return;
+              }
+              if (other.Contents.Length != 0) {
+                Contents = other.Contents;
+              }
+              if (other.Unknown2 != 0) {
+                Unknown2 = other.Unknown2;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    Contents = input.ReadString();
+                    break;
+                  }
+                  case 16: {
+                    Unknown2 = input.ReadInt32();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+        }
+        #endregion
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Envelopes/ResponseEnvelope.cs b/PokemonGo/POGOProtos/Networking/Envelopes/ResponseEnvelope.cs
new file mode 100644
index 0000000..9b9e578
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Envelopes/ResponseEnvelope.cs
@@ -0,0 +1,506 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Envelopes/ResponseEnvelope.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Envelopes {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Envelopes/ResponseEnvelope.proto</summary>
+  public static partial class ResponseEnvelopeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Envelopes/ResponseEnvelope.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ResponseEnvelopeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL05ldHdvcmtpbmcvRW52ZWxvcGVzL1Jlc3BvbnNlRW52",
+            "ZWxvcGUucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMa",
+            "MFBPR09Qcm90b3MvTmV0d29ya2luZy9FbnZlbG9wZXMvQXV0aFRpY2tldC5w",
+            "cm90bxo2UE9HT1Byb3Rvcy9OZXR3b3JraW5nL0VudmVsb3Blcy9Vbmtub3du",
+            "NlJlc3BvbnNlLnByb3RvIrgCChBSZXNwb25zZUVudmVsb3BlEhMKC3N0YXR1",
+            "c19jb2RlGAEgASgFEhIKCnJlcXVlc3RfaWQYAiABKAQSDwoHYXBpX3VybBgD",
+            "IAEoCRJDCgh1bmtub3duNhgGIAMoCzIxLlBPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5FbnZlbG9wZXMuVW5rbm93bjZSZXNwb25zZRJACgthdXRoX3RpY2tldBgH",
+            "IAEoCzIrLlBPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMuQXV0aFRp",
+            "Y2tldBIPCgdyZXR1cm5zGGQgAygMEg0KBWVycm9yGGUgASgJGkMKCFVua25v",
+            "d243EhEKCXVua25vd243MRgBIAEoDBIRCgl1bmtub3duNzIYAiABKAMSEQoJ",
+            "dW5rbm93bjczGAMgASgMYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Networking.Envelopes.AuthTicketReflection.Descriptor, global::POGOProtos.Networking.Envelopes.Unknown6ResponseReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.ResponseEnvelope), global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Parser, new[]{ "StatusCode", "RequestId", "ApiUrl", "Unknown6", "AuthTicket", "Returns", "Error" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Types.Unknown7), global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Types.Unknown7.Parser, new[]{ "Unknown71", "Unknown72", "Unknown73" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ResponseEnvelope : pb::IMessage<ResponseEnvelope> {
+    private static readonly pb::MessageParser<ResponseEnvelope> _parser = new pb::MessageParser<ResponseEnvelope>(() => new ResponseEnvelope());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ResponseEnvelope> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.ResponseEnvelopeReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ResponseEnvelope() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ResponseEnvelope(ResponseEnvelope other) : this() {
+      statusCode_ = other.statusCode_;
+      requestId_ = other.requestId_;
+      apiUrl_ = other.apiUrl_;
+      unknown6_ = other.unknown6_.Clone();
+      AuthTicket = other.authTicket_ != null ? other.AuthTicket.Clone() : null;
+      returns_ = other.returns_.Clone();
+      error_ = other.error_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ResponseEnvelope Clone() {
+      return new ResponseEnvelope(this);
+    }
+
+    /// <summary>Field number for the "status_code" field.</summary>
+    public const int StatusCodeFieldNumber = 1;
+    private int statusCode_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StatusCode {
+      get { return statusCode_; }
+      set {
+        statusCode_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_id" field.</summary>
+    public const int RequestIdFieldNumber = 2;
+    private ulong requestId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong RequestId {
+      get { return requestId_; }
+      set {
+        requestId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "api_url" field.</summary>
+    public const int ApiUrlFieldNumber = 3;
+    private string apiUrl_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string ApiUrl {
+      get { return apiUrl_; }
+      set {
+        apiUrl_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6Response> _repeated_unknown6_codec
+        = pb::FieldCodec.ForMessage(50, global::POGOProtos.Networking.Envelopes.Unknown6Response.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response> unknown6_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response> Unknown6 {
+      get { return unknown6_; }
+    }
+
+    /// <summary>Field number for the "auth_ticket" field.</summary>
+    public const int AuthTicketFieldNumber = 7;
+    private global::POGOProtos.Networking.Envelopes.AuthTicket authTicket_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.AuthTicket AuthTicket {
+      get { return authTicket_; }
+      set {
+        authTicket_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "returns" field.</summary>
+    public const int ReturnsFieldNumber = 100;
+    private static readonly pb::FieldCodec<pb::ByteString> _repeated_returns_codec
+        = pb::FieldCodec.ForBytes(802);
+    private readonly pbc::RepeatedField<pb::ByteString> returns_ = new pbc::RepeatedField<pb::ByteString>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<pb::ByteString> Returns {
+      get { return returns_; }
+    }
+
+    /// <summary>Field number for the "error" field.</summary>
+    public const int ErrorFieldNumber = 101;
+    private string error_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Error {
+      get { return error_; }
+      set {
+        error_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ResponseEnvelope);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ResponseEnvelope other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StatusCode != other.StatusCode) return false;
+      if (RequestId != other.RequestId) return false;
+      if (ApiUrl != other.ApiUrl) return false;
+      if(!unknown6_.Equals(other.unknown6_)) return false;
+      if (!object.Equals(AuthTicket, other.AuthTicket)) return false;
+      if(!returns_.Equals(other.returns_)) return false;
+      if (Error != other.Error) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StatusCode != 0) hash ^= StatusCode.GetHashCode();
+      if (RequestId != 0UL) hash ^= RequestId.GetHashCode();
+      if (ApiUrl.Length != 0) hash ^= ApiUrl.GetHashCode();
+      hash ^= unknown6_.GetHashCode();
+      if (authTicket_ != null) hash ^= AuthTicket.GetHashCode();
+      hash ^= returns_.GetHashCode();
+      if (Error.Length != 0) hash ^= Error.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StatusCode != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(RequestId);
+      }
+      if (ApiUrl.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(ApiUrl);
+      }
+      unknown6_.WriteTo(output, _repeated_unknown6_codec);
+      if (authTicket_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(AuthTicket);
+      }
+      returns_.WriteTo(output, _repeated_returns_codec);
+      if (Error.Length != 0) {
+        output.WriteRawTag(170, 6);
+        output.WriteString(Error);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StatusCode != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StatusCode);
+      }
+      if (RequestId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(RequestId);
+      }
+      if (ApiUrl.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ApiUrl);
+      }
+      size += unknown6_.CalculateSize(_repeated_unknown6_codec);
+      if (authTicket_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AuthTicket);
+      }
+      size += returns_.CalculateSize(_repeated_returns_codec);
+      if (Error.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(Error);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ResponseEnvelope other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StatusCode != 0) {
+        StatusCode = other.StatusCode;
+      }
+      if (other.RequestId != 0UL) {
+        RequestId = other.RequestId;
+      }
+      if (other.ApiUrl.Length != 0) {
+        ApiUrl = other.ApiUrl;
+      }
+      unknown6_.Add(other.unknown6_);
+      if (other.authTicket_ != null) {
+        if (authTicket_ == null) {
+          authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+        }
+        AuthTicket.MergeFrom(other.AuthTicket);
+      }
+      returns_.Add(other.returns_);
+      if (other.Error.Length != 0) {
+        Error = other.Error;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            StatusCode = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            RequestId = input.ReadUInt64();
+            break;
+          }
+          case 26: {
+            ApiUrl = input.ReadString();
+            break;
+          }
+          case 50: {
+            unknown6_.AddEntriesFrom(input, _repeated_unknown6_codec);
+            break;
+          }
+          case 58: {
+            if (authTicket_ == null) {
+              authTicket_ = new global::POGOProtos.Networking.Envelopes.AuthTicket();
+            }
+            input.ReadMessage(authTicket_);
+            break;
+          }
+          case 802: {
+            returns_.AddEntriesFrom(input, _repeated_returns_codec);
+            break;
+          }
+          case 810: {
+            Error = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the ResponseEnvelope message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class Unknown7 : pb::IMessage<Unknown7> {
+        private static readonly pb::MessageParser<Unknown7> _parser = new pb::MessageParser<Unknown7>(() => new Unknown7());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown7> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.ResponseEnvelope.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown7() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown7(Unknown7 other) : this() {
+          unknown71_ = other.unknown71_;
+          unknown72_ = other.unknown72_;
+          unknown73_ = other.unknown73_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown7 Clone() {
+          return new Unknown7(this);
+        }
+
+        /// <summary>Field number for the "unknown71" field.</summary>
+        public const int Unknown71FieldNumber = 1;
+        private pb::ByteString unknown71_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unknown71 {
+          get { return unknown71_; }
+          set {
+            unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unknown72" field.</summary>
+        public const int Unknown72FieldNumber = 2;
+        private long unknown72_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public long Unknown72 {
+          get { return unknown72_; }
+          set {
+            unknown72_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown73" field.</summary>
+        public const int Unknown73FieldNumber = 3;
+        private pb::ByteString unknown73_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unknown73 {
+          get { return unknown73_; }
+          set {
+            unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown7);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown7 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown71 != other.Unknown71) return false;
+          if (Unknown72 != other.Unknown72) return false;
+          if (Unknown73 != other.Unknown73) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
+          if (Unknown72 != 0L) hash ^= Unknown72.GetHashCode();
+          if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown71.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            output.WriteRawTag(26);
+            output.WriteBytes(Unknown73);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown71.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown7 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown71.Length != 0) {
+            Unknown71 = other.Unknown71;
+          }
+          if (other.Unknown72 != 0L) {
+            Unknown72 = other.Unknown72;
+          }
+          if (other.Unknown73.Length != 0) {
+            Unknown73 = other.Unknown73;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown71 = input.ReadBytes();
+                break;
+              }
+              case 16: {
+                Unknown72 = input.ReadInt64();
+                break;
+              }
+              case 26: {
+                Unknown73 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Envelopes/Unknown6.cs b/PokemonGo/POGOProtos/Networking/Envelopes/Unknown6.cs
new file mode 100644
index 0000000..e7d8666
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Envelopes/Unknown6.cs
@@ -0,0 +1,322 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Envelopes/Unknown6.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Envelopes {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Envelopes/Unknown6.proto</summary>
+  public static partial class Unknown6Reflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Envelopes/Unknown6.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static Unknown6Reflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci5QT0dPUHJvdG9zL05ldHdvcmtpbmcvRW52ZWxvcGVzL1Vua25vd242LnBy",
+            "b3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzIoQBCghVbmtu",
+            "b3duNhIUCgxyZXF1ZXN0X3R5cGUYASABKAUSRAoIdW5rbm93bjIYAiABKAsy",
+            "Mi5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuRW52ZWxvcGVzLlVua25vd242LlVu",
+            "a25vd24yGhwKCFVua25vd24yEhAKCHVua25vd24xGAEgASgMYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6), global::POGOProtos.Networking.Envelopes.Unknown6.Parser, new[]{ "RequestType", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2), global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2.Parser, new[]{ "Unknown1" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Unknown6 : pb::IMessage<Unknown6> {
+    private static readonly pb::MessageParser<Unknown6> _parser = new pb::MessageParser<Unknown6>(() => new Unknown6());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Unknown6> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.Unknown6Reflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6(Unknown6 other) : this() {
+      requestType_ = other.requestType_;
+      Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6 Clone() {
+      return new Unknown6(this);
+    }
+
+    /// <summary>Field number for the "request_type" field.</summary>
+    public const int RequestTypeFieldNumber = 1;
+    private int requestType_;
+    /// <summary>
+    ///  5 for IAPs, 6 is unknown still
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int RequestType {
+      get { return requestType_; }
+      set {
+        requestType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2 unknown2_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2 Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Unknown6);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Unknown6 other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (RequestType != other.RequestType) return false;
+      if (!object.Equals(Unknown2, other.Unknown2)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (RequestType != 0) hash ^= RequestType.GetHashCode();
+      if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (RequestType != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(RequestType);
+      }
+      if (unknown2_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (RequestType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(RequestType);
+      }
+      if (unknown2_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Unknown6 other) {
+      if (other == null) {
+        return;
+      }
+      if (other.RequestType != 0) {
+        RequestType = other.RequestType;
+      }
+      if (other.unknown2_ != null) {
+        if (unknown2_ == null) {
+          unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2();
+        }
+        Unknown2.MergeFrom(other.Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            RequestType = input.ReadInt32();
+            break;
+          }
+          case 18: {
+            if (unknown2_ == null) {
+              unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6.Types.Unknown2();
+            }
+            input.ReadMessage(unknown2_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+        private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.Unknown6.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2(Unknown2 other) : this() {
+          unknown1_ = other.unknown1_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2 Clone() {
+          return new Unknown2(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private pb::ByteString unknown1_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown2);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown2 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown1);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown2 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1.Length != 0) {
+            Unknown1 = other.Unknown1;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown1 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Envelopes/Unknown6Response.cs b/PokemonGo/POGOProtos/Networking/Envelopes/Unknown6Response.cs
new file mode 100644
index 0000000..fd8f0fc
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Envelopes/Unknown6Response.cs
@@ -0,0 +1,895 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Envelopes/Unknown6Response.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Envelopes {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Envelopes/Unknown6Response.proto</summary>
+  public static partial class Unknown6ResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Envelopes/Unknown6Response.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static Unknown6ResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL05ldHdvcmtpbmcvRW52ZWxvcGVzL1Vua25vd242UmVz",
+            "cG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMa",
+            "JVBPR09Qcm90b3MvRGF0YS9QbGF5ZXIvQ3VycmVuY3kucHJvdG8aKFBPR09Q",
+            "cm90b3MvSW52ZW50b3J5L0l0ZW0vSXRlbURhdGEucHJvdG8ipgUKEFVua25v",
+            "d242UmVzcG9uc2USFQoNcmVzcG9uc2VfdHlwZRgBIAEoBRJMCgh1bmtub3du",
+            "MhgCIAEoCzI6LlBPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMuVW5r",
+            "bm93bjZSZXNwb25zZS5Vbmtub3duMhqsBAoIVW5rbm93bjISEAoIdW5rbm93",
+            "bjEYASABKAQSUwoFaXRlbXMYAiADKAsyRC5QT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuRW52ZWxvcGVzLlVua25vd242UmVzcG9uc2UuVW5rbm93bjIuU3RvcmVJ",
+            "dGVtEjsKEXBsYXllcl9jdXJyZW5jaWVzGAMgAygLMiAuUE9HT1Byb3Rvcy5E",
+            "YXRhLlBsYXllci5DdXJyZW5jeRIQCgh1bmtub3duNBgEIAEoCRrpAgoJU3Rv",
+            "cmVJdGVtEg8KB2l0ZW1faWQYASABKAkSDgoGaXNfaWFwGAIgASgIEjkKD2N1",
+            "cnJlbmN5X3RvX2J1eRgDIAEoCzIgLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXIu",
+            "Q3VycmVuY3kSOQoPeWllbGRzX2N1cnJlbmN5GAQgASgLMiAuUE9HT1Byb3Rv",
+            "cy5EYXRhLlBsYXllci5DdXJyZW5jeRI4Cgt5aWVsZHNfaXRlbRgFIAEoCzIj",
+            "LlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbURhdGESVgoEdGFncxgG",
+            "IAMoCzJILlBPR09Qcm90b3MuTmV0d29ya2luZy5FbnZlbG9wZXMuVW5rbm93",
+            "bjZSZXNwb25zZS5Vbmtub3duMi5TdG9yZUl0ZW0uVGFnEhAKCHVua25vd243",
+            "GAcgASgFGiEKA1RhZxILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAliBnBy",
+            "b3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Player.CurrencyReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response), global::POGOProtos.Networking.Envelopes.Unknown6Response.Parser, new[]{ "ResponseType", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2), global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Parser, new[]{ "Unknown1", "Items", "PlayerCurrencies", "Unknown4" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem), global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Parser, new[]{ "ItemId", "IsIap", "CurrencyToBuy", "YieldsCurrency", "YieldsItem", "Tags", "Unknown7" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag), global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag.Parser, new[]{ "Key", "Value" }, null, null, null)})})})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Unknown6Response : pb::IMessage<Unknown6Response> {
+    private static readonly pb::MessageParser<Unknown6Response> _parser = new pb::MessageParser<Unknown6Response>(() => new Unknown6Response());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Unknown6Response> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Envelopes.Unknown6ResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6Response() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6Response(Unknown6Response other) : this() {
+      responseType_ = other.responseType_;
+      Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Unknown6Response Clone() {
+      return new Unknown6Response(this);
+    }
+
+    /// <summary>Field number for the "response_type" field.</summary>
+    public const int ResponseTypeFieldNumber = 1;
+    private int responseType_;
+    /// <summary>
+    ///  Still don't know what 6 is, but 5 lists items available via IAPs.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ResponseType {
+      get { return responseType_; }
+      set {
+        responseType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2 unknown2_;
+    /// <summary>
+    ///  Response data
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2 Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Unknown6Response);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Unknown6Response other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ResponseType != other.ResponseType) return false;
+      if (!object.Equals(Unknown2, other.Unknown2)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ResponseType != 0) hash ^= ResponseType.GetHashCode();
+      if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ResponseType != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(ResponseType);
+      }
+      if (unknown2_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ResponseType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ResponseType);
+      }
+      if (unknown2_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Unknown6Response other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ResponseType != 0) {
+        ResponseType = other.ResponseType;
+      }
+      if (other.unknown2_ != null) {
+        if (unknown2_ == null) {
+          unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2();
+        }
+        Unknown2.MergeFrom(other.Unknown2);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            ResponseType = input.ReadInt32();
+            break;
+          }
+          case 18: {
+            if (unknown2_ == null) {
+              unknown2_ = new global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2();
+            }
+            input.ReadMessage(unknown2_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the Unknown6Response message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+        private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Envelopes.Unknown6Response.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2(Unknown2 other) : this() {
+          unknown1_ = other.unknown1_;
+          items_ = other.items_.Clone();
+          playerCurrencies_ = other.playerCurrencies_.Clone();
+          unknown4_ = other.unknown4_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown2 Clone() {
+          return new Unknown2(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private ulong unknown1_;
+        /// <summary>
+        ///  Maybe status? It's always 1 (success), so it's probably that.
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "items" field.</summary>
+        public const int ItemsFieldNumber = 2;
+        private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem> _repeated_items_codec
+            = pb::FieldCodec.ForMessage(18, global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Parser);
+        private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem> items_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem>();
+        /// <summary>
+        ///  Items to show in the shop
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem> Items {
+          get { return items_; }
+        }
+
+        /// <summary>Field number for the "player_currencies" field.</summary>
+        public const int PlayerCurrenciesFieldNumber = 3;
+        private static readonly pb::FieldCodec<global::POGOProtos.Data.Player.Currency> _repeated_playerCurrencies_codec
+            = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.Player.Currency.Parser);
+        private readonly pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> playerCurrencies_ = new pbc::RepeatedField<global::POGOProtos.Data.Player.Currency>();
+        /// <summary>
+        ///  currencies that player has at the moment
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<global::POGOProtos.Data.Player.Currency> PlayerCurrencies {
+          get { return playerCurrencies_; }
+        }
+
+        /// <summary>Field number for the "unknown4" field.</summary>
+        public const int Unknown4FieldNumber = 4;
+        private string unknown4_ = "";
+        /// <summary>
+        ///  Some base64 encoded stuff...
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string Unknown4 {
+          get { return unknown4_; }
+          set {
+            unknown4_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown2);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown2 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          if(!items_.Equals(other.items_)) return false;
+          if(!playerCurrencies_.Equals(other.playerCurrencies_)) return false;
+          if (Unknown4 != other.Unknown4) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1 != 0UL) hash ^= Unknown1.GetHashCode();
+          hash ^= items_.GetHashCode();
+          hash ^= playerCurrencies_.GetHashCode();
+          if (Unknown4.Length != 0) hash ^= Unknown4.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1 != 0UL) {
+            output.WriteRawTag(8);
+            output.WriteUInt64(Unknown1);
+          }
+          items_.WriteTo(output, _repeated_items_codec);
+          playerCurrencies_.WriteTo(output, _repeated_playerCurrencies_codec);
+          if (Unknown4.Length != 0) {
+            output.WriteRawTag(34);
+            output.WriteString(Unknown4);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unknown1);
+          }
+          size += items_.CalculateSize(_repeated_items_codec);
+          size += playerCurrencies_.CalculateSize(_repeated_playerCurrencies_codec);
+          if (Unknown4.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Unknown4);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown2 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1 != 0UL) {
+            Unknown1 = other.Unknown1;
+          }
+          items_.Add(other.items_);
+          playerCurrencies_.Add(other.playerCurrencies_);
+          if (other.Unknown4.Length != 0) {
+            Unknown4 = other.Unknown4;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Unknown1 = input.ReadUInt64();
+                break;
+              }
+              case 18: {
+                items_.AddEntriesFrom(input, _repeated_items_codec);
+                break;
+              }
+              case 26: {
+                playerCurrencies_.AddEntriesFrom(input, _repeated_playerCurrencies_codec);
+                break;
+              }
+              case 34: {
+                Unknown4 = input.ReadString();
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Unknown2 message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static partial class Types {
+          public sealed partial class StoreItem : pb::IMessage<StoreItem> {
+            private static readonly pb::MessageParser<StoreItem> _parser = new pb::MessageParser<StoreItem>(() => new StoreItem());
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pb::MessageParser<StoreItem> Parser { get { return _parser; } }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Descriptor.NestedTypes[0]; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public StoreItem() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public StoreItem(StoreItem other) : this() {
+              itemId_ = other.itemId_;
+              isIap_ = other.isIap_;
+              CurrencyToBuy = other.currencyToBuy_ != null ? other.CurrencyToBuy.Clone() : null;
+              YieldsCurrency = other.yieldsCurrency_ != null ? other.YieldsCurrency.Clone() : null;
+              YieldsItem = other.yieldsItem_ != null ? other.YieldsItem.Clone() : null;
+              tags_ = other.tags_.Clone();
+              unknown7_ = other.unknown7_;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public StoreItem Clone() {
+              return new StoreItem(this);
+            }
+
+            /// <summary>Field number for the "item_id" field.</summary>
+            public const int ItemIdFieldNumber = 1;
+            private string itemId_ = "";
+            /// <summary>
+            ///  Internal ID (probably for Google Play/App Store) example: "pgorelease.incenseordinary.1"
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public string ItemId {
+              get { return itemId_; }
+              set {
+                itemId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            /// <summary>Field number for the "is_iap" field.</summary>
+            public const int IsIapFieldNumber = 2;
+            private bool isIap_;
+            /// <summary>
+            ///  If true, this item is bought with real currency (USD, etc.) through the Play/App Store instead of Pokecoins
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public bool IsIap {
+              get { return isIap_; }
+              set {
+                isIap_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "currency_to_buy" field.</summary>
+            public const int CurrencyToBuyFieldNumber = 3;
+            private global::POGOProtos.Data.Player.Currency currencyToBuy_;
+            /// <summary>
+            ///  This defines how much the item costs (with the exception of items that cost real money like Pokecoins, that's defined in the respective store)
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public global::POGOProtos.Data.Player.Currency CurrencyToBuy {
+              get { return currencyToBuy_; }
+              set {
+                currencyToBuy_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "yields_currency" field.</summary>
+            public const int YieldsCurrencyFieldNumber = 4;
+            private global::POGOProtos.Data.Player.Currency yieldsCurrency_;
+            /// <summary>
+            ///  When bought, this IAP will yield this much currency
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public global::POGOProtos.Data.Player.Currency YieldsCurrency {
+              get { return yieldsCurrency_; }
+              set {
+                yieldsCurrency_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "yields_item" field.</summary>
+            public const int YieldsItemFieldNumber = 5;
+            private global::POGOProtos.Inventory.Item.ItemData yieldsItem_;
+            /// <summary>
+            ///  The item and count of such item that this IAP will yield
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public global::POGOProtos.Inventory.Item.ItemData YieldsItem {
+              get { return yieldsItem_; }
+              set {
+                yieldsItem_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "tags" field.</summary>
+            public const int TagsFieldNumber = 6;
+            private static readonly pb::FieldCodec<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag> _repeated_tags_codec
+                = pb::FieldCodec.ForMessage(50, global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag.Parser);
+            private readonly pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag> tags_ = new pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag>();
+            /// <summary>
+            ///  Stuff like SORT:12, CATEGORY:ITEMS
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public pbc::RepeatedField<global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Types.Tag> Tags {
+              get { return tags_; }
+            }
+
+            /// <summary>Field number for the "unknown7" field.</summary>
+            public const int Unknown7FieldNumber = 7;
+            private int unknown7_;
+            /// <summary>
+            ///  Possibly something to toggle visibility in the store/purchasibility?
+            /// </summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int Unknown7 {
+              get { return unknown7_; }
+              set {
+                unknown7_ = value;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override bool Equals(object other) {
+              return Equals(other as StoreItem);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public bool Equals(StoreItem other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (ItemId != other.ItemId) return false;
+              if (IsIap != other.IsIap) return false;
+              if (!object.Equals(CurrencyToBuy, other.CurrencyToBuy)) return false;
+              if (!object.Equals(YieldsCurrency, other.YieldsCurrency)) return false;
+              if (!object.Equals(YieldsItem, other.YieldsItem)) return false;
+              if(!tags_.Equals(other.tags_)) return false;
+              if (Unknown7 != other.Unknown7) return false;
+              return true;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override int GetHashCode() {
+              int hash = 1;
+              if (ItemId.Length != 0) hash ^= ItemId.GetHashCode();
+              if (IsIap != false) hash ^= IsIap.GetHashCode();
+              if (currencyToBuy_ != null) hash ^= CurrencyToBuy.GetHashCode();
+              if (yieldsCurrency_ != null) hash ^= YieldsCurrency.GetHashCode();
+              if (yieldsItem_ != null) hash ^= YieldsItem.GetHashCode();
+              hash ^= tags_.GetHashCode();
+              if (Unknown7 != 0) hash ^= Unknown7.GetHashCode();
+              return hash;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (ItemId.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteString(ItemId);
+              }
+              if (IsIap != false) {
+                output.WriteRawTag(16);
+                output.WriteBool(IsIap);
+              }
+              if (currencyToBuy_ != null) {
+                output.WriteRawTag(26);
+                output.WriteMessage(CurrencyToBuy);
+              }
+              if (yieldsCurrency_ != null) {
+                output.WriteRawTag(34);
+                output.WriteMessage(YieldsCurrency);
+              }
+              if (yieldsItem_ != null) {
+                output.WriteRawTag(42);
+                output.WriteMessage(YieldsItem);
+              }
+              tags_.WriteTo(output, _repeated_tags_codec);
+              if (Unknown7 != 0) {
+                output.WriteRawTag(56);
+                output.WriteInt32(Unknown7);
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public int CalculateSize() {
+              int size = 0;
+              if (ItemId.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeStringSize(ItemId);
+              }
+              if (IsIap != false) {
+                size += 1 + 1;
+              }
+              if (currencyToBuy_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(CurrencyToBuy);
+              }
+              if (yieldsCurrency_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(YieldsCurrency);
+              }
+              if (yieldsItem_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(YieldsItem);
+              }
+              size += tags_.CalculateSize(_repeated_tags_codec);
+              if (Unknown7 != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown7);
+              }
+              return size;
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(StoreItem other) {
+              if (other == null) {
+                return;
+              }
+              if (other.ItemId.Length != 0) {
+                ItemId = other.ItemId;
+              }
+              if (other.IsIap != false) {
+                IsIap = other.IsIap;
+              }
+              if (other.currencyToBuy_ != null) {
+                if (currencyToBuy_ == null) {
+                  currencyToBuy_ = new global::POGOProtos.Data.Player.Currency();
+                }
+                CurrencyToBuy.MergeFrom(other.CurrencyToBuy);
+              }
+              if (other.yieldsCurrency_ != null) {
+                if (yieldsCurrency_ == null) {
+                  yieldsCurrency_ = new global::POGOProtos.Data.Player.Currency();
+                }
+                YieldsCurrency.MergeFrom(other.YieldsCurrency);
+              }
+              if (other.yieldsItem_ != null) {
+                if (yieldsItem_ == null) {
+                  yieldsItem_ = new global::POGOProtos.Inventory.Item.ItemData();
+                }
+                YieldsItem.MergeFrom(other.YieldsItem);
+              }
+              tags_.Add(other.tags_);
+              if (other.Unknown7 != 0) {
+                Unknown7 = other.Unknown7;
+              }
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    ItemId = input.ReadString();
+                    break;
+                  }
+                  case 16: {
+                    IsIap = input.ReadBool();
+                    break;
+                  }
+                  case 26: {
+                    if (currencyToBuy_ == null) {
+                      currencyToBuy_ = new global::POGOProtos.Data.Player.Currency();
+                    }
+                    input.ReadMessage(currencyToBuy_);
+                    break;
+                  }
+                  case 34: {
+                    if (yieldsCurrency_ == null) {
+                      yieldsCurrency_ = new global::POGOProtos.Data.Player.Currency();
+                    }
+                    input.ReadMessage(yieldsCurrency_);
+                    break;
+                  }
+                  case 42: {
+                    if (yieldsItem_ == null) {
+                      yieldsItem_ = new global::POGOProtos.Inventory.Item.ItemData();
+                    }
+                    input.ReadMessage(yieldsItem_);
+                    break;
+                  }
+                  case 50: {
+                    tags_.AddEntriesFrom(input, _repeated_tags_codec);
+                    break;
+                  }
+                  case 56: {
+                    Unknown7 = input.ReadInt32();
+                    break;
+                  }
+                }
+              }
+            }
+
+            #region Nested types
+            /// <summary>Container for nested types declared in the StoreItem message type.</summary>
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+            public static partial class Types {
+              public sealed partial class Tag : pb::IMessage<Tag> {
+                private static readonly pb::MessageParser<Tag> _parser = new pb::MessageParser<Tag>(() => new Tag());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<Tag> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor {
+                  get { return global::POGOProtos.Networking.Envelopes.Unknown6Response.Types.Unknown2.Types.StoreItem.Descriptor.NestedTypes[0]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor {
+                  get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public Tag() {
+                  OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public Tag(Tag other) : this() {
+                  key_ = other.key_;
+                  value_ = other.value_;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public Tag Clone() {
+                  return new Tag(this);
+                }
+
+                /// <summary>Field number for the "key" field.</summary>
+                public const int KeyFieldNumber = 1;
+                private string key_ = "";
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string Key {
+                  get { return key_; }
+                  set {
+                    key_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                  }
+                }
+
+                /// <summary>Field number for the "value" field.</summary>
+                public const int ValueFieldNumber = 2;
+                private string value_ = "";
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string Value {
+                  get { return value_; }
+                  set {
+                    value_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                  }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other) {
+                  return Equals(other as Tag);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(Tag other) {
+                  if (ReferenceEquals(other, null)) {
+                    return false;
+                  }
+                  if (ReferenceEquals(other, this)) {
+                    return true;
+                  }
+                  if (Key != other.Key) return false;
+                  if (Value != other.Value) return false;
+                  return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode() {
+                  int hash = 1;
+                  if (Key.Length != 0) hash ^= Key.GetHashCode();
+                  if (Value.Length != 0) hash ^= Value.GetHashCode();
+                  return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString() {
+                  return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output) {
+                  if (Key.Length != 0) {
+                    output.WriteRawTag(10);
+                    output.WriteString(Key);
+                  }
+                  if (Value.Length != 0) {
+                    output.WriteRawTag(18);
+                    output.WriteString(Value);
+                  }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize() {
+                  int size = 0;
+                  if (Key.Length != 0) {
+                    size += 1 + pb::CodedOutputStream.ComputeStringSize(Key);
+                  }
+                  if (Value.Length != 0) {
+                    size += 1 + pb::CodedOutputStream.ComputeStringSize(Value);
+                  }
+                  return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(Tag other) {
+                  if (other == null) {
+                    return;
+                  }
+                  if (other.Key.Length != 0) {
+                    Key = other.Key;
+                  }
+                  if (other.Value.Length != 0) {
+                    Value = other.Value;
+                  }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input) {
+                  uint tag;
+                  while ((tag = input.ReadTag()) != 0) {
+                    switch(tag) {
+                      default:
+                        input.SkipLastField();
+                        break;
+                      case 10: {
+                        Key = input.ReadString();
+                        break;
+                      }
+                      case 18: {
+                        Value = input.ReadString();
+                        break;
+                      }
+                    }
+                  }
+                }
+
+              }
+
+            }
+            #endregion
+
+          }
+
+        }
+        #endregion
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.cs
new file mode 100644
index 0000000..f185caf
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.cs
@@ -0,0 +1,247 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.proto</summary>
+  public static partial class AddFortModifierMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/AddFortModifierMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AddFortModifierMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkRQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQWRk",
+            "Rm9ydE1vZGlmaWVyTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlcXVlc3RzLk1lc3NhZ2VzGiZQT0dPUHJvdG9zL0ludmVudG9yeS9J",
+            "dGVtL0l0ZW1JZC5wcm90byKWAQoWQWRkRm9ydE1vZGlmaWVyTWVzc2FnZRI4",
+            "Cg1tb2RpZmllcl90eXBlGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnku",
+            "SXRlbS5JdGVtSWQSDwoHZm9ydF9pZBgCIAEoCRIXCg9wbGF5ZXJfbGF0aXR1",
+            "ZGUYAyABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgEIAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.AddFortModifierMessage), global::POGOProtos.Networking.Requests.Messages.AddFortModifierMessage.Parser, new[]{ "ModifierType", "FortId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AddFortModifierMessage : pb::IMessage<AddFortModifierMessage> {
+    private static readonly pb::MessageParser<AddFortModifierMessage> _parser = new pb::MessageParser<AddFortModifierMessage>(() => new AddFortModifierMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AddFortModifierMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.AddFortModifierMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierMessage(AddFortModifierMessage other) : this() {
+      modifierType_ = other.modifierType_;
+      fortId_ = other.fortId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierMessage Clone() {
+      return new AddFortModifierMessage(this);
+    }
+
+    /// <summary>Field number for the "modifier_type" field.</summary>
+    public const int ModifierTypeFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId modifierType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ModifierType {
+      get { return modifierType_; }
+      set {
+        modifierType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 2;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AddFortModifierMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AddFortModifierMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ModifierType != other.ModifierType) return false;
+      if (FortId != other.FortId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ModifierType != 0) hash ^= ModifierType.GetHashCode();
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ModifierType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ModifierType);
+      }
+      if (FortId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ModifierType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ModifierType);
+      }
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AddFortModifierMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ModifierType != 0) {
+        ModifierType = other.ModifierType;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            modifierType_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/AttackGymMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/AttackGymMessage.cs
new file mode 100644
index 0000000..348ce67
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/AttackGymMessage.cs
@@ -0,0 +1,303 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/AttackGymMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/AttackGymMessage.proto</summary>
+  public static partial class AttackGymMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/AttackGymMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AttackGymMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQXR0",
+            "YWNrR3ltTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "cXVlc3RzLk1lc3NhZ2VzGilQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRs",
+            "ZUFjdGlvbi5wcm90byLsAQoQQXR0YWNrR3ltTWVzc2FnZRIOCgZneW1faWQY",
+            "ASABKAkSEQoJYmF0dGxlX2lkGAIgASgJEjwKDmF0dGFja19hY3Rpb25zGAMg",
+            "AygLMiQuUE9HT1Byb3Rvcy5EYXRhLkJhdHRsZS5CYXR0bGVBY3Rpb24SRAoW",
+            "bGFzdF9yZXRyaWV2ZWRfYWN0aW9ucxgEIAEoCzIkLlBPR09Qcm90b3MuRGF0",
+            "YS5CYXR0bGUuQmF0dGxlQWN0aW9uEhcKD3BsYXllcl9sYXRpdHVkZRgFIAEo",
+            "ARIYChBwbGF5ZXJfbG9uZ2l0dWRlGAYgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Battle.BattleActionReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.AttackGymMessage), global::POGOProtos.Networking.Requests.Messages.AttackGymMessage.Parser, new[]{ "GymId", "BattleId", "AttackActions", "LastRetrievedActions", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AttackGymMessage : pb::IMessage<AttackGymMessage> {
+    private static readonly pb::MessageParser<AttackGymMessage> _parser = new pb::MessageParser<AttackGymMessage>(() => new AttackGymMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AttackGymMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.AttackGymMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymMessage(AttackGymMessage other) : this() {
+      gymId_ = other.gymId_;
+      battleId_ = other.battleId_;
+      attackActions_ = other.attackActions_.Clone();
+      LastRetrievedActions = other.lastRetrievedActions_ != null ? other.LastRetrievedActions.Clone() : null;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymMessage Clone() {
+      return new AttackGymMessage(this);
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 1;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "battle_id" field.</summary>
+    public const int BattleIdFieldNumber = 2;
+    private string battleId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BattleId {
+      get { return battleId_; }
+      set {
+        battleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "attack_actions" field.</summary>
+    public const int AttackActionsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattleAction> _repeated_attackActions_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.Battle.BattleAction.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> attackActions_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> AttackActions {
+      get { return attackActions_; }
+    }
+
+    /// <summary>Field number for the "last_retrieved_actions" field.</summary>
+    public const int LastRetrievedActionsFieldNumber = 4;
+    private global::POGOProtos.Data.Battle.BattleAction lastRetrievedActions_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleAction LastRetrievedActions {
+      get { return lastRetrievedActions_; }
+      set {
+        lastRetrievedActions_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 5;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 6;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AttackGymMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AttackGymMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (GymId != other.GymId) return false;
+      if (BattleId != other.BattleId) return false;
+      if(!attackActions_.Equals(other.attackActions_)) return false;
+      if (!object.Equals(LastRetrievedActions, other.LastRetrievedActions)) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      if (BattleId.Length != 0) hash ^= BattleId.GetHashCode();
+      hash ^= attackActions_.GetHashCode();
+      if (lastRetrievedActions_ != null) hash ^= LastRetrievedActions.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (GymId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(GymId);
+      }
+      if (BattleId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(BattleId);
+      }
+      attackActions_.WriteTo(output, _repeated_attackActions_codec);
+      if (lastRetrievedActions_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(LastRetrievedActions);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      if (BattleId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BattleId);
+      }
+      size += attackActions_.CalculateSize(_repeated_attackActions_codec);
+      if (lastRetrievedActions_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LastRetrievedActions);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AttackGymMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      if (other.BattleId.Length != 0) {
+        BattleId = other.BattleId;
+      }
+      attackActions_.Add(other.attackActions_);
+      if (other.lastRetrievedActions_ != null) {
+        if (lastRetrievedActions_ == null) {
+          lastRetrievedActions_ = new global::POGOProtos.Data.Battle.BattleAction();
+        }
+        LastRetrievedActions.MergeFrom(other.LastRetrievedActions);
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 18: {
+            BattleId = input.ReadString();
+            break;
+          }
+          case 26: {
+            attackActions_.AddEntriesFrom(input, _repeated_attackActions_codec);
+            break;
+          }
+          case 34: {
+            if (lastRetrievedActions_ == null) {
+              lastRetrievedActions_ = new global::POGOProtos.Data.Battle.BattleAction();
+            }
+            input.ReadMessage(lastRetrievedActions_);
+            break;
+          }
+          case 41: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 49: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.cs
new file mode 100644
index 0000000..9e2a885
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.cs
@@ -0,0 +1,333 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.proto</summary>
+  public static partial class CatchPokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/CatchPokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CatchPokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkFQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQ2F0",
+            "Y2hQb2tlbW9uTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5n",
+            "LlJlcXVlc3RzLk1lc3NhZ2VzGiZQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVt",
+            "L0l0ZW1JZC5wcm90byLmAQoTQ2F0Y2hQb2tlbW9uTWVzc2FnZRIUCgxlbmNv",
+            "dW50ZXJfaWQYASABKAYSMwoIcG9rZWJhbGwYAiABKA4yIS5QT0dPUHJvdG9z",
+            "LkludmVudG9yeS5JdGVtLkl0ZW1JZBIfChdub3JtYWxpemVkX3JldGljbGVf",
+            "c2l6ZRgDIAEoARIWCg5zcGF3bl9wb2ludF9pZBgEIAEoCRITCgtoaXRfcG9r",
+            "ZW1vbhgFIAEoCBIVCg1zcGluX21vZGlmaWVyGAYgASgBEh8KF25vcm1hbGl6",
+            "ZWRfaGl0X3Bvc2l0aW9uGAcgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CatchPokemonMessage), global::POGOProtos.Networking.Requests.Messages.CatchPokemonMessage.Parser, new[]{ "EncounterId", "Pokeball", "NormalizedReticleSize", "SpawnPointId", "HitPokemon", "SpinModifier", "NormalizedHitPosition" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CatchPokemonMessage : pb::IMessage<CatchPokemonMessage> {
+    private static readonly pb::MessageParser<CatchPokemonMessage> _parser = new pb::MessageParser<CatchPokemonMessage>(() => new CatchPokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CatchPokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.CatchPokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonMessage(CatchPokemonMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      pokeball_ = other.pokeball_;
+      normalizedReticleSize_ = other.normalizedReticleSize_;
+      spawnPointId_ = other.spawnPointId_;
+      hitPokemon_ = other.hitPokemon_;
+      spinModifier_ = other.spinModifier_;
+      normalizedHitPosition_ = other.normalizedHitPosition_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonMessage Clone() {
+      return new CatchPokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeball" field.</summary>
+    public const int PokeballFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemId pokeball_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId Pokeball {
+      get { return pokeball_; }
+      set {
+        pokeball_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "normalized_reticle_size" field.</summary>
+    public const int NormalizedReticleSizeFieldNumber = 3;
+    private double normalizedReticleSize_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double NormalizedReticleSize {
+      get { return normalizedReticleSize_; }
+      set {
+        normalizedReticleSize_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 4;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "hit_pokemon" field.</summary>
+    public const int HitPokemonFieldNumber = 5;
+    private bool hitPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool HitPokemon {
+      get { return hitPokemon_; }
+      set {
+        hitPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spin_modifier" field.</summary>
+    public const int SpinModifierFieldNumber = 6;
+    private double spinModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double SpinModifier {
+      get { return spinModifier_; }
+      set {
+        spinModifier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "normalized_hit_position" field.</summary>
+    public const int NormalizedHitPositionFieldNumber = 7;
+    private double normalizedHitPosition_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double NormalizedHitPosition {
+      get { return normalizedHitPosition_; }
+      set {
+        normalizedHitPosition_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CatchPokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (Pokeball != other.Pokeball) return false;
+      if (NormalizedReticleSize != other.NormalizedReticleSize) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (HitPokemon != other.HitPokemon) return false;
+      if (SpinModifier != other.SpinModifier) return false;
+      if (NormalizedHitPosition != other.NormalizedHitPosition) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
+      if (NormalizedReticleSize != 0D) hash ^= NormalizedReticleSize.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (HitPokemon != false) hash ^= HitPokemon.GetHashCode();
+      if (SpinModifier != 0D) hash ^= SpinModifier.GetHashCode();
+      if (NormalizedHitPosition != 0D) hash ^= NormalizedHitPosition.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(EncounterId);
+      }
+      if (Pokeball != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Pokeball);
+      }
+      if (NormalizedReticleSize != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(NormalizedReticleSize);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(SpawnPointId);
+      }
+      if (HitPokemon != false) {
+        output.WriteRawTag(40);
+        output.WriteBool(HitPokemon);
+      }
+      if (SpinModifier != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(SpinModifier);
+      }
+      if (NormalizedHitPosition != 0D) {
+        output.WriteRawTag(57);
+        output.WriteDouble(NormalizedHitPosition);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (Pokeball != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Pokeball);
+      }
+      if (NormalizedReticleSize != 0D) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (HitPokemon != false) {
+        size += 1 + 1;
+      }
+      if (SpinModifier != 0D) {
+        size += 1 + 8;
+      }
+      if (NormalizedHitPosition != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CatchPokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.Pokeball != 0) {
+        Pokeball = other.Pokeball;
+      }
+      if (other.NormalizedReticleSize != 0D) {
+        NormalizedReticleSize = other.NormalizedReticleSize;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.HitPokemon != false) {
+        HitPokemon = other.HitPokemon;
+      }
+      if (other.SpinModifier != 0D) {
+        SpinModifier = other.SpinModifier;
+      }
+      if (other.NormalizedHitPosition != 0D) {
+        NormalizedHitPosition = other.NormalizedHitPosition;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 16: {
+            pokeball_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 25: {
+            NormalizedReticleSize = input.ReadDouble();
+            break;
+          }
+          case 34: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 40: {
+            HitPokemon = input.ReadBool();
+            break;
+          }
+          case 49: {
+            SpinModifier = input.ReadDouble();
+            break;
+          }
+          case 57: {
+            NormalizedHitPosition = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.cs
new file mode 100644
index 0000000..cdf4b62
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.proto</summary>
+  public static partial class CheckAwardedBadgesMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/CheckAwardedBadgesMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CheckAwardedBadgesMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQ2hl",
+            "Y2tBd2FyZGVkQmFkZ2VzTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLlJlcXVlc3RzLk1lc3NhZ2VzIhsKGUNoZWNrQXdhcmRlZEJhZGdl",
+            "c01lc3NhZ2ViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CheckAwardedBadgesMessage), global::POGOProtos.Networking.Requests.Messages.CheckAwardedBadgesMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class CheckAwardedBadgesMessage : pb::IMessage<CheckAwardedBadgesMessage> {
+    private static readonly pb::MessageParser<CheckAwardedBadgesMessage> _parser = new pb::MessageParser<CheckAwardedBadgesMessage>(() => new CheckAwardedBadgesMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckAwardedBadgesMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.CheckAwardedBadgesMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesMessage(CheckAwardedBadgesMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesMessage Clone() {
+      return new CheckAwardedBadgesMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckAwardedBadgesMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckAwardedBadgesMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckAwardedBadgesMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.cs
new file mode 100644
index 0000000..634d1f5
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.proto</summary>
+  public static partial class CheckCodenameAvailableMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/CheckCodenameAvailableMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CheckCodenameAvailableMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CktQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQ2hl",
+            "Y2tDb2RlbmFtZUF2YWlsYWJsZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3Mu",
+            "TmV0d29ya2luZy5SZXF1ZXN0cy5NZXNzYWdlcyIxCh1DaGVja0NvZGVuYW1l",
+            "QXZhaWxhYmxlTWVzc2FnZRIQCghjb2RlbmFtZRgBIAEoCWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CheckCodenameAvailableMessage), global::POGOProtos.Networking.Requests.Messages.CheckCodenameAvailableMessage.Parser, new[]{ "Codename" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CheckCodenameAvailableMessage : pb::IMessage<CheckCodenameAvailableMessage> {
+    private static readonly pb::MessageParser<CheckCodenameAvailableMessage> _parser = new pb::MessageParser<CheckCodenameAvailableMessage>(() => new CheckCodenameAvailableMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckCodenameAvailableMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.CheckCodenameAvailableMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableMessage(CheckCodenameAvailableMessage other) : this() {
+      codename_ = other.codename_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableMessage Clone() {
+      return new CheckCodenameAvailableMessage(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckCodenameAvailableMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckCodenameAvailableMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckCodenameAvailableMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.cs
new file mode 100644
index 0000000..c155f40
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.proto</summary>
+  public static partial class ClaimCodenameMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/ClaimCodenameMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ClaimCodenameMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQ2xh",
+            "aW1Db2RlbmFtZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcyIoChRDbGFpbUNvZGVuYW1lTWVzc2FnZRIQ",
+            "Cghjb2RlbmFtZRgBIAEoCWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.ClaimCodenameMessage), global::POGOProtos.Networking.Requests.Messages.ClaimCodenameMessage.Parser, new[]{ "Codename" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ClaimCodenameMessage : pb::IMessage<ClaimCodenameMessage> {
+    private static readonly pb::MessageParser<ClaimCodenameMessage> _parser = new pb::MessageParser<ClaimCodenameMessage>(() => new ClaimCodenameMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ClaimCodenameMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.ClaimCodenameMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameMessage(ClaimCodenameMessage other) : this() {
+      codename_ = other.codename_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameMessage Clone() {
+      return new ClaimCodenameMessage(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ClaimCodenameMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ClaimCodenameMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ClaimCodenameMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.cs
new file mode 100644
index 0000000..3529f8e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.proto</summary>
+  public static partial class CollectDailyBonusMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/CollectDailyBonusMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CollectDailyBonusMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkZQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQ29s",
+            "bGVjdERhaWx5Qm9udXNNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdv",
+            "cmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMiGgoYQ29sbGVjdERhaWx5Qm9udXNN",
+            "ZXNzYWdlYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CollectDailyBonusMessage), global::POGOProtos.Networking.Requests.Messages.CollectDailyBonusMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class CollectDailyBonusMessage : pb::IMessage<CollectDailyBonusMessage> {
+    private static readonly pb::MessageParser<CollectDailyBonusMessage> _parser = new pb::MessageParser<CollectDailyBonusMessage>(() => new CollectDailyBonusMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyBonusMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.CollectDailyBonusMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusMessage(CollectDailyBonusMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusMessage Clone() {
+      return new CollectDailyBonusMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyBonusMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyBonusMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyBonusMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.cs
new file mode 100644
index 0000000..dd0561e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.proto</summary>
+  public static partial class CollectDailyDefenderBonusMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/CollectDailyDefenderBonusMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CollectDailyDefenderBonusMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ck5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvQ29s",
+            "bGVjdERhaWx5RGVmZW5kZXJCb251c01lc3NhZ2UucHJvdG8SJ1BPR09Qcm90",
+            "b3MuTmV0d29ya2luZy5SZXF1ZXN0cy5NZXNzYWdlcyIiCiBDb2xsZWN0RGFp",
+            "bHlEZWZlbmRlckJvbnVzTWVzc2FnZWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CollectDailyDefenderBonusMessage), global::POGOProtos.Networking.Requests.Messages.CollectDailyDefenderBonusMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class CollectDailyDefenderBonusMessage : pb::IMessage<CollectDailyDefenderBonusMessage> {
+    private static readonly pb::MessageParser<CollectDailyDefenderBonusMessage> _parser = new pb::MessageParser<CollectDailyDefenderBonusMessage>(() => new CollectDailyDefenderBonusMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyDefenderBonusMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.CollectDailyDefenderBonusMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusMessage(CollectDailyDefenderBonusMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusMessage Clone() {
+      return new CollectDailyDefenderBonusMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyDefenderBonusMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyDefenderBonusMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyDefenderBonusMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.cs
new file mode 100644
index 0000000..8ab20c1
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.cs
@@ -0,0 +1,246 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.proto</summary>
+  public static partial class DiskEncounterMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/DiskEncounterMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DiskEncounterMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRGlz",
+            "a0VuY291bnRlck1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcyJwChREaXNrRW5jb3VudGVyTWVzc2FnZRIU",
+            "CgxlbmNvdW50ZXJfaWQYASABKAQSDwoHZm9ydF9pZBgCIAEoCRIXCg9wbGF5",
+            "ZXJfbGF0aXR1ZGUYAyABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgEIAEoAWIG",
+            "cHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DiskEncounterMessage), global::POGOProtos.Networking.Requests.Messages.DiskEncounterMessage.Parser, new[]{ "EncounterId", "FortId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DiskEncounterMessage : pb::IMessage<DiskEncounterMessage> {
+    private static readonly pb::MessageParser<DiskEncounterMessage> _parser = new pb::MessageParser<DiskEncounterMessage>(() => new DiskEncounterMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DiskEncounterMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.DiskEncounterMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterMessage(DiskEncounterMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      fortId_ = other.fortId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterMessage Clone() {
+      return new DiskEncounterMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 2;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DiskEncounterMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DiskEncounterMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (FortId != other.FortId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(EncounterId);
+      }
+      if (FortId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(EncounterId);
+      }
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DiskEncounterMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            EncounterId = input.ReadUInt64();
+            break;
+          }
+          case 18: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.cs
new file mode 100644
index 0000000..3585345
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.proto</summary>
+  public static partial class DownloadItemTemplatesMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/DownloadItemTemplatesMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadItemTemplatesMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkpQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRG93",
+            "bmxvYWRJdGVtVGVtcGxhdGVzTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5O",
+            "ZXR3b3JraW5nLlJlcXVlc3RzLk1lc3NhZ2VzIh4KHERvd25sb2FkSXRlbVRl",
+            "bXBsYXRlc01lc3NhZ2ViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DownloadItemTemplatesMessage), global::POGOProtos.Networking.Requests.Messages.DownloadItemTemplatesMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class DownloadItemTemplatesMessage : pb::IMessage<DownloadItemTemplatesMessage> {
+    private static readonly pb::MessageParser<DownloadItemTemplatesMessage> _parser = new pb::MessageParser<DownloadItemTemplatesMessage>(() => new DownloadItemTemplatesMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadItemTemplatesMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.DownloadItemTemplatesMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesMessage(DownloadItemTemplatesMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesMessage Clone() {
+      return new DownloadItemTemplatesMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadItemTemplatesMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadItemTemplatesMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadItemTemplatesMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.cs
new file mode 100644
index 0000000..cb931a7
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.cs
@@ -0,0 +1,276 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.proto</summary>
+  public static partial class DownloadRemoteConfigVersionMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/DownloadRemoteConfigVersionMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadRemoteConfigVersionMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ClBQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRG93",
+            "bmxvYWRSZW1vdGVDb25maWdWZXJzaW9uTWVzc2FnZS5wcm90bxInUE9HT1By",
+            "b3Rvcy5OZXR3b3JraW5nLlJlcXVlc3RzLk1lc3NhZ2VzGh9QT0dPUHJvdG9z",
+            "L0VudW1zL1BsYXRmb3JtLnByb3RvIqoBCiJEb3dubG9hZFJlbW90ZUNvbmZp",
+            "Z1ZlcnNpb25NZXNzYWdlEiwKCHBsYXRmb3JtGAEgASgOMhouUE9HT1Byb3Rv",
+            "cy5FbnVtcy5QbGF0Zm9ybRIbChNkZXZpY2VfbWFudWZhY3R1cmVyGAIgASgJ",
+            "EhQKDGRldmljZV9tb2RlbBgDIAEoCRIOCgZsb2NhbGUYBCABKAkSEwoLYXBw",
+            "X3ZlcnNpb24YBSABKA1iBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PlatformReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DownloadRemoteConfigVersionMessage), global::POGOProtos.Networking.Requests.Messages.DownloadRemoteConfigVersionMessage.Parser, new[]{ "Platform", "DeviceManufacturer", "DeviceModel", "Locale", "AppVersion" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadRemoteConfigVersionMessage : pb::IMessage<DownloadRemoteConfigVersionMessage> {
+    private static readonly pb::MessageParser<DownloadRemoteConfigVersionMessage> _parser = new pb::MessageParser<DownloadRemoteConfigVersionMessage>(() => new DownloadRemoteConfigVersionMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadRemoteConfigVersionMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.DownloadRemoteConfigVersionMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionMessage(DownloadRemoteConfigVersionMessage other) : this() {
+      platform_ = other.platform_;
+      deviceManufacturer_ = other.deviceManufacturer_;
+      deviceModel_ = other.deviceModel_;
+      locale_ = other.locale_;
+      appVersion_ = other.appVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionMessage Clone() {
+      return new DownloadRemoteConfigVersionMessage(this);
+    }
+
+    /// <summary>Field number for the "platform" field.</summary>
+    public const int PlatformFieldNumber = 1;
+    private global::POGOProtos.Enums.Platform platform_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.Platform Platform {
+      get { return platform_; }
+      set {
+        platform_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "device_manufacturer" field.</summary>
+    public const int DeviceManufacturerFieldNumber = 2;
+    private string deviceManufacturer_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceManufacturer {
+      get { return deviceManufacturer_; }
+      set {
+        deviceManufacturer_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "device_model" field.</summary>
+    public const int DeviceModelFieldNumber = 3;
+    private string deviceModel_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceModel {
+      get { return deviceModel_; }
+      set {
+        deviceModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "locale" field.</summary>
+    public const int LocaleFieldNumber = 4;
+    private string locale_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Locale {
+      get { return locale_; }
+      set {
+        locale_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "app_version" field.</summary>
+    public const int AppVersionFieldNumber = 5;
+    private uint appVersion_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint AppVersion {
+      get { return appVersion_; }
+      set {
+        appVersion_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadRemoteConfigVersionMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadRemoteConfigVersionMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Platform != other.Platform) return false;
+      if (DeviceManufacturer != other.DeviceManufacturer) return false;
+      if (DeviceModel != other.DeviceModel) return false;
+      if (Locale != other.Locale) return false;
+      if (AppVersion != other.AppVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Platform != 0) hash ^= Platform.GetHashCode();
+      if (DeviceManufacturer.Length != 0) hash ^= DeviceManufacturer.GetHashCode();
+      if (DeviceModel.Length != 0) hash ^= DeviceModel.GetHashCode();
+      if (Locale.Length != 0) hash ^= Locale.GetHashCode();
+      if (AppVersion != 0) hash ^= AppVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Platform != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Locale);
+      }
+      if (AppVersion != 0) {
+        output.WriteRawTag(40);
+        output.WriteUInt32(AppVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Platform != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Locale);
+      }
+      if (AppVersion != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt32Size(AppVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadRemoteConfigVersionMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Platform != 0) {
+        Platform = other.Platform;
+      }
+      if (other.DeviceManufacturer.Length != 0) {
+        DeviceManufacturer = other.DeviceManufacturer;
+      }
+      if (other.DeviceModel.Length != 0) {
+        DeviceModel = other.DeviceModel;
+      }
+      if (other.Locale.Length != 0) {
+        Locale = other.Locale;
+      }
+      if (other.AppVersion != 0) {
+        AppVersion = other.AppVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            platform_ = (global::POGOProtos.Enums.Platform) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            DeviceManufacturer = input.ReadString();
+            break;
+          }
+          case 26: {
+            DeviceModel = input.ReadString();
+            break;
+          }
+          case 34: {
+            Locale = input.ReadString();
+            break;
+          }
+          case 40: {
+            AppVersion = input.ReadUInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.cs
new file mode 100644
index 0000000..cb5a68e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.proto</summary>
+  public static partial class DownloadSettingsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/DownloadSettingsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadSettingsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkVQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRG93",
+            "bmxvYWRTZXR0aW5nc01lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29y",
+            "a2luZy5SZXF1ZXN0cy5NZXNzYWdlcyInChdEb3dubG9hZFNldHRpbmdzTWVz",
+            "c2FnZRIMCgRoYXNoGAEgASgJYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DownloadSettingsMessage), global::POGOProtos.Networking.Requests.Messages.DownloadSettingsMessage.Parser, new[]{ "Hash" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadSettingsMessage : pb::IMessage<DownloadSettingsMessage> {
+    private static readonly pb::MessageParser<DownloadSettingsMessage> _parser = new pb::MessageParser<DownloadSettingsMessage>(() => new DownloadSettingsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadSettingsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.DownloadSettingsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsMessage(DownloadSettingsMessage other) : this() {
+      hash_ = other.hash_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsMessage Clone() {
+      return new DownloadSettingsMessage(this);
+    }
+
+    /// <summary>Field number for the "hash" field.</summary>
+    public const int HashFieldNumber = 1;
+    private string hash_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Hash {
+      get { return hash_; }
+      set {
+        hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadSettingsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadSettingsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Hash != other.Hash) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Hash.Length != 0) hash ^= Hash.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Hash.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Hash);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Hash.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadSettingsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Hash.Length != 0) {
+        Hash = other.Hash;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Hash = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/EchoMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/EchoMessage.cs
new file mode 100644
index 0000000..581fece
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/EchoMessage.cs
@@ -0,0 +1,134 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/EchoMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/EchoMessage.proto</summary>
+  public static partial class EchoMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/EchoMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EchoMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjlQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRWNo",
+            "b01lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXF1ZXN0",
+            "cy5NZXNzYWdlcyINCgtFY2hvTWVzc2FnZWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EchoMessage), global::POGOProtos.Networking.Requests.Messages.EchoMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class EchoMessage : pb::IMessage<EchoMessage> {
+    private static readonly pb::MessageParser<EchoMessage> _parser = new pb::MessageParser<EchoMessage>(() => new EchoMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EchoMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.EchoMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoMessage(EchoMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoMessage Clone() {
+      return new EchoMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EchoMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EchoMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EchoMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterMessage.cs
new file mode 100644
index 0000000..36f3c03
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterMessage.cs
@@ -0,0 +1,246 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/EncounterMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/EncounterMessage.proto</summary>
+  public static partial class EncounterMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/EncounterMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRW5j",
+            "b3VudGVyTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "cXVlc3RzLk1lc3NhZ2VzInMKEEVuY291bnRlck1lc3NhZ2USFAoMZW5jb3Vu",
+            "dGVyX2lkGAEgASgGEhYKDnNwYXduX3BvaW50X2lkGAIgASgJEhcKD3BsYXll",
+            "cl9sYXRpdHVkZRgDIAEoARIYChBwbGF5ZXJfbG9uZ2l0dWRlGAQgASgBYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EncounterMessage), global::POGOProtos.Networking.Requests.Messages.EncounterMessage.Parser, new[]{ "EncounterId", "SpawnPointId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EncounterMessage : pb::IMessage<EncounterMessage> {
+    private static readonly pb::MessageParser<EncounterMessage> _parser = new pb::MessageParser<EncounterMessage>(() => new EncounterMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.EncounterMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterMessage(EncounterMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      spawnPointId_ = other.spawnPointId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterMessage Clone() {
+      return new EncounterMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 2;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(EncounterId);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(SpawnPointId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 18: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.cs
new file mode 100644
index 0000000..f5d8068
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.cs
@@ -0,0 +1,162 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.proto</summary>
+  public static partial class EncounterTutorialCompleteMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/EncounterTutorialCompleteMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterTutorialCompleteMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ck5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRW5j",
+            "b3VudGVyVHV0b3JpYWxDb21wbGV0ZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90",
+            "b3MuTmV0d29ya2luZy5SZXF1ZXN0cy5NZXNzYWdlcxogUE9HT1Byb3Rvcy9F",
+            "bnVtcy9Qb2tlbW9uSWQucHJvdG8iUwogRW5jb3VudGVyVHV0b3JpYWxDb21w",
+            "bGV0ZU1lc3NhZ2USLwoKcG9rZW1vbl9pZBgBIAEoDjIbLlBPR09Qcm90b3Mu",
+            "RW51bXMuUG9rZW1vbklkYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EncounterTutorialCompleteMessage), global::POGOProtos.Networking.Requests.Messages.EncounterTutorialCompleteMessage.Parser, new[]{ "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EncounterTutorialCompleteMessage : pb::IMessage<EncounterTutorialCompleteMessage> {
+    private static readonly pb::MessageParser<EncounterTutorialCompleteMessage> _parser = new pb::MessageParser<EncounterTutorialCompleteMessage>(() => new EncounterTutorialCompleteMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterTutorialCompleteMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.EncounterTutorialCompleteMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteMessage(EncounterTutorialCompleteMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteMessage Clone() {
+      return new EncounterTutorialCompleteMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterTutorialCompleteMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterTutorialCompleteMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterTutorialCompleteMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.cs
new file mode 100644
index 0000000..275b487
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.cs
@@ -0,0 +1,161 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.proto</summary>
+  public static partial class EquipBadgeMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/EquipBadgeMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EquipBadgeMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRXF1",
+            "aXBCYWRnZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXF1ZXN0cy5NZXNzYWdlcxogUE9HT1Byb3Rvcy9FbnVtcy9CYWRnZVR5cGUu",
+            "cHJvdG8iRAoRRXF1aXBCYWRnZU1lc3NhZ2USLwoKYmFkZ2VfdHlwZRgBIAEo",
+            "DjIbLlBPR09Qcm90b3MuRW51bXMuQmFkZ2VUeXBlYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.BadgeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EquipBadgeMessage), global::POGOProtos.Networking.Requests.Messages.EquipBadgeMessage.Parser, new[]{ "BadgeType" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EquipBadgeMessage : pb::IMessage<EquipBadgeMessage> {
+    private static readonly pb::MessageParser<EquipBadgeMessage> _parser = new pb::MessageParser<EquipBadgeMessage>(() => new EquipBadgeMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquipBadgeMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.EquipBadgeMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeMessage(EquipBadgeMessage other) : this() {
+      badgeType_ = other.badgeType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeMessage Clone() {
+      return new EquipBadgeMessage(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquipBadgeMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquipBadgeMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquipBadgeMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.cs
new file mode 100644
index 0000000..13b6061
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.proto</summary>
+  public static partial class EvolvePokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/EvolvePokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EvolvePokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRXZv",
+            "bHZlUG9rZW1vbk1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcyIqChRFdm9sdmVQb2tlbW9uTWVzc2FnZRIS",
+            "Cgpwb2tlbW9uX2lkGAEgASgGYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EvolvePokemonMessage), global::POGOProtos.Networking.Requests.Messages.EvolvePokemonMessage.Parser, new[]{ "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EvolvePokemonMessage : pb::IMessage<EvolvePokemonMessage> {
+    private static readonly pb::MessageParser<EvolvePokemonMessage> _parser = new pb::MessageParser<EvolvePokemonMessage>(() => new EvolvePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EvolvePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.EvolvePokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonMessage(EvolvePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonMessage Clone() {
+      return new EvolvePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EvolvePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EvolvePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EvolvePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.cs
new file mode 100644
index 0000000..5db48ac
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.cs
@@ -0,0 +1,246 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.proto</summary>
+  public static partial class FortDeployPokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/FortDeployPokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortDeployPokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkZQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRm9y",
+            "dERlcGxveVBva2Vtb25NZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdv",
+            "cmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMicgoYRm9ydERlcGxveVBva2Vtb25N",
+            "ZXNzYWdlEg8KB2ZvcnRfaWQYASABKAkSEgoKcG9rZW1vbl9pZBgCIAEoBhIX",
+            "Cg9wbGF5ZXJfbGF0aXR1ZGUYAyABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgE",
+            "IAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortDeployPokemonMessage), global::POGOProtos.Networking.Requests.Messages.FortDeployPokemonMessage.Parser, new[]{ "FortId", "PokemonId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortDeployPokemonMessage : pb::IMessage<FortDeployPokemonMessage> {
+    private static readonly pb::MessageParser<FortDeployPokemonMessage> _parser = new pb::MessageParser<FortDeployPokemonMessage>(() => new FortDeployPokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDeployPokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.FortDeployPokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonMessage(FortDeployPokemonMessage other) : this() {
+      fortId_ = other.fortId_;
+      pokemonId_ = other.pokemonId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonMessage Clone() {
+      return new FortDeployPokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDeployPokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDeployPokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDeployPokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/FortDetailsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortDetailsMessage.cs
new file mode 100644
index 0000000..e393140
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortDetailsMessage.cs
@@ -0,0 +1,217 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/FortDetailsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/FortDetailsMessage.proto</summary>
+  public static partial class FortDetailsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/FortDetailsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortDetailsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkBQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRm9y",
+            "dERldGFpbHNNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtpbmcu",
+            "UmVxdWVzdHMuTWVzc2FnZXMiSgoSRm9ydERldGFpbHNNZXNzYWdlEg8KB2Zv",
+            "cnRfaWQYASABKAkSEAoIbGF0aXR1ZGUYAiABKAESEQoJbG9uZ2l0dWRlGAMg",
+            "ASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortDetailsMessage), global::POGOProtos.Networking.Requests.Messages.FortDetailsMessage.Parser, new[]{ "FortId", "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortDetailsMessage : pb::IMessage<FortDetailsMessage> {
+    private static readonly pb::MessageParser<FortDetailsMessage> _parser = new pb::MessageParser<FortDetailsMessage>(() => new FortDetailsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDetailsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.FortDetailsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsMessage(FortDetailsMessage other) : this() {
+      fortId_ = other.fortId_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsMessage Clone() {
+      return new FortDetailsMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 2;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 3;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDetailsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDetailsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDetailsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.cs
new file mode 100644
index 0000000..851454e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.cs
@@ -0,0 +1,246 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.proto</summary>
+  public static partial class FortRecallPokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/FortRecallPokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortRecallPokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkZQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRm9y",
+            "dFJlY2FsbFBva2Vtb25NZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdv",
+            "cmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMicgoYRm9ydFJlY2FsbFBva2Vtb25N",
+            "ZXNzYWdlEg8KB2ZvcnRfaWQYASABKAkSEgoKcG9rZW1vbl9pZBgCIAEoBhIX",
+            "Cg9wbGF5ZXJfbGF0aXR1ZGUYAyABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgE",
+            "IAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortRecallPokemonMessage), global::POGOProtos.Networking.Requests.Messages.FortRecallPokemonMessage.Parser, new[]{ "FortId", "PokemonId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortRecallPokemonMessage : pb::IMessage<FortRecallPokemonMessage> {
+    private static readonly pb::MessageParser<FortRecallPokemonMessage> _parser = new pb::MessageParser<FortRecallPokemonMessage>(() => new FortRecallPokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortRecallPokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.FortRecallPokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonMessage(FortRecallPokemonMessage other) : this() {
+      fortId_ = other.fortId_;
+      pokemonId_ = other.pokemonId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonMessage Clone() {
+      return new FortRecallPokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortRecallPokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortRecallPokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortRecallPokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/FortSearchMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortSearchMessage.cs
new file mode 100644
index 0000000..66640b3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/FortSearchMessage.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/FortSearchMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/FortSearchMessage.proto</summary>
+  public static partial class FortSearchMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/FortSearchMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortSearchMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvRm9y",
+            "dFNlYXJjaE1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXF1ZXN0cy5NZXNzYWdlcyKGAQoRRm9ydFNlYXJjaE1lc3NhZ2USDwoHZm9y",
+            "dF9pZBgBIAEoCRIXCg9wbGF5ZXJfbGF0aXR1ZGUYAiABKAESGAoQcGxheWVy",
+            "X2xvbmdpdHVkZRgDIAEoARIVCg1mb3J0X2xhdGl0dWRlGAQgASgBEhYKDmZv",
+            "cnRfbG9uZ2l0dWRlGAUgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortSearchMessage), global::POGOProtos.Networking.Requests.Messages.FortSearchMessage.Parser, new[]{ "FortId", "PlayerLatitude", "PlayerLongitude", "FortLatitude", "FortLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortSearchMessage : pb::IMessage<FortSearchMessage> {
+    private static readonly pb::MessageParser<FortSearchMessage> _parser = new pb::MessageParser<FortSearchMessage>(() => new FortSearchMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSearchMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.FortSearchMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchMessage(FortSearchMessage other) : this() {
+      fortId_ = other.fortId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+      fortLatitude_ = other.fortLatitude_;
+      fortLongitude_ = other.fortLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchMessage Clone() {
+      return new FortSearchMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 2;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 3;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_latitude" field.</summary>
+    public const int FortLatitudeFieldNumber = 4;
+    private double fortLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double FortLatitude {
+      get { return fortLatitude_; }
+      set {
+        fortLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_longitude" field.</summary>
+    public const int FortLongitudeFieldNumber = 5;
+    private double fortLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double FortLongitude {
+      get { return fortLongitude_; }
+      set {
+        fortLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSearchMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSearchMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      if (FortLatitude != other.FortLatitude) return false;
+      if (FortLongitude != other.FortLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      if (FortLatitude != 0D) hash ^= FortLatitude.GetHashCode();
+      if (FortLongitude != 0D) hash ^= FortLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLongitude);
+      }
+      if (FortLatitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(FortLatitude);
+      }
+      if (FortLongitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(FortLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      if (FortLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (FortLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSearchMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+      if (other.FortLatitude != 0D) {
+        FortLatitude = other.FortLatitude;
+      }
+      if (other.FortLongitude != 0D) {
+        FortLongitude = other.FortLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            FortLatitude = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            FortLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.cs
new file mode 100644
index 0000000..d996871
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.cs
@@ -0,0 +1,275 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.proto</summary>
+  public static partial class GetAssetDigestMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetAssetDigestMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetAssetDigestMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "QXNzZXREaWdlc3RNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMaH1BPR09Qcm90b3MvRW51bXMvUGxhdGZv",
+            "cm0ucHJvdG8inQEKFUdldEFzc2V0RGlnZXN0TWVzc2FnZRIsCghwbGF0Zm9y",
+            "bRgBIAEoDjIaLlBPR09Qcm90b3MuRW51bXMuUGxhdGZvcm0SGwoTZGV2aWNl",
+            "X21hbnVmYWN0dXJlchgCIAEoCRIUCgxkZXZpY2VfbW9kZWwYAyABKAkSDgoG",
+            "bG9jYWxlGAQgASgJEhMKC2FwcF92ZXJzaW9uGAUgASgNYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PlatformReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetAssetDigestMessage), global::POGOProtos.Networking.Requests.Messages.GetAssetDigestMessage.Parser, new[]{ "Platform", "DeviceManufacturer", "DeviceModel", "Locale", "AppVersion" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetAssetDigestMessage : pb::IMessage<GetAssetDigestMessage> {
+    private static readonly pb::MessageParser<GetAssetDigestMessage> _parser = new pb::MessageParser<GetAssetDigestMessage>(() => new GetAssetDigestMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetAssetDigestMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetAssetDigestMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestMessage(GetAssetDigestMessage other) : this() {
+      platform_ = other.platform_;
+      deviceManufacturer_ = other.deviceManufacturer_;
+      deviceModel_ = other.deviceModel_;
+      locale_ = other.locale_;
+      appVersion_ = other.appVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestMessage Clone() {
+      return new GetAssetDigestMessage(this);
+    }
+
+    /// <summary>Field number for the "platform" field.</summary>
+    public const int PlatformFieldNumber = 1;
+    private global::POGOProtos.Enums.Platform platform_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.Platform Platform {
+      get { return platform_; }
+      set {
+        platform_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "device_manufacturer" field.</summary>
+    public const int DeviceManufacturerFieldNumber = 2;
+    private string deviceManufacturer_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceManufacturer {
+      get { return deviceManufacturer_; }
+      set {
+        deviceManufacturer_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "device_model" field.</summary>
+    public const int DeviceModelFieldNumber = 3;
+    private string deviceModel_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceModel {
+      get { return deviceModel_; }
+      set {
+        deviceModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "locale" field.</summary>
+    public const int LocaleFieldNumber = 4;
+    private string locale_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Locale {
+      get { return locale_; }
+      set {
+        locale_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "app_version" field.</summary>
+    public const int AppVersionFieldNumber = 5;
+    private uint appVersion_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint AppVersion {
+      get { return appVersion_; }
+      set {
+        appVersion_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetAssetDigestMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetAssetDigestMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Platform != other.Platform) return false;
+      if (DeviceManufacturer != other.DeviceManufacturer) return false;
+      if (DeviceModel != other.DeviceModel) return false;
+      if (Locale != other.Locale) return false;
+      if (AppVersion != other.AppVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Platform != 0) hash ^= Platform.GetHashCode();
+      if (DeviceManufacturer.Length != 0) hash ^= DeviceManufacturer.GetHashCode();
+      if (DeviceModel.Length != 0) hash ^= DeviceModel.GetHashCode();
+      if (Locale.Length != 0) hash ^= Locale.GetHashCode();
+      if (AppVersion != 0) hash ^= AppVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Platform != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Locale);
+      }
+      if (AppVersion != 0) {
+        output.WriteRawTag(40);
+        output.WriteUInt32(AppVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Platform != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Locale);
+      }
+      if (AppVersion != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt32Size(AppVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetAssetDigestMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Platform != 0) {
+        Platform = other.Platform;
+      }
+      if (other.DeviceManufacturer.Length != 0) {
+        DeviceManufacturer = other.DeviceManufacturer;
+      }
+      if (other.DeviceModel.Length != 0) {
+        DeviceModel = other.DeviceModel;
+      }
+      if (other.Locale.Length != 0) {
+        Locale = other.Locale;
+      }
+      if (other.AppVersion != 0) {
+        AppVersion = other.AppVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            platform_ = (global::POGOProtos.Enums.Platform) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            DeviceManufacturer = input.ReadString();
+            break;
+          }
+          case 26: {
+            DeviceModel = input.ReadString();
+            break;
+          }
+          case 34: {
+            Locale = input.ReadString();
+            break;
+          }
+          case 40: {
+            AppVersion = input.ReadUInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.cs
new file mode 100644
index 0000000..7ed025e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.cs
@@ -0,0 +1,155 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.proto</summary>
+  public static partial class GetDownloadUrlsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetDownloadUrlsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetDownloadUrlsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkRQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "RG93bmxvYWRVcmxzTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlcXVlc3RzLk1lc3NhZ2VzIioKFkdldERvd25sb2FkVXJsc01lc3Nh",
+            "Z2USEAoIYXNzZXRfaWQYASADKAliBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetDownloadUrlsMessage), global::POGOProtos.Networking.Requests.Messages.GetDownloadUrlsMessage.Parser, new[]{ "AssetId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  UNTESTED
+  /// </summary>
+  public sealed partial class GetDownloadUrlsMessage : pb::IMessage<GetDownloadUrlsMessage> {
+    private static readonly pb::MessageParser<GetDownloadUrlsMessage> _parser = new pb::MessageParser<GetDownloadUrlsMessage>(() => new GetDownloadUrlsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetDownloadUrlsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetDownloadUrlsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsMessage(GetDownloadUrlsMessage other) : this() {
+      assetId_ = other.assetId_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsMessage Clone() {
+      return new GetDownloadUrlsMessage(this);
+    }
+
+    /// <summary>Field number for the "asset_id" field.</summary>
+    public const int AssetIdFieldNumber = 1;
+    private static readonly pb::FieldCodec<string> _repeated_assetId_codec
+        = pb::FieldCodec.ForString(10);
+    private readonly pbc::RepeatedField<string> assetId_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> AssetId {
+      get { return assetId_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetDownloadUrlsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetDownloadUrlsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!assetId_.Equals(other.assetId_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= assetId_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      assetId_.WriteTo(output, _repeated_assetId_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += assetId_.CalculateSize(_repeated_assetId_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetDownloadUrlsMessage other) {
+      if (other == null) {
+        return;
+      }
+      assetId_.Add(other.assetId_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            assetId_.AddEntriesFrom(input, _repeated_assetId_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.cs
new file mode 100644
index 0000000..320e5b0
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.proto</summary>
+  public static partial class GetGymDetailsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetGymDetailsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetGymDetailsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "R3ltRGV0YWlsc01lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcyKGAQoUR2V0R3ltRGV0YWlsc01lc3NhZ2US",
+            "DgoGZ3ltX2lkGAEgASgJEhcKD3BsYXllcl9sYXRpdHVkZRgCIAEoARIYChBw",
+            "bGF5ZXJfbG9uZ2l0dWRlGAMgASgBEhQKDGd5bV9sYXRpdHVkZRgEIAEoARIV",
+            "Cg1neW1fbG9uZ2l0dWRlGAUgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetGymDetailsMessage), global::POGOProtos.Networking.Requests.Messages.GetGymDetailsMessage.Parser, new[]{ "GymId", "PlayerLatitude", "PlayerLongitude", "GymLatitude", "GymLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetGymDetailsMessage : pb::IMessage<GetGymDetailsMessage> {
+    private static readonly pb::MessageParser<GetGymDetailsMessage> _parser = new pb::MessageParser<GetGymDetailsMessage>(() => new GetGymDetailsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetGymDetailsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetGymDetailsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsMessage(GetGymDetailsMessage other) : this() {
+      gymId_ = other.gymId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+      gymLatitude_ = other.gymLatitude_;
+      gymLongitude_ = other.gymLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsMessage Clone() {
+      return new GetGymDetailsMessage(this);
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 1;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 2;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 3;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_latitude" field.</summary>
+    public const int GymLatitudeFieldNumber = 4;
+    private double gymLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double GymLatitude {
+      get { return gymLatitude_; }
+      set {
+        gymLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_longitude" field.</summary>
+    public const int GymLongitudeFieldNumber = 5;
+    private double gymLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double GymLongitude {
+      get { return gymLongitude_; }
+      set {
+        gymLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetGymDetailsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetGymDetailsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (GymId != other.GymId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      if (GymLatitude != other.GymLatitude) return false;
+      if (GymLongitude != other.GymLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      if (GymLatitude != 0D) hash ^= GymLatitude.GetHashCode();
+      if (GymLongitude != 0D) hash ^= GymLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (GymId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLongitude);
+      }
+      if (GymLatitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(GymLatitude);
+      }
+      if (GymLongitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(GymLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      if (GymLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (GymLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetGymDetailsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+      if (other.GymLatitude != 0D) {
+        GymLatitude = other.GymLatitude;
+      }
+      if (other.GymLongitude != 0D) {
+        GymLongitude = other.GymLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            GymLatitude = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            GymLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.cs
new file mode 100644
index 0000000..f86f9a6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.proto</summary>
+  public static partial class GetHatchedEggsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetHatchedEggsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetHatchedEggsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "SGF0Y2hlZEVnZ3NNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMiFwoVR2V0SGF0Y2hlZEVnZ3NNZXNzYWdl",
+            "YgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetHatchedEggsMessage), global::POGOProtos.Networking.Requests.Messages.GetHatchedEggsMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class GetHatchedEggsMessage : pb::IMessage<GetHatchedEggsMessage> {
+    private static readonly pb::MessageParser<GetHatchedEggsMessage> _parser = new pb::MessageParser<GetHatchedEggsMessage>(() => new GetHatchedEggsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetHatchedEggsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetHatchedEggsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsMessage(GetHatchedEggsMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsMessage Clone() {
+      return new GetHatchedEggsMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetHatchedEggsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetHatchedEggsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetHatchedEggsMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.cs
new file mode 100644
index 0000000..cab58bd
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.proto</summary>
+  public static partial class GetIncensePokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetIncensePokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetIncensePokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkZQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "SW5jZW5zZVBva2Vtb25NZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdv",
+            "cmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMiTQoYR2V0SW5jZW5zZVBva2Vtb25N",
+            "ZXNzYWdlEhcKD3BsYXllcl9sYXRpdHVkZRgBIAEoARIYChBwbGF5ZXJfbG9u",
+            "Z2l0dWRlGAIgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetIncensePokemonMessage), global::POGOProtos.Networking.Requests.Messages.GetIncensePokemonMessage.Parser, new[]{ "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetIncensePokemonMessage : pb::IMessage<GetIncensePokemonMessage> {
+    private static readonly pb::MessageParser<GetIncensePokemonMessage> _parser = new pb::MessageParser<GetIncensePokemonMessage>(() => new GetIncensePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetIncensePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetIncensePokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonMessage(GetIncensePokemonMessage other) : this() {
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonMessage Clone() {
+      return new GetIncensePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 1;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 2;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetIncensePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetIncensePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetIncensePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 17: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetInventoryMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetInventoryMessage.cs
new file mode 100644
index 0000000..575ed9d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetInventoryMessage.cs
@@ -0,0 +1,192 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetInventoryMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetInventoryMessage.proto</summary>
+  public static partial class GetInventoryMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetInventoryMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetInventoryMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkFQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "SW52ZW50b3J5TWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5n",
+            "LlJlcXVlc3RzLk1lc3NhZ2VzIkgKE0dldEludmVudG9yeU1lc3NhZ2USGQoR",
+            "bGFzdF90aW1lc3RhbXBfbXMYASABKAMSFgoOaXRlbV9iZWVuX3NlZW4YAiAB",
+            "KAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetInventoryMessage), global::POGOProtos.Networking.Requests.Messages.GetInventoryMessage.Parser, new[]{ "LastTimestampMs", "ItemBeenSeen" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetInventoryMessage : pb::IMessage<GetInventoryMessage> {
+    private static readonly pb::MessageParser<GetInventoryMessage> _parser = new pb::MessageParser<GetInventoryMessage>(() => new GetInventoryMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetInventoryMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetInventoryMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryMessage(GetInventoryMessage other) : this() {
+      lastTimestampMs_ = other.lastTimestampMs_;
+      itemBeenSeen_ = other.itemBeenSeen_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryMessage Clone() {
+      return new GetInventoryMessage(this);
+    }
+
+    /// <summary>Field number for the "last_timestamp_ms" field.</summary>
+    public const int LastTimestampMsFieldNumber = 1;
+    private long lastTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastTimestampMs {
+      get { return lastTimestampMs_; }
+      set {
+        lastTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_been_seen" field.</summary>
+    public const int ItemBeenSeenFieldNumber = 2;
+    private int itemBeenSeen_;
+    /// <summary>
+    ///  TODO: Find out what this is.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ItemBeenSeen {
+      get { return itemBeenSeen_; }
+      set {
+        itemBeenSeen_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetInventoryMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetInventoryMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (LastTimestampMs != other.LastTimestampMs) return false;
+      if (ItemBeenSeen != other.ItemBeenSeen) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (LastTimestampMs != 0L) hash ^= LastTimestampMs.GetHashCode();
+      if (ItemBeenSeen != 0) hash ^= ItemBeenSeen.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (LastTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(LastTimestampMs);
+      }
+      if (ItemBeenSeen != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(ItemBeenSeen);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (LastTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastTimestampMs);
+      }
+      if (ItemBeenSeen != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ItemBeenSeen);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetInventoryMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.LastTimestampMs != 0L) {
+        LastTimestampMs = other.LastTimestampMs;
+      }
+      if (other.ItemBeenSeen != 0) {
+        ItemBeenSeen = other.ItemBeenSeen;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            LastTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            ItemBeenSeen = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.cs
new file mode 100644
index 0000000..9ded9c8
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.cs
@@ -0,0 +1,232 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.proto</summary>
+  public static partial class GetMapObjectsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetMapObjectsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetMapObjectsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "TWFwT2JqZWN0c01lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcyJwChRHZXRNYXBPYmplY3RzTWVzc2FnZRIT",
+            "CgdjZWxsX2lkGAEgAygEQgIQARIeChJzaW5jZV90aW1lc3RhbXBfbXMYAiAD",
+            "KANCAhABEhAKCGxhdGl0dWRlGAMgASgBEhEKCWxvbmdpdHVkZRgEIAEoAWIG",
+            "cHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetMapObjectsMessage), global::POGOProtos.Networking.Requests.Messages.GetMapObjectsMessage.Parser, new[]{ "CellId", "SinceTimestampMs", "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetMapObjectsMessage : pb::IMessage<GetMapObjectsMessage> {
+    private static readonly pb::MessageParser<GetMapObjectsMessage> _parser = new pb::MessageParser<GetMapObjectsMessage>(() => new GetMapObjectsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetMapObjectsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetMapObjectsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsMessage(GetMapObjectsMessage other) : this() {
+      cellId_ = other.cellId_.Clone();
+      sinceTimestampMs_ = other.sinceTimestampMs_.Clone();
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsMessage Clone() {
+      return new GetMapObjectsMessage(this);
+    }
+
+    /// <summary>Field number for the "cell_id" field.</summary>
+    public const int CellIdFieldNumber = 1;
+    private static readonly pb::FieldCodec<ulong> _repeated_cellId_codec
+        = pb::FieldCodec.ForUInt64(10);
+    private readonly pbc::RepeatedField<ulong> cellId_ = new pbc::RepeatedField<ulong>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<ulong> CellId {
+      get { return cellId_; }
+    }
+
+    /// <summary>Field number for the "since_timestamp_ms" field.</summary>
+    public const int SinceTimestampMsFieldNumber = 2;
+    private static readonly pb::FieldCodec<long> _repeated_sinceTimestampMs_codec
+        = pb::FieldCodec.ForInt64(18);
+    private readonly pbc::RepeatedField<long> sinceTimestampMs_ = new pbc::RepeatedField<long>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<long> SinceTimestampMs {
+      get { return sinceTimestampMs_; }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetMapObjectsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetMapObjectsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!cellId_.Equals(other.cellId_)) return false;
+      if(!sinceTimestampMs_.Equals(other.sinceTimestampMs_)) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= cellId_.GetHashCode();
+      hash ^= sinceTimestampMs_.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      cellId_.WriteTo(output, _repeated_cellId_codec);
+      sinceTimestampMs_.WriteTo(output, _repeated_sinceTimestampMs_codec);
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += cellId_.CalculateSize(_repeated_cellId_codec);
+      size += sinceTimestampMs_.CalculateSize(_repeated_sinceTimestampMs_codec);
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetMapObjectsMessage other) {
+      if (other == null) {
+        return;
+      }
+      cellId_.Add(other.cellId_);
+      sinceTimestampMs_.Add(other.sinceTimestampMs_);
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            cellId_.AddEntriesFrom(input, _repeated_cellId_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            sinceTimestampMs_.AddEntriesFrom(input, _repeated_sinceTimestampMs_codec);
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerMessage.cs
new file mode 100644
index 0000000..51b0cdb
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerMessage.cs
@@ -0,0 +1,163 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetPlayerMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetPlayerMessage.proto</summary>
+  public static partial class GetPlayerMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetPlayerMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetPlayerMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "UGxheWVyTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "cXVlc3RzLk1lc3NhZ2VzIicKEEdldFBsYXllck1lc3NhZ2USEwoLYXBwX3Zl",
+            "cnNpb24YASABKAliBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetPlayerMessage), global::POGOProtos.Networking.Requests.Messages.GetPlayerMessage.Parser, new[]{ "AppVersion" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetPlayerMessage : pb::IMessage<GetPlayerMessage> {
+    private static readonly pb::MessageParser<GetPlayerMessage> _parser = new pb::MessageParser<GetPlayerMessage>(() => new GetPlayerMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetPlayerMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerMessage(GetPlayerMessage other) : this() {
+      appVersion_ = other.appVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerMessage Clone() {
+      return new GetPlayerMessage(this);
+    }
+
+    /// <summary>Field number for the "app_version" field.</summary>
+    public const int AppVersionFieldNumber = 1;
+    private string appVersion_ = "";
+    /// <summary>
+    ///  Human readable app version, e.g. "0.31.1"
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string AppVersion {
+      get { return appVersion_; }
+      set {
+        appVersion_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AppVersion != other.AppVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AppVersion.Length != 0) hash ^= AppVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AppVersion.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(AppVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AppVersion.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(AppVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AppVersion.Length != 0) {
+        AppVersion = other.AppVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            AppVersion = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.cs
new file mode 100644
index 0000000..1e7a8c0
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.proto</summary>
+  public static partial class GetPlayerProfileMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetPlayerProfileMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetPlayerProfileMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkVQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "UGxheWVyUHJvZmlsZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29y",
+            "a2luZy5SZXF1ZXN0cy5NZXNzYWdlcyIuChdHZXRQbGF5ZXJQcm9maWxlTWVz",
+            "c2FnZRITCgtwbGF5ZXJfbmFtZRgBIAEoCWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetPlayerProfileMessage), global::POGOProtos.Networking.Requests.Messages.GetPlayerProfileMessage.Parser, new[]{ "PlayerName" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetPlayerProfileMessage : pb::IMessage<GetPlayerProfileMessage> {
+    private static readonly pb::MessageParser<GetPlayerProfileMessage> _parser = new pb::MessageParser<GetPlayerProfileMessage>(() => new GetPlayerProfileMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerProfileMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetPlayerProfileMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileMessage(GetPlayerProfileMessage other) : this() {
+      playerName_ = other.playerName_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileMessage Clone() {
+      return new GetPlayerProfileMessage(this);
+    }
+
+    /// <summary>Field number for the "player_name" field.</summary>
+    public const int PlayerNameFieldNumber = 1;
+    private string playerName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string PlayerName {
+      get { return playerName_; }
+      set {
+        playerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerProfileMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerProfileMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PlayerName != other.PlayerName) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PlayerName.Length != 0) hash ^= PlayerName.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PlayerName.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(PlayerName);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PlayerName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(PlayerName);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerProfileMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PlayerName.Length != 0) {
+        PlayerName = other.PlayerName;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            PlayerName = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.cs
new file mode 100644
index 0000000..6aa8b3a
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.proto</summary>
+  public static partial class GetSuggestedCodenamesMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/GetSuggestedCodenamesMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetSuggestedCodenamesMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkpQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvR2V0",
+            "U3VnZ2VzdGVkQ29kZW5hbWVzTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5O",
+            "ZXR3b3JraW5nLlJlcXVlc3RzLk1lc3NhZ2VzIh4KHEdldFN1Z2dlc3RlZENv",
+            "ZGVuYW1lc01lc3NhZ2ViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetSuggestedCodenamesMessage), global::POGOProtos.Networking.Requests.Messages.GetSuggestedCodenamesMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class GetSuggestedCodenamesMessage : pb::IMessage<GetSuggestedCodenamesMessage> {
+    private static readonly pb::MessageParser<GetSuggestedCodenamesMessage> _parser = new pb::MessageParser<GetSuggestedCodenamesMessage>(() => new GetSuggestedCodenamesMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetSuggestedCodenamesMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.GetSuggestedCodenamesMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesMessage(GetSuggestedCodenamesMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesMessage Clone() {
+      return new GetSuggestedCodenamesMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetSuggestedCodenamesMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetSuggestedCodenamesMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetSuggestedCodenamesMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.cs
new file mode 100644
index 0000000..6d4708b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.proto</summary>
+  public static partial class IncenseEncounterMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/IncenseEncounterMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static IncenseEncounterMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkVQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvSW5j",
+            "ZW5zZUVuY291bnRlck1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29y",
+            "a2luZy5SZXF1ZXN0cy5NZXNzYWdlcyJLChdJbmNlbnNlRW5jb3VudGVyTWVz",
+            "c2FnZRIUCgxlbmNvdW50ZXJfaWQYASABKAQSGgoSZW5jb3VudGVyX2xvY2F0",
+            "aW9uGAIgASgJYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.IncenseEncounterMessage), global::POGOProtos.Networking.Requests.Messages.IncenseEncounterMessage.Parser, new[]{ "EncounterId", "EncounterLocation" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class IncenseEncounterMessage : pb::IMessage<IncenseEncounterMessage> {
+    private static readonly pb::MessageParser<IncenseEncounterMessage> _parser = new pb::MessageParser<IncenseEncounterMessage>(() => new IncenseEncounterMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IncenseEncounterMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.IncenseEncounterMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterMessage(IncenseEncounterMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      encounterLocation_ = other.encounterLocation_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterMessage Clone() {
+      return new IncenseEncounterMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_location" field.</summary>
+    public const int EncounterLocationFieldNumber = 2;
+    private string encounterLocation_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string EncounterLocation {
+      get { return encounterLocation_; }
+      set {
+        encounterLocation_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IncenseEncounterMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IncenseEncounterMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (EncounterLocation != other.EncounterLocation) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (EncounterLocation.Length != 0) hash ^= EncounterLocation.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(EncounterId);
+      }
+      if (EncounterLocation.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(EncounterLocation);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(EncounterId);
+      }
+      if (EncounterLocation.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(EncounterLocation);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IncenseEncounterMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.EncounterLocation.Length != 0) {
+        EncounterLocation = other.EncounterLocation;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            EncounterId = input.ReadUInt64();
+            break;
+          }
+          case 18: {
+            EncounterLocation = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.cs
new file mode 100644
index 0000000..8f1dffa
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.proto</summary>
+  public static partial class LevelUpRewardsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/LevelUpRewardsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static LevelUpRewardsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvTGV2",
+            "ZWxVcFJld2FyZHNNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMiJgoVTGV2ZWxVcFJld2FyZHNNZXNzYWdl",
+            "Eg0KBWxldmVsGAEgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.LevelUpRewardsMessage), global::POGOProtos.Networking.Requests.Messages.LevelUpRewardsMessage.Parser, new[]{ "Level" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class LevelUpRewardsMessage : pb::IMessage<LevelUpRewardsMessage> {
+    private static readonly pb::MessageParser<LevelUpRewardsMessage> _parser = new pb::MessageParser<LevelUpRewardsMessage>(() => new LevelUpRewardsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<LevelUpRewardsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.LevelUpRewardsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsMessage(LevelUpRewardsMessage other) : this() {
+      level_ = other.level_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsMessage Clone() {
+      return new LevelUpRewardsMessage(this);
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 1;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as LevelUpRewardsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(LevelUpRewardsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Level != other.Level) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Level != 0) hash ^= Level.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Level != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Level);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(LevelUpRewardsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Level = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.cs
new file mode 100644
index 0000000..cbd3fcc
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.cs
@@ -0,0 +1,213 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.proto</summary>
+  public static partial class MarkTutorialCompleteMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/MarkTutorialCompleteMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MarkTutorialCompleteMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CklQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvTWFy",
+            "a1R1dG9yaWFsQ29tcGxldGVNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5l",
+            "dHdvcmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMaJFBPR09Qcm90b3MvRW51bXMv",
+            "VHV0b3JpYWxTdGF0ZS5wcm90byKbAQobTWFya1R1dG9yaWFsQ29tcGxldGVN",
+            "ZXNzYWdlEjwKE3R1dG9yaWFsc19jb21wbGV0ZWQYASADKA4yHy5QT0dPUHJv",
+            "dG9zLkVudW1zLlR1dG9yaWFsU3RhdGUSHQoVc2VuZF9tYXJrZXRpbmdfZW1h",
+            "aWxzGAIgASgIEh8KF3NlbmRfcHVzaF9ub3RpZmljYXRpb25zGAMgASgIYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.TutorialStateReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.MarkTutorialCompleteMessage), global::POGOProtos.Networking.Requests.Messages.MarkTutorialCompleteMessage.Parser, new[]{ "TutorialsCompleted", "SendMarketingEmails", "SendPushNotifications" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MarkTutorialCompleteMessage : pb::IMessage<MarkTutorialCompleteMessage> {
+    private static readonly pb::MessageParser<MarkTutorialCompleteMessage> _parser = new pb::MessageParser<MarkTutorialCompleteMessage>(() => new MarkTutorialCompleteMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MarkTutorialCompleteMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.MarkTutorialCompleteMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteMessage(MarkTutorialCompleteMessage other) : this() {
+      tutorialsCompleted_ = other.tutorialsCompleted_.Clone();
+      sendMarketingEmails_ = other.sendMarketingEmails_;
+      sendPushNotifications_ = other.sendPushNotifications_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteMessage Clone() {
+      return new MarkTutorialCompleteMessage(this);
+    }
+
+    /// <summary>Field number for the "tutorials_completed" field.</summary>
+    public const int TutorialsCompletedFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.TutorialState> _repeated_tutorialsCompleted_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Enums.TutorialState) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> tutorialsCompleted_ = new pbc::RepeatedField<global::POGOProtos.Enums.TutorialState>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> TutorialsCompleted {
+      get { return tutorialsCompleted_; }
+    }
+
+    /// <summary>Field number for the "send_marketing_emails" field.</summary>
+    public const int SendMarketingEmailsFieldNumber = 2;
+    private bool sendMarketingEmails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendMarketingEmails {
+      get { return sendMarketingEmails_; }
+      set {
+        sendMarketingEmails_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "send_push_notifications" field.</summary>
+    public const int SendPushNotificationsFieldNumber = 3;
+    private bool sendPushNotifications_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendPushNotifications {
+      get { return sendPushNotifications_; }
+      set {
+        sendPushNotifications_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MarkTutorialCompleteMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MarkTutorialCompleteMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!tutorialsCompleted_.Equals(other.tutorialsCompleted_)) return false;
+      if (SendMarketingEmails != other.SendMarketingEmails) return false;
+      if (SendPushNotifications != other.SendPushNotifications) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= tutorialsCompleted_.GetHashCode();
+      if (SendMarketingEmails != false) hash ^= SendMarketingEmails.GetHashCode();
+      if (SendPushNotifications != false) hash ^= SendPushNotifications.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      tutorialsCompleted_.WriteTo(output, _repeated_tutorialsCompleted_codec);
+      if (SendMarketingEmails != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(SendMarketingEmails);
+      }
+      if (SendPushNotifications != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(SendPushNotifications);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += tutorialsCompleted_.CalculateSize(_repeated_tutorialsCompleted_codec);
+      if (SendMarketingEmails != false) {
+        size += 1 + 1;
+      }
+      if (SendPushNotifications != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MarkTutorialCompleteMessage other) {
+      if (other == null) {
+        return;
+      }
+      tutorialsCompleted_.Add(other.tutorialsCompleted_);
+      if (other.SendMarketingEmails != false) {
+        SendMarketingEmails = other.SendMarketingEmails;
+      }
+      if (other.SendPushNotifications != false) {
+        SendPushNotifications = other.SendPushNotifications;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            tutorialsCompleted_.AddEntriesFrom(input, _repeated_tutorialsCompleted_codec);
+            break;
+          }
+          case 16: {
+            SendMarketingEmails = input.ReadBool();
+            break;
+          }
+          case 24: {
+            SendPushNotifications = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.cs
new file mode 100644
index 0000000..9fedd82
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.proto</summary>
+  public static partial class NicknamePokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/NicknamePokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static NicknamePokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkRQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvTmlj",
+            "a25hbWVQb2tlbW9uTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlcXVlc3RzLk1lc3NhZ2VzIj4KFk5pY2tuYW1lUG9rZW1vbk1lc3Nh",
+            "Z2USEgoKcG9rZW1vbl9pZBgBIAEoBhIQCghuaWNrbmFtZRgCIAEoCWIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.NicknamePokemonMessage), global::POGOProtos.Networking.Requests.Messages.NicknamePokemonMessage.Parser, new[]{ "PokemonId", "Nickname" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class NicknamePokemonMessage : pb::IMessage<NicknamePokemonMessage> {
+    private static readonly pb::MessageParser<NicknamePokemonMessage> _parser = new pb::MessageParser<NicknamePokemonMessage>(() => new NicknamePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<NicknamePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.NicknamePokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonMessage(NicknamePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+      nickname_ = other.nickname_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonMessage Clone() {
+      return new NicknamePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "nickname" field.</summary>
+    public const int NicknameFieldNumber = 2;
+    private string nickname_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Nickname {
+      get { return nickname_; }
+      set {
+        nickname_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as NicknamePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(NicknamePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (Nickname != other.Nickname) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (Nickname.Length != 0) hash ^= Nickname.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+      if (Nickname.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Nickname);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (Nickname.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Nickname);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(NicknamePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.Nickname.Length != 0) {
+        Nickname = other.Nickname;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+          case 18: {
+            Nickname = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/POGOProtosNetworkingRequestsMessages.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/POGOProtosNetworkingRequestsMessages.cs
new file mode 100644
index 0000000..0e19434
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/POGOProtosNetworkingRequestsMessages.cs
@@ -0,0 +1,7968 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Networking.Requests.Messages.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Networking.Requests.Messages.proto</summary>
+  public static partial class POGOProtosNetworkingRequestsMessagesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Networking.Requests.Messages.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosNetworkingRequestsMessagesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci1QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMucHJv",
+            "dG8SJ1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXF1ZXN0cy5NZXNzYWdlcxof",
+            "UE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5wcm90bxoWUE9HT1Byb3Rvcy5F",
+            "bnVtcy5wcm90bxocUE9HT1Byb3Rvcy5EYXRhLkJhdHRsZS5wcm90bxocUE9H",
+            "T1Byb3Rvcy5EYXRhLlBsYXllci5wcm90byJyChhGb3J0UmVjYWxsUG9rZW1v",
+            "bk1lc3NhZ2USDwoHZm9ydF9pZBgBIAEoCRISCgpwb2tlbW9uX2lkGAIgASgG",
+            "EhcKD3BsYXllcl9sYXRpdHVkZRgDIAEoARIYChBwbGF5ZXJfbG9uZ2l0dWRl",
+            "GAQgASgBIl4KFFVzZUl0ZW1Qb3Rpb25NZXNzYWdlEjIKB2l0ZW1faWQYASAB",
+            "KA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1JZBISCgpwb2tl",
+            "bW9uX2lkGAIgASgGIk0KGEdldEluY2Vuc2VQb2tlbW9uTWVzc2FnZRIXCg9w",
+            "bGF5ZXJfbGF0aXR1ZGUYASABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgCIAEo",
+            "ASIiCiBDb2xsZWN0RGFpbHlEZWZlbmRlckJvbnVzTWVzc2FnZSInChdEb3du",
+            "bG9hZFNldHRpbmdzTWVzc2FnZRIMCgRoYXNoGAEgASgJIkoKEkZvcnREZXRh",
+            "aWxzTWVzc2FnZRIPCgdmb3J0X2lkGAEgASgJEhAKCGxhdGl0dWRlGAIgASgB",
+            "EhEKCWxvbmdpdHVkZRgDIAEoASIuChdHZXRQbGF5ZXJQcm9maWxlTWVzc2Fn",
+            "ZRITCgtwbGF5ZXJfbmFtZRgBIAEoCSIrChVVcGdyYWRlUG9rZW1vbk1lc3Nh",
+            "Z2USEgoKcG9rZW1vbl9pZBgBIAEoBiI6ChNQbGF5ZXJVcGRhdGVNZXNzYWdl",
+            "EhAKCGxhdGl0dWRlGAEgASgBEhEKCWxvbmdpdHVkZRgCIAEoASJEChlTZXRG",
+            "YXZvcml0ZVBva2Vtb25NZXNzYWdlEhIKCnBva2Vtb25faWQYASABKAQSEwoL",
+            "aXNfZmF2b3JpdGUYAiABKAginQEKFUdldEFzc2V0RGlnZXN0TWVzc2FnZRIs",
+            "CghwbGF0Zm9ybRgBIAEoDjIaLlBPR09Qcm90b3MuRW51bXMuUGxhdGZvcm0S",
+            "GwoTZGV2aWNlX21hbnVmYWN0dXJlchgCIAEoCRIUCgxkZXZpY2VfbW9kZWwY",
+            "AyABKAkSDgoGbG9jYWxlGAQgASgJEhMKC2FwcF92ZXJzaW9uGAUgASgNIpYB",
+            "ChZBZGRGb3J0TW9kaWZpZXJNZXNzYWdlEjgKDW1vZGlmaWVyX3R5cGUYASAB",
+            "KA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1JZBIPCgdmb3J0",
+            "X2lkGAIgASgJEhcKD3BsYXllcl9sYXRpdHVkZRgDIAEoARIYChBwbGF5ZXJf",
+            "bG9uZ2l0dWRlGAQgASgBIkgKE0dldEludmVudG9yeU1lc3NhZ2USGQoRbGFz",
+            "dF90aW1lc3RhbXBfbXMYASABKAMSFgoOaXRlbV9iZWVuX3NlZW4YAiABKAUi",
+            "cgoYRm9ydERlcGxveVBva2Vtb25NZXNzYWdlEg8KB2ZvcnRfaWQYASABKAkS",
+            "EgoKcG9rZW1vbl9pZBgCIAEoBhIXCg9wbGF5ZXJfbGF0aXR1ZGUYAyABKAES",
+            "GAoQcGxheWVyX2xvbmdpdHVkZRgEIAEoASKGAQoRRm9ydFNlYXJjaE1lc3Nh",
+            "Z2USDwoHZm9ydF9pZBgBIAEoCRIXCg9wbGF5ZXJfbGF0aXR1ZGUYAiABKAES",
+            "GAoQcGxheWVyX2xvbmdpdHVkZRgDIAEoARIVCg1mb3J0X2xhdGl0dWRlGAQg",
+            "ASgBEhYKDmZvcnRfbG9uZ2l0dWRlGAUgASgBIksKFVVzZUl0ZW1YcEJvb3N0",
+            "TWVzc2FnZRIyCgdpdGVtX2lkGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRv",
+            "cnkuSXRlbS5JdGVtSWQiUwogRW5jb3VudGVyVHV0b3JpYWxDb21wbGV0ZU1l",
+            "c3NhZ2USLwoKcG9rZW1vbl9pZBgBIAEoDjIbLlBPR09Qcm90b3MuRW51bXMu",
+            "UG9rZW1vbklkIhcKFVNmaWRhQWN0aW9uTG9nTWVzc2FnZSLsAQoQQXR0YWNr",
+            "R3ltTWVzc2FnZRIOCgZneW1faWQYASABKAkSEQoJYmF0dGxlX2lkGAIgASgJ",
+            "EjwKDmF0dGFja19hY3Rpb25zGAMgAygLMiQuUE9HT1Byb3Rvcy5EYXRhLkJh",
+            "dHRsZS5CYXR0bGVBY3Rpb24SRAoWbGFzdF9yZXRyaWV2ZWRfYWN0aW9ucxgE",
+            "IAEoCzIkLlBPR09Qcm90b3MuRGF0YS5CYXR0bGUuQmF0dGxlQWN0aW9uEhcK",
+            "D3BsYXllcl9sYXRpdHVkZRgFIAEoARIYChBwbGF5ZXJfbG9uZ2l0dWRlGAYg",
+            "ASgBIhoKGENvbGxlY3REYWlseUJvbnVzTWVzc2FnZSKKAQoRVXNlSXRlbUd5",
+            "bU1lc3NhZ2USMgoHaXRlbV9pZBgBIAEoDjIhLlBPR09Qcm90b3MuSW52ZW50",
+            "b3J5Lkl0ZW0uSXRlbUlkEg4KBmd5bV9pZBgCIAEoCRIXCg9wbGF5ZXJfbGF0",
+            "aXR1ZGUYAyABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgEIAEoASKXAQoVU3Rh",
+            "cnRHeW1CYXR0bGVNZXNzYWdlEg4KBmd5bV9pZBgBIAEoCRIdChVhdHRhY2tp",
+            "bmdfcG9rZW1vbl9pZHMYAiADKAYSHAoUZGVmZW5kaW5nX3Bva2Vtb25faWQY",
+            "AyABKAYSFwoPcGxheWVyX2xhdGl0dWRlGAQgASgBEhgKEHBsYXllcl9sb25n",
+            "aXR1ZGUYBSABKAEi5gEKE0NhdGNoUG9rZW1vbk1lc3NhZ2USFAoMZW5jb3Vu",
+            "dGVyX2lkGAEgASgGEjMKCHBva2ViYWxsGAIgASgOMiEuUE9HT1Byb3Rvcy5J",
+            "bnZlbnRvcnkuSXRlbS5JdGVtSWQSHwoXbm9ybWFsaXplZF9yZXRpY2xlX3Np",
+            "emUYAyABKAESFgoOc3Bhd25fcG9pbnRfaWQYBCABKAkSEwoLaGl0X3Bva2Vt",
+            "b24YBSABKAgSFQoNc3Bpbl9tb2RpZmllchgGIAEoARIfChdub3JtYWxpemVk",
+            "X2hpdF9wb3NpdGlvbhgHIAEoASJLChdJbmNlbnNlRW5jb3VudGVyTWVzc2Fn",
+            "ZRIUCgxlbmNvdW50ZXJfaWQYASABKAMSGgoSZW5jb3VudGVyX2xvY2F0aW9u",
+            "GAIgASgJIqoBCiJEb3dubG9hZFJlbW90ZUNvbmZpZ1ZlcnNpb25NZXNzYWdl",
+            "EiwKCHBsYXRmb3JtGAEgASgOMhouUE9HT1Byb3Rvcy5FbnVtcy5QbGF0Zm9y",
+            "bRIbChNkZXZpY2VfbWFudWZhY3R1cmVyGAIgASgJEhQKDGRldmljZV9tb2Rl",
+            "bBgDIAEoCRIOCgZsb2NhbGUYBCABKAkSEwoLYXBwX3ZlcnNpb24YBSABKA0i",
+            "XgoZU2V0Q29udGFjdFNldHRpbmdzTWVzc2FnZRJBChBjb250YWN0X3NldHRp",
+            "bmdzGAEgASgLMicuUE9HT1Byb3Rvcy5EYXRhLlBsYXllci5Db250YWN0U2V0",
+            "dGluZ3MiJwoQR2V0UGxheWVyTWVzc2FnZRITCgthcHBfdmVyc2lvbhgBIAEo",
+            "CSJgChtSZWN5Y2xlSW52ZW50b3J5SXRlbU1lc3NhZ2USMgoHaXRlbV9pZBgB",
+            "IAEoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlkEg0KBWNv",
+            "dW50GAIgASgFIioKFEV2b2x2ZVBva2Vtb25NZXNzYWdlEhIKCnBva2Vtb25f",
+            "aWQYASABKAYiQQoUU2V0UGxheWVyVGVhbU1lc3NhZ2USKQoEdGVhbRgBIAEo",
+            "DjIbLlBPR09Qcm90b3MuRW51bXMuVGVhbUNvbG9yIigKFENsYWltQ29kZW5h",
+            "bWVNZXNzYWdlEhAKCGNvZGVuYW1lGAEgASgJIj4KFk5pY2tuYW1lUG9rZW1v",
+            "bk1lc3NhZ2USEgoKcG9rZW1vbl9pZBgBIAEoBhIQCghuaWNrbmFtZRgCIAEo",
+            "CSIxCh1DaGVja0NvZGVuYW1lQXZhaWxhYmxlTWVzc2FnZRIQCghjb2RlbmFt",
+            "ZRgBIAEoCSJwChRHZXRNYXBPYmplY3RzTWVzc2FnZRITCgdjZWxsX2lkGAEg",
+            "AygEQgIQARIeChJzaW5jZV90aW1lc3RhbXBfbXMYAiADKANCAhABEhAKCGxh",
+            "dGl0dWRlGAMgASgBEhEKCWxvbmdpdHVkZRgEIAEoASKGAQoUR2V0R3ltRGV0",
+            "YWlsc01lc3NhZ2USDgoGZ3ltX2lkGAEgASgJEhcKD3BsYXllcl9sYXRpdHVk",
+            "ZRgCIAEoARIYChBwbGF5ZXJfbG9uZ2l0dWRlGAMgASgBEhQKDGd5bV9sYXRp",
+            "dHVkZRgEIAEoARIVCg1neW1fbG9uZ2l0dWRlGAUgASgBIkEKGlVzZUl0ZW1F",
+            "Z2dJbmN1YmF0b3JNZXNzYWdlEg8KB2l0ZW1faWQYASABKAkSEgoKcG9rZW1v",
+            "bl9pZBgCIAEoBCIeChxHZXRTdWdnZXN0ZWRDb2RlbmFtZXNNZXNzYWdlIg0K",
+            "C0VjaG9NZXNzYWdlIkwKEVVzZUluY2Vuc2VNZXNzYWdlEjcKDGluY2Vuc2Vf",
+            "dHlwZRgBIAEoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlk",
+            "IioKFkdldERvd25sb2FkVXJsc01lc3NhZ2USEAoIYXNzZXRfaWQYASADKAki",
+            "JgoVTGV2ZWxVcFJld2FyZHNNZXNzYWdlEg0KBWxldmVsGAEgASgFIhcKFUdl",
+            "dEhhdGNoZWRFZ2dzTWVzc2FnZSJzChBFbmNvdW50ZXJNZXNzYWdlEhQKDGVu",
+            "Y291bnRlcl9pZBgBIAEoBhIWCg5zcGF3bl9wb2ludF9pZBgCIAEoCRIXCg9w",
+            "bGF5ZXJfbGF0aXR1ZGUYAyABKAESGAoQcGxheWVyX2xvbmdpdHVkZRgEIAEo",
+            "ASJwChREaXNrRW5jb3VudGVyTWVzc2FnZRIUCgxlbmNvdW50ZXJfaWQYASAB",
+            "KAQSDwoHZm9ydF9pZBgCIAEoCRIXCg9wbGF5ZXJfbGF0aXR1ZGUYAyABKAES",
+            "GAoQcGxheWVyX2xvbmdpdHVkZRgEIAEoASIbChlDaGVja0F3YXJkZWRCYWRn",
+            "ZXNNZXNzYWdlIh4KHERvd25sb2FkSXRlbVRlbXBsYXRlc01lc3NhZ2UiRAoR",
+            "RXF1aXBCYWRnZU1lc3NhZ2USLwoKYmFkZ2VfdHlwZRgBIAEoDjIbLlBPR09Q",
+            "cm90b3MuRW51bXMuQmFkZ2VUeXBlIl4KFFVzZUl0ZW1SZXZpdmVNZXNzYWdl",
+            "EjIKB2l0ZW1faWQYASABKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVt",
+            "Lkl0ZW1JZBISCgpwb2tlbW9uX2lkGAIgASgGIisKFVJlbGVhc2VQb2tlbW9u",
+            "TWVzc2FnZRISCgpwb2tlbW9uX2lkGAEgASgGInkKFVVzZUl0ZW1DYXB0dXJl",
+            "TWVzc2FnZRIyCgdpdGVtX2lkGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRv",
+            "cnkuSXRlbS5JdGVtSWQSFAoMZW5jb3VudGVyX2lkGAIgASgGEhYKDnNwYXdu",
+            "X3BvaW50X2lkGAMgASgJIpsBChtNYXJrVHV0b3JpYWxDb21wbGV0ZU1lc3Nh",
+            "Z2USPAoTdHV0b3JpYWxzX2NvbXBsZXRlZBgBIAMoDjIfLlBPR09Qcm90b3Mu",
+            "RW51bXMuVHV0b3JpYWxTdGF0ZRIdChVzZW5kX21hcmtldGluZ19lbWFpbHMY",
+            "AiABKAgSHwoXc2VuZF9wdXNoX25vdGlmaWNhdGlvbnMYAyABKAgiTwoQU2V0",
+            "QXZhdGFyTWVzc2FnZRI7Cg1wbGF5ZXJfYXZhdGFyGAIgASgLMiQuUE9HT1By",
+            "b3Rvcy5EYXRhLlBsYXllci5QbGF5ZXJBdmF0YXJQAFABUAJQA2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortRecallPokemonMessage), global::POGOProtos.Networking.Requests.Messages.FortRecallPokemonMessage.Parser, new[]{ "FortId", "PokemonId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemPotionMessage), global::POGOProtos.Networking.Requests.Messages.UseItemPotionMessage.Parser, new[]{ "ItemId", "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetIncensePokemonMessage), global::POGOProtos.Networking.Requests.Messages.GetIncensePokemonMessage.Parser, new[]{ "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CollectDailyDefenderBonusMessage), global::POGOProtos.Networking.Requests.Messages.CollectDailyDefenderBonusMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DownloadSettingsMessage), global::POGOProtos.Networking.Requests.Messages.DownloadSettingsMessage.Parser, new[]{ "Hash" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortDetailsMessage), global::POGOProtos.Networking.Requests.Messages.FortDetailsMessage.Parser, new[]{ "FortId", "Latitude", "Longitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetPlayerProfileMessage), global::POGOProtos.Networking.Requests.Messages.GetPlayerProfileMessage.Parser, new[]{ "PlayerName" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UpgradePokemonMessage), global::POGOProtos.Networking.Requests.Messages.UpgradePokemonMessage.Parser, new[]{ "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.PlayerUpdateMessage), global::POGOProtos.Networking.Requests.Messages.PlayerUpdateMessage.Parser, new[]{ "Latitude", "Longitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetFavoritePokemonMessage), global::POGOProtos.Networking.Requests.Messages.SetFavoritePokemonMessage.Parser, new[]{ "PokemonId", "IsFavorite" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetAssetDigestMessage), global::POGOProtos.Networking.Requests.Messages.GetAssetDigestMessage.Parser, new[]{ "Platform", "DeviceManufacturer", "DeviceModel", "Locale", "AppVersion" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.AddFortModifierMessage), global::POGOProtos.Networking.Requests.Messages.AddFortModifierMessage.Parser, new[]{ "ModifierType", "FortId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetInventoryMessage), global::POGOProtos.Networking.Requests.Messages.GetInventoryMessage.Parser, new[]{ "LastTimestampMs", "ItemBeenSeen" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortDeployPokemonMessage), global::POGOProtos.Networking.Requests.Messages.FortDeployPokemonMessage.Parser, new[]{ "FortId", "PokemonId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.FortSearchMessage), global::POGOProtos.Networking.Requests.Messages.FortSearchMessage.Parser, new[]{ "FortId", "PlayerLatitude", "PlayerLongitude", "FortLatitude", "FortLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemXpBoostMessage), global::POGOProtos.Networking.Requests.Messages.UseItemXpBoostMessage.Parser, new[]{ "ItemId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EncounterTutorialCompleteMessage), global::POGOProtos.Networking.Requests.Messages.EncounterTutorialCompleteMessage.Parser, new[]{ "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SfidaActionLogMessage), global::POGOProtos.Networking.Requests.Messages.SfidaActionLogMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.AttackGymMessage), global::POGOProtos.Networking.Requests.Messages.AttackGymMessage.Parser, new[]{ "GymId", "BattleId", "AttackActions", "LastRetrievedActions", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CollectDailyBonusMessage), global::POGOProtos.Networking.Requests.Messages.CollectDailyBonusMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemGymMessage), global::POGOProtos.Networking.Requests.Messages.UseItemGymMessage.Parser, new[]{ "ItemId", "GymId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.StartGymBattleMessage), global::POGOProtos.Networking.Requests.Messages.StartGymBattleMessage.Parser, new[]{ "GymId", "AttackingPokemonIds", "DefendingPokemonId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CatchPokemonMessage), global::POGOProtos.Networking.Requests.Messages.CatchPokemonMessage.Parser, new[]{ "EncounterId", "Pokeball", "NormalizedReticleSize", "SpawnPointId", "HitPokemon", "SpinModifier", "NormalizedHitPosition" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.IncenseEncounterMessage), global::POGOProtos.Networking.Requests.Messages.IncenseEncounterMessage.Parser, new[]{ "EncounterId", "EncounterLocation" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DownloadRemoteConfigVersionMessage), global::POGOProtos.Networking.Requests.Messages.DownloadRemoteConfigVersionMessage.Parser, new[]{ "Platform", "DeviceManufacturer", "DeviceModel", "Locale", "AppVersion" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetContactSettingsMessage), global::POGOProtos.Networking.Requests.Messages.SetContactSettingsMessage.Parser, new[]{ "ContactSettings" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetPlayerMessage), global::POGOProtos.Networking.Requests.Messages.GetPlayerMessage.Parser, new[]{ "AppVersion" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.RecycleInventoryItemMessage), global::POGOProtos.Networking.Requests.Messages.RecycleInventoryItemMessage.Parser, new[]{ "ItemId", "Count" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EvolvePokemonMessage), global::POGOProtos.Networking.Requests.Messages.EvolvePokemonMessage.Parser, new[]{ "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetPlayerTeamMessage), global::POGOProtos.Networking.Requests.Messages.SetPlayerTeamMessage.Parser, new[]{ "Team" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.ClaimCodenameMessage), global::POGOProtos.Networking.Requests.Messages.ClaimCodenameMessage.Parser, new[]{ "Codename" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.NicknamePokemonMessage), global::POGOProtos.Networking.Requests.Messages.NicknamePokemonMessage.Parser, new[]{ "PokemonId", "Nickname" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CheckCodenameAvailableMessage), global::POGOProtos.Networking.Requests.Messages.CheckCodenameAvailableMessage.Parser, new[]{ "Codename" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetMapObjectsMessage), global::POGOProtos.Networking.Requests.Messages.GetMapObjectsMessage.Parser, new[]{ "CellId", "SinceTimestampMs", "Latitude", "Longitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetGymDetailsMessage), global::POGOProtos.Networking.Requests.Messages.GetGymDetailsMessage.Parser, new[]{ "GymId", "PlayerLatitude", "PlayerLongitude", "GymLatitude", "GymLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemEggIncubatorMessage), global::POGOProtos.Networking.Requests.Messages.UseItemEggIncubatorMessage.Parser, new[]{ "ItemId", "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetSuggestedCodenamesMessage), global::POGOProtos.Networking.Requests.Messages.GetSuggestedCodenamesMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EchoMessage), global::POGOProtos.Networking.Requests.Messages.EchoMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseIncenseMessage), global::POGOProtos.Networking.Requests.Messages.UseIncenseMessage.Parser, new[]{ "IncenseType" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetDownloadUrlsMessage), global::POGOProtos.Networking.Requests.Messages.GetDownloadUrlsMessage.Parser, new[]{ "AssetId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.LevelUpRewardsMessage), global::POGOProtos.Networking.Requests.Messages.LevelUpRewardsMessage.Parser, new[]{ "Level" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.GetHatchedEggsMessage), global::POGOProtos.Networking.Requests.Messages.GetHatchedEggsMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EncounterMessage), global::POGOProtos.Networking.Requests.Messages.EncounterMessage.Parser, new[]{ "EncounterId", "SpawnPointId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DiskEncounterMessage), global::POGOProtos.Networking.Requests.Messages.DiskEncounterMessage.Parser, new[]{ "EncounterId", "FortId", "PlayerLatitude", "PlayerLongitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.CheckAwardedBadgesMessage), global::POGOProtos.Networking.Requests.Messages.CheckAwardedBadgesMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.DownloadItemTemplatesMessage), global::POGOProtos.Networking.Requests.Messages.DownloadItemTemplatesMessage.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.EquipBadgeMessage), global::POGOProtos.Networking.Requests.Messages.EquipBadgeMessage.Parser, new[]{ "BadgeType" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemReviveMessage), global::POGOProtos.Networking.Requests.Messages.UseItemReviveMessage.Parser, new[]{ "ItemId", "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.ReleasePokemonMessage), global::POGOProtos.Networking.Requests.Messages.ReleasePokemonMessage.Parser, new[]{ "PokemonId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemCaptureMessage), global::POGOProtos.Networking.Requests.Messages.UseItemCaptureMessage.Parser, new[]{ "ItemId", "EncounterId", "SpawnPointId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.MarkTutorialCompleteMessage), global::POGOProtos.Networking.Requests.Messages.MarkTutorialCompleteMessage.Parser, new[]{ "TutorialsCompleted", "SendMarketingEmails", "SendPushNotifications" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetAvatarMessage), global::POGOProtos.Networking.Requests.Messages.SetAvatarMessage.Parser, new[]{ "PlayerAvatar" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortRecallPokemonMessage : pb::IMessage<FortRecallPokemonMessage> {
+    private static readonly pb::MessageParser<FortRecallPokemonMessage> _parser = new pb::MessageParser<FortRecallPokemonMessage>(() => new FortRecallPokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortRecallPokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonMessage(FortRecallPokemonMessage other) : this() {
+      fortId_ = other.fortId_;
+      pokemonId_ = other.pokemonId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonMessage Clone() {
+      return new FortRecallPokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortRecallPokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortRecallPokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortRecallPokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemPotionMessage : pb::IMessage<UseItemPotionMessage> {
+    private static readonly pb::MessageParser<UseItemPotionMessage> _parser = new pb::MessageParser<UseItemPotionMessage>(() => new UseItemPotionMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemPotionMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionMessage(UseItemPotionMessage other) : this() {
+      itemId_ = other.itemId_;
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionMessage Clone() {
+      return new UseItemPotionMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemPotionMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemPotionMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemPotionMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetIncensePokemonMessage : pb::IMessage<GetIncensePokemonMessage> {
+    private static readonly pb::MessageParser<GetIncensePokemonMessage> _parser = new pb::MessageParser<GetIncensePokemonMessage>(() => new GetIncensePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetIncensePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonMessage(GetIncensePokemonMessage other) : this() {
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonMessage Clone() {
+      return new GetIncensePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 1;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 2;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetIncensePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetIncensePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetIncensePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 17: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class CollectDailyDefenderBonusMessage : pb::IMessage<CollectDailyDefenderBonusMessage> {
+    private static readonly pb::MessageParser<CollectDailyDefenderBonusMessage> _parser = new pb::MessageParser<CollectDailyDefenderBonusMessage>(() => new CollectDailyDefenderBonusMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyDefenderBonusMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusMessage(CollectDailyDefenderBonusMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusMessage Clone() {
+      return new CollectDailyDefenderBonusMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyDefenderBonusMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyDefenderBonusMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyDefenderBonusMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DownloadSettingsMessage : pb::IMessage<DownloadSettingsMessage> {
+    private static readonly pb::MessageParser<DownloadSettingsMessage> _parser = new pb::MessageParser<DownloadSettingsMessage>(() => new DownloadSettingsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadSettingsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsMessage(DownloadSettingsMessage other) : this() {
+      hash_ = other.hash_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsMessage Clone() {
+      return new DownloadSettingsMessage(this);
+    }
+
+    /// <summary>Field number for the "hash" field.</summary>
+    public const int HashFieldNumber = 1;
+    private string hash_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Hash {
+      get { return hash_; }
+      set {
+        hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadSettingsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadSettingsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Hash != other.Hash) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Hash.Length != 0) hash ^= Hash.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Hash.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Hash);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Hash.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadSettingsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Hash.Length != 0) {
+        Hash = other.Hash;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Hash = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortDetailsMessage : pb::IMessage<FortDetailsMessage> {
+    private static readonly pb::MessageParser<FortDetailsMessage> _parser = new pb::MessageParser<FortDetailsMessage>(() => new FortDetailsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDetailsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsMessage(FortDetailsMessage other) : this() {
+      fortId_ = other.fortId_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsMessage Clone() {
+      return new FortDetailsMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 2;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 3;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDetailsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDetailsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDetailsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetPlayerProfileMessage : pb::IMessage<GetPlayerProfileMessage> {
+    private static readonly pb::MessageParser<GetPlayerProfileMessage> _parser = new pb::MessageParser<GetPlayerProfileMessage>(() => new GetPlayerProfileMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerProfileMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileMessage(GetPlayerProfileMessage other) : this() {
+      playerName_ = other.playerName_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileMessage Clone() {
+      return new GetPlayerProfileMessage(this);
+    }
+
+    /// <summary>Field number for the "player_name" field.</summary>
+    public const int PlayerNameFieldNumber = 1;
+    private string playerName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string PlayerName {
+      get { return playerName_; }
+      set {
+        playerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerProfileMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerProfileMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PlayerName != other.PlayerName) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PlayerName.Length != 0) hash ^= PlayerName.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PlayerName.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(PlayerName);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PlayerName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(PlayerName);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerProfileMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PlayerName.Length != 0) {
+        PlayerName = other.PlayerName;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            PlayerName = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UpgradePokemonMessage : pb::IMessage<UpgradePokemonMessage> {
+    private static readonly pb::MessageParser<UpgradePokemonMessage> _parser = new pb::MessageParser<UpgradePokemonMessage>(() => new UpgradePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UpgradePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonMessage(UpgradePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonMessage Clone() {
+      return new UpgradePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UpgradePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UpgradePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UpgradePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerUpdateMessage : pb::IMessage<PlayerUpdateMessage> {
+    private static readonly pb::MessageParser<PlayerUpdateMessage> _parser = new pb::MessageParser<PlayerUpdateMessage>(() => new PlayerUpdateMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerUpdateMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateMessage(PlayerUpdateMessage other) : this() {
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateMessage Clone() {
+      return new PlayerUpdateMessage(this);
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 1;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 2;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerUpdateMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerUpdateMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Latitude != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerUpdateMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 17: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SetFavoritePokemonMessage : pb::IMessage<SetFavoritePokemonMessage> {
+    private static readonly pb::MessageParser<SetFavoritePokemonMessage> _parser = new pb::MessageParser<SetFavoritePokemonMessage>(() => new SetFavoritePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetFavoritePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[9]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonMessage(SetFavoritePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+      isFavorite_ = other.isFavorite_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonMessage Clone() {
+      return new SetFavoritePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    /// <summary>
+    ///  needs to be uint64, tested by Grover
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "is_favorite" field.</summary>
+    public const int IsFavoriteFieldNumber = 2;
+    private bool isFavorite_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsFavorite {
+      get { return isFavorite_; }
+      set {
+        isFavorite_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetFavoritePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetFavoritePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (IsFavorite != other.IsFavorite) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (IsFavorite != false) hash ^= IsFavorite.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(PokemonId);
+      }
+      if (IsFavorite != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(IsFavorite);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonId);
+      }
+      if (IsFavorite != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetFavoritePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.IsFavorite != false) {
+        IsFavorite = other.IsFavorite;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            PokemonId = input.ReadUInt64();
+            break;
+          }
+          case 16: {
+            IsFavorite = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetAssetDigestMessage : pb::IMessage<GetAssetDigestMessage> {
+    private static readonly pb::MessageParser<GetAssetDigestMessage> _parser = new pb::MessageParser<GetAssetDigestMessage>(() => new GetAssetDigestMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetAssetDigestMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[10]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestMessage(GetAssetDigestMessage other) : this() {
+      platform_ = other.platform_;
+      deviceManufacturer_ = other.deviceManufacturer_;
+      deviceModel_ = other.deviceModel_;
+      locale_ = other.locale_;
+      appVersion_ = other.appVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestMessage Clone() {
+      return new GetAssetDigestMessage(this);
+    }
+
+    /// <summary>Field number for the "platform" field.</summary>
+    public const int PlatformFieldNumber = 1;
+    private global::POGOProtos.Enums.Platform platform_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.Platform Platform {
+      get { return platform_; }
+      set {
+        platform_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "device_manufacturer" field.</summary>
+    public const int DeviceManufacturerFieldNumber = 2;
+    private string deviceManufacturer_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceManufacturer {
+      get { return deviceManufacturer_; }
+      set {
+        deviceManufacturer_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "device_model" field.</summary>
+    public const int DeviceModelFieldNumber = 3;
+    private string deviceModel_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceModel {
+      get { return deviceModel_; }
+      set {
+        deviceModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "locale" field.</summary>
+    public const int LocaleFieldNumber = 4;
+    private string locale_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Locale {
+      get { return locale_; }
+      set {
+        locale_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "app_version" field.</summary>
+    public const int AppVersionFieldNumber = 5;
+    private uint appVersion_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint AppVersion {
+      get { return appVersion_; }
+      set {
+        appVersion_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetAssetDigestMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetAssetDigestMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Platform != other.Platform) return false;
+      if (DeviceManufacturer != other.DeviceManufacturer) return false;
+      if (DeviceModel != other.DeviceModel) return false;
+      if (Locale != other.Locale) return false;
+      if (AppVersion != other.AppVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Platform != 0) hash ^= Platform.GetHashCode();
+      if (DeviceManufacturer.Length != 0) hash ^= DeviceManufacturer.GetHashCode();
+      if (DeviceModel.Length != 0) hash ^= DeviceModel.GetHashCode();
+      if (Locale.Length != 0) hash ^= Locale.GetHashCode();
+      if (AppVersion != 0) hash ^= AppVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Platform != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Locale);
+      }
+      if (AppVersion != 0) {
+        output.WriteRawTag(40);
+        output.WriteUInt32(AppVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Platform != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Locale);
+      }
+      if (AppVersion != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt32Size(AppVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetAssetDigestMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Platform != 0) {
+        Platform = other.Platform;
+      }
+      if (other.DeviceManufacturer.Length != 0) {
+        DeviceManufacturer = other.DeviceManufacturer;
+      }
+      if (other.DeviceModel.Length != 0) {
+        DeviceModel = other.DeviceModel;
+      }
+      if (other.Locale.Length != 0) {
+        Locale = other.Locale;
+      }
+      if (other.AppVersion != 0) {
+        AppVersion = other.AppVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            platform_ = (global::POGOProtos.Enums.Platform) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            DeviceManufacturer = input.ReadString();
+            break;
+          }
+          case 26: {
+            DeviceModel = input.ReadString();
+            break;
+          }
+          case 34: {
+            Locale = input.ReadString();
+            break;
+          }
+          case 40: {
+            AppVersion = input.ReadUInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class AddFortModifierMessage : pb::IMessage<AddFortModifierMessage> {
+    private static readonly pb::MessageParser<AddFortModifierMessage> _parser = new pb::MessageParser<AddFortModifierMessage>(() => new AddFortModifierMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AddFortModifierMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[11]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierMessage(AddFortModifierMessage other) : this() {
+      modifierType_ = other.modifierType_;
+      fortId_ = other.fortId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierMessage Clone() {
+      return new AddFortModifierMessage(this);
+    }
+
+    /// <summary>Field number for the "modifier_type" field.</summary>
+    public const int ModifierTypeFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId modifierType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ModifierType {
+      get { return modifierType_; }
+      set {
+        modifierType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 2;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AddFortModifierMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AddFortModifierMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ModifierType != other.ModifierType) return false;
+      if (FortId != other.FortId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ModifierType != 0) hash ^= ModifierType.GetHashCode();
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ModifierType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ModifierType);
+      }
+      if (FortId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ModifierType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ModifierType);
+      }
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AddFortModifierMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ModifierType != 0) {
+        ModifierType = other.ModifierType;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            modifierType_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetInventoryMessage : pb::IMessage<GetInventoryMessage> {
+    private static readonly pb::MessageParser<GetInventoryMessage> _parser = new pb::MessageParser<GetInventoryMessage>(() => new GetInventoryMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetInventoryMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[12]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryMessage(GetInventoryMessage other) : this() {
+      lastTimestampMs_ = other.lastTimestampMs_;
+      itemBeenSeen_ = other.itemBeenSeen_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryMessage Clone() {
+      return new GetInventoryMessage(this);
+    }
+
+    /// <summary>Field number for the "last_timestamp_ms" field.</summary>
+    public const int LastTimestampMsFieldNumber = 1;
+    private long lastTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long LastTimestampMs {
+      get { return lastTimestampMs_; }
+      set {
+        lastTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_been_seen" field.</summary>
+    public const int ItemBeenSeenFieldNumber = 2;
+    private int itemBeenSeen_;
+    /// <summary>
+    ///  TODO: Find out what this is.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ItemBeenSeen {
+      get { return itemBeenSeen_; }
+      set {
+        itemBeenSeen_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetInventoryMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetInventoryMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (LastTimestampMs != other.LastTimestampMs) return false;
+      if (ItemBeenSeen != other.ItemBeenSeen) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (LastTimestampMs != 0L) hash ^= LastTimestampMs.GetHashCode();
+      if (ItemBeenSeen != 0) hash ^= ItemBeenSeen.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (LastTimestampMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(LastTimestampMs);
+      }
+      if (ItemBeenSeen != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(ItemBeenSeen);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (LastTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastTimestampMs);
+      }
+      if (ItemBeenSeen != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ItemBeenSeen);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetInventoryMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.LastTimestampMs != 0L) {
+        LastTimestampMs = other.LastTimestampMs;
+      }
+      if (other.ItemBeenSeen != 0) {
+        ItemBeenSeen = other.ItemBeenSeen;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            LastTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 16: {
+            ItemBeenSeen = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortDeployPokemonMessage : pb::IMessage<FortDeployPokemonMessage> {
+    private static readonly pb::MessageParser<FortDeployPokemonMessage> _parser = new pb::MessageParser<FortDeployPokemonMessage>(() => new FortDeployPokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDeployPokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[13]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonMessage(FortDeployPokemonMessage other) : this() {
+      fortId_ = other.fortId_;
+      pokemonId_ = other.pokemonId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonMessage Clone() {
+      return new FortDeployPokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDeployPokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDeployPokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDeployPokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortSearchMessage : pb::IMessage<FortSearchMessage> {
+    private static readonly pb::MessageParser<FortSearchMessage> _parser = new pb::MessageParser<FortSearchMessage>(() => new FortSearchMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSearchMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[14]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchMessage(FortSearchMessage other) : this() {
+      fortId_ = other.fortId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+      fortLatitude_ = other.fortLatitude_;
+      fortLongitude_ = other.fortLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchMessage Clone() {
+      return new FortSearchMessage(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 2;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 3;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_latitude" field.</summary>
+    public const int FortLatitudeFieldNumber = 4;
+    private double fortLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double FortLatitude {
+      get { return fortLatitude_; }
+      set {
+        fortLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_longitude" field.</summary>
+    public const int FortLongitudeFieldNumber = 5;
+    private double fortLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double FortLongitude {
+      get { return fortLongitude_; }
+      set {
+        fortLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSearchMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSearchMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      if (FortLatitude != other.FortLatitude) return false;
+      if (FortLongitude != other.FortLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      if (FortLatitude != 0D) hash ^= FortLatitude.GetHashCode();
+      if (FortLongitude != 0D) hash ^= FortLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLongitude);
+      }
+      if (FortLatitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(FortLatitude);
+      }
+      if (FortLongitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(FortLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      if (FortLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (FortLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSearchMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+      if (other.FortLatitude != 0D) {
+        FortLatitude = other.FortLatitude;
+      }
+      if (other.FortLongitude != 0D) {
+        FortLongitude = other.FortLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            FortLatitude = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            FortLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemXpBoostMessage : pb::IMessage<UseItemXpBoostMessage> {
+    private static readonly pb::MessageParser<UseItemXpBoostMessage> _parser = new pb::MessageParser<UseItemXpBoostMessage>(() => new UseItemXpBoostMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemXpBoostMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[15]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostMessage(UseItemXpBoostMessage other) : this() {
+      itemId_ = other.itemId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostMessage Clone() {
+      return new UseItemXpBoostMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemXpBoostMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemXpBoostMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemXpBoostMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EncounterTutorialCompleteMessage : pb::IMessage<EncounterTutorialCompleteMessage> {
+    private static readonly pb::MessageParser<EncounterTutorialCompleteMessage> _parser = new pb::MessageParser<EncounterTutorialCompleteMessage>(() => new EncounterTutorialCompleteMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterTutorialCompleteMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[16]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteMessage(EncounterTutorialCompleteMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteMessage Clone() {
+      return new EncounterTutorialCompleteMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterTutorialCompleteMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterTutorialCompleteMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterTutorialCompleteMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class SfidaActionLogMessage : pb::IMessage<SfidaActionLogMessage> {
+    private static readonly pb::MessageParser<SfidaActionLogMessage> _parser = new pb::MessageParser<SfidaActionLogMessage>(() => new SfidaActionLogMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SfidaActionLogMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[17]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogMessage(SfidaActionLogMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogMessage Clone() {
+      return new SfidaActionLogMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SfidaActionLogMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SfidaActionLogMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SfidaActionLogMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class AttackGymMessage : pb::IMessage<AttackGymMessage> {
+    private static readonly pb::MessageParser<AttackGymMessage> _parser = new pb::MessageParser<AttackGymMessage>(() => new AttackGymMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AttackGymMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[18]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymMessage(AttackGymMessage other) : this() {
+      gymId_ = other.gymId_;
+      battleId_ = other.battleId_;
+      attackActions_ = other.attackActions_.Clone();
+      LastRetrievedActions = other.lastRetrievedActions_ != null ? other.LastRetrievedActions.Clone() : null;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymMessage Clone() {
+      return new AttackGymMessage(this);
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 1;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "battle_id" field.</summary>
+    public const int BattleIdFieldNumber = 2;
+    private string battleId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BattleId {
+      get { return battleId_; }
+      set {
+        battleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "attack_actions" field.</summary>
+    public const int AttackActionsFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Battle.BattleAction> _repeated_attackActions_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.Battle.BattleAction.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> attackActions_ = new pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Battle.BattleAction> AttackActions {
+      get { return attackActions_; }
+    }
+
+    /// <summary>Field number for the "last_retrieved_actions" field.</summary>
+    public const int LastRetrievedActionsFieldNumber = 4;
+    private global::POGOProtos.Data.Battle.BattleAction lastRetrievedActions_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleAction LastRetrievedActions {
+      get { return lastRetrievedActions_; }
+      set {
+        lastRetrievedActions_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 5;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 6;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AttackGymMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AttackGymMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (GymId != other.GymId) return false;
+      if (BattleId != other.BattleId) return false;
+      if(!attackActions_.Equals(other.attackActions_)) return false;
+      if (!object.Equals(LastRetrievedActions, other.LastRetrievedActions)) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      if (BattleId.Length != 0) hash ^= BattleId.GetHashCode();
+      hash ^= attackActions_.GetHashCode();
+      if (lastRetrievedActions_ != null) hash ^= LastRetrievedActions.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (GymId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(GymId);
+      }
+      if (BattleId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(BattleId);
+      }
+      attackActions_.WriteTo(output, _repeated_attackActions_codec);
+      if (lastRetrievedActions_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(LastRetrievedActions);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      if (BattleId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BattleId);
+      }
+      size += attackActions_.CalculateSize(_repeated_attackActions_codec);
+      if (lastRetrievedActions_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LastRetrievedActions);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AttackGymMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      if (other.BattleId.Length != 0) {
+        BattleId = other.BattleId;
+      }
+      attackActions_.Add(other.attackActions_);
+      if (other.lastRetrievedActions_ != null) {
+        if (lastRetrievedActions_ == null) {
+          lastRetrievedActions_ = new global::POGOProtos.Data.Battle.BattleAction();
+        }
+        LastRetrievedActions.MergeFrom(other.LastRetrievedActions);
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 18: {
+            BattleId = input.ReadString();
+            break;
+          }
+          case 26: {
+            attackActions_.AddEntriesFrom(input, _repeated_attackActions_codec);
+            break;
+          }
+          case 34: {
+            if (lastRetrievedActions_ == null) {
+              lastRetrievedActions_ = new global::POGOProtos.Data.Battle.BattleAction();
+            }
+            input.ReadMessage(lastRetrievedActions_);
+            break;
+          }
+          case 41: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 49: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class CollectDailyBonusMessage : pb::IMessage<CollectDailyBonusMessage> {
+    private static readonly pb::MessageParser<CollectDailyBonusMessage> _parser = new pb::MessageParser<CollectDailyBonusMessage>(() => new CollectDailyBonusMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyBonusMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[19]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusMessage(CollectDailyBonusMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusMessage Clone() {
+      return new CollectDailyBonusMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyBonusMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyBonusMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyBonusMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemGymMessage : pb::IMessage<UseItemGymMessage> {
+    private static readonly pb::MessageParser<UseItemGymMessage> _parser = new pb::MessageParser<UseItemGymMessage>(() => new UseItemGymMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemGymMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[20]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymMessage(UseItemGymMessage other) : this() {
+      itemId_ = other.itemId_;
+      gymId_ = other.gymId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymMessage Clone() {
+      return new UseItemGymMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 2;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemGymMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemGymMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (GymId != other.GymId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (GymId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemGymMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class StartGymBattleMessage : pb::IMessage<StartGymBattleMessage> {
+    private static readonly pb::MessageParser<StartGymBattleMessage> _parser = new pb::MessageParser<StartGymBattleMessage>(() => new StartGymBattleMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<StartGymBattleMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[21]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleMessage(StartGymBattleMessage other) : this() {
+      gymId_ = other.gymId_;
+      attackingPokemonIds_ = other.attackingPokemonIds_.Clone();
+      defendingPokemonId_ = other.defendingPokemonId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleMessage Clone() {
+      return new StartGymBattleMessage(this);
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 1;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "attacking_pokemon_ids" field.</summary>
+    public const int AttackingPokemonIdsFieldNumber = 2;
+    private static readonly pb::FieldCodec<ulong> _repeated_attackingPokemonIds_codec
+        = pb::FieldCodec.ForFixed64(18);
+    private readonly pbc::RepeatedField<ulong> attackingPokemonIds_ = new pbc::RepeatedField<ulong>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<ulong> AttackingPokemonIds {
+      get { return attackingPokemonIds_; }
+    }
+
+    /// <summary>Field number for the "defending_pokemon_id" field.</summary>
+    public const int DefendingPokemonIdFieldNumber = 3;
+    private ulong defendingPokemonId_;
+    /// <summary>
+    ///  needs to be fixed64, tested by Grover
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong DefendingPokemonId {
+      get { return defendingPokemonId_; }
+      set {
+        defendingPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 4;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 5;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as StartGymBattleMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(StartGymBattleMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (GymId != other.GymId) return false;
+      if(!attackingPokemonIds_.Equals(other.attackingPokemonIds_)) return false;
+      if (DefendingPokemonId != other.DefendingPokemonId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      hash ^= attackingPokemonIds_.GetHashCode();
+      if (DefendingPokemonId != 0UL) hash ^= DefendingPokemonId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (GymId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(GymId);
+      }
+      attackingPokemonIds_.WriteTo(output, _repeated_attackingPokemonIds_codec);
+      if (DefendingPokemonId != 0UL) {
+        output.WriteRawTag(25);
+        output.WriteFixed64(DefendingPokemonId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      size += attackingPokemonIds_.CalculateSize(_repeated_attackingPokemonIds_codec);
+      if (DefendingPokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(StartGymBattleMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      attackingPokemonIds_.Add(other.attackingPokemonIds_);
+      if (other.DefendingPokemonId != 0UL) {
+        DefendingPokemonId = other.DefendingPokemonId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 18:
+          case 17: {
+            attackingPokemonIds_.AddEntriesFrom(input, _repeated_attackingPokemonIds_codec);
+            break;
+          }
+          case 25: {
+            DefendingPokemonId = input.ReadFixed64();
+            break;
+          }
+          case 33: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CatchPokemonMessage : pb::IMessage<CatchPokemonMessage> {
+    private static readonly pb::MessageParser<CatchPokemonMessage> _parser = new pb::MessageParser<CatchPokemonMessage>(() => new CatchPokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CatchPokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[22]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonMessage(CatchPokemonMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      pokeball_ = other.pokeball_;
+      normalizedReticleSize_ = other.normalizedReticleSize_;
+      spawnPointId_ = other.spawnPointId_;
+      hitPokemon_ = other.hitPokemon_;
+      spinModifier_ = other.spinModifier_;
+      normalizedHitPosition_ = other.normalizedHitPosition_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonMessage Clone() {
+      return new CatchPokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeball" field.</summary>
+    public const int PokeballFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemId pokeball_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId Pokeball {
+      get { return pokeball_; }
+      set {
+        pokeball_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "normalized_reticle_size" field.</summary>
+    public const int NormalizedReticleSizeFieldNumber = 3;
+    private double normalizedReticleSize_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double NormalizedReticleSize {
+      get { return normalizedReticleSize_; }
+      set {
+        normalizedReticleSize_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 4;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "hit_pokemon" field.</summary>
+    public const int HitPokemonFieldNumber = 5;
+    private bool hitPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool HitPokemon {
+      get { return hitPokemon_; }
+      set {
+        hitPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spin_modifier" field.</summary>
+    public const int SpinModifierFieldNumber = 6;
+    private double spinModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double SpinModifier {
+      get { return spinModifier_; }
+      set {
+        spinModifier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "normalized_hit_position" field.</summary>
+    public const int NormalizedHitPositionFieldNumber = 7;
+    private double normalizedHitPosition_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double NormalizedHitPosition {
+      get { return normalizedHitPosition_; }
+      set {
+        normalizedHitPosition_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CatchPokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (Pokeball != other.Pokeball) return false;
+      if (NormalizedReticleSize != other.NormalizedReticleSize) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (HitPokemon != other.HitPokemon) return false;
+      if (SpinModifier != other.SpinModifier) return false;
+      if (NormalizedHitPosition != other.NormalizedHitPosition) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
+      if (NormalizedReticleSize != 0D) hash ^= NormalizedReticleSize.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (HitPokemon != false) hash ^= HitPokemon.GetHashCode();
+      if (SpinModifier != 0D) hash ^= SpinModifier.GetHashCode();
+      if (NormalizedHitPosition != 0D) hash ^= NormalizedHitPosition.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(EncounterId);
+      }
+      if (Pokeball != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Pokeball);
+      }
+      if (NormalizedReticleSize != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(NormalizedReticleSize);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(SpawnPointId);
+      }
+      if (HitPokemon != false) {
+        output.WriteRawTag(40);
+        output.WriteBool(HitPokemon);
+      }
+      if (SpinModifier != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(SpinModifier);
+      }
+      if (NormalizedHitPosition != 0D) {
+        output.WriteRawTag(57);
+        output.WriteDouble(NormalizedHitPosition);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (Pokeball != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Pokeball);
+      }
+      if (NormalizedReticleSize != 0D) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (HitPokemon != false) {
+        size += 1 + 1;
+      }
+      if (SpinModifier != 0D) {
+        size += 1 + 8;
+      }
+      if (NormalizedHitPosition != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CatchPokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.Pokeball != 0) {
+        Pokeball = other.Pokeball;
+      }
+      if (other.NormalizedReticleSize != 0D) {
+        NormalizedReticleSize = other.NormalizedReticleSize;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.HitPokemon != false) {
+        HitPokemon = other.HitPokemon;
+      }
+      if (other.SpinModifier != 0D) {
+        SpinModifier = other.SpinModifier;
+      }
+      if (other.NormalizedHitPosition != 0D) {
+        NormalizedHitPosition = other.NormalizedHitPosition;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 16: {
+            pokeball_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 25: {
+            NormalizedReticleSize = input.ReadDouble();
+            break;
+          }
+          case 34: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 40: {
+            HitPokemon = input.ReadBool();
+            break;
+          }
+          case 49: {
+            SpinModifier = input.ReadDouble();
+            break;
+          }
+          case 57: {
+            NormalizedHitPosition = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class IncenseEncounterMessage : pb::IMessage<IncenseEncounterMessage> {
+    private static readonly pb::MessageParser<IncenseEncounterMessage> _parser = new pb::MessageParser<IncenseEncounterMessage>(() => new IncenseEncounterMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IncenseEncounterMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[23]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterMessage(IncenseEncounterMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      encounterLocation_ = other.encounterLocation_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterMessage Clone() {
+      return new IncenseEncounterMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private long encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_location" field.</summary>
+    public const int EncounterLocationFieldNumber = 2;
+    private string encounterLocation_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string EncounterLocation {
+      get { return encounterLocation_; }
+      set {
+        encounterLocation_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IncenseEncounterMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IncenseEncounterMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (EncounterLocation != other.EncounterLocation) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0L) hash ^= EncounterId.GetHashCode();
+      if (EncounterLocation.Length != 0) hash ^= EncounterLocation.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(EncounterId);
+      }
+      if (EncounterLocation.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(EncounterLocation);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(EncounterId);
+      }
+      if (EncounterLocation.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(EncounterLocation);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IncenseEncounterMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0L) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.EncounterLocation.Length != 0) {
+        EncounterLocation = other.EncounterLocation;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            EncounterId = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            EncounterLocation = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DownloadRemoteConfigVersionMessage : pb::IMessage<DownloadRemoteConfigVersionMessage> {
+    private static readonly pb::MessageParser<DownloadRemoteConfigVersionMessage> _parser = new pb::MessageParser<DownloadRemoteConfigVersionMessage>(() => new DownloadRemoteConfigVersionMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadRemoteConfigVersionMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[24]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionMessage(DownloadRemoteConfigVersionMessage other) : this() {
+      platform_ = other.platform_;
+      deviceManufacturer_ = other.deviceManufacturer_;
+      deviceModel_ = other.deviceModel_;
+      locale_ = other.locale_;
+      appVersion_ = other.appVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionMessage Clone() {
+      return new DownloadRemoteConfigVersionMessage(this);
+    }
+
+    /// <summary>Field number for the "platform" field.</summary>
+    public const int PlatformFieldNumber = 1;
+    private global::POGOProtos.Enums.Platform platform_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.Platform Platform {
+      get { return platform_; }
+      set {
+        platform_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "device_manufacturer" field.</summary>
+    public const int DeviceManufacturerFieldNumber = 2;
+    private string deviceManufacturer_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceManufacturer {
+      get { return deviceManufacturer_; }
+      set {
+        deviceManufacturer_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "device_model" field.</summary>
+    public const int DeviceModelFieldNumber = 3;
+    private string deviceModel_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string DeviceModel {
+      get { return deviceModel_; }
+      set {
+        deviceModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "locale" field.</summary>
+    public const int LocaleFieldNumber = 4;
+    private string locale_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Locale {
+      get { return locale_; }
+      set {
+        locale_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "app_version" field.</summary>
+    public const int AppVersionFieldNumber = 5;
+    private uint appVersion_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public uint AppVersion {
+      get { return appVersion_; }
+      set {
+        appVersion_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadRemoteConfigVersionMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadRemoteConfigVersionMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Platform != other.Platform) return false;
+      if (DeviceManufacturer != other.DeviceManufacturer) return false;
+      if (DeviceModel != other.DeviceModel) return false;
+      if (Locale != other.Locale) return false;
+      if (AppVersion != other.AppVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Platform != 0) hash ^= Platform.GetHashCode();
+      if (DeviceManufacturer.Length != 0) hash ^= DeviceManufacturer.GetHashCode();
+      if (DeviceModel.Length != 0) hash ^= DeviceModel.GetHashCode();
+      if (Locale.Length != 0) hash ^= Locale.GetHashCode();
+      if (AppVersion != 0) hash ^= AppVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Platform != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Locale);
+      }
+      if (AppVersion != 0) {
+        output.WriteRawTag(40);
+        output.WriteUInt32(AppVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Platform != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Platform);
+      }
+      if (DeviceManufacturer.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceManufacturer);
+      }
+      if (DeviceModel.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModel);
+      }
+      if (Locale.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Locale);
+      }
+      if (AppVersion != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt32Size(AppVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadRemoteConfigVersionMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Platform != 0) {
+        Platform = other.Platform;
+      }
+      if (other.DeviceManufacturer.Length != 0) {
+        DeviceManufacturer = other.DeviceManufacturer;
+      }
+      if (other.DeviceModel.Length != 0) {
+        DeviceModel = other.DeviceModel;
+      }
+      if (other.Locale.Length != 0) {
+        Locale = other.Locale;
+      }
+      if (other.AppVersion != 0) {
+        AppVersion = other.AppVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            platform_ = (global::POGOProtos.Enums.Platform) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            DeviceManufacturer = input.ReadString();
+            break;
+          }
+          case 26: {
+            DeviceModel = input.ReadString();
+            break;
+          }
+          case 34: {
+            Locale = input.ReadString();
+            break;
+          }
+          case 40: {
+            AppVersion = input.ReadUInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SetContactSettingsMessage : pb::IMessage<SetContactSettingsMessage> {
+    private static readonly pb::MessageParser<SetContactSettingsMessage> _parser = new pb::MessageParser<SetContactSettingsMessage>(() => new SetContactSettingsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetContactSettingsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[25]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsMessage(SetContactSettingsMessage other) : this() {
+      ContactSettings = other.contactSettings_ != null ? other.ContactSettings.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsMessage Clone() {
+      return new SetContactSettingsMessage(this);
+    }
+
+    /// <summary>Field number for the "contact_settings" field.</summary>
+    public const int ContactSettingsFieldNumber = 1;
+    private global::POGOProtos.Data.Player.ContactSettings contactSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.ContactSettings ContactSettings {
+      get { return contactSettings_; }
+      set {
+        contactSettings_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetContactSettingsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetContactSettingsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(ContactSettings, other.ContactSettings)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (contactSettings_ != null) hash ^= ContactSettings.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (contactSettings_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(ContactSettings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (contactSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ContactSettings);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetContactSettingsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.contactSettings_ != null) {
+        if (contactSettings_ == null) {
+          contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+        }
+        ContactSettings.MergeFrom(other.ContactSettings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (contactSettings_ == null) {
+              contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+            }
+            input.ReadMessage(contactSettings_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetPlayerMessage : pb::IMessage<GetPlayerMessage> {
+    private static readonly pb::MessageParser<GetPlayerMessage> _parser = new pb::MessageParser<GetPlayerMessage>(() => new GetPlayerMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[26]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerMessage(GetPlayerMessage other) : this() {
+      appVersion_ = other.appVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerMessage Clone() {
+      return new GetPlayerMessage(this);
+    }
+
+    /// <summary>Field number for the "app_version" field.</summary>
+    public const int AppVersionFieldNumber = 1;
+    private string appVersion_ = "";
+    /// <summary>
+    ///  Human readable app version, e.g. "0.31.1"
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string AppVersion {
+      get { return appVersion_; }
+      set {
+        appVersion_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AppVersion != other.AppVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AppVersion.Length != 0) hash ^= AppVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AppVersion.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(AppVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AppVersion.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(AppVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AppVersion.Length != 0) {
+        AppVersion = other.AppVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            AppVersion = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class RecycleInventoryItemMessage : pb::IMessage<RecycleInventoryItemMessage> {
+    private static readonly pb::MessageParser<RecycleInventoryItemMessage> _parser = new pb::MessageParser<RecycleInventoryItemMessage>(() => new RecycleInventoryItemMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<RecycleInventoryItemMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[27]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemMessage(RecycleInventoryItemMessage other) : this() {
+      itemId_ = other.itemId_;
+      count_ = other.count_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemMessage Clone() {
+      return new RecycleInventoryItemMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "count" field.</summary>
+    public const int CountFieldNumber = 2;
+    private int count_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Count {
+      get { return count_; }
+      set {
+        count_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as RecycleInventoryItemMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(RecycleInventoryItemMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (Count != other.Count) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (Count != 0) hash ^= Count.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (Count != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Count);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (Count != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(RecycleInventoryItemMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.Count != 0) {
+        Count = other.Count;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Count = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EvolvePokemonMessage : pb::IMessage<EvolvePokemonMessage> {
+    private static readonly pb::MessageParser<EvolvePokemonMessage> _parser = new pb::MessageParser<EvolvePokemonMessage>(() => new EvolvePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EvolvePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[28]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonMessage(EvolvePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonMessage Clone() {
+      return new EvolvePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EvolvePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EvolvePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EvolvePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SetPlayerTeamMessage : pb::IMessage<SetPlayerTeamMessage> {
+    private static readonly pb::MessageParser<SetPlayerTeamMessage> _parser = new pb::MessageParser<SetPlayerTeamMessage>(() => new SetPlayerTeamMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetPlayerTeamMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[29]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamMessage(SetPlayerTeamMessage other) : this() {
+      team_ = other.team_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamMessage Clone() {
+      return new SetPlayerTeamMessage(this);
+    }
+
+    /// <summary>Field number for the "team" field.</summary>
+    public const int TeamFieldNumber = 1;
+    private global::POGOProtos.Enums.TeamColor team_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor Team {
+      get { return team_; }
+      set {
+        team_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetPlayerTeamMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetPlayerTeamMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Team != other.Team) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Team != 0) hash ^= Team.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Team != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Team);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Team != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Team);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetPlayerTeamMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Team != 0) {
+        Team = other.Team;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            team_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ClaimCodenameMessage : pb::IMessage<ClaimCodenameMessage> {
+    private static readonly pb::MessageParser<ClaimCodenameMessage> _parser = new pb::MessageParser<ClaimCodenameMessage>(() => new ClaimCodenameMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ClaimCodenameMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[30]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameMessage(ClaimCodenameMessage other) : this() {
+      codename_ = other.codename_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameMessage Clone() {
+      return new ClaimCodenameMessage(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ClaimCodenameMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ClaimCodenameMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ClaimCodenameMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class NicknamePokemonMessage : pb::IMessage<NicknamePokemonMessage> {
+    private static readonly pb::MessageParser<NicknamePokemonMessage> _parser = new pb::MessageParser<NicknamePokemonMessage>(() => new NicknamePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<NicknamePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[31]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonMessage(NicknamePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+      nickname_ = other.nickname_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonMessage Clone() {
+      return new NicknamePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "nickname" field.</summary>
+    public const int NicknameFieldNumber = 2;
+    private string nickname_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Nickname {
+      get { return nickname_; }
+      set {
+        nickname_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as NicknamePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(NicknamePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (Nickname != other.Nickname) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      if (Nickname.Length != 0) hash ^= Nickname.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+      if (Nickname.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Nickname);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (Nickname.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Nickname);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(NicknamePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.Nickname.Length != 0) {
+        Nickname = other.Nickname;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+          case 18: {
+            Nickname = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CheckCodenameAvailableMessage : pb::IMessage<CheckCodenameAvailableMessage> {
+    private static readonly pb::MessageParser<CheckCodenameAvailableMessage> _parser = new pb::MessageParser<CheckCodenameAvailableMessage>(() => new CheckCodenameAvailableMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckCodenameAvailableMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[32]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableMessage(CheckCodenameAvailableMessage other) : this() {
+      codename_ = other.codename_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableMessage Clone() {
+      return new CheckCodenameAvailableMessage(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckCodenameAvailableMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckCodenameAvailableMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckCodenameAvailableMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetMapObjectsMessage : pb::IMessage<GetMapObjectsMessage> {
+    private static readonly pb::MessageParser<GetMapObjectsMessage> _parser = new pb::MessageParser<GetMapObjectsMessage>(() => new GetMapObjectsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetMapObjectsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[33]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsMessage(GetMapObjectsMessage other) : this() {
+      cellId_ = other.cellId_.Clone();
+      sinceTimestampMs_ = other.sinceTimestampMs_.Clone();
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsMessage Clone() {
+      return new GetMapObjectsMessage(this);
+    }
+
+    /// <summary>Field number for the "cell_id" field.</summary>
+    public const int CellIdFieldNumber = 1;
+    private static readonly pb::FieldCodec<ulong> _repeated_cellId_codec
+        = pb::FieldCodec.ForUInt64(10);
+    private readonly pbc::RepeatedField<ulong> cellId_ = new pbc::RepeatedField<ulong>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<ulong> CellId {
+      get { return cellId_; }
+    }
+
+    /// <summary>Field number for the "since_timestamp_ms" field.</summary>
+    public const int SinceTimestampMsFieldNumber = 2;
+    private static readonly pb::FieldCodec<long> _repeated_sinceTimestampMs_codec
+        = pb::FieldCodec.ForInt64(18);
+    private readonly pbc::RepeatedField<long> sinceTimestampMs_ = new pbc::RepeatedField<long>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<long> SinceTimestampMs {
+      get { return sinceTimestampMs_; }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetMapObjectsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetMapObjectsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!cellId_.Equals(other.cellId_)) return false;
+      if(!sinceTimestampMs_.Equals(other.sinceTimestampMs_)) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= cellId_.GetHashCode();
+      hash ^= sinceTimestampMs_.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      cellId_.WriteTo(output, _repeated_cellId_codec);
+      sinceTimestampMs_.WriteTo(output, _repeated_sinceTimestampMs_codec);
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += cellId_.CalculateSize(_repeated_cellId_codec);
+      size += sinceTimestampMs_.CalculateSize(_repeated_sinceTimestampMs_codec);
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetMapObjectsMessage other) {
+      if (other == null) {
+        return;
+      }
+      cellId_.Add(other.cellId_);
+      sinceTimestampMs_.Add(other.sinceTimestampMs_);
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            cellId_.AddEntriesFrom(input, _repeated_cellId_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            sinceTimestampMs_.AddEntriesFrom(input, _repeated_sinceTimestampMs_codec);
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetGymDetailsMessage : pb::IMessage<GetGymDetailsMessage> {
+    private static readonly pb::MessageParser<GetGymDetailsMessage> _parser = new pb::MessageParser<GetGymDetailsMessage>(() => new GetGymDetailsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetGymDetailsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[34]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsMessage(GetGymDetailsMessage other) : this() {
+      gymId_ = other.gymId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+      gymLatitude_ = other.gymLatitude_;
+      gymLongitude_ = other.gymLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsMessage Clone() {
+      return new GetGymDetailsMessage(this);
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 1;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 2;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 3;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_latitude" field.</summary>
+    public const int GymLatitudeFieldNumber = 4;
+    private double gymLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double GymLatitude {
+      get { return gymLatitude_; }
+      set {
+        gymLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_longitude" field.</summary>
+    public const int GymLongitudeFieldNumber = 5;
+    private double gymLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double GymLongitude {
+      get { return gymLongitude_; }
+      set {
+        gymLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetGymDetailsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetGymDetailsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (GymId != other.GymId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      if (GymLatitude != other.GymLatitude) return false;
+      if (GymLongitude != other.GymLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      if (GymLatitude != 0D) hash ^= GymLatitude.GetHashCode();
+      if (GymLongitude != 0D) hash ^= GymLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (GymId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLongitude);
+      }
+      if (GymLatitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(GymLatitude);
+      }
+      if (GymLongitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(GymLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      if (GymLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (GymLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetGymDetailsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+      if (other.GymLatitude != 0D) {
+        GymLatitude = other.GymLatitude;
+      }
+      if (other.GymLongitude != 0D) {
+        GymLongitude = other.GymLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 17: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            GymLatitude = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            GymLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemEggIncubatorMessage : pb::IMessage<UseItemEggIncubatorMessage> {
+    private static readonly pb::MessageParser<UseItemEggIncubatorMessage> _parser = new pb::MessageParser<UseItemEggIncubatorMessage>(() => new UseItemEggIncubatorMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemEggIncubatorMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[35]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorMessage(UseItemEggIncubatorMessage other) : this() {
+      itemId_ = other.itemId_;
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorMessage Clone() {
+      return new UseItemEggIncubatorMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private string itemId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemEggIncubatorMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemEggIncubatorMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId.Length != 0) hash ^= ItemId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(ItemId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ItemId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemEggIncubatorMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId.Length != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            ItemId = input.ReadString();
+            break;
+          }
+          case 16: {
+            PokemonId = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class GetSuggestedCodenamesMessage : pb::IMessage<GetSuggestedCodenamesMessage> {
+    private static readonly pb::MessageParser<GetSuggestedCodenamesMessage> _parser = new pb::MessageParser<GetSuggestedCodenamesMessage>(() => new GetSuggestedCodenamesMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetSuggestedCodenamesMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[36]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesMessage(GetSuggestedCodenamesMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesMessage Clone() {
+      return new GetSuggestedCodenamesMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetSuggestedCodenamesMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetSuggestedCodenamesMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetSuggestedCodenamesMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class EchoMessage : pb::IMessage<EchoMessage> {
+    private static readonly pb::MessageParser<EchoMessage> _parser = new pb::MessageParser<EchoMessage>(() => new EchoMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EchoMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[37]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoMessage(EchoMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoMessage Clone() {
+      return new EchoMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EchoMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EchoMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EchoMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseIncenseMessage : pb::IMessage<UseIncenseMessage> {
+    private static readonly pb::MessageParser<UseIncenseMessage> _parser = new pb::MessageParser<UseIncenseMessage>(() => new UseIncenseMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseIncenseMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[38]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseMessage(UseIncenseMessage other) : this() {
+      incenseType_ = other.incenseType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseMessage Clone() {
+      return new UseIncenseMessage(this);
+    }
+
+    /// <summary>Field number for the "incense_type" field.</summary>
+    public const int IncenseTypeFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId incenseType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId IncenseType {
+      get { return incenseType_; }
+      set {
+        incenseType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseIncenseMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseIncenseMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IncenseType != other.IncenseType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IncenseType != 0) hash ^= IncenseType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IncenseType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) IncenseType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IncenseType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) IncenseType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseIncenseMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IncenseType != 0) {
+        IncenseType = other.IncenseType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            incenseType_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetDownloadUrlsMessage : pb::IMessage<GetDownloadUrlsMessage> {
+    private static readonly pb::MessageParser<GetDownloadUrlsMessage> _parser = new pb::MessageParser<GetDownloadUrlsMessage>(() => new GetDownloadUrlsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetDownloadUrlsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[39]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsMessage(GetDownloadUrlsMessage other) : this() {
+      assetId_ = other.assetId_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsMessage Clone() {
+      return new GetDownloadUrlsMessage(this);
+    }
+
+    /// <summary>Field number for the "asset_id" field.</summary>
+    public const int AssetIdFieldNumber = 1;
+    private static readonly pb::FieldCodec<string> _repeated_assetId_codec
+        = pb::FieldCodec.ForString(10);
+    private readonly pbc::RepeatedField<string> assetId_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> AssetId {
+      get { return assetId_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetDownloadUrlsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetDownloadUrlsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!assetId_.Equals(other.assetId_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= assetId_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      assetId_.WriteTo(output, _repeated_assetId_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += assetId_.CalculateSize(_repeated_assetId_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetDownloadUrlsMessage other) {
+      if (other == null) {
+        return;
+      }
+      assetId_.Add(other.assetId_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            assetId_.AddEntriesFrom(input, _repeated_assetId_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class LevelUpRewardsMessage : pb::IMessage<LevelUpRewardsMessage> {
+    private static readonly pb::MessageParser<LevelUpRewardsMessage> _parser = new pb::MessageParser<LevelUpRewardsMessage>(() => new LevelUpRewardsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<LevelUpRewardsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[40]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsMessage(LevelUpRewardsMessage other) : this() {
+      level_ = other.level_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsMessage Clone() {
+      return new LevelUpRewardsMessage(this);
+    }
+
+    /// <summary>Field number for the "level" field.</summary>
+    public const int LevelFieldNumber = 1;
+    private int level_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Level {
+      get { return level_; }
+      set {
+        level_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as LevelUpRewardsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(LevelUpRewardsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Level != other.Level) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Level != 0) hash ^= Level.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Level != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Level);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Level != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(LevelUpRewardsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Level != 0) {
+        Level = other.Level;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Level = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class GetHatchedEggsMessage : pb::IMessage<GetHatchedEggsMessage> {
+    private static readonly pb::MessageParser<GetHatchedEggsMessage> _parser = new pb::MessageParser<GetHatchedEggsMessage>(() => new GetHatchedEggsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetHatchedEggsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[41]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsMessage(GetHatchedEggsMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsMessage Clone() {
+      return new GetHatchedEggsMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetHatchedEggsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetHatchedEggsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetHatchedEggsMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EncounterMessage : pb::IMessage<EncounterMessage> {
+    private static readonly pb::MessageParser<EncounterMessage> _parser = new pb::MessageParser<EncounterMessage>(() => new EncounterMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[42]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterMessage(EncounterMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      spawnPointId_ = other.spawnPointId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterMessage Clone() {
+      return new EncounterMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 2;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(EncounterId);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(SpawnPointId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 18: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DiskEncounterMessage : pb::IMessage<DiskEncounterMessage> {
+    private static readonly pb::MessageParser<DiskEncounterMessage> _parser = new pb::MessageParser<DiskEncounterMessage>(() => new DiskEncounterMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DiskEncounterMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[43]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterMessage(DiskEncounterMessage other) : this() {
+      encounterId_ = other.encounterId_;
+      fortId_ = other.fortId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterMessage Clone() {
+      return new DiskEncounterMessage(this);
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 1;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 2;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DiskEncounterMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DiskEncounterMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EncounterId != other.EncounterId) return false;
+      if (FortId != other.FortId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(EncounterId);
+      }
+      if (FortId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EncounterId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(EncounterId);
+      }
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DiskEncounterMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            EncounterId = input.ReadUInt64();
+            break;
+          }
+          case 18: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class CheckAwardedBadgesMessage : pb::IMessage<CheckAwardedBadgesMessage> {
+    private static readonly pb::MessageParser<CheckAwardedBadgesMessage> _parser = new pb::MessageParser<CheckAwardedBadgesMessage>(() => new CheckAwardedBadgesMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckAwardedBadgesMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[44]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesMessage(CheckAwardedBadgesMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesMessage Clone() {
+      return new CheckAwardedBadgesMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckAwardedBadgesMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckAwardedBadgesMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckAwardedBadgesMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class DownloadItemTemplatesMessage : pb::IMessage<DownloadItemTemplatesMessage> {
+    private static readonly pb::MessageParser<DownloadItemTemplatesMessage> _parser = new pb::MessageParser<DownloadItemTemplatesMessage>(() => new DownloadItemTemplatesMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadItemTemplatesMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[45]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesMessage(DownloadItemTemplatesMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesMessage Clone() {
+      return new DownloadItemTemplatesMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadItemTemplatesMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadItemTemplatesMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadItemTemplatesMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EquipBadgeMessage : pb::IMessage<EquipBadgeMessage> {
+    private static readonly pb::MessageParser<EquipBadgeMessage> _parser = new pb::MessageParser<EquipBadgeMessage>(() => new EquipBadgeMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquipBadgeMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[46]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeMessage(EquipBadgeMessage other) : this() {
+      badgeType_ = other.badgeType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeMessage Clone() {
+      return new EquipBadgeMessage(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquipBadgeMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquipBadgeMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquipBadgeMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemReviveMessage : pb::IMessage<UseItemReviveMessage> {
+    private static readonly pb::MessageParser<UseItemReviveMessage> _parser = new pb::MessageParser<UseItemReviveMessage>(() => new UseItemReviveMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemReviveMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[47]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveMessage(UseItemReviveMessage other) : this() {
+      itemId_ = other.itemId_;
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveMessage Clone() {
+      return new UseItemReviveMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemReviveMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemReviveMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemReviveMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ReleasePokemonMessage : pb::IMessage<ReleasePokemonMessage> {
+    private static readonly pb::MessageParser<ReleasePokemonMessage> _parser = new pb::MessageParser<ReleasePokemonMessage>(() => new ReleasePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ReleasePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[48]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonMessage(ReleasePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonMessage Clone() {
+      return new ReleasePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ReleasePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ReleasePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ReleasePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemCaptureMessage : pb::IMessage<UseItemCaptureMessage> {
+    private static readonly pb::MessageParser<UseItemCaptureMessage> _parser = new pb::MessageParser<UseItemCaptureMessage>(() => new UseItemCaptureMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemCaptureMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[49]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureMessage(UseItemCaptureMessage other) : this() {
+      itemId_ = other.itemId_;
+      encounterId_ = other.encounterId_;
+      spawnPointId_ = other.spawnPointId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureMessage Clone() {
+      return new UseItemCaptureMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 2;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 3;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemCaptureMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemCaptureMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(EncounterId);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(SpawnPointId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemCaptureMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 26: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class MarkTutorialCompleteMessage : pb::IMessage<MarkTutorialCompleteMessage> {
+    private static readonly pb::MessageParser<MarkTutorialCompleteMessage> _parser = new pb::MessageParser<MarkTutorialCompleteMessage>(() => new MarkTutorialCompleteMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MarkTutorialCompleteMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[50]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteMessage(MarkTutorialCompleteMessage other) : this() {
+      tutorialsCompleted_ = other.tutorialsCompleted_.Clone();
+      sendMarketingEmails_ = other.sendMarketingEmails_;
+      sendPushNotifications_ = other.sendPushNotifications_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteMessage Clone() {
+      return new MarkTutorialCompleteMessage(this);
+    }
+
+    /// <summary>Field number for the "tutorials_completed" field.</summary>
+    public const int TutorialsCompletedFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.TutorialState> _repeated_tutorialsCompleted_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Enums.TutorialState) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> tutorialsCompleted_ = new pbc::RepeatedField<global::POGOProtos.Enums.TutorialState>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.TutorialState> TutorialsCompleted {
+      get { return tutorialsCompleted_; }
+    }
+
+    /// <summary>Field number for the "send_marketing_emails" field.</summary>
+    public const int SendMarketingEmailsFieldNumber = 2;
+    private bool sendMarketingEmails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendMarketingEmails {
+      get { return sendMarketingEmails_; }
+      set {
+        sendMarketingEmails_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "send_push_notifications" field.</summary>
+    public const int SendPushNotificationsFieldNumber = 3;
+    private bool sendPushNotifications_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool SendPushNotifications {
+      get { return sendPushNotifications_; }
+      set {
+        sendPushNotifications_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MarkTutorialCompleteMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MarkTutorialCompleteMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!tutorialsCompleted_.Equals(other.tutorialsCompleted_)) return false;
+      if (SendMarketingEmails != other.SendMarketingEmails) return false;
+      if (SendPushNotifications != other.SendPushNotifications) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= tutorialsCompleted_.GetHashCode();
+      if (SendMarketingEmails != false) hash ^= SendMarketingEmails.GetHashCode();
+      if (SendPushNotifications != false) hash ^= SendPushNotifications.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      tutorialsCompleted_.WriteTo(output, _repeated_tutorialsCompleted_codec);
+      if (SendMarketingEmails != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(SendMarketingEmails);
+      }
+      if (SendPushNotifications != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(SendPushNotifications);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += tutorialsCompleted_.CalculateSize(_repeated_tutorialsCompleted_codec);
+      if (SendMarketingEmails != false) {
+        size += 1 + 1;
+      }
+      if (SendPushNotifications != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MarkTutorialCompleteMessage other) {
+      if (other == null) {
+        return;
+      }
+      tutorialsCompleted_.Add(other.tutorialsCompleted_);
+      if (other.SendMarketingEmails != false) {
+        SendMarketingEmails = other.SendMarketingEmails;
+      }
+      if (other.SendPushNotifications != false) {
+        SendPushNotifications = other.SendPushNotifications;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            tutorialsCompleted_.AddEntriesFrom(input, _repeated_tutorialsCompleted_codec);
+            break;
+          }
+          case 16: {
+            SendMarketingEmails = input.ReadBool();
+            break;
+          }
+          case 24: {
+            SendPushNotifications = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SetAvatarMessage : pb::IMessage<SetAvatarMessage> {
+    private static readonly pb::MessageParser<SetAvatarMessage> _parser = new pb::MessageParser<SetAvatarMessage>(() => new SetAvatarMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetAvatarMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.POGOProtosNetworkingRequestsMessagesReflection.Descriptor.MessageTypes[51]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarMessage(SetAvatarMessage other) : this() {
+      PlayerAvatar = other.playerAvatar_ != null ? other.PlayerAvatar.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarMessage Clone() {
+      return new SetAvatarMessage(this);
+    }
+
+    /// <summary>Field number for the "player_avatar" field.</summary>
+    public const int PlayerAvatarFieldNumber = 2;
+    private global::POGOProtos.Data.Player.PlayerAvatar playerAvatar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerAvatar PlayerAvatar {
+      get { return playerAvatar_; }
+      set {
+        playerAvatar_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetAvatarMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetAvatarMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PlayerAvatar, other.PlayerAvatar)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (playerAvatar_ != null) hash ^= PlayerAvatar.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (playerAvatar_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerAvatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (playerAvatar_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerAvatar);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetAvatarMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.playerAvatar_ != null) {
+        if (playerAvatar_ == null) {
+          playerAvatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+        }
+        PlayerAvatar.MergeFrom(other.PlayerAvatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 18: {
+            if (playerAvatar_ == null) {
+              playerAvatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+            }
+            input.ReadMessage(playerAvatar_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.cs
new file mode 100644
index 0000000..9b46d25
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.cs
@@ -0,0 +1,188 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.proto</summary>
+  public static partial class PlayerUpdateMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/PlayerUpdateMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerUpdateMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkFQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvUGxh",
+            "eWVyVXBkYXRlTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5n",
+            "LlJlcXVlc3RzLk1lc3NhZ2VzIjoKE1BsYXllclVwZGF0ZU1lc3NhZ2USEAoI",
+            "bGF0aXR1ZGUYASABKAESEQoJbG9uZ2l0dWRlGAIgASgBYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.PlayerUpdateMessage), global::POGOProtos.Networking.Requests.Messages.PlayerUpdateMessage.Parser, new[]{ "Latitude", "Longitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerUpdateMessage : pb::IMessage<PlayerUpdateMessage> {
+    private static readonly pb::MessageParser<PlayerUpdateMessage> _parser = new pb::MessageParser<PlayerUpdateMessage>(() => new PlayerUpdateMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerUpdateMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.PlayerUpdateMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateMessage(PlayerUpdateMessage other) : this() {
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateMessage Clone() {
+      return new PlayerUpdateMessage(this);
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 1;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 2;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerUpdateMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerUpdateMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Latitude != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(Longitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerUpdateMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 17: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.cs
new file mode 100644
index 0000000..bc72a70
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.cs
@@ -0,0 +1,190 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.proto</summary>
+  public static partial class RecycleInventoryItemMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/RecycleInventoryItemMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static RecycleInventoryItemMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CklQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvUmVj",
+            "eWNsZUludmVudG9yeUl0ZW1NZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5l",
+            "dHdvcmtpbmcuUmVxdWVzdHMuTWVzc2FnZXMaJlBPR09Qcm90b3MvSW52ZW50",
+            "b3J5L0l0ZW0vSXRlbUlkLnByb3RvImAKG1JlY3ljbGVJbnZlbnRvcnlJdGVt",
+            "TWVzc2FnZRIyCgdpdGVtX2lkGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRv",
+            "cnkuSXRlbS5JdGVtSWQSDQoFY291bnQYAiABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.RecycleInventoryItemMessage), global::POGOProtos.Networking.Requests.Messages.RecycleInventoryItemMessage.Parser, new[]{ "ItemId", "Count" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class RecycleInventoryItemMessage : pb::IMessage<RecycleInventoryItemMessage> {
+    private static readonly pb::MessageParser<RecycleInventoryItemMessage> _parser = new pb::MessageParser<RecycleInventoryItemMessage>(() => new RecycleInventoryItemMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<RecycleInventoryItemMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.RecycleInventoryItemMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemMessage(RecycleInventoryItemMessage other) : this() {
+      itemId_ = other.itemId_;
+      count_ = other.count_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemMessage Clone() {
+      return new RecycleInventoryItemMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "count" field.</summary>
+    public const int CountFieldNumber = 2;
+    private int count_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Count {
+      get { return count_; }
+      set {
+        count_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as RecycleInventoryItemMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(RecycleInventoryItemMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (Count != other.Count) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (Count != 0) hash ^= Count.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (Count != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Count);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (Count != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(RecycleInventoryItemMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.Count != 0) {
+        Count = other.Count;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Count = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.cs
new file mode 100644
index 0000000..88f55b5
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.proto</summary>
+  public static partial class ReleasePokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/ReleasePokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ReleasePokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvUmVs",
+            "ZWFzZVBva2Vtb25NZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMiKwoVUmVsZWFzZVBva2Vtb25NZXNzYWdl",
+            "EhIKCnBva2Vtb25faWQYASABKAZiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.ReleasePokemonMessage), global::POGOProtos.Networking.Requests.Messages.ReleasePokemonMessage.Parser, new[]{ "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ReleasePokemonMessage : pb::IMessage<ReleasePokemonMessage> {
+    private static readonly pb::MessageParser<ReleasePokemonMessage> _parser = new pb::MessageParser<ReleasePokemonMessage>(() => new ReleasePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ReleasePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.ReleasePokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonMessage(ReleasePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonMessage Clone() {
+      return new ReleasePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ReleasePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ReleasePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ReleasePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/SetAvatarMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetAvatarMessage.cs
new file mode 100644
index 0000000..ecf2368
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetAvatarMessage.cs
@@ -0,0 +1,168 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/SetAvatarMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/SetAvatarMessage.proto</summary>
+  public static partial class SetAvatarMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/SetAvatarMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetAvatarMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvU2V0",
+            "QXZhdGFyTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "cXVlc3RzLk1lc3NhZ2VzGilQT0dPUHJvdG9zL0RhdGEvUGxheWVyL1BsYXll",
+            "ckF2YXRhci5wcm90byJPChBTZXRBdmF0YXJNZXNzYWdlEjsKDXBsYXllcl9h",
+            "dmF0YXIYAiABKAsyJC5QT0dPUHJvdG9zLkRhdGEuUGxheWVyLlBsYXllckF2",
+            "YXRhcmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Player.PlayerAvatarReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetAvatarMessage), global::POGOProtos.Networking.Requests.Messages.SetAvatarMessage.Parser, new[]{ "PlayerAvatar" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetAvatarMessage : pb::IMessage<SetAvatarMessage> {
+    private static readonly pb::MessageParser<SetAvatarMessage> _parser = new pb::MessageParser<SetAvatarMessage>(() => new SetAvatarMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetAvatarMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.SetAvatarMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarMessage(SetAvatarMessage other) : this() {
+      PlayerAvatar = other.playerAvatar_ != null ? other.PlayerAvatar.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarMessage Clone() {
+      return new SetAvatarMessage(this);
+    }
+
+    /// <summary>Field number for the "player_avatar" field.</summary>
+    public const int PlayerAvatarFieldNumber = 2;
+    private global::POGOProtos.Data.Player.PlayerAvatar playerAvatar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.PlayerAvatar PlayerAvatar {
+      get { return playerAvatar_; }
+      set {
+        playerAvatar_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetAvatarMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetAvatarMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PlayerAvatar, other.PlayerAvatar)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (playerAvatar_ != null) hash ^= PlayerAvatar.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (playerAvatar_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerAvatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (playerAvatar_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerAvatar);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetAvatarMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.playerAvatar_ != null) {
+        if (playerAvatar_ == null) {
+          playerAvatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+        }
+        PlayerAvatar.MergeFrom(other.PlayerAvatar);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 18: {
+            if (playerAvatar_ == null) {
+              playerAvatar_ = new global::POGOProtos.Data.Player.PlayerAvatar();
+            }
+            input.ReadMessage(playerAvatar_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.cs
new file mode 100644
index 0000000..1b2c183
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.cs
@@ -0,0 +1,168 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.proto</summary>
+  public static partial class SetContactSettingsMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetContactSettingsMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvU2V0",
+            "Q29udGFjdFNldHRpbmdzTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLlJlcXVlc3RzLk1lc3NhZ2VzGixQT0dPUHJvdG9zL0RhdGEvUGxh",
+            "eWVyL0NvbnRhY3RTZXR0aW5ncy5wcm90byJeChlTZXRDb250YWN0U2V0dGlu",
+            "Z3NNZXNzYWdlEkEKEGNvbnRhY3Rfc2V0dGluZ3MYASABKAsyJy5QT0dPUHJv",
+            "dG9zLkRhdGEuUGxheWVyLkNvbnRhY3RTZXR0aW5nc2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Player.ContactSettingsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetContactSettingsMessage), global::POGOProtos.Networking.Requests.Messages.SetContactSettingsMessage.Parser, new[]{ "ContactSettings" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetContactSettingsMessage : pb::IMessage<SetContactSettingsMessage> {
+    private static readonly pb::MessageParser<SetContactSettingsMessage> _parser = new pb::MessageParser<SetContactSettingsMessage>(() => new SetContactSettingsMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetContactSettingsMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.SetContactSettingsMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsMessage(SetContactSettingsMessage other) : this() {
+      ContactSettings = other.contactSettings_ != null ? other.ContactSettings.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsMessage Clone() {
+      return new SetContactSettingsMessage(this);
+    }
+
+    /// <summary>Field number for the "contact_settings" field.</summary>
+    public const int ContactSettingsFieldNumber = 1;
+    private global::POGOProtos.Data.Player.ContactSettings contactSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.ContactSettings ContactSettings {
+      get { return contactSettings_; }
+      set {
+        contactSettings_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetContactSettingsMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetContactSettingsMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(ContactSettings, other.ContactSettings)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (contactSettings_ != null) hash ^= ContactSettings.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (contactSettings_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(ContactSettings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (contactSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ContactSettings);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetContactSettingsMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.contactSettings_ != null) {
+        if (contactSettings_ == null) {
+          contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+        }
+        ContactSettings.MergeFrom(other.ContactSettings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (contactSettings_ == null) {
+              contactSettings_ = new global::POGOProtos.Data.Player.ContactSettings();
+            }
+            input.ReadMessage(contactSettings_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.cs
new file mode 100644
index 0000000..c24be4c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.cs
@@ -0,0 +1,192 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.proto</summary>
+  public static partial class SetFavoritePokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetFavoritePokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvU2V0",
+            "RmF2b3JpdGVQb2tlbW9uTWVzc2FnZS5wcm90bxInUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLlJlcXVlc3RzLk1lc3NhZ2VzIkQKGVNldEZhdm9yaXRlUG9rZW1v",
+            "bk1lc3NhZ2USEgoKcG9rZW1vbl9pZBgBIAEoAxITCgtpc19mYXZvcml0ZRgC",
+            "IAEoCGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetFavoritePokemonMessage), global::POGOProtos.Networking.Requests.Messages.SetFavoritePokemonMessage.Parser, new[]{ "PokemonId", "IsFavorite" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetFavoritePokemonMessage : pb::IMessage<SetFavoritePokemonMessage> {
+    private static readonly pb::MessageParser<SetFavoritePokemonMessage> _parser = new pb::MessageParser<SetFavoritePokemonMessage>(() => new SetFavoritePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetFavoritePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.SetFavoritePokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonMessage(SetFavoritePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+      isFavorite_ = other.isFavorite_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonMessage Clone() {
+      return new SetFavoritePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    /// <summary>
+    ///  Do not change https://github.com/AeonLucid/POGOProtos/pull/126
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "is_favorite" field.</summary>
+    public const int IsFavoriteFieldNumber = 2;
+    private bool isFavorite_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsFavorite {
+      get { return isFavorite_; }
+      set {
+        isFavorite_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetFavoritePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetFavoritePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (IsFavorite != other.IsFavorite) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0L) hash ^= PokemonId.GetHashCode();
+      if (IsFavorite != false) hash ^= IsFavorite.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0L) {
+        output.WriteRawTag(8);
+        output.WriteUInt64(PokemonId);
+      }
+      if (IsFavorite != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(IsFavorite);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonId);
+      }
+      if (IsFavorite != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetFavoritePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0L) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.IsFavorite != false) {
+        IsFavorite = other.IsFavorite;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            PokemonId = input.ReadUInt64();
+            break;
+          }
+          case 16: {
+            IsFavorite = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.cs
new file mode 100644
index 0000000..f069b29
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.cs
@@ -0,0 +1,161 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.proto</summary>
+  public static partial class SetPlayerTeamMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetPlayerTeamMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvU2V0",
+            "UGxheWVyVGVhbU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcxogUE9HT1Byb3Rvcy9FbnVtcy9UZWFtQ29s",
+            "b3IucHJvdG8iQQoUU2V0UGxheWVyVGVhbU1lc3NhZ2USKQoEdGVhbRgBIAEo",
+            "DjIbLlBPR09Qcm90b3MuRW51bXMuVGVhbUNvbG9yYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.TeamColorReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SetPlayerTeamMessage), global::POGOProtos.Networking.Requests.Messages.SetPlayerTeamMessage.Parser, new[]{ "Team" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetPlayerTeamMessage : pb::IMessage<SetPlayerTeamMessage> {
+    private static readonly pb::MessageParser<SetPlayerTeamMessage> _parser = new pb::MessageParser<SetPlayerTeamMessage>(() => new SetPlayerTeamMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetPlayerTeamMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.SetPlayerTeamMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamMessage(SetPlayerTeamMessage other) : this() {
+      team_ = other.team_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamMessage Clone() {
+      return new SetPlayerTeamMessage(this);
+    }
+
+    /// <summary>Field number for the "team" field.</summary>
+    public const int TeamFieldNumber = 1;
+    private global::POGOProtos.Enums.TeamColor team_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor Team {
+      get { return team_; }
+      set {
+        team_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetPlayerTeamMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetPlayerTeamMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Team != other.Team) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Team != 0) hash ^= Team.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Team != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Team);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Team != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Team);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetPlayerTeamMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Team != 0) {
+        Team = other.Team;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            team_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.cs
new file mode 100644
index 0000000..346ef81
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.cs
@@ -0,0 +1,135 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.proto</summary>
+  public static partial class SfidaActionLogMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SfidaActionLogMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvU2Zp",
+            "ZGFBY3Rpb25Mb2dNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMiFwoVU2ZpZGFBY3Rpb25Mb2dNZXNzYWdl",
+            "YgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.SfidaActionLogMessage), global::POGOProtos.Networking.Requests.Messages.SfidaActionLogMessage.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  No message needed.
+  /// </summary>
+  public sealed partial class SfidaActionLogMessage : pb::IMessage<SfidaActionLogMessage> {
+    private static readonly pb::MessageParser<SfidaActionLogMessage> _parser = new pb::MessageParser<SfidaActionLogMessage>(() => new SfidaActionLogMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SfidaActionLogMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.SfidaActionLogMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogMessage(SfidaActionLogMessage other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogMessage Clone() {
+      return new SfidaActionLogMessage(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SfidaActionLogMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SfidaActionLogMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SfidaActionLogMessage other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.cs
new file mode 100644
index 0000000..9a60c13
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.cs
@@ -0,0 +1,271 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.proto</summary>
+  public static partial class StartGymBattleMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static StartGymBattleMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvU3Rh",
+            "cnRHeW1CYXR0bGVNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMilwEKFVN0YXJ0R3ltQmF0dGxlTWVzc2Fn",
+            "ZRIOCgZneW1faWQYASABKAkSHQoVYXR0YWNraW5nX3Bva2Vtb25faWRzGAIg",
+            "AygGEhwKFGRlZmVuZGluZ19wb2tlbW9uX2lkGAMgASgGEhcKD3BsYXllcl9s",
+            "YXRpdHVkZRgEIAEoARIYChBwbGF5ZXJfbG9uZ2l0dWRlGAUgASgBYgZwcm90",
+            "bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.StartGymBattleMessage), global::POGOProtos.Networking.Requests.Messages.StartGymBattleMessage.Parser, new[]{ "GymId", "AttackingPokemonIds", "DefendingPokemonId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class StartGymBattleMessage : pb::IMessage<StartGymBattleMessage> {
+    private static readonly pb::MessageParser<StartGymBattleMessage> _parser = new pb::MessageParser<StartGymBattleMessage>(() => new StartGymBattleMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<StartGymBattleMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.StartGymBattleMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleMessage(StartGymBattleMessage other) : this() {
+      gymId_ = other.gymId_;
+      attackingPokemonIds_ = other.attackingPokemonIds_.Clone();
+      defendingPokemonId_ = other.defendingPokemonId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleMessage Clone() {
+      return new StartGymBattleMessage(this);
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 1;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "attacking_pokemon_ids" field.</summary>
+    public const int AttackingPokemonIdsFieldNumber = 2;
+    private static readonly pb::FieldCodec<ulong> _repeated_attackingPokemonIds_codec
+        = pb::FieldCodec.ForFixed64(18);
+    private readonly pbc::RepeatedField<ulong> attackingPokemonIds_ = new pbc::RepeatedField<ulong>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<ulong> AttackingPokemonIds {
+      get { return attackingPokemonIds_; }
+    }
+
+    /// <summary>Field number for the "defending_pokemon_id" field.</summary>
+    public const int DefendingPokemonIdFieldNumber = 3;
+    private ulong defendingPokemonId_;
+    /// <summary>
+    ///  needs to be fixed64, tested by Grover
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong DefendingPokemonId {
+      get { return defendingPokemonId_; }
+      set {
+        defendingPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 4;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 5;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as StartGymBattleMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(StartGymBattleMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (GymId != other.GymId) return false;
+      if(!attackingPokemonIds_.Equals(other.attackingPokemonIds_)) return false;
+      if (DefendingPokemonId != other.DefendingPokemonId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      hash ^= attackingPokemonIds_.GetHashCode();
+      if (DefendingPokemonId != 0UL) hash ^= DefendingPokemonId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (GymId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(GymId);
+      }
+      attackingPokemonIds_.WriteTo(output, _repeated_attackingPokemonIds_codec);
+      if (DefendingPokemonId != 0UL) {
+        output.WriteRawTag(25);
+        output.WriteFixed64(DefendingPokemonId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      size += attackingPokemonIds_.CalculateSize(_repeated_attackingPokemonIds_codec);
+      if (DefendingPokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(StartGymBattleMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      attackingPokemonIds_.Add(other.attackingPokemonIds_);
+      if (other.DefendingPokemonId != 0UL) {
+        DefendingPokemonId = other.DefendingPokemonId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 18:
+          case 17: {
+            attackingPokemonIds_.AddEntriesFrom(input, _repeated_attackingPokemonIds_codec);
+            break;
+          }
+          case 25: {
+            DefendingPokemonId = input.ReadFixed64();
+            break;
+          }
+          case 33: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.cs
new file mode 100644
index 0000000..3960f73
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.proto</summary>
+  public static partial class UpgradePokemonMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UpgradePokemonMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXBn",
+            "cmFkZVBva2Vtb25NZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMiKwoVVXBncmFkZVBva2Vtb25NZXNzYWdl",
+            "EhIKCnBva2Vtb25faWQYASABKAZiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UpgradePokemonMessage), global::POGOProtos.Networking.Requests.Messages.UpgradePokemonMessage.Parser, new[]{ "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UpgradePokemonMessage : pb::IMessage<UpgradePokemonMessage> {
+    private static readonly pb::MessageParser<UpgradePokemonMessage> _parser = new pb::MessageParser<UpgradePokemonMessage>(() => new UpgradePokemonMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UpgradePokemonMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UpgradePokemonMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonMessage(UpgradePokemonMessage other) : this() {
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonMessage Clone() {
+      return new UpgradePokemonMessage(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UpgradePokemonMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UpgradePokemonMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(9);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UpgradePokemonMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseIncenseMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseIncenseMessage.cs
new file mode 100644
index 0000000..a27a57a
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseIncenseMessage.cs
@@ -0,0 +1,162 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseIncenseMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseIncenseMessage.proto</summary>
+  public static partial class UseIncenseMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseIncenseMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseIncenseMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SW5jZW5zZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXF1ZXN0cy5NZXNzYWdlcxomUE9HT1Byb3Rvcy9JbnZlbnRvcnkvSXRlbS9J",
+            "dGVtSWQucHJvdG8iTAoRVXNlSW5jZW5zZU1lc3NhZ2USNwoMaW5jZW5zZV90",
+            "eXBlGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWRi",
+            "BnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseIncenseMessage), global::POGOProtos.Networking.Requests.Messages.UseIncenseMessage.Parser, new[]{ "IncenseType" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseIncenseMessage : pb::IMessage<UseIncenseMessage> {
+    private static readonly pb::MessageParser<UseIncenseMessage> _parser = new pb::MessageParser<UseIncenseMessage>(() => new UseIncenseMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseIncenseMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseIncenseMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseMessage(UseIncenseMessage other) : this() {
+      incenseType_ = other.incenseType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseMessage Clone() {
+      return new UseIncenseMessage(this);
+    }
+
+    /// <summary>Field number for the "incense_type" field.</summary>
+    public const int IncenseTypeFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId incenseType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId IncenseType {
+      get { return incenseType_; }
+      set {
+        incenseType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseIncenseMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseIncenseMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IncenseType != other.IncenseType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IncenseType != 0) hash ^= IncenseType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IncenseType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) IncenseType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IncenseType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) IncenseType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseIncenseMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IncenseType != 0) {
+        IncenseType = other.IncenseType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            incenseType_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.cs
new file mode 100644
index 0000000..4e9c3ef
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.cs
@@ -0,0 +1,219 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.proto</summary>
+  public static partial class UseItemCaptureMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemCaptureMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SXRlbUNhcHR1cmVNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMaJlBPR09Qcm90b3MvSW52ZW50b3J5L0l0",
+            "ZW0vSXRlbUlkLnByb3RvInkKFVVzZUl0ZW1DYXB0dXJlTWVzc2FnZRIyCgdp",
+            "dGVtX2lkGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVt",
+            "SWQSFAoMZW5jb3VudGVyX2lkGAIgASgGEhYKDnNwYXduX3BvaW50X2lkGAMg",
+            "ASgJYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemCaptureMessage), global::POGOProtos.Networking.Requests.Messages.UseItemCaptureMessage.Parser, new[]{ "ItemId", "EncounterId", "SpawnPointId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemCaptureMessage : pb::IMessage<UseItemCaptureMessage> {
+    private static readonly pb::MessageParser<UseItemCaptureMessage> _parser = new pb::MessageParser<UseItemCaptureMessage>(() => new UseItemCaptureMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemCaptureMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseItemCaptureMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureMessage(UseItemCaptureMessage other) : this() {
+      itemId_ = other.itemId_;
+      encounterId_ = other.encounterId_;
+      spawnPointId_ = other.spawnPointId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureMessage Clone() {
+      return new UseItemCaptureMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 2;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "spawn_point_id" field.</summary>
+    public const int SpawnPointIdFieldNumber = 3;
+    private string spawnPointId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string SpawnPointId {
+      get { return spawnPointId_; }
+      set {
+        spawnPointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemCaptureMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemCaptureMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (SpawnPointId != other.SpawnPointId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (SpawnPointId.Length != 0) hash ^= SpawnPointId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(EncounterId);
+      }
+      if (SpawnPointId.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(SpawnPointId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (SpawnPointId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemCaptureMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.SpawnPointId.Length != 0) {
+        SpawnPointId = other.SpawnPointId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 26: {
+            SpawnPointId = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.cs
new file mode 100644
index 0000000..a85a985
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.proto</summary>
+  public static partial class UseItemEggIncubatorMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseItemEggIncubatorMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemEggIncubatorMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkhQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SXRlbUVnZ0luY3ViYXRvck1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0",
+            "d29ya2luZy5SZXF1ZXN0cy5NZXNzYWdlcyJBChpVc2VJdGVtRWdnSW5jdWJh",
+            "dG9yTWVzc2FnZRIPCgdpdGVtX2lkGAEgASgJEhIKCnBva2Vtb25faWQYAiAB",
+            "KARiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemEggIncubatorMessage), global::POGOProtos.Networking.Requests.Messages.UseItemEggIncubatorMessage.Parser, new[]{ "ItemId", "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemEggIncubatorMessage : pb::IMessage<UseItemEggIncubatorMessage> {
+    private static readonly pb::MessageParser<UseItemEggIncubatorMessage> _parser = new pb::MessageParser<UseItemEggIncubatorMessage>(() => new UseItemEggIncubatorMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemEggIncubatorMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseItemEggIncubatorMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorMessage(UseItemEggIncubatorMessage other) : this() {
+      itemId_ = other.itemId_;
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorMessage Clone() {
+      return new UseItemEggIncubatorMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private string itemId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemEggIncubatorMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemEggIncubatorMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId.Length != 0) hash ^= ItemId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(ItemId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ItemId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PokemonId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemEggIncubatorMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId.Length != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            ItemId = input.ReadString();
+            break;
+          }
+          case 16: {
+            PokemonId = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemGymMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemGymMessage.cs
new file mode 100644
index 0000000..574efee
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemGymMessage.cs
@@ -0,0 +1,247 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseItemGymMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseItemGymMessage.proto</summary>
+  public static partial class UseItemGymMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseItemGymMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemGymMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SXRlbUd5bU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXF1ZXN0cy5NZXNzYWdlcxomUE9HT1Byb3Rvcy9JbnZlbnRvcnkvSXRlbS9J",
+            "dGVtSWQucHJvdG8iigEKEVVzZUl0ZW1HeW1NZXNzYWdlEjIKB2l0ZW1faWQY",
+            "ASABKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1JZBIOCgZn",
+            "eW1faWQYAiABKAkSFwoPcGxheWVyX2xhdGl0dWRlGAMgASgBEhgKEHBsYXll",
+            "cl9sb25naXR1ZGUYBCABKAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemGymMessage), global::POGOProtos.Networking.Requests.Messages.UseItemGymMessage.Parser, new[]{ "ItemId", "GymId", "PlayerLatitude", "PlayerLongitude" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemGymMessage : pb::IMessage<UseItemGymMessage> {
+    private static readonly pb::MessageParser<UseItemGymMessage> _parser = new pb::MessageParser<UseItemGymMessage>(() => new UseItemGymMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemGymMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseItemGymMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymMessage(UseItemGymMessage other) : this() {
+      itemId_ = other.itemId_;
+      gymId_ = other.gymId_;
+      playerLatitude_ = other.playerLatitude_;
+      playerLongitude_ = other.playerLongitude_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymMessage Clone() {
+      return new UseItemGymMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_id" field.</summary>
+    public const int GymIdFieldNumber = 2;
+    private string gymId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GymId {
+      get { return gymId_; }
+      set {
+        gymId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "player_latitude" field.</summary>
+    public const int PlayerLatitudeFieldNumber = 3;
+    private double playerLatitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLatitude {
+      get { return playerLatitude_; }
+      set {
+        playerLatitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_longitude" field.</summary>
+    public const int PlayerLongitudeFieldNumber = 4;
+    private double playerLongitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PlayerLongitude {
+      get { return playerLongitude_; }
+      set {
+        playerLongitude_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemGymMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemGymMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (GymId != other.GymId) return false;
+      if (PlayerLatitude != other.PlayerLatitude) return false;
+      if (PlayerLongitude != other.PlayerLongitude) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (GymId.Length != 0) hash ^= GymId.GetHashCode();
+      if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
+      if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (GymId.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(PlayerLatitude);
+      }
+      if (PlayerLongitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(PlayerLongitude);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (GymId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GymId);
+      }
+      if (PlayerLatitude != 0D) {
+        size += 1 + 8;
+      }
+      if (PlayerLongitude != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemGymMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.GymId.Length != 0) {
+        GymId = other.GymId;
+      }
+      if (other.PlayerLatitude != 0D) {
+        PlayerLatitude = other.PlayerLatitude;
+      }
+      if (other.PlayerLongitude != 0D) {
+        PlayerLongitude = other.PlayerLongitude;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            GymId = input.ReadString();
+            break;
+          }
+          case 25: {
+            PlayerLatitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            PlayerLongitude = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.cs
new file mode 100644
index 0000000..f057bc6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.cs
@@ -0,0 +1,190 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.proto</summary>
+  public static partial class UseItemPotionMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseItemPotionMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemPotionMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SXRlbVBvdGlvbk1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcxomUE9HT1Byb3Rvcy9JbnZlbnRvcnkvSXRl",
+            "bS9JdGVtSWQucHJvdG8iXgoUVXNlSXRlbVBvdGlvbk1lc3NhZ2USMgoHaXRl",
+            "bV9pZBgBIAEoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlk",
+            "EhIKCnBva2Vtb25faWQYAiABKAZiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemPotionMessage), global::POGOProtos.Networking.Requests.Messages.UseItemPotionMessage.Parser, new[]{ "ItemId", "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemPotionMessage : pb::IMessage<UseItemPotionMessage> {
+    private static readonly pb::MessageParser<UseItemPotionMessage> _parser = new pb::MessageParser<UseItemPotionMessage>(() => new UseItemPotionMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemPotionMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseItemPotionMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionMessage(UseItemPotionMessage other) : this() {
+      itemId_ = other.itemId_;
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionMessage Clone() {
+      return new UseItemPotionMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemPotionMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemPotionMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemPotionMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.cs
new file mode 100644
index 0000000..747aeef
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.cs
@@ -0,0 +1,190 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.proto</summary>
+  public static partial class UseItemReviveMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseItemReviveMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemReviveMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SXRlbVJldml2ZU1lc3NhZ2UucHJvdG8SJ1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXF1ZXN0cy5NZXNzYWdlcxomUE9HT1Byb3Rvcy9JbnZlbnRvcnkvSXRl",
+            "bS9JdGVtSWQucHJvdG8iXgoUVXNlSXRlbVJldml2ZU1lc3NhZ2USMgoHaXRl",
+            "bV9pZBgBIAEoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlk",
+            "EhIKCnBva2Vtb25faWQYAiABKAZiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemReviveMessage), global::POGOProtos.Networking.Requests.Messages.UseItemReviveMessage.Parser, new[]{ "ItemId", "PokemonId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemReviveMessage : pb::IMessage<UseItemReviveMessage> {
+    private static readonly pb::MessageParser<UseItemReviveMessage> _parser = new pb::MessageParser<UseItemReviveMessage>(() => new UseItemReviveMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemReviveMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseItemReviveMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveMessage(UseItemReviveMessage other) : this() {
+      itemId_ = other.itemId_;
+      pokemonId_ = other.pokemonId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveMessage Clone() {
+      return new UseItemReviveMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private ulong pokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemReviveMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemReviveMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (PokemonId != other.PokemonId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        output.WriteRawTag(17);
+        output.WriteFixed64(PokemonId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (PokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemReviveMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.PokemonId != 0UL) {
+        PokemonId = other.PokemonId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            PokemonId = input.ReadFixed64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.cs b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.cs
new file mode 100644
index 0000000..443aa69
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.cs
@@ -0,0 +1,162 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests.Messages {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.proto</summary>
+  public static partial class UseItemXpBoostMessageReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Messages/UseItemXpBoostMessage.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemXpBoostMessageReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvTWVzc2FnZXMvVXNl",
+            "SXRlbVhwQm9vc3RNZXNzYWdlLnByb3RvEidQT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVxdWVzdHMuTWVzc2FnZXMaJlBPR09Qcm90b3MvSW52ZW50b3J5L0l0",
+            "ZW0vSXRlbUlkLnByb3RvIksKFVVzZUl0ZW1YcEJvb3N0TWVzc2FnZRIyCgdp",
+            "dGVtX2lkGAEgASgOMiEuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVt",
+            "SWRiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Messages.UseItemXpBoostMessage), global::POGOProtos.Networking.Requests.Messages.UseItemXpBoostMessage.Parser, new[]{ "ItemId" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemXpBoostMessage : pb::IMessage<UseItemXpBoostMessage> {
+    private static readonly pb::MessageParser<UseItemXpBoostMessage> _parser = new pb::MessageParser<UseItemXpBoostMessage>(() => new UseItemXpBoostMessage());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemXpBoostMessage> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.Messages.UseItemXpBoostMessageReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostMessage(UseItemXpBoostMessage other) : this() {
+      itemId_ = other.itemId_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostMessage Clone() {
+      return new UseItemXpBoostMessage(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemXpBoostMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemXpBoostMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemXpBoostMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/POGOProtosNetworkingRequests.cs b/PokemonGo/POGOProtos/Networking/Requests/POGOProtosNetworkingRequests.cs
new file mode 100644
index 0000000..b1785f8
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/POGOProtosNetworkingRequests.cs
@@ -0,0 +1,508 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Networking.Requests.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Networking.Requests.proto</summary>
+  public static partial class POGOProtosNetworkingRequestsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Networking.Requests.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosNetworkingRequestsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiRQT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVxdWVzdHMucHJvdG8SHlBPR09Q",
+            "cm90b3MuTmV0d29ya2luZy5SZXF1ZXN0cyJlCgdSZXF1ZXN0EkEKDHJlcXVl",
+            "c3RfdHlwZRgBIAEoDjIrLlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXF1ZXN0",
+            "cy5SZXF1ZXN0VHlwZRIXCg9yZXF1ZXN0X21lc3NhZ2UYAiABKAwqwQwKC1Jl",
+            "cXVlc3RUeXBlEhAKDE1FVEhPRF9VTlNFVBAAEhEKDVBMQVlFUl9VUERBVEUQ",
+            "ARIOCgpHRVRfUExBWUVSEAISEQoNR0VUX0lOVkVOVE9SWRAEEhUKEURPV05M",
+            "T0FEX1NFVFRJTkdTEAUSGwoXRE9XTkxPQURfSVRFTV9URU1QTEFURVMQBhIi",
+            "Ch5ET1dOTE9BRF9SRU1PVEVfQ09ORklHX1ZFUlNJT04QBxIPCgtGT1JUX1NF",
+            "QVJDSBBlEg0KCUVOQ09VTlRFUhBmEhEKDUNBVENIX1BPS0VNT04QZxIQCgxG",
+            "T1JUX0RFVEFJTFMQaBIMCghJVEVNX1VTRRBpEhMKD0dFVF9NQVBfT0JKRUNU",
+            "UxBqEhcKE0ZPUlRfREVQTE9ZX1BPS0VNT04QbhIXChNGT1JUX1JFQ0FMTF9Q",
+            "T0tFTU9OEG8SEwoPUkVMRUFTRV9QT0tFTU9OEHASEwoPVVNFX0lURU1fUE9U",
+            "SU9OEHESFAoQVVNFX0lURU1fQ0FQVFVSRRByEhEKDVVTRV9JVEVNX0ZMRUUQ",
+            "cxITCg9VU0VfSVRFTV9SRVZJVkUQdBIQCgxUUkFERV9TRUFSQ0gQdRIPCgtU",
+            "UkFERV9PRkZFUhB2EhIKDlRSQURFX1JFU1BPTlNFEHcSEAoMVFJBREVfUkVT",
+            "VUxUEHgSFgoSR0VUX1BMQVlFUl9QUk9GSUxFEHkSEQoNR0VUX0lURU1fUEFD",
+            "SxB6EhEKDUJVWV9JVEVNX1BBQ0sQexIQCgxCVVlfR0VNX1BBQ0sQfBISCg5F",
+            "Vk9MVkVfUE9LRU1PThB9EhQKEEdFVF9IQVRDSEVEX0VHR1MQfhIfChtFTkNP",
+            "VU5URVJfVFVUT1JJQUxfQ09NUExFVEUQfxIVChBMRVZFTF9VUF9SRVdBUkRT",
+            "EIABEhkKFENIRUNLX0FXQVJERURfQkFER0VTEIEBEhEKDFVTRV9JVEVNX0dZ",
+            "TRCFARIUCg9HRVRfR1lNX0RFVEFJTFMQhgESFQoQU1RBUlRfR1lNX0JBVFRM",
+            "RRCHARIPCgpBVFRBQ0tfR1lNEIgBEhsKFlJFQ1lDTEVfSU5WRU5UT1JZX0lU",
+            "RU0QiQESGAoTQ09MTEVDVF9EQUlMWV9CT05VUxCKARIWChFVU0VfSVRFTV9Y",
+            "UF9CT09TVBCLARIbChZVU0VfSVRFTV9FR0dfSU5DVUJBVE9SEIwBEhAKC1VT",
+            "RV9JTkNFTlNFEI0BEhgKE0dFVF9JTkNFTlNFX1BPS0VNT04QjgESFgoRSU5D",
+            "RU5TRV9FTkNPVU5URVIQjwESFgoRQUREX0ZPUlRfTU9ESUZJRVIQkAESEwoO",
+            "RElTS19FTkNPVU5URVIQkQESIQocQ09MTEVDVF9EQUlMWV9ERUZFTkRFUl9C",
+            "T05VUxCSARIUCg9VUEdSQURFX1BPS0VNT04QkwESGQoUU0VUX0ZBVk9SSVRF",
+            "X1BPS0VNT04QlAESFQoQTklDS05BTUVfUE9LRU1PThCVARIQCgtFUVVJUF9C",
+            "QURHRRCWARIZChRTRVRfQ09OVEFDVF9TRVRUSU5HUxCXARIVChBHRVRfQVNT",
+            "RVRfRElHRVNUEKwCEhYKEUdFVF9ET1dOTE9BRF9VUkxTEK0CEhwKF0dFVF9T",
+            "VUdHRVNURURfQ09ERU5BTUVTEJEDEh0KGENIRUNLX0NPREVOQU1FX0FWQUlM",
+            "QUJMRRCSAxITCg5DTEFJTV9DT0RFTkFNRRCTAxIPCgpTRVRfQVZBVEFSEJQD",
+            "EhQKD1NFVF9QTEFZRVJfVEVBTRCVAxIbChZNQVJLX1RVVE9SSUFMX0NPTVBM",
+            "RVRFEJYDEhYKEUxPQURfU1BBV05fUE9JTlRTEPQDEgkKBEVDSE8QmgUSGwoW",
+            "REVCVUdfVVBEQVRFX0lOVkVOVE9SWRC8BRIYChNERUJVR19ERUxFVEVfUExB",
+            "WUVSEL0FEhcKElNGSURBX1JFR0lTVFJBVElPThCgBhIVChBTRklEQV9BQ1RJ",
+            "T05fTE9HEKEGEhgKE1NGSURBX0NFUlRJRklDQVRJT04QogYSEQoMU0ZJREFf",
+            "VVBEQVRFEKMGEhEKDFNGSURBX0FDVElPThCkBhIRCgxTRklEQV9ET1dTRVIQ",
+            "pQYSEgoNU0ZJREFfQ0FQVFVSRRCmBmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Networking.Requests.RequestType), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Request), global::POGOProtos.Networking.Requests.Request.Parser, new[]{ "RequestType", "RequestMessage" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum RequestType {
+    /// <summary>
+    ///  No implementation required
+    /// </summary>
+    [pbr::OriginalName("METHOD_UNSET")] MethodUnset = 0,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("PLAYER_UPDATE")] PlayerUpdate = 1,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_PLAYER")] GetPlayer = 2,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_INVENTORY")] GetInventory = 4,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DOWNLOAD_SETTINGS")] DownloadSettings = 5,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DOWNLOAD_ITEM_TEMPLATES")] DownloadItemTemplates = 6,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DOWNLOAD_REMOTE_CONFIG_VERSION")] DownloadRemoteConfigVersion = 7,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_SEARCH")] FortSearch = 101,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ENCOUNTER")] Encounter = 102,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("CATCH_POKEMON")] CatchPokemon = 103,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_DETAILS")] FortDetails = 104,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("ITEM_USE")] ItemUse = 105,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_MAP_OBJECTS")] GetMapObjects = 106,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_DEPLOY_POKEMON")] FortDeployPokemon = 110,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_RECALL_POKEMON")] FortRecallPokemon = 111,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("RELEASE_POKEMON")] ReleasePokemon = 112,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_POTION")] UseItemPotion = 113,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_CAPTURE")] UseItemCapture = 114,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_FLEE")] UseItemFlee = 115,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_REVIVE")] UseItemRevive = 116,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_SEARCH")] TradeSearch = 117,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_OFFER")] TradeOffer = 118,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_RESPONSE")] TradeResponse = 119,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_RESULT")] TradeResult = 120,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_PLAYER_PROFILE")] GetPlayerProfile = 121,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("GET_ITEM_PACK")] GetItemPack = 122,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("BUY_ITEM_PACK")] BuyItemPack = 123,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("BUY_GEM_PACK")] BuyGemPack = 124,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("EVOLVE_POKEMON")] EvolvePokemon = 125,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_HATCHED_EGGS")] GetHatchedEggs = 126,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ENCOUNTER_TUTORIAL_COMPLETE")] EncounterTutorialComplete = 127,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("LEVEL_UP_REWARDS")] LevelUpRewards = 128,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("CHECK_AWARDED_BADGES")] CheckAwardedBadges = 129,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_GYM")] UseItemGym = 133,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_GYM_DETAILS")] GetGymDetails = 134,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("START_GYM_BATTLE")] StartGymBattle = 135,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ATTACK_GYM")] AttackGym = 136,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("RECYCLE_INVENTORY_ITEM")] RecycleInventoryItem = 137,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("COLLECT_DAILY_BONUS")] CollectDailyBonus = 138,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_XP_BOOST")] UseItemXpBoost = 139,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_EGG_INCUBATOR")] UseItemEggIncubator = 140,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_INCENSE")] UseIncense = 141,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_INCENSE_POKEMON")] GetIncensePokemon = 142,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("INCENSE_ENCOUNTER")] IncenseEncounter = 143,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ADD_FORT_MODIFIER")] AddFortModifier = 144,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DISK_ENCOUNTER")] DiskEncounter = 145,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("COLLECT_DAILY_DEFENDER_BONUS")] CollectDailyDefenderBonus = 146,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("UPGRADE_POKEMON")] UpgradePokemon = 147,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_FAVORITE_POKEMON")] SetFavoritePokemon = 148,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("NICKNAME_POKEMON")] NicknamePokemon = 149,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("EQUIP_BADGE")] EquipBadge = 150,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_CONTACT_SETTINGS")] SetContactSettings = 151,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_ASSET_DIGEST")] GetAssetDigest = 300,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_DOWNLOAD_URLS")] GetDownloadUrls = 301,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_SUGGESTED_CODENAMES")] GetSuggestedCodenames = 401,
+    /// <summary>
+    ///  Implemented [R &amp; M] TEST RESPONSE
+    /// </summary>
+    [pbr::OriginalName("CHECK_CODENAME_AVAILABLE")] CheckCodenameAvailable = 402,
+    /// <summary>
+    ///  Implemented [R &amp; M] TEST RESPONSE
+    /// </summary>
+    [pbr::OriginalName("CLAIM_CODENAME")] ClaimCodename = 403,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_AVATAR")] SetAvatar = 404,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_PLAYER_TEAM")] SetPlayerTeam = 405,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("MARK_TUTORIAL_COMPLETE")] MarkTutorialComplete = 406,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("LOAD_SPAWN_POINTS")] LoadSpawnPoints = 500,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ECHO")] Echo = 666,
+    [pbr::OriginalName("DEBUG_UPDATE_INVENTORY")] DebugUpdateInventory = 700,
+    [pbr::OriginalName("DEBUG_DELETE_PLAYER")] DebugDeletePlayer = 701,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_REGISTRATION")] SfidaRegistration = 800,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SFIDA_ACTION_LOG")] SfidaActionLog = 801,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_CERTIFICATION")] SfidaCertification = 802,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_UPDATE")] SfidaUpdate = 803,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_ACTION")] SfidaAction = 804,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_DOWSER")] SfidaDowser = 805,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_CAPTURE")] SfidaCapture = 806,
+  }
+
+  #endregion
+
+  #region Messages
+  public sealed partial class Request : pb::IMessage<Request> {
+    private static readonly pb::MessageParser<Request> _parser = new pb::MessageParser<Request>(() => new Request());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Request> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.POGOProtosNetworkingRequestsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Request() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Request(Request other) : this() {
+      requestType_ = other.requestType_;
+      requestMessage_ = other.requestMessage_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Request Clone() {
+      return new Request(this);
+    }
+
+    /// <summary>Field number for the "request_type" field.</summary>
+    public const int RequestTypeFieldNumber = 1;
+    private global::POGOProtos.Networking.Requests.RequestType requestType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Requests.RequestType RequestType {
+      get { return requestType_; }
+      set {
+        requestType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_message" field.</summary>
+    public const int RequestMessageFieldNumber = 2;
+    private pb::ByteString requestMessage_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString RequestMessage {
+      get { return requestMessage_; }
+      set {
+        requestMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Request);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Request other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (RequestType != other.RequestType) return false;
+      if (RequestMessage != other.RequestMessage) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (RequestType != 0) hash ^= RequestType.GetHashCode();
+      if (RequestMessage.Length != 0) hash ^= RequestMessage.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (RequestType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) RequestType);
+      }
+      if (RequestMessage.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteBytes(RequestMessage);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (RequestType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) RequestType);
+      }
+      if (RequestMessage.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(RequestMessage);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Request other) {
+      if (other == null) {
+        return;
+      }
+      if (other.RequestType != 0) {
+        RequestType = other.RequestType;
+      }
+      if (other.RequestMessage.Length != 0) {
+        RequestMessage = other.RequestMessage;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            requestType_ = (global::POGOProtos.Networking.Requests.RequestType) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            RequestMessage = input.ReadBytes();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/Request.cs b/PokemonGo/POGOProtos/Networking/Requests/Request.cs
new file mode 100644
index 0000000..0c9f008
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/Request.cs
@@ -0,0 +1,190 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/Request.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/Request.proto</summary>
+  public static partial class RequestReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/Request.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static RequestReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CixQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvUmVxdWVzdC5wcm90",
+            "bxIeUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlcXVlc3RzGjBQT0dPUHJvdG9z",
+            "L05ldHdvcmtpbmcvUmVxdWVzdHMvUmVxdWVzdFR5cGUucHJvdG8iZQoHUmVx",
+            "dWVzdBJBCgxyZXF1ZXN0X3R5cGUYASABKA4yKy5QT0dPUHJvdG9zLk5ldHdv",
+            "cmtpbmcuUmVxdWVzdHMuUmVxdWVzdFR5cGUSFwoPcmVxdWVzdF9tZXNzYWdl",
+            "GAIgASgMYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Networking.Requests.RequestTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Requests.Request), global::POGOProtos.Networking.Requests.Request.Parser, new[]{ "RequestType", "RequestMessage" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Request : pb::IMessage<Request> {
+    private static readonly pb::MessageParser<Request> _parser = new pb::MessageParser<Request>(() => new Request());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Request> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Requests.RequestReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Request() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Request(Request other) : this() {
+      requestType_ = other.requestType_;
+      requestMessage_ = other.requestMessage_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Request Clone() {
+      return new Request(this);
+    }
+
+    /// <summary>Field number for the "request_type" field.</summary>
+    public const int RequestTypeFieldNumber = 1;
+    private global::POGOProtos.Networking.Requests.RequestType requestType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Requests.RequestType RequestType {
+      get { return requestType_; }
+      set {
+        requestType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_message" field.</summary>
+    public const int RequestMessageFieldNumber = 2;
+    private pb::ByteString requestMessage_ = pb::ByteString.Empty;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pb::ByteString RequestMessage {
+      get { return requestMessage_; }
+      set {
+        requestMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Request);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Request other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (RequestType != other.RequestType) return false;
+      if (RequestMessage != other.RequestMessage) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (RequestType != 0) hash ^= RequestType.GetHashCode();
+      if (RequestMessage.Length != 0) hash ^= RequestMessage.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (RequestType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) RequestType);
+      }
+      if (RequestMessage.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteBytes(RequestMessage);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (RequestType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) RequestType);
+      }
+      if (RequestMessage.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(RequestMessage);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Request other) {
+      if (other == null) {
+        return;
+      }
+      if (other.RequestType != 0) {
+        RequestType = other.RequestType;
+      }
+      if (other.RequestMessage.Length != 0) {
+        RequestMessage = other.RequestMessage;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            requestType_ = (global::POGOProtos.Networking.Requests.RequestType) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            RequestMessage = input.ReadBytes();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Requests/RequestType.cs b/PokemonGo/POGOProtos/Networking/Requests/RequestType.cs
new file mode 100644
index 0000000..c699d6e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Requests/RequestType.cs
@@ -0,0 +1,356 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Requests/RequestType.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Requests {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Requests/RequestType.proto</summary>
+  public static partial class RequestTypeReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Requests/RequestType.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static RequestTypeReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjBQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVxdWVzdHMvUmVxdWVzdFR5cGUu",
+            "cHJvdG8SHlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXF1ZXN0cyrBDAoLUmVx",
+            "dWVzdFR5cGUSEAoMTUVUSE9EX1VOU0VUEAASEQoNUExBWUVSX1VQREFURRAB",
+            "Eg4KCkdFVF9QTEFZRVIQAhIRCg1HRVRfSU5WRU5UT1JZEAQSFQoRRE9XTkxP",
+            "QURfU0VUVElOR1MQBRIbChdET1dOTE9BRF9JVEVNX1RFTVBMQVRFUxAGEiIK",
+            "HkRPV05MT0FEX1JFTU9URV9DT05GSUdfVkVSU0lPThAHEg8KC0ZPUlRfU0VB",
+            "UkNIEGUSDQoJRU5DT1VOVEVSEGYSEQoNQ0FUQ0hfUE9LRU1PThBnEhAKDEZP",
+            "UlRfREVUQUlMUxBoEgwKCElURU1fVVNFEGkSEwoPR0VUX01BUF9PQkpFQ1RT",
+            "EGoSFwoTRk9SVF9ERVBMT1lfUE9LRU1PThBuEhcKE0ZPUlRfUkVDQUxMX1BP",
+            "S0VNT04QbxITCg9SRUxFQVNFX1BPS0VNT04QcBITCg9VU0VfSVRFTV9QT1RJ",
+            "T04QcRIUChBVU0VfSVRFTV9DQVBUVVJFEHISEQoNVVNFX0lURU1fRkxFRRBz",
+            "EhMKD1VTRV9JVEVNX1JFVklWRRB0EhAKDFRSQURFX1NFQVJDSBB1Eg8KC1RS",
+            "QURFX09GRkVSEHYSEgoOVFJBREVfUkVTUE9OU0UQdxIQCgxUUkFERV9SRVNV",
+            "TFQQeBIWChJHRVRfUExBWUVSX1BST0ZJTEUQeRIRCg1HRVRfSVRFTV9QQUNL",
+            "EHoSEQoNQlVZX0lURU1fUEFDSxB7EhAKDEJVWV9HRU1fUEFDSxB8EhIKDkVW",
+            "T0xWRV9QT0tFTU9OEH0SFAoQR0VUX0hBVENIRURfRUdHUxB+Eh8KG0VOQ09V",
+            "TlRFUl9UVVRPUklBTF9DT01QTEVURRB/EhUKEExFVkVMX1VQX1JFV0FSRFMQ",
+            "gAESGQoUQ0hFQ0tfQVdBUkRFRF9CQURHRVMQgQESEQoMVVNFX0lURU1fR1lN",
+            "EIUBEhQKD0dFVF9HWU1fREVUQUlMUxCGARIVChBTVEFSVF9HWU1fQkFUVExF",
+            "EIcBEg8KCkFUVEFDS19HWU0QiAESGwoWUkVDWUNMRV9JTlZFTlRPUllfSVRF",
+            "TRCJARIYChNDT0xMRUNUX0RBSUxZX0JPTlVTEIoBEhYKEVVTRV9JVEVNX1hQ",
+            "X0JPT1NUEIsBEhsKFlVTRV9JVEVNX0VHR19JTkNVQkFUT1IQjAESEAoLVVNF",
+            "X0lOQ0VOU0UQjQESGAoTR0VUX0lOQ0VOU0VfUE9LRU1PThCOARIWChFJTkNF",
+            "TlNFX0VOQ09VTlRFUhCPARIWChFBRERfRk9SVF9NT0RJRklFUhCQARITCg5E",
+            "SVNLX0VOQ09VTlRFUhCRARIhChxDT0xMRUNUX0RBSUxZX0RFRkVOREVSX0JP",
+            "TlVTEJIBEhQKD1VQR1JBREVfUE9LRU1PThCTARIZChRTRVRfRkFWT1JJVEVf",
+            "UE9LRU1PThCUARIVChBOSUNLTkFNRV9QT0tFTU9OEJUBEhAKC0VRVUlQX0JB",
+            "REdFEJYBEhkKFFNFVF9DT05UQUNUX1NFVFRJTkdTEJcBEhUKEEdFVF9BU1NF",
+            "VF9ESUdFU1QQrAISFgoRR0VUX0RPV05MT0FEX1VSTFMQrQISHAoXR0VUX1NV",
+            "R0dFU1RFRF9DT0RFTkFNRVMQkQMSHQoYQ0hFQ0tfQ09ERU5BTUVfQVZBSUxB",
+            "QkxFEJIDEhMKDkNMQUlNX0NPREVOQU1FEJMDEg8KClNFVF9BVkFUQVIQlAMS",
+            "FAoPU0VUX1BMQVlFUl9URUFNEJUDEhsKFk1BUktfVFVUT1JJQUxfQ09NUExF",
+            "VEUQlgMSFgoRTE9BRF9TUEFXTl9QT0lOVFMQ9AMSCQoERUNITxCaBRIbChZE",
+            "RUJVR19VUERBVEVfSU5WRU5UT1JZELwFEhgKE0RFQlVHX0RFTEVURV9QTEFZ",
+            "RVIQvQUSFwoSU0ZJREFfUkVHSVNUUkFUSU9OEKAGEhUKEFNGSURBX0FDVElP",
+            "Tl9MT0cQoQYSGAoTU0ZJREFfQ0VSVElGSUNBVElPThCiBhIRCgxTRklEQV9V",
+            "UERBVEUQowYSEQoMU0ZJREFfQUNUSU9OEKQGEhEKDFNGSURBX0RPV1NFUhCl",
+            "BhISCg1TRklEQV9DQVBUVVJFEKYGYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::POGOProtos.Networking.Requests.RequestType), }, null));
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum RequestType {
+    /// <summary>
+    ///  No implementation required
+    /// </summary>
+    [pbr::OriginalName("METHOD_UNSET")] MethodUnset = 0,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("PLAYER_UPDATE")] PlayerUpdate = 1,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_PLAYER")] GetPlayer = 2,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_INVENTORY")] GetInventory = 4,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DOWNLOAD_SETTINGS")] DownloadSettings = 5,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DOWNLOAD_ITEM_TEMPLATES")] DownloadItemTemplates = 6,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DOWNLOAD_REMOTE_CONFIG_VERSION")] DownloadRemoteConfigVersion = 7,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_SEARCH")] FortSearch = 101,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ENCOUNTER")] Encounter = 102,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("CATCH_POKEMON")] CatchPokemon = 103,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_DETAILS")] FortDetails = 104,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("ITEM_USE")] ItemUse = 105,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_MAP_OBJECTS")] GetMapObjects = 106,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_DEPLOY_POKEMON")] FortDeployPokemon = 110,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("FORT_RECALL_POKEMON")] FortRecallPokemon = 111,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("RELEASE_POKEMON")] ReleasePokemon = 112,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_POTION")] UseItemPotion = 113,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_CAPTURE")] UseItemCapture = 114,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_FLEE")] UseItemFlee = 115,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_REVIVE")] UseItemRevive = 116,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_SEARCH")] TradeSearch = 117,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_OFFER")] TradeOffer = 118,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_RESPONSE")] TradeResponse = 119,
+    /// <summary>
+    ///  Not yet implemented in the game
+    /// </summary>
+    [pbr::OriginalName("TRADE_RESULT")] TradeResult = 120,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_PLAYER_PROFILE")] GetPlayerProfile = 121,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("GET_ITEM_PACK")] GetItemPack = 122,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("BUY_ITEM_PACK")] BuyItemPack = 123,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("BUY_GEM_PACK")] BuyGemPack = 124,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("EVOLVE_POKEMON")] EvolvePokemon = 125,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_HATCHED_EGGS")] GetHatchedEggs = 126,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ENCOUNTER_TUTORIAL_COMPLETE")] EncounterTutorialComplete = 127,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("LEVEL_UP_REWARDS")] LevelUpRewards = 128,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("CHECK_AWARDED_BADGES")] CheckAwardedBadges = 129,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_GYM")] UseItemGym = 133,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_GYM_DETAILS")] GetGymDetails = 134,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("START_GYM_BATTLE")] StartGymBattle = 135,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ATTACK_GYM")] AttackGym = 136,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("RECYCLE_INVENTORY_ITEM")] RecycleInventoryItem = 137,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("COLLECT_DAILY_BONUS")] CollectDailyBonus = 138,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_XP_BOOST")] UseItemXpBoost = 139,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_ITEM_EGG_INCUBATOR")] UseItemEggIncubator = 140,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("USE_INCENSE")] UseIncense = 141,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_INCENSE_POKEMON")] GetIncensePokemon = 142,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("INCENSE_ENCOUNTER")] IncenseEncounter = 143,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ADD_FORT_MODIFIER")] AddFortModifier = 144,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("DISK_ENCOUNTER")] DiskEncounter = 145,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("COLLECT_DAILY_DEFENDER_BONUS")] CollectDailyDefenderBonus = 146,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("UPGRADE_POKEMON")] UpgradePokemon = 147,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_FAVORITE_POKEMON")] SetFavoritePokemon = 148,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("NICKNAME_POKEMON")] NicknamePokemon = 149,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("EQUIP_BADGE")] EquipBadge = 150,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_CONTACT_SETTINGS")] SetContactSettings = 151,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_ASSET_DIGEST")] GetAssetDigest = 300,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_DOWNLOAD_URLS")] GetDownloadUrls = 301,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("GET_SUGGESTED_CODENAMES")] GetSuggestedCodenames = 401,
+    /// <summary>
+    ///  Implemented [R &amp; M] TEST RESPONSE
+    /// </summary>
+    [pbr::OriginalName("CHECK_CODENAME_AVAILABLE")] CheckCodenameAvailable = 402,
+    /// <summary>
+    ///  Implemented [R &amp; M] TEST RESPONSE
+    /// </summary>
+    [pbr::OriginalName("CLAIM_CODENAME")] ClaimCodename = 403,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_AVATAR")] SetAvatar = 404,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SET_PLAYER_TEAM")] SetPlayerTeam = 405,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("MARK_TUTORIAL_COMPLETE")] MarkTutorialComplete = 406,
+    /// <summary>
+    ///  Can't find this one
+    /// </summary>
+    [pbr::OriginalName("LOAD_SPAWN_POINTS")] LoadSpawnPoints = 500,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("ECHO")] Echo = 666,
+    [pbr::OriginalName("DEBUG_UPDATE_INVENTORY")] DebugUpdateInventory = 700,
+    [pbr::OriginalName("DEBUG_DELETE_PLAYER")] DebugDeletePlayer = 701,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_REGISTRATION")] SfidaRegistration = 800,
+    /// <summary>
+    ///  Implemented [R &amp; M]
+    /// </summary>
+    [pbr::OriginalName("SFIDA_ACTION_LOG")] SfidaActionLog = 801,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_CERTIFICATION")] SfidaCertification = 802,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_UPDATE")] SfidaUpdate = 803,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_ACTION")] SfidaAction = 804,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_DOWSER")] SfidaDowser = 805,
+    /// <summary>
+    ///  Not yet released.
+    /// </summary>
+    [pbr::OriginalName("SFIDA_CAPTURE")] SfidaCapture = 806,
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/AddFortModifierResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/AddFortModifierResponse.cs
new file mode 100644
index 0000000..1ac36ff
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/AddFortModifierResponse.cs
@@ -0,0 +1,134 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/AddFortModifierResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/AddFortModifierResponse.proto</summary>
+  public static partial class AddFortModifierResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/AddFortModifierResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AddFortModifierResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj1QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0FkZEZvcnRNb2Rp",
+            "ZmllclJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVz",
+            "cG9uc2VzIhkKF0FkZEZvcnRNb2RpZmllclJlc3BvbnNlYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.AddFortModifierResponse), global::POGOProtos.Networking.Responses.AddFortModifierResponse.Parser, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  Initialized by assist.py
+  /// </summary>
+  public sealed partial class AddFortModifierResponse : pb::IMessage<AddFortModifierResponse> {
+    private static readonly pb::MessageParser<AddFortModifierResponse> _parser = new pb::MessageParser<AddFortModifierResponse>(() => new AddFortModifierResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AddFortModifierResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.AddFortModifierResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierResponse(AddFortModifierResponse other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierResponse Clone() {
+      return new AddFortModifierResponse(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AddFortModifierResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AddFortModifierResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AddFortModifierResponse other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/AttackGymResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/AttackGymResponse.cs
new file mode 100644
index 0000000..718a0ba
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/AttackGymResponse.cs
@@ -0,0 +1,313 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/AttackGymResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/AttackGymResponse.proto</summary>
+  public static partial class AttackGymResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/AttackGymResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static AttackGymResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0F0dGFja0d5bVJl",
+            "c3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2Vz",
+            "GiZQT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZUxvZy5wcm90bxouUE9H",
+            "T1Byb3Rvcy9EYXRhL0JhdHRsZS9CYXR0bGVQb2tlbW9uSW5mby5wcm90byKM",
+            "AwoRQXR0YWNrR3ltUmVzcG9uc2USSQoGcmVzdWx0GAEgASgOMjkuUE9HT1By",
+            "b3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5BdHRhY2tHeW1SZXNwb25zZS5S",
+            "ZXN1bHQSNQoKYmF0dGxlX2xvZxgCIAEoCzIhLlBPR09Qcm90b3MuRGF0YS5C",
+            "YXR0bGUuQmF0dGxlTG9nEhEKCWJhdHRsZV9pZBgDIAEoCRJCCg9hY3RpdmVf",
+            "ZGVmZW5kZXIYBCABKAsyKS5QT0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRs",
+            "ZVBva2Vtb25JbmZvEkIKD2FjdGl2ZV9hdHRhY2tlchgFIAEoCzIpLlBPR09Q",
+            "cm90b3MuRGF0YS5CYXR0bGUuQmF0dGxlUG9rZW1vbkluZm8iWgoGUmVzdWx0",
+            "EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEiAKHEVSUk9SX0lOVkFMSURfQVRU",
+            "QUNLX0FDVElPTlMQAhIWChJFUlJPUl9OT1RfSU5fUkFOR0UQA2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Battle.BattleLogReflection.Descriptor, global::POGOProtos.Data.Battle.BattlePokemonInfoReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.AttackGymResponse), global::POGOProtos.Networking.Responses.AttackGymResponse.Parser, new[]{ "Result", "BattleLog", "BattleId", "ActiveDefender", "ActiveAttacker" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class AttackGymResponse : pb::IMessage<AttackGymResponse> {
+    private static readonly pb::MessageParser<AttackGymResponse> _parser = new pb::MessageParser<AttackGymResponse>(() => new AttackGymResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AttackGymResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.AttackGymResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymResponse(AttackGymResponse other) : this() {
+      result_ = other.result_;
+      BattleLog = other.battleLog_ != null ? other.BattleLog.Clone() : null;
+      battleId_ = other.battleId_;
+      ActiveDefender = other.activeDefender_ != null ? other.ActiveDefender.Clone() : null;
+      ActiveAttacker = other.activeAttacker_ != null ? other.ActiveAttacker.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymResponse Clone() {
+      return new AttackGymResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_log" field.</summary>
+    public const int BattleLogFieldNumber = 2;
+    private global::POGOProtos.Data.Battle.BattleLog battleLog_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleLog BattleLog {
+      get { return battleLog_; }
+      set {
+        battleLog_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_id" field.</summary>
+    public const int BattleIdFieldNumber = 3;
+    private string battleId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BattleId {
+      get { return battleId_; }
+      set {
+        battleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "active_defender" field.</summary>
+    public const int ActiveDefenderFieldNumber = 4;
+    private global::POGOProtos.Data.Battle.BattlePokemonInfo activeDefender_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattlePokemonInfo ActiveDefender {
+      get { return activeDefender_; }
+      set {
+        activeDefender_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_attacker" field.</summary>
+    public const int ActiveAttackerFieldNumber = 5;
+    private global::POGOProtos.Data.Battle.BattlePokemonInfo activeAttacker_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattlePokemonInfo ActiveAttacker {
+      get { return activeAttacker_; }
+      set {
+        activeAttacker_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AttackGymResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AttackGymResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(BattleLog, other.BattleLog)) return false;
+      if (BattleId != other.BattleId) return false;
+      if (!object.Equals(ActiveDefender, other.ActiveDefender)) return false;
+      if (!object.Equals(ActiveAttacker, other.ActiveAttacker)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (battleLog_ != null) hash ^= BattleLog.GetHashCode();
+      if (BattleId.Length != 0) hash ^= BattleId.GetHashCode();
+      if (activeDefender_ != null) hash ^= ActiveDefender.GetHashCode();
+      if (activeAttacker_ != null) hash ^= ActiveAttacker.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (battleLog_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(BattleLog);
+      }
+      if (BattleId.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(BattleId);
+      }
+      if (activeDefender_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(ActiveDefender);
+      }
+      if (activeAttacker_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(ActiveAttacker);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (battleLog_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleLog);
+      }
+      if (BattleId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BattleId);
+      }
+      if (activeDefender_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActiveDefender);
+      }
+      if (activeAttacker_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActiveAttacker);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AttackGymResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.battleLog_ != null) {
+        if (battleLog_ == null) {
+          battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+        }
+        BattleLog.MergeFrom(other.BattleLog);
+      }
+      if (other.BattleId.Length != 0) {
+        BattleId = other.BattleId;
+      }
+      if (other.activeDefender_ != null) {
+        if (activeDefender_ == null) {
+          activeDefender_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+        }
+        ActiveDefender.MergeFrom(other.ActiveDefender);
+      }
+      if (other.activeAttacker_ != null) {
+        if (activeAttacker_ == null) {
+          activeAttacker_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+        }
+        ActiveAttacker.MergeFrom(other.ActiveAttacker);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (battleLog_ == null) {
+              battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+            }
+            input.ReadMessage(battleLog_);
+            break;
+          }
+          case 26: {
+            BattleId = input.ReadString();
+            break;
+          }
+          case 34: {
+            if (activeDefender_ == null) {
+              activeDefender_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+            }
+            input.ReadMessage(activeDefender_);
+            break;
+          }
+          case 42: {
+            if (activeAttacker_ == null) {
+              activeAttacker_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+            }
+            input.ReadMessage(activeAttacker_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the AttackGymResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_ATTACK_ACTIONS")] ErrorInvalidAttackActions = 2,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/CatchPokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/CatchPokemonResponse.cs
new file mode 100644
index 0000000..1836104
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/CatchPokemonResponse.cs
@@ -0,0 +1,272 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/CatchPokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/CatchPokemonResponse.proto</summary>
+  public static partial class CatchPokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/CatchPokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CatchPokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjpQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0NhdGNoUG9rZW1v",
+            "blJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9u",
+            "c2VzGipQT0dPUHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlQXdhcmQucHJv",
+            "dG8iwQIKFENhdGNoUG9rZW1vblJlc3BvbnNlElEKBnN0YXR1cxgBIAEoDjJB",
+            "LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuQ2F0Y2hQb2tlbW9u",
+            "UmVzcG9uc2UuQ2F0Y2hTdGF0dXMSFAoMbWlzc19wZXJjZW50GAIgASgBEhsK",
+            "E2NhcHR1cmVkX3Bva2Vtb25faWQYAyABKAYSPAoNY2FwdHVyZV9hd2FyZBgE",
+            "IAEoCzIlLlBPR09Qcm90b3MuRGF0YS5DYXB0dXJlLkNhcHR1cmVBd2FyZCJl",
+            "CgtDYXRjaFN0YXR1cxIPCgtDQVRDSF9FUlJPUhAAEhEKDUNBVENIX1NVQ0NF",
+            "U1MQARIQCgxDQVRDSF9FU0NBUEUQAhIOCgpDQVRDSF9GTEVFEAMSEAoMQ0FU",
+            "Q0hfTUlTU0VEEARiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Capture.CaptureAwardReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CatchPokemonResponse), global::POGOProtos.Networking.Responses.CatchPokemonResponse.Parser, new[]{ "Status", "MissPercent", "CapturedPokemonId", "CaptureAward" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CatchPokemonResponse : pb::IMessage<CatchPokemonResponse> {
+    private static readonly pb::MessageParser<CatchPokemonResponse> _parser = new pb::MessageParser<CatchPokemonResponse>(() => new CatchPokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CatchPokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.CatchPokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonResponse(CatchPokemonResponse other) : this() {
+      status_ = other.status_;
+      missPercent_ = other.missPercent_;
+      capturedPokemonId_ = other.capturedPokemonId_;
+      CaptureAward = other.captureAward_ != null ? other.CaptureAward.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonResponse Clone() {
+      return new CatchPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "miss_percent" field.</summary>
+    public const int MissPercentFieldNumber = 2;
+    private double missPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double MissPercent {
+      get { return missPercent_; }
+      set {
+        missPercent_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "captured_pokemon_id" field.</summary>
+    public const int CapturedPokemonIdFieldNumber = 3;
+    private ulong capturedPokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong CapturedPokemonId {
+      get { return capturedPokemonId_; }
+      set {
+        capturedPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_award" field.</summary>
+    public const int CaptureAwardFieldNumber = 4;
+    private global::POGOProtos.Data.Capture.CaptureAward captureAward_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureAward CaptureAward {
+      get { return captureAward_; }
+      set {
+        captureAward_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CatchPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (MissPercent != other.MissPercent) return false;
+      if (CapturedPokemonId != other.CapturedPokemonId) return false;
+      if (!object.Equals(CaptureAward, other.CaptureAward)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (MissPercent != 0D) hash ^= MissPercent.GetHashCode();
+      if (CapturedPokemonId != 0UL) hash ^= CapturedPokemonId.GetHashCode();
+      if (captureAward_ != null) hash ^= CaptureAward.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (MissPercent != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(MissPercent);
+      }
+      if (CapturedPokemonId != 0UL) {
+        output.WriteRawTag(25);
+        output.WriteFixed64(CapturedPokemonId);
+      }
+      if (captureAward_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (MissPercent != 0D) {
+        size += 1 + 8;
+      }
+      if (CapturedPokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (captureAward_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureAward);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CatchPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.MissPercent != 0D) {
+        MissPercent = other.MissPercent;
+      }
+      if (other.CapturedPokemonId != 0UL) {
+        CapturedPokemonId = other.CapturedPokemonId;
+      }
+      if (other.captureAward_ != null) {
+        if (captureAward_ == null) {
+          captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+        }
+        CaptureAward.MergeFrom(other.CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            MissPercent = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            CapturedPokemonId = input.ReadFixed64();
+            break;
+          }
+          case 34: {
+            if (captureAward_ == null) {
+              captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+            }
+            input.ReadMessage(captureAward_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CatchPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum CatchStatus {
+        [pbr::OriginalName("CATCH_ERROR")] CatchError = 0,
+        [pbr::OriginalName("CATCH_SUCCESS")] CatchSuccess = 1,
+        [pbr::OriginalName("CATCH_ESCAPE")] CatchEscape = 2,
+        [pbr::OriginalName("CATCH_FLEE")] CatchFlee = 3,
+        [pbr::OriginalName("CATCH_MISSED")] CatchMissed = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.cs
new file mode 100644
index 0000000..aea936b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.cs
@@ -0,0 +1,205 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.proto</summary>
+  public static partial class CheckAwardedBadgesResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/CheckAwardedBadgesResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CheckAwardedBadgesResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkBQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0NoZWNrQXdhcmRl",
+            "ZEJhZGdlc1Jlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcu",
+            "UmVzcG9uc2VzGiBQT0dPUHJvdG9zL0VudW1zL0JhZGdlVHlwZS5wcm90byKA",
+            "AQoaQ2hlY2tBd2FyZGVkQmFkZ2VzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEo",
+            "CBIzCg5hd2FyZGVkX2JhZGdlcxgCIAMoDjIbLlBPR09Qcm90b3MuRW51bXMu",
+            "QmFkZ2VUeXBlEhwKFGF3YXJkZWRfYmFkZ2VfbGV2ZWxzGAMgAygFYgZwcm90",
+            "bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.BadgeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CheckAwardedBadgesResponse), global::POGOProtos.Networking.Responses.CheckAwardedBadgesResponse.Parser, new[]{ "Success", "AwardedBadges", "AwardedBadgeLevels" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CheckAwardedBadgesResponse : pb::IMessage<CheckAwardedBadgesResponse> {
+    private static readonly pb::MessageParser<CheckAwardedBadgesResponse> _parser = new pb::MessageParser<CheckAwardedBadgesResponse>(() => new CheckAwardedBadgesResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckAwardedBadgesResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.CheckAwardedBadgesResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesResponse(CheckAwardedBadgesResponse other) : this() {
+      success_ = other.success_;
+      awardedBadges_ = other.awardedBadges_.Clone();
+      awardedBadgeLevels_ = other.awardedBadgeLevels_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesResponse Clone() {
+      return new CheckAwardedBadgesResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "awarded_badges" field.</summary>
+    public const int AwardedBadgesFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.BadgeType> _repeated_awardedBadges_codec
+        = pb::FieldCodec.ForEnum(18, x => (int) x, x => (global::POGOProtos.Enums.BadgeType) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.BadgeType> awardedBadges_ = new pbc::RepeatedField<global::POGOProtos.Enums.BadgeType>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.BadgeType> AwardedBadges {
+      get { return awardedBadges_; }
+    }
+
+    /// <summary>Field number for the "awarded_badge_levels" field.</summary>
+    public const int AwardedBadgeLevelsFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_awardedBadgeLevels_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> awardedBadgeLevels_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> AwardedBadgeLevels {
+      get { return awardedBadgeLevels_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckAwardedBadgesResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckAwardedBadgesResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if(!awardedBadges_.Equals(other.awardedBadges_)) return false;
+      if(!awardedBadgeLevels_.Equals(other.awardedBadgeLevels_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      hash ^= awardedBadges_.GetHashCode();
+      hash ^= awardedBadgeLevels_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      awardedBadges_.WriteTo(output, _repeated_awardedBadges_codec);
+      awardedBadgeLevels_.WriteTo(output, _repeated_awardedBadgeLevels_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      size += awardedBadges_.CalculateSize(_repeated_awardedBadges_codec);
+      size += awardedBadgeLevels_.CalculateSize(_repeated_awardedBadgeLevels_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckAwardedBadgesResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      awardedBadges_.Add(other.awardedBadges_);
+      awardedBadgeLevels_.Add(other.awardedBadgeLevels_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18:
+          case 16: {
+            awardedBadges_.AddEntriesFrom(input, _repeated_awardedBadges_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            awardedBadgeLevels_.AddEntriesFrom(input, _repeated_awardedBadgeLevels_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.cs
new file mode 100644
index 0000000..2ddeb86
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.cs
@@ -0,0 +1,269 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.proto</summary>
+  public static partial class CheckCodenameAvailableResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/CheckCodenameAvailableResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CheckCodenameAvailableResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkRQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0NoZWNrQ29kZW5h",
+            "bWVBdmFpbGFibGVSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlc3BvbnNlcyLCAgoeQ2hlY2tDb2RlbmFtZUF2YWlsYWJsZVJlc3Bv",
+            "bnNlEhAKCGNvZGVuYW1lGAEgASgJEhQKDHVzZXJfbWVzc2FnZRgCIAEoCRIV",
+            "Cg1pc19hc3NpZ25hYmxlGAMgASgIElYKBnN0YXR1cxgEIAEoDjJGLlBPR09Q",
+            "cm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuQ2hlY2tDb2RlbmFtZUF2YWls",
+            "YWJsZVJlc3BvbnNlLlN0YXR1cyKIAQoGU3RhdHVzEgkKBVVOU0VUEAASCwoH",
+            "U1VDQ0VTUxABEhoKFkNPREVOQU1FX05PVF9BVkFJTEFCTEUQAhIWChJDT0RF",
+            "TkFNRV9OT1RfVkFMSUQQAxIRCg1DVVJSRU5UX09XTkVSEAQSHwobQ09ERU5B",
+            "TUVfQ0hBTkdFX05PVF9BTExPV0VEEAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse), global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Parser, new[]{ "Codename", "UserMessage", "IsAssignable", "Status" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  TODO: Might be incorrect, please test.
+  /// </summary>
+  public sealed partial class CheckCodenameAvailableResponse : pb::IMessage<CheckCodenameAvailableResponse> {
+    private static readonly pb::MessageParser<CheckCodenameAvailableResponse> _parser = new pb::MessageParser<CheckCodenameAvailableResponse>(() => new CheckCodenameAvailableResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckCodenameAvailableResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableResponse(CheckCodenameAvailableResponse other) : this() {
+      codename_ = other.codename_;
+      userMessage_ = other.userMessage_;
+      isAssignable_ = other.isAssignable_;
+      status_ = other.status_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableResponse Clone() {
+      return new CheckCodenameAvailableResponse(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "user_message" field.</summary>
+    public const int UserMessageFieldNumber = 2;
+    private string userMessage_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string UserMessage {
+      get { return userMessage_; }
+      set {
+        userMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "is_assignable" field.</summary>
+    public const int IsAssignableFieldNumber = 3;
+    private bool isAssignable_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsAssignable {
+      get { return isAssignable_; }
+      set {
+        isAssignable_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 4;
+    private global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckCodenameAvailableResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckCodenameAvailableResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      if (UserMessage != other.UserMessage) return false;
+      if (IsAssignable != other.IsAssignable) return false;
+      if (Status != other.Status) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      if (UserMessage.Length != 0) hash ^= UserMessage.GetHashCode();
+      if (IsAssignable != false) hash ^= IsAssignable.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(UserMessage);
+      }
+      if (IsAssignable != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(IsAssignable);
+      }
+      if (Status != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Status);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(UserMessage);
+      }
+      if (IsAssignable != false) {
+        size += 1 + 1;
+      }
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckCodenameAvailableResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+      if (other.UserMessage.Length != 0) {
+        UserMessage = other.UserMessage;
+      }
+      if (other.IsAssignable != false) {
+        IsAssignable = other.IsAssignable;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+          case 18: {
+            UserMessage = input.ReadString();
+            break;
+          }
+          case 24: {
+            IsAssignable = input.ReadBool();
+            break;
+          }
+          case 32: {
+            status_ = (global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CheckCodenameAvailableResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("CODENAME_NOT_AVAILABLE")] CodenameNotAvailable = 2,
+        [pbr::OriginalName("CODENAME_NOT_VALID")] CodenameNotValid = 3,
+        [pbr::OriginalName("CURRENT_OWNER")] CurrentOwner = 4,
+        [pbr::OriginalName("CODENAME_CHANGE_NOT_ALLOWED")] CodenameChangeNotAllowed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/ClaimCodenameResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/ClaimCodenameResponse.cs
new file mode 100644
index 0000000..39438b5
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/ClaimCodenameResponse.cs
@@ -0,0 +1,269 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/ClaimCodenameResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/ClaimCodenameResponse.proto</summary>
+  public static partial class ClaimCodenameResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/ClaimCodenameResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ClaimCodenameResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0NsYWltQ29kZW5h",
+            "bWVSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcyKwAgoVQ2xhaW1Db2RlbmFtZVJlc3BvbnNlEhAKCGNvZGVuYW1lGAEg",
+            "ASgJEhQKDHVzZXJfbWVzc2FnZRgCIAEoCRIVCg1pc19hc3NpZ25hYmxlGAMg",
+            "ASgIEk0KBnN0YXR1cxgEIAEoDjI9LlBPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXNwb25zZXMuQ2xhaW1Db2RlbmFtZVJlc3BvbnNlLlN0YXR1cyKIAQoGU3Rh",
+            "dHVzEgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhoKFkNPREVOQU1FX05PVF9B",
+            "VkFJTEFCTEUQAhIWChJDT0RFTkFNRV9OT1RfVkFMSUQQAxIRCg1DVVJSRU5U",
+            "X09XTkVSEAQSHwobQ09ERU5BTUVfQ0hBTkdFX05PVF9BTExPV0VEEAViBnBy",
+            "b3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.ClaimCodenameResponse), global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Parser, new[]{ "Codename", "UserMessage", "IsAssignable", "Status" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  TODO: Might be incorrect, please test.
+  /// </summary>
+  public sealed partial class ClaimCodenameResponse : pb::IMessage<ClaimCodenameResponse> {
+    private static readonly pb::MessageParser<ClaimCodenameResponse> _parser = new pb::MessageParser<ClaimCodenameResponse>(() => new ClaimCodenameResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ClaimCodenameResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.ClaimCodenameResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameResponse(ClaimCodenameResponse other) : this() {
+      codename_ = other.codename_;
+      userMessage_ = other.userMessage_;
+      isAssignable_ = other.isAssignable_;
+      status_ = other.status_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameResponse Clone() {
+      return new ClaimCodenameResponse(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "user_message" field.</summary>
+    public const int UserMessageFieldNumber = 2;
+    private string userMessage_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string UserMessage {
+      get { return userMessage_; }
+      set {
+        userMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "is_assignable" field.</summary>
+    public const int IsAssignableFieldNumber = 3;
+    private bool isAssignable_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsAssignable {
+      get { return isAssignable_; }
+      set {
+        isAssignable_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 4;
+    private global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ClaimCodenameResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ClaimCodenameResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      if (UserMessage != other.UserMessage) return false;
+      if (IsAssignable != other.IsAssignable) return false;
+      if (Status != other.Status) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      if (UserMessage.Length != 0) hash ^= UserMessage.GetHashCode();
+      if (IsAssignable != false) hash ^= IsAssignable.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(UserMessage);
+      }
+      if (IsAssignable != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(IsAssignable);
+      }
+      if (Status != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Status);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(UserMessage);
+      }
+      if (IsAssignable != false) {
+        size += 1 + 1;
+      }
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ClaimCodenameResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+      if (other.UserMessage.Length != 0) {
+        UserMessage = other.UserMessage;
+      }
+      if (other.IsAssignable != false) {
+        IsAssignable = other.IsAssignable;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+          case 18: {
+            UserMessage = input.ReadString();
+            break;
+          }
+          case 24: {
+            IsAssignable = input.ReadBool();
+            break;
+          }
+          case 32: {
+            status_ = (global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the ClaimCodenameResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("CODENAME_NOT_AVAILABLE")] CodenameNotAvailable = 2,
+        [pbr::OriginalName("CODENAME_NOT_VALID")] CodenameNotValid = 3,
+        [pbr::OriginalName("CURRENT_OWNER")] CurrentOwner = 4,
+        [pbr::OriginalName("CODENAME_CHANGE_NOT_ALLOWED")] CodenameChangeNotAllowed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/CollectDailyBonusResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/CollectDailyBonusResponse.cs
new file mode 100644
index 0000000..a44d0c9
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/CollectDailyBonusResponse.cs
@@ -0,0 +1,177 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/CollectDailyBonusResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/CollectDailyBonusResponse.proto</summary>
+  public static partial class CollectDailyBonusResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/CollectDailyBonusResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CollectDailyBonusResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0NvbGxlY3REYWls",
+            "eUJvbnVzUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXNwb25zZXMiqwEKGUNvbGxlY3REYWlseUJvbnVzUmVzcG9uc2USUQoGcmVz",
+            "dWx0GAEgASgOMkEuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5D",
+            "b2xsZWN0RGFpbHlCb251c1Jlc3BvbnNlLlJlc3VsdCI7CgZSZXN1bHQSCQoF",
+            "VU5TRVQQABILCgdTVUNDRVNTEAESCwoHRkFJTFVSRRACEgwKCFRPT19TT09O",
+            "EANiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CollectDailyBonusResponse), global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Parser, new[]{ "Result" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CollectDailyBonusResponse : pb::IMessage<CollectDailyBonusResponse> {
+    private static readonly pb::MessageParser<CollectDailyBonusResponse> _parser = new pb::MessageParser<CollectDailyBonusResponse>(() => new CollectDailyBonusResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyBonusResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.CollectDailyBonusResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusResponse(CollectDailyBonusResponse other) : this() {
+      result_ = other.result_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusResponse Clone() {
+      return new CollectDailyBonusResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyBonusResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyBonusResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyBonusResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CollectDailyBonusResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILURE")] Failure = 2,
+        [pbr::OriginalName("TOO_SOON")] TooSoon = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.cs
new file mode 100644
index 0000000..1164076
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.cs
@@ -0,0 +1,249 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.proto</summary>
+  public static partial class CollectDailyDefenderBonusResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/CollectDailyDefenderBonusResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CollectDailyDefenderBonusResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0NvbGxlY3REYWls",
+            "eURlZmVuZGVyQm9udXNSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLlJlc3BvbnNlcyKXAgohQ29sbGVjdERhaWx5RGVmZW5kZXJCb251",
+            "c1Jlc3BvbnNlElkKBnJlc3VsdBgBIAEoDjJJLlBPR09Qcm90b3MuTmV0d29y",
+            "a2luZy5SZXNwb25zZXMuQ29sbGVjdERhaWx5RGVmZW5kZXJCb251c1Jlc3Bv",
+            "bnNlLlJlc3VsdBIVCg1jdXJyZW5jeV90eXBlGAIgAygJEhgKEGN1cnJlbmN5",
+            "X2F3YXJkZWQYAyADKAUSFwoPZGVmZW5kZXJzX2NvdW50GAQgASgFIk0KBlJl",
+            "c3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQARILCgdGQUlMVVJFEAISDAoI",
+            "VE9PX1NPT04QAxIQCgxOT19ERUZFTkRFUlMQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse), global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Parser, new[]{ "Result", "CurrencyType", "CurrencyAwarded", "DefendersCount" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CollectDailyDefenderBonusResponse : pb::IMessage<CollectDailyDefenderBonusResponse> {
+    private static readonly pb::MessageParser<CollectDailyDefenderBonusResponse> _parser = new pb::MessageParser<CollectDailyDefenderBonusResponse>(() => new CollectDailyDefenderBonusResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyDefenderBonusResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusResponse(CollectDailyDefenderBonusResponse other) : this() {
+      result_ = other.result_;
+      currencyType_ = other.currencyType_.Clone();
+      currencyAwarded_ = other.currencyAwarded_.Clone();
+      defendersCount_ = other.defendersCount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusResponse Clone() {
+      return new CollectDailyDefenderBonusResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "currency_type" field.</summary>
+    public const int CurrencyTypeFieldNumber = 2;
+    private static readonly pb::FieldCodec<string> _repeated_currencyType_codec
+        = pb::FieldCodec.ForString(18);
+    private readonly pbc::RepeatedField<string> currencyType_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> CurrencyType {
+      get { return currencyType_; }
+    }
+
+    /// <summary>Field number for the "currency_awarded" field.</summary>
+    public const int CurrencyAwardedFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_currencyAwarded_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> currencyAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> CurrencyAwarded {
+      get { return currencyAwarded_; }
+    }
+
+    /// <summary>Field number for the "defenders_count" field.</summary>
+    public const int DefendersCountFieldNumber = 4;
+    private int defendersCount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DefendersCount {
+      get { return defendersCount_; }
+      set {
+        defendersCount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyDefenderBonusResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyDefenderBonusResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!currencyType_.Equals(other.currencyType_)) return false;
+      if(!currencyAwarded_.Equals(other.currencyAwarded_)) return false;
+      if (DefendersCount != other.DefendersCount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= currencyType_.GetHashCode();
+      hash ^= currencyAwarded_.GetHashCode();
+      if (DefendersCount != 0) hash ^= DefendersCount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      currencyType_.WriteTo(output, _repeated_currencyType_codec);
+      currencyAwarded_.WriteTo(output, _repeated_currencyAwarded_codec);
+      if (DefendersCount != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(DefendersCount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += currencyType_.CalculateSize(_repeated_currencyType_codec);
+      size += currencyAwarded_.CalculateSize(_repeated_currencyAwarded_codec);
+      if (DefendersCount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DefendersCount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyDefenderBonusResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      currencyType_.Add(other.currencyType_);
+      currencyAwarded_.Add(other.currencyAwarded_);
+      if (other.DefendersCount != 0) {
+        DefendersCount = other.DefendersCount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            currencyType_.AddEntriesFrom(input, _repeated_currencyType_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            currencyAwarded_.AddEntriesFrom(input, _repeated_currencyAwarded_codec);
+            break;
+          }
+          case 32: {
+            DefendersCount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CollectDailyDefenderBonusResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILURE")] Failure = 2,
+        [pbr::OriginalName("TOO_SOON")] TooSoon = 3,
+        [pbr::OriginalName("NO_DEFENDERS")] NoDefenders = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/DiskEncounterResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/DiskEncounterResponse.cs
new file mode 100644
index 0000000..7011cbc
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/DiskEncounterResponse.cs
@@ -0,0 +1,253 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/DiskEncounterResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/DiskEncounterResponse.proto</summary>
+  public static partial class DiskEncounterResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/DiskEncounterResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DiskEncounterResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0Rpc2tFbmNvdW50",
+            "ZXJSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcxohUE9HT1Byb3Rvcy9EYXRhL1Bva2Vtb25EYXRhLnByb3RvGjBQT0dP",
+            "UHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlUHJvYmFiaWxpdHkucHJvdG8i",
+            "6gIKFURpc2tFbmNvdW50ZXJSZXNwb25zZRJNCgZyZXN1bHQYASABKA4yPS5Q",
+            "T0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkRpc2tFbmNvdW50ZXJS",
+            "ZXNwb25zZS5SZXN1bHQSMgoMcG9rZW1vbl9kYXRhGAIgASgLMhwuUE9HT1By",
+            "b3Rvcy5EYXRhLlBva2Vtb25EYXRhEkgKE2NhcHR1cmVfcHJvYmFiaWxpdHkY",
+            "AyABKAsyKy5QT0dPUHJvdG9zLkRhdGEuQ2FwdHVyZS5DYXB0dXJlUHJvYmFi",
+            "aWxpdHkigwEKBlJlc3VsdBILCgdVTktOT1dOEAASCwoHU1VDQ0VTUxABEhEK",
+            "DU5PVF9BVkFJTEFCTEUQAhIQCgxOT1RfSU5fUkFOR0UQAxIeChpFTkNPVU5U",
+            "RVJfQUxSRUFEWV9GSU5JU0hFRBAEEhoKFlBPS0VNT05fSU5WRU5UT1JZX0ZV",
+            "TEwQBWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Data.Capture.CaptureProbabilityReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DiskEncounterResponse), global::POGOProtos.Networking.Responses.DiskEncounterResponse.Parser, new[]{ "Result", "PokemonData", "CaptureProbability" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DiskEncounterResponse : pb::IMessage<DiskEncounterResponse> {
+    private static readonly pb::MessageParser<DiskEncounterResponse> _parser = new pb::MessageParser<DiskEncounterResponse>(() => new DiskEncounterResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DiskEncounterResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.DiskEncounterResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterResponse(DiskEncounterResponse other) : this() {
+      result_ = other.result_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterResponse Clone() {
+      return new DiskEncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbabilityFieldNumber = 3;
+    private global::POGOProtos.Data.Capture.CaptureProbability captureProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureProbability CaptureProbability {
+      get { return captureProbability_; }
+      set {
+        captureProbability_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DiskEncounterResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DiskEncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(CaptureProbability, other.CaptureProbability)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DiskEncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.captureProbability_ != null) {
+        if (captureProbability_ == null) {
+          captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+        }
+        CaptureProbability.MergeFrom(other.CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 26: {
+            if (captureProbability_ == null) {
+              captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+            }
+            input.ReadMessage(captureProbability_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the DiskEncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNKNOWN")] Unknown = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("NOT_AVAILABLE")] NotAvailable = 2,
+        [pbr::OriginalName("NOT_IN_RANGE")] NotInRange = 3,
+        [pbr::OriginalName("ENCOUNTER_ALREADY_FINISHED")] EncounterAlreadyFinished = 4,
+        [pbr::OriginalName("POKEMON_INVENTORY_FULL")] PokemonInventoryFull = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.cs
new file mode 100644
index 0000000..15bb120
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.cs
@@ -0,0 +1,886 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.proto</summary>
+  public static partial class DownloadItemTemplatesResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/DownloadItemTemplatesResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadItemTemplatesResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0Rvd25sb2FkSXRl",
+            "bVRlbXBsYXRlc1Jlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVzcG9uc2VzGi1QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVt",
+            "U2V0dGluZ3MucHJvdG8aLVBPR09Qcm90b3MvU2V0dGluZ3MvTWFzdGVyL01v",
+            "dmVTZXR0aW5ncy5wcm90bxouUE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXN0ZXIv",
+            "QmFkZ2VTZXR0aW5ncy5wcm90bxowUE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXN0",
+            "ZXIvUG9rZW1vblNldHRpbmdzLnByb3RvGjVQT0dPUHJvdG9zL1NldHRpbmdz",
+            "L01hc3Rlci9Nb3ZlU2VxdWVuY2VTZXR0aW5ncy5wcm90bxo2UE9HT1Byb3Rv",
+            "cy9TZXR0aW5ncy9NYXN0ZXIvVHlwZUVmZmVjdGl2ZVNldHRpbmdzLnByb3Rv",
+            "Gi9QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9DYW1lcmFTZXR0aW5ncy5w",
+            "cm90bxo0UE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXN0ZXIvUGxheWVyTGV2ZWxT",
+            "ZXR0aW5ncy5wcm90bxoxUE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXN0ZXIvR3lt",
+            "TGV2ZWxTZXR0aW5ncy5wcm90bxoyUE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXN0",
+            "ZXIvR3ltQmF0dGxlU2V0dGluZ3MucHJvdG8aMlBPR09Qcm90b3MvU2V0dGlu",
+            "Z3MvTWFzdGVyL0VuY291bnRlclNldHRpbmdzLnByb3RvGi9QT0dPUHJvdG9z",
+            "L1NldHRpbmdzL01hc3Rlci9JYXBJdGVtRGlzcGxheS5wcm90bxosUE9HT1By",
+            "b3Rvcy9TZXR0aW5ncy9NYXN0ZXIvSWFwU2V0dGluZ3MucHJvdG8aN1BPR09Q",
+            "cm90b3MvU2V0dGluZ3MvTWFzdGVyL1Bva2Vtb25VcGdyYWRlU2V0dGluZ3Mu",
+            "cHJvdG8aNlBPR09Qcm90b3MvU2V0dGluZ3MvTWFzdGVyL0VxdWlwcGVkQmFk",
+            "Z2VTZXR0aW5ncy5wcm90byLwCQodRG93bmxvYWRJdGVtVGVtcGxhdGVzUmVz",
+            "cG9uc2USDwoHc3VjY2VzcxgBIAEoCBJjCg5pdGVtX3RlbXBsYXRlcxgCIAMo",
+            "CzJLLlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuRG93bmxvYWRJ",
+            "dGVtVGVtcGxhdGVzUmVzcG9uc2UuSXRlbVRlbXBsYXRlEhQKDHRpbWVzdGFt",
+            "cF9tcxgDIAEoBBrCCAoMSXRlbVRlbXBsYXRlEhMKC3RlbXBsYXRlX2lkGAEg",
+            "ASgJEkUKEHBva2Vtb25fc2V0dGluZ3MYAiABKAsyKy5QT0dPUHJvdG9zLlNl",
+            "dHRpbmdzLk1hc3Rlci5Qb2tlbW9uU2V0dGluZ3MSPwoNaXRlbV9zZXR0aW5n",
+            "cxgDIAEoCzIoLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW1TZXR0",
+            "aW5ncxI/Cg1tb3ZlX3NldHRpbmdzGAQgASgLMiguUE9HT1Byb3Rvcy5TZXR0",
+            "aW5ncy5NYXN0ZXIuTW92ZVNldHRpbmdzElAKFm1vdmVfc2VxdWVuY2Vfc2V0",
+            "dGluZ3MYBSABKAsyMC5QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5Nb3Zl",
+            "U2VxdWVuY2VTZXR0aW5ncxJJCg50eXBlX2VmZmVjdGl2ZRgIIAEoCzIxLlBP",
+            "R09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLlR5cGVFZmZlY3RpdmVTZXR0aW5n",
+            "cxJBCg5iYWRnZV9zZXR0aW5ncxgKIAEoCzIpLlBPR09Qcm90b3MuU2V0dGlu",
+            "Z3MuTWFzdGVyLkJhZGdlU2V0dGluZ3MSOgoGY2FtZXJhGAsgASgLMiouUE9H",
+            "T1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuQ2FtZXJhU2V0dGluZ3MSRQoMcGxh",
+            "eWVyX2xldmVsGAwgASgLMi8uUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIu",
+            "UGxheWVyTGV2ZWxTZXR0aW5ncxI/CglneW1fbGV2ZWwYDSABKAsyLC5QT0dP",
+            "UHJvdG9zLlNldHRpbmdzLk1hc3Rlci5HeW1MZXZlbFNldHRpbmdzEkYKD2Jh",
+            "dHRsZV9zZXR0aW5ncxgOIAEoCzItLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFz",
+            "dGVyLkd5bUJhdHRsZVNldHRpbmdzEkkKEmVuY291bnRlcl9zZXR0aW5ncxgP",
+            "IAEoCzItLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkVuY291bnRlclNl",
+            "dHRpbmdzEkQKEGlhcF9pdGVtX2Rpc3BsYXkYECABKAsyKi5QT0dPUHJvdG9z",
+            "LlNldHRpbmdzLk1hc3Rlci5JYXBJdGVtRGlzcGxheRI9CgxpYXBfc2V0dGlu",
+            "Z3MYESABKAsyJy5QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JYXBTZXR0",
+            "aW5ncxJMChBwb2tlbW9uX3VwZ3JhZGVzGBIgASgLMjIuUE9HT1Byb3Rvcy5T",
+            "ZXR0aW5ncy5NYXN0ZXIuUG9rZW1vblVwZ3JhZGVTZXR0aW5ncxJKCg9lcXVp",
+            "cHBlZF9iYWRnZXMYEyABKAsyMS5QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rl",
+            "ci5FcXVpcHBlZEJhZGdlU2V0dGluZ3NiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Settings.Master.ItemSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.MoveSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.BadgeSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.PokemonSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.MoveSequenceSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.TypeEffectiveSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.CameraSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.PlayerLevelSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.GymLevelSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.GymBattleSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.EncounterSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.IapItemDisplayReflection.Descriptor, global::POGOProtos.Settings.Master.IapSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.PokemonUpgradeSettingsReflection.Descriptor, global::POGOProtos.Settings.Master.EquippedBadgeSettingsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse), global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Parser, new[]{ "Success", "ItemTemplates", "TimestampMs" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate), global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate.Parser, new[]{ "TemplateId", "PokemonSettings", "ItemSettings", "MoveSettings", "MoveSequenceSettings", "TypeEffective", "BadgeSettings", "Camera", "PlayerLevel", "GymLevel", "BattleSettings", "EncounterSettings", "IapItemDisplay", "IapSettings", "PokemonUpgrades", "EquippedBadges" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadItemTemplatesResponse : pb::IMessage<DownloadItemTemplatesResponse> {
+    private static readonly pb::MessageParser<DownloadItemTemplatesResponse> _parser = new pb::MessageParser<DownloadItemTemplatesResponse>(() => new DownloadItemTemplatesResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadItemTemplatesResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesResponse(DownloadItemTemplatesResponse other) : this() {
+      success_ = other.success_;
+      itemTemplates_ = other.itemTemplates_.Clone();
+      timestampMs_ = other.timestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesResponse Clone() {
+      return new DownloadItemTemplatesResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_templates" field.</summary>
+    public const int ItemTemplatesFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate> _repeated_itemTemplates_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate> itemTemplates_ = new pbc::RepeatedField<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate> ItemTemplates {
+      get { return itemTemplates_; }
+    }
+
+    /// <summary>Field number for the "timestamp_ms" field.</summary>
+    public const int TimestampMsFieldNumber = 3;
+    private ulong timestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong TimestampMs {
+      get { return timestampMs_; }
+      set {
+        timestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadItemTemplatesResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadItemTemplatesResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if(!itemTemplates_.Equals(other.itemTemplates_)) return false;
+      if (TimestampMs != other.TimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      hash ^= itemTemplates_.GetHashCode();
+      if (TimestampMs != 0UL) hash ^= TimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      itemTemplates_.WriteTo(output, _repeated_itemTemplates_codec);
+      if (TimestampMs != 0UL) {
+        output.WriteRawTag(24);
+        output.WriteUInt64(TimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      size += itemTemplates_.CalculateSize(_repeated_itemTemplates_codec);
+      if (TimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadItemTemplatesResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      itemTemplates_.Add(other.itemTemplates_);
+      if (other.TimestampMs != 0UL) {
+        TimestampMs = other.TimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            itemTemplates_.AddEntriesFrom(input, _repeated_itemTemplates_codec);
+            break;
+          }
+          case 24: {
+            TimestampMs = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the DownloadItemTemplatesResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class ItemTemplate : pb::IMessage<ItemTemplate> {
+        private static readonly pb::MessageParser<ItemTemplate> _parser = new pb::MessageParser<ItemTemplate>(() => new ItemTemplate());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<ItemTemplate> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ItemTemplate() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ItemTemplate(ItemTemplate other) : this() {
+          templateId_ = other.templateId_;
+          PokemonSettings = other.pokemonSettings_ != null ? other.PokemonSettings.Clone() : null;
+          ItemSettings = other.itemSettings_ != null ? other.ItemSettings.Clone() : null;
+          MoveSettings = other.moveSettings_ != null ? other.MoveSettings.Clone() : null;
+          MoveSequenceSettings = other.moveSequenceSettings_ != null ? other.MoveSequenceSettings.Clone() : null;
+          TypeEffective = other.typeEffective_ != null ? other.TypeEffective.Clone() : null;
+          BadgeSettings = other.badgeSettings_ != null ? other.BadgeSettings.Clone() : null;
+          Camera = other.camera_ != null ? other.Camera.Clone() : null;
+          PlayerLevel = other.playerLevel_ != null ? other.PlayerLevel.Clone() : null;
+          GymLevel = other.gymLevel_ != null ? other.GymLevel.Clone() : null;
+          BattleSettings = other.battleSettings_ != null ? other.BattleSettings.Clone() : null;
+          EncounterSettings = other.encounterSettings_ != null ? other.EncounterSettings.Clone() : null;
+          IapItemDisplay = other.iapItemDisplay_ != null ? other.IapItemDisplay.Clone() : null;
+          IapSettings = other.iapSettings_ != null ? other.IapSettings.Clone() : null;
+          PokemonUpgrades = other.pokemonUpgrades_ != null ? other.PokemonUpgrades.Clone() : null;
+          EquippedBadges = other.equippedBadges_ != null ? other.EquippedBadges.Clone() : null;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ItemTemplate Clone() {
+          return new ItemTemplate(this);
+        }
+
+        /// <summary>Field number for the "template_id" field.</summary>
+        public const int TemplateIdFieldNumber = 1;
+        private string templateId_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string TemplateId {
+          get { return templateId_; }
+          set {
+            templateId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "pokemon_settings" field.</summary>
+        public const int PokemonSettingsFieldNumber = 2;
+        private global::POGOProtos.Settings.Master.PokemonSettings pokemonSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.PokemonSettings PokemonSettings {
+          get { return pokemonSettings_; }
+          set {
+            pokemonSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "item_settings" field.</summary>
+        public const int ItemSettingsFieldNumber = 3;
+        private global::POGOProtos.Settings.Master.ItemSettings itemSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.ItemSettings ItemSettings {
+          get { return itemSettings_; }
+          set {
+            itemSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "move_settings" field.</summary>
+        public const int MoveSettingsFieldNumber = 4;
+        private global::POGOProtos.Settings.Master.MoveSettings moveSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.MoveSettings MoveSettings {
+          get { return moveSettings_; }
+          set {
+            moveSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "move_sequence_settings" field.</summary>
+        public const int MoveSequenceSettingsFieldNumber = 5;
+        private global::POGOProtos.Settings.Master.MoveSequenceSettings moveSequenceSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.MoveSequenceSettings MoveSequenceSettings {
+          get { return moveSequenceSettings_; }
+          set {
+            moveSequenceSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "type_effective" field.</summary>
+        public const int TypeEffectiveFieldNumber = 8;
+        private global::POGOProtos.Settings.Master.TypeEffectiveSettings typeEffective_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.TypeEffectiveSettings TypeEffective {
+          get { return typeEffective_; }
+          set {
+            typeEffective_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "badge_settings" field.</summary>
+        public const int BadgeSettingsFieldNumber = 10;
+        private global::POGOProtos.Settings.Master.BadgeSettings badgeSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.BadgeSettings BadgeSettings {
+          get { return badgeSettings_; }
+          set {
+            badgeSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "camera" field.</summary>
+        public const int CameraFieldNumber = 11;
+        private global::POGOProtos.Settings.Master.CameraSettings camera_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.CameraSettings Camera {
+          get { return camera_; }
+          set {
+            camera_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "player_level" field.</summary>
+        public const int PlayerLevelFieldNumber = 12;
+        private global::POGOProtos.Settings.Master.PlayerLevelSettings playerLevel_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.PlayerLevelSettings PlayerLevel {
+          get { return playerLevel_; }
+          set {
+            playerLevel_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "gym_level" field.</summary>
+        public const int GymLevelFieldNumber = 13;
+        private global::POGOProtos.Settings.Master.GymLevelSettings gymLevel_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.GymLevelSettings GymLevel {
+          get { return gymLevel_; }
+          set {
+            gymLevel_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "battle_settings" field.</summary>
+        public const int BattleSettingsFieldNumber = 14;
+        private global::POGOProtos.Settings.Master.GymBattleSettings battleSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.GymBattleSettings BattleSettings {
+          get { return battleSettings_; }
+          set {
+            battleSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "encounter_settings" field.</summary>
+        public const int EncounterSettingsFieldNumber = 15;
+        private global::POGOProtos.Settings.Master.EncounterSettings encounterSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.EncounterSettings EncounterSettings {
+          get { return encounterSettings_; }
+          set {
+            encounterSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "iap_item_display" field.</summary>
+        public const int IapItemDisplayFieldNumber = 16;
+        private global::POGOProtos.Settings.Master.IapItemDisplay iapItemDisplay_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.IapItemDisplay IapItemDisplay {
+          get { return iapItemDisplay_; }
+          set {
+            iapItemDisplay_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "iap_settings" field.</summary>
+        public const int IapSettingsFieldNumber = 17;
+        private global::POGOProtos.Settings.Master.IapSettings iapSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.IapSettings IapSettings {
+          get { return iapSettings_; }
+          set {
+            iapSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "pokemon_upgrades" field.</summary>
+        public const int PokemonUpgradesFieldNumber = 18;
+        private global::POGOProtos.Settings.Master.PokemonUpgradeSettings pokemonUpgrades_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.PokemonUpgradeSettings PokemonUpgrades {
+          get { return pokemonUpgrades_; }
+          set {
+            pokemonUpgrades_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "equipped_badges" field.</summary>
+        public const int EquippedBadgesFieldNumber = 19;
+        private global::POGOProtos.Settings.Master.EquippedBadgeSettings equippedBadges_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.EquippedBadgeSettings EquippedBadges {
+          get { return equippedBadges_; }
+          set {
+            equippedBadges_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as ItemTemplate);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(ItemTemplate other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (TemplateId != other.TemplateId) return false;
+          if (!object.Equals(PokemonSettings, other.PokemonSettings)) return false;
+          if (!object.Equals(ItemSettings, other.ItemSettings)) return false;
+          if (!object.Equals(MoveSettings, other.MoveSettings)) return false;
+          if (!object.Equals(MoveSequenceSettings, other.MoveSequenceSettings)) return false;
+          if (!object.Equals(TypeEffective, other.TypeEffective)) return false;
+          if (!object.Equals(BadgeSettings, other.BadgeSettings)) return false;
+          if (!object.Equals(Camera, other.Camera)) return false;
+          if (!object.Equals(PlayerLevel, other.PlayerLevel)) return false;
+          if (!object.Equals(GymLevel, other.GymLevel)) return false;
+          if (!object.Equals(BattleSettings, other.BattleSettings)) return false;
+          if (!object.Equals(EncounterSettings, other.EncounterSettings)) return false;
+          if (!object.Equals(IapItemDisplay, other.IapItemDisplay)) return false;
+          if (!object.Equals(IapSettings, other.IapSettings)) return false;
+          if (!object.Equals(PokemonUpgrades, other.PokemonUpgrades)) return false;
+          if (!object.Equals(EquippedBadges, other.EquippedBadges)) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (TemplateId.Length != 0) hash ^= TemplateId.GetHashCode();
+          if (pokemonSettings_ != null) hash ^= PokemonSettings.GetHashCode();
+          if (itemSettings_ != null) hash ^= ItemSettings.GetHashCode();
+          if (moveSettings_ != null) hash ^= MoveSettings.GetHashCode();
+          if (moveSequenceSettings_ != null) hash ^= MoveSequenceSettings.GetHashCode();
+          if (typeEffective_ != null) hash ^= TypeEffective.GetHashCode();
+          if (badgeSettings_ != null) hash ^= BadgeSettings.GetHashCode();
+          if (camera_ != null) hash ^= Camera.GetHashCode();
+          if (playerLevel_ != null) hash ^= PlayerLevel.GetHashCode();
+          if (gymLevel_ != null) hash ^= GymLevel.GetHashCode();
+          if (battleSettings_ != null) hash ^= BattleSettings.GetHashCode();
+          if (encounterSettings_ != null) hash ^= EncounterSettings.GetHashCode();
+          if (iapItemDisplay_ != null) hash ^= IapItemDisplay.GetHashCode();
+          if (iapSettings_ != null) hash ^= IapSettings.GetHashCode();
+          if (pokemonUpgrades_ != null) hash ^= PokemonUpgrades.GetHashCode();
+          if (equippedBadges_ != null) hash ^= EquippedBadges.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (TemplateId.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(TemplateId);
+          }
+          if (pokemonSettings_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(PokemonSettings);
+          }
+          if (itemSettings_ != null) {
+            output.WriteRawTag(26);
+            output.WriteMessage(ItemSettings);
+          }
+          if (moveSettings_ != null) {
+            output.WriteRawTag(34);
+            output.WriteMessage(MoveSettings);
+          }
+          if (moveSequenceSettings_ != null) {
+            output.WriteRawTag(42);
+            output.WriteMessage(MoveSequenceSettings);
+          }
+          if (typeEffective_ != null) {
+            output.WriteRawTag(66);
+            output.WriteMessage(TypeEffective);
+          }
+          if (badgeSettings_ != null) {
+            output.WriteRawTag(82);
+            output.WriteMessage(BadgeSettings);
+          }
+          if (camera_ != null) {
+            output.WriteRawTag(90);
+            output.WriteMessage(Camera);
+          }
+          if (playerLevel_ != null) {
+            output.WriteRawTag(98);
+            output.WriteMessage(PlayerLevel);
+          }
+          if (gymLevel_ != null) {
+            output.WriteRawTag(106);
+            output.WriteMessage(GymLevel);
+          }
+          if (battleSettings_ != null) {
+            output.WriteRawTag(114);
+            output.WriteMessage(BattleSettings);
+          }
+          if (encounterSettings_ != null) {
+            output.WriteRawTag(122);
+            output.WriteMessage(EncounterSettings);
+          }
+          if (iapItemDisplay_ != null) {
+            output.WriteRawTag(130, 1);
+            output.WriteMessage(IapItemDisplay);
+          }
+          if (iapSettings_ != null) {
+            output.WriteRawTag(138, 1);
+            output.WriteMessage(IapSettings);
+          }
+          if (pokemonUpgrades_ != null) {
+            output.WriteRawTag(146, 1);
+            output.WriteMessage(PokemonUpgrades);
+          }
+          if (equippedBadges_ != null) {
+            output.WriteRawTag(154, 1);
+            output.WriteMessage(EquippedBadges);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (TemplateId.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(TemplateId);
+          }
+          if (pokemonSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonSettings);
+          }
+          if (itemSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(ItemSettings);
+          }
+          if (moveSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(MoveSettings);
+          }
+          if (moveSequenceSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(MoveSequenceSettings);
+          }
+          if (typeEffective_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeEffective);
+          }
+          if (badgeSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(BadgeSettings);
+          }
+          if (camera_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Camera);
+          }
+          if (playerLevel_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerLevel);
+          }
+          if (gymLevel_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymLevel);
+          }
+          if (battleSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleSettings);
+          }
+          if (encounterSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(EncounterSettings);
+          }
+          if (iapItemDisplay_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(IapItemDisplay);
+          }
+          if (iapSettings_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(IapSettings);
+          }
+          if (pokemonUpgrades_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(PokemonUpgrades);
+          }
+          if (equippedBadges_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(EquippedBadges);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(ItemTemplate other) {
+          if (other == null) {
+            return;
+          }
+          if (other.TemplateId.Length != 0) {
+            TemplateId = other.TemplateId;
+          }
+          if (other.pokemonSettings_ != null) {
+            if (pokemonSettings_ == null) {
+              pokemonSettings_ = new global::POGOProtos.Settings.Master.PokemonSettings();
+            }
+            PokemonSettings.MergeFrom(other.PokemonSettings);
+          }
+          if (other.itemSettings_ != null) {
+            if (itemSettings_ == null) {
+              itemSettings_ = new global::POGOProtos.Settings.Master.ItemSettings();
+            }
+            ItemSettings.MergeFrom(other.ItemSettings);
+          }
+          if (other.moveSettings_ != null) {
+            if (moveSettings_ == null) {
+              moveSettings_ = new global::POGOProtos.Settings.Master.MoveSettings();
+            }
+            MoveSettings.MergeFrom(other.MoveSettings);
+          }
+          if (other.moveSequenceSettings_ != null) {
+            if (moveSequenceSettings_ == null) {
+              moveSequenceSettings_ = new global::POGOProtos.Settings.Master.MoveSequenceSettings();
+            }
+            MoveSequenceSettings.MergeFrom(other.MoveSequenceSettings);
+          }
+          if (other.typeEffective_ != null) {
+            if (typeEffective_ == null) {
+              typeEffective_ = new global::POGOProtos.Settings.Master.TypeEffectiveSettings();
+            }
+            TypeEffective.MergeFrom(other.TypeEffective);
+          }
+          if (other.badgeSettings_ != null) {
+            if (badgeSettings_ == null) {
+              badgeSettings_ = new global::POGOProtos.Settings.Master.BadgeSettings();
+            }
+            BadgeSettings.MergeFrom(other.BadgeSettings);
+          }
+          if (other.camera_ != null) {
+            if (camera_ == null) {
+              camera_ = new global::POGOProtos.Settings.Master.CameraSettings();
+            }
+            Camera.MergeFrom(other.Camera);
+          }
+          if (other.playerLevel_ != null) {
+            if (playerLevel_ == null) {
+              playerLevel_ = new global::POGOProtos.Settings.Master.PlayerLevelSettings();
+            }
+            PlayerLevel.MergeFrom(other.PlayerLevel);
+          }
+          if (other.gymLevel_ != null) {
+            if (gymLevel_ == null) {
+              gymLevel_ = new global::POGOProtos.Settings.Master.GymLevelSettings();
+            }
+            GymLevel.MergeFrom(other.GymLevel);
+          }
+          if (other.battleSettings_ != null) {
+            if (battleSettings_ == null) {
+              battleSettings_ = new global::POGOProtos.Settings.Master.GymBattleSettings();
+            }
+            BattleSettings.MergeFrom(other.BattleSettings);
+          }
+          if (other.encounterSettings_ != null) {
+            if (encounterSettings_ == null) {
+              encounterSettings_ = new global::POGOProtos.Settings.Master.EncounterSettings();
+            }
+            EncounterSettings.MergeFrom(other.EncounterSettings);
+          }
+          if (other.iapItemDisplay_ != null) {
+            if (iapItemDisplay_ == null) {
+              iapItemDisplay_ = new global::POGOProtos.Settings.Master.IapItemDisplay();
+            }
+            IapItemDisplay.MergeFrom(other.IapItemDisplay);
+          }
+          if (other.iapSettings_ != null) {
+            if (iapSettings_ == null) {
+              iapSettings_ = new global::POGOProtos.Settings.Master.IapSettings();
+            }
+            IapSettings.MergeFrom(other.IapSettings);
+          }
+          if (other.pokemonUpgrades_ != null) {
+            if (pokemonUpgrades_ == null) {
+              pokemonUpgrades_ = new global::POGOProtos.Settings.Master.PokemonUpgradeSettings();
+            }
+            PokemonUpgrades.MergeFrom(other.PokemonUpgrades);
+          }
+          if (other.equippedBadges_ != null) {
+            if (equippedBadges_ == null) {
+              equippedBadges_ = new global::POGOProtos.Settings.Master.EquippedBadgeSettings();
+            }
+            EquippedBadges.MergeFrom(other.EquippedBadges);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                TemplateId = input.ReadString();
+                break;
+              }
+              case 18: {
+                if (pokemonSettings_ == null) {
+                  pokemonSettings_ = new global::POGOProtos.Settings.Master.PokemonSettings();
+                }
+                input.ReadMessage(pokemonSettings_);
+                break;
+              }
+              case 26: {
+                if (itemSettings_ == null) {
+                  itemSettings_ = new global::POGOProtos.Settings.Master.ItemSettings();
+                }
+                input.ReadMessage(itemSettings_);
+                break;
+              }
+              case 34: {
+                if (moveSettings_ == null) {
+                  moveSettings_ = new global::POGOProtos.Settings.Master.MoveSettings();
+                }
+                input.ReadMessage(moveSettings_);
+                break;
+              }
+              case 42: {
+                if (moveSequenceSettings_ == null) {
+                  moveSequenceSettings_ = new global::POGOProtos.Settings.Master.MoveSequenceSettings();
+                }
+                input.ReadMessage(moveSequenceSettings_);
+                break;
+              }
+              case 66: {
+                if (typeEffective_ == null) {
+                  typeEffective_ = new global::POGOProtos.Settings.Master.TypeEffectiveSettings();
+                }
+                input.ReadMessage(typeEffective_);
+                break;
+              }
+              case 82: {
+                if (badgeSettings_ == null) {
+                  badgeSettings_ = new global::POGOProtos.Settings.Master.BadgeSettings();
+                }
+                input.ReadMessage(badgeSettings_);
+                break;
+              }
+              case 90: {
+                if (camera_ == null) {
+                  camera_ = new global::POGOProtos.Settings.Master.CameraSettings();
+                }
+                input.ReadMessage(camera_);
+                break;
+              }
+              case 98: {
+                if (playerLevel_ == null) {
+                  playerLevel_ = new global::POGOProtos.Settings.Master.PlayerLevelSettings();
+                }
+                input.ReadMessage(playerLevel_);
+                break;
+              }
+              case 106: {
+                if (gymLevel_ == null) {
+                  gymLevel_ = new global::POGOProtos.Settings.Master.GymLevelSettings();
+                }
+                input.ReadMessage(gymLevel_);
+                break;
+              }
+              case 114: {
+                if (battleSettings_ == null) {
+                  battleSettings_ = new global::POGOProtos.Settings.Master.GymBattleSettings();
+                }
+                input.ReadMessage(battleSettings_);
+                break;
+              }
+              case 122: {
+                if (encounterSettings_ == null) {
+                  encounterSettings_ = new global::POGOProtos.Settings.Master.EncounterSettings();
+                }
+                input.ReadMessage(encounterSettings_);
+                break;
+              }
+              case 130: {
+                if (iapItemDisplay_ == null) {
+                  iapItemDisplay_ = new global::POGOProtos.Settings.Master.IapItemDisplay();
+                }
+                input.ReadMessage(iapItemDisplay_);
+                break;
+              }
+              case 138: {
+                if (iapSettings_ == null) {
+                  iapSettings_ = new global::POGOProtos.Settings.Master.IapSettings();
+                }
+                input.ReadMessage(iapSettings_);
+                break;
+              }
+              case 146: {
+                if (pokemonUpgrades_ == null) {
+                  pokemonUpgrades_ = new global::POGOProtos.Settings.Master.PokemonUpgradeSettings();
+                }
+                input.ReadMessage(pokemonUpgrades_);
+                break;
+              }
+              case 154: {
+                if (equippedBadges_ == null) {
+                  equippedBadges_ = new global::POGOProtos.Settings.Master.EquippedBadgeSettings();
+                }
+                input.ReadMessage(equippedBadges_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.cs
new file mode 100644
index 0000000..d393f3b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.cs
@@ -0,0 +1,235 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.proto</summary>
+  public static partial class DownloadRemoteConfigVersionResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/DownloadRemoteConfigVersionResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadRemoteConfigVersionResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CklQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0Rvd25sb2FkUmVt",
+            "b3RlQ29uZmlnVmVyc2lvblJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5l",
+            "dHdvcmtpbmcuUmVzcG9uc2VzIuwBCiNEb3dubG9hZFJlbW90ZUNvbmZpZ1Zl",
+            "cnNpb25SZXNwb25zZRJbCgZyZXN1bHQYASABKA4ySy5QT0dPUHJvdG9zLk5l",
+            "dHdvcmtpbmcuUmVzcG9uc2VzLkRvd25sb2FkUmVtb3RlQ29uZmlnVmVyc2lv",
+            "blJlc3BvbnNlLlJlc3VsdBIjChtpdGVtX3RlbXBsYXRlc190aW1lc3RhbXBf",
+            "bXMYAiABKAQSIQoZYXNzZXRfZGlnZXN0X3RpbWVzdGFtcF9tcxgDIAEoBCIg",
+            "CgZSZXN1bHQSCQoFVU5TRVQQABILCgdTVUNDRVNTEAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse), global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Parser, new[]{ "Result", "ItemTemplatesTimestampMs", "AssetDigestTimestampMs" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadRemoteConfigVersionResponse : pb::IMessage<DownloadRemoteConfigVersionResponse> {
+    private static readonly pb::MessageParser<DownloadRemoteConfigVersionResponse> _parser = new pb::MessageParser<DownloadRemoteConfigVersionResponse>(() => new DownloadRemoteConfigVersionResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadRemoteConfigVersionResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionResponse(DownloadRemoteConfigVersionResponse other) : this() {
+      result_ = other.result_;
+      itemTemplatesTimestampMs_ = other.itemTemplatesTimestampMs_;
+      assetDigestTimestampMs_ = other.assetDigestTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionResponse Clone() {
+      return new DownloadRemoteConfigVersionResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_templates_timestamp_ms" field.</summary>
+    public const int ItemTemplatesTimestampMsFieldNumber = 2;
+    private ulong itemTemplatesTimestampMs_;
+    /// <summary>
+    ///  Latest available?
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong ItemTemplatesTimestampMs {
+      get { return itemTemplatesTimestampMs_; }
+      set {
+        itemTemplatesTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "asset_digest_timestamp_ms" field.</summary>
+    public const int AssetDigestTimestampMsFieldNumber = 3;
+    private ulong assetDigestTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong AssetDigestTimestampMs {
+      get { return assetDigestTimestampMs_; }
+      set {
+        assetDigestTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadRemoteConfigVersionResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadRemoteConfigVersionResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (ItemTemplatesTimestampMs != other.ItemTemplatesTimestampMs) return false;
+      if (AssetDigestTimestampMs != other.AssetDigestTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (ItemTemplatesTimestampMs != 0UL) hash ^= ItemTemplatesTimestampMs.GetHashCode();
+      if (AssetDigestTimestampMs != 0UL) hash ^= AssetDigestTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (ItemTemplatesTimestampMs != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(ItemTemplatesTimestampMs);
+      }
+      if (AssetDigestTimestampMs != 0UL) {
+        output.WriteRawTag(24);
+        output.WriteUInt64(AssetDigestTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (ItemTemplatesTimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(ItemTemplatesTimestampMs);
+      }
+      if (AssetDigestTimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(AssetDigestTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadRemoteConfigVersionResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.ItemTemplatesTimestampMs != 0UL) {
+        ItemTemplatesTimestampMs = other.ItemTemplatesTimestampMs;
+      }
+      if (other.AssetDigestTimestampMs != 0UL) {
+        AssetDigestTimestampMs = other.AssetDigestTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ItemTemplatesTimestampMs = input.ReadUInt64();
+            break;
+          }
+          case 24: {
+            AssetDigestTimestampMs = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the DownloadRemoteConfigVersionResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/DownloadSettingsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/DownloadSettingsResponse.cs
new file mode 100644
index 0000000..d334013
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/DownloadSettingsResponse.cs
@@ -0,0 +1,224 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/DownloadSettingsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/DownloadSettingsResponse.proto</summary>
+  public static partial class DownloadSettingsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/DownloadSettingsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadSettingsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0Rvd25sb2FkU2V0",
+            "dGluZ3NSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "c3BvbnNlcxooUE9HT1Byb3Rvcy9TZXR0aW5ncy9HbG9iYWxTZXR0aW5ncy5w",
+            "cm90byJuChhEb3dubG9hZFNldHRpbmdzUmVzcG9uc2USDQoFZXJyb3IYASAB",
+            "KAkSDAoEaGFzaBgCIAEoCRI1CghzZXR0aW5ncxgDIAEoCzIjLlBPR09Qcm90",
+            "b3MuU2V0dGluZ3MuR2xvYmFsU2V0dGluZ3NiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Settings.GlobalSettingsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadSettingsResponse), global::POGOProtos.Networking.Responses.DownloadSettingsResponse.Parser, new[]{ "Error", "Hash", "Settings" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadSettingsResponse : pb::IMessage<DownloadSettingsResponse> {
+    private static readonly pb::MessageParser<DownloadSettingsResponse> _parser = new pb::MessageParser<DownloadSettingsResponse>(() => new DownloadSettingsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadSettingsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.DownloadSettingsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsResponse(DownloadSettingsResponse other) : this() {
+      error_ = other.error_;
+      hash_ = other.hash_;
+      Settings = other.settings_ != null ? other.Settings.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsResponse Clone() {
+      return new DownloadSettingsResponse(this);
+    }
+
+    /// <summary>Field number for the "error" field.</summary>
+    public const int ErrorFieldNumber = 1;
+    private string error_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Error {
+      get { return error_; }
+      set {
+        error_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "hash" field.</summary>
+    public const int HashFieldNumber = 2;
+    private string hash_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Hash {
+      get { return hash_; }
+      set {
+        hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "settings" field.</summary>
+    public const int SettingsFieldNumber = 3;
+    private global::POGOProtos.Settings.GlobalSettings settings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.GlobalSettings Settings {
+      get { return settings_; }
+      set {
+        settings_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadSettingsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadSettingsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Error != other.Error) return false;
+      if (Hash != other.Hash) return false;
+      if (!object.Equals(Settings, other.Settings)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Error.Length != 0) hash ^= Error.GetHashCode();
+      if (Hash.Length != 0) hash ^= Hash.GetHashCode();
+      if (settings_ != null) hash ^= Settings.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Error.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Error);
+      }
+      if (Hash.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Hash);
+      }
+      if (settings_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(Settings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Error.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Error);
+      }
+      if (Hash.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
+      }
+      if (settings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Settings);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadSettingsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Error.Length != 0) {
+        Error = other.Error;
+      }
+      if (other.Hash.Length != 0) {
+        Hash = other.Hash;
+      }
+      if (other.settings_ != null) {
+        if (settings_ == null) {
+          settings_ = new global::POGOProtos.Settings.GlobalSettings();
+        }
+        Settings.MergeFrom(other.Settings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Error = input.ReadString();
+            break;
+          }
+          case 18: {
+            Hash = input.ReadString();
+            break;
+          }
+          case 26: {
+            if (settings_ == null) {
+              settings_ = new global::POGOProtos.Settings.GlobalSettings();
+            }
+            input.ReadMessage(settings_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/EchoResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/EchoResponse.cs
new file mode 100644
index 0000000..ec7acbd
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/EchoResponse.cs
@@ -0,0 +1,159 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/EchoResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/EchoResponse.proto</summary>
+  public static partial class EchoResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/EchoResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EchoResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0VjaG9SZXNwb25z",
+            "ZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcyIfCgxF",
+            "Y2hvUmVzcG9uc2USDwoHY29udGV4dBgBIAEoCWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EchoResponse), global::POGOProtos.Networking.Responses.EchoResponse.Parser, new[]{ "Context" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EchoResponse : pb::IMessage<EchoResponse> {
+    private static readonly pb::MessageParser<EchoResponse> _parser = new pb::MessageParser<EchoResponse>(() => new EchoResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EchoResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.EchoResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoResponse(EchoResponse other) : this() {
+      context_ = other.context_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoResponse Clone() {
+      return new EchoResponse(this);
+    }
+
+    /// <summary>Field number for the "context" field.</summary>
+    public const int ContextFieldNumber = 1;
+    private string context_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Context {
+      get { return context_; }
+      set {
+        context_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EchoResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EchoResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Context != other.Context) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Context.Length != 0) hash ^= Context.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Context.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Context);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Context.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Context);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EchoResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Context.Length != 0) {
+        Context = other.Context;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Context = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/EncounterResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/EncounterResponse.cs
new file mode 100644
index 0000000..1a64d3e
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/EncounterResponse.cs
@@ -0,0 +1,292 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/EncounterResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/EncounterResponse.proto</summary>
+  public static partial class EncounterResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/EncounterResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0VuY291bnRlclJl",
+            "c3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2Vz",
+            "GjBQT0dPUHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlUHJvYmFiaWxpdHku",
+            "cHJvdG8aKFBPR09Qcm90b3MvTWFwL1Bva2Vtb24vV2lsZFBva2Vtb24ucHJv",
+            "dG8itAQKEUVuY291bnRlclJlc3BvbnNlEjkKDHdpbGRfcG9rZW1vbhgBIAEo",
+            "CzIjLlBPR09Qcm90b3MuTWFwLlBva2Vtb24uV2lsZFBva2Vtb24SUQoKYmFj",
+            "a2dyb3VuZBgCIAEoDjI9LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25z",
+            "ZXMuRW5jb3VudGVyUmVzcG9uc2UuQmFja2dyb3VuZBJJCgZzdGF0dXMYAyAB",
+            "KA4yOS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkVuY291bnRl",
+            "clJlc3BvbnNlLlN0YXR1cxJIChNjYXB0dXJlX3Byb2JhYmlsaXR5GAQgASgL",
+            "MisuUE9HT1Byb3Rvcy5EYXRhLkNhcHR1cmUuQ2FwdHVyZVByb2JhYmlsaXR5",
+            "IiIKCkJhY2tncm91bmQSCAoEUEFSSxAAEgoKBkRFU0VSVBABItcBCgZTdGF0",
+            "dXMSEwoPRU5DT1VOVEVSX0VSUk9SEAASFQoRRU5DT1VOVEVSX1NVQ0NFU1MQ",
+            "ARIXChNFTkNPVU5URVJfTk9UX0ZPVU5EEAISFAoQRU5DT1VOVEVSX0NMT1NF",
+            "RBADEhoKFkVOQ09VTlRFUl9QT0tFTU9OX0ZMRUQQBBIaChZFTkNPVU5URVJf",
+            "Tk9UX0lOX1JBTkdFEAUSHgoaRU5DT1VOVEVSX0FMUkVBRFlfSEFQUEVORUQQ",
+            "BhIaChZQT0tFTU9OX0lOVkVOVE9SWV9GVUxMEAdiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Capture.CaptureProbabilityReflection.Descriptor, global::POGOProtos.Map.Pokemon.WildPokemonReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EncounterResponse), global::POGOProtos.Networking.Responses.EncounterResponse.Parser, new[]{ "WildPokemon", "Background", "Status", "CaptureProbability" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background), typeof(global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EncounterResponse : pb::IMessage<EncounterResponse> {
+    private static readonly pb::MessageParser<EncounterResponse> _parser = new pb::MessageParser<EncounterResponse>(() => new EncounterResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.EncounterResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterResponse(EncounterResponse other) : this() {
+      WildPokemon = other.wildPokemon_ != null ? other.WildPokemon.Clone() : null;
+      background_ = other.background_;
+      status_ = other.status_;
+      CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterResponse Clone() {
+      return new EncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "wild_pokemon" field.</summary>
+    public const int WildPokemonFieldNumber = 1;
+    private global::POGOProtos.Map.Pokemon.WildPokemon wildPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Pokemon.WildPokemon WildPokemon {
+      get { return wildPokemon_; }
+      set {
+        wildPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "background" field.</summary>
+    public const int BackgroundFieldNumber = 2;
+    private global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background background_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background Background {
+      get { return background_; }
+      set {
+        background_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 3;
+    private global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbabilityFieldNumber = 4;
+    private global::POGOProtos.Data.Capture.CaptureProbability captureProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureProbability CaptureProbability {
+      get { return captureProbability_; }
+      set {
+        captureProbability_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(WildPokemon, other.WildPokemon)) return false;
+      if (Background != other.Background) return false;
+      if (Status != other.Status) return false;
+      if (!object.Equals(CaptureProbability, other.CaptureProbability)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (wildPokemon_ != null) hash ^= WildPokemon.GetHashCode();
+      if (Background != 0) hash ^= Background.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (wildPokemon_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(WildPokemon);
+      }
+      if (Background != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Background);
+      }
+      if (Status != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) Status);
+      }
+      if (captureProbability_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (wildPokemon_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(WildPokemon);
+      }
+      if (Background != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Background);
+      }
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (captureProbability_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.wildPokemon_ != null) {
+        if (wildPokemon_ == null) {
+          wildPokemon_ = new global::POGOProtos.Map.Pokemon.WildPokemon();
+        }
+        WildPokemon.MergeFrom(other.WildPokemon);
+      }
+      if (other.Background != 0) {
+        Background = other.Background;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.captureProbability_ != null) {
+        if (captureProbability_ == null) {
+          captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+        }
+        CaptureProbability.MergeFrom(other.CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (wildPokemon_ == null) {
+              wildPokemon_ = new global::POGOProtos.Map.Pokemon.WildPokemon();
+            }
+            input.ReadMessage(wildPokemon_);
+            break;
+          }
+          case 16: {
+            background_ = (global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            status_ = (global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 34: {
+            if (captureProbability_ == null) {
+              captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+            }
+            input.ReadMessage(captureProbability_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Background {
+        [pbr::OriginalName("PARK")] Park = 0,
+        [pbr::OriginalName("DESERT")] Desert = 1,
+      }
+
+      public enum Status {
+        [pbr::OriginalName("ENCOUNTER_ERROR")] EncounterError = 0,
+        [pbr::OriginalName("ENCOUNTER_SUCCESS")] EncounterSuccess = 1,
+        [pbr::OriginalName("ENCOUNTER_NOT_FOUND")] EncounterNotFound = 2,
+        [pbr::OriginalName("ENCOUNTER_CLOSED")] EncounterClosed = 3,
+        [pbr::OriginalName("ENCOUNTER_POKEMON_FLED")] EncounterPokemonFled = 4,
+        [pbr::OriginalName("ENCOUNTER_NOT_IN_RANGE")] EncounterNotInRange = 5,
+        [pbr::OriginalName("ENCOUNTER_ALREADY_HAPPENED")] EncounterAlreadyHappened = 6,
+        [pbr::OriginalName("POKEMON_INVENTORY_FULL")] PokemonInventoryFull = 7,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.cs
new file mode 100644
index 0000000..e1f08a3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.cs
@@ -0,0 +1,249 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.proto</summary>
+  public static partial class EncounterTutorialCompleteResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/EncounterTutorialCompleteResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterTutorialCompleteResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0VuY291bnRlclR1",
+            "dG9yaWFsQ29tcGxldGVSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLlJlc3BvbnNlcxohUE9HT1Byb3Rvcy9EYXRhL1Bva2Vtb25EYXRh",
+            "LnByb3RvGipQT0dPUHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlQXdhcmQu",
+            "cHJvdG8irQIKIUVuY291bnRlclR1dG9yaWFsQ29tcGxldGVSZXNwb25zZRJZ",
+            "CgZyZXN1bHQYASABKA4ySS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9u",
+            "c2VzLkVuY291bnRlclR1dG9yaWFsQ29tcGxldGVSZXNwb25zZS5SZXN1bHQS",
+            "MgoMcG9rZW1vbl9kYXRhGAIgASgLMhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vt",
+            "b25EYXRhEjwKDWNhcHR1cmVfYXdhcmQYAyABKAsyJS5QT0dPUHJvdG9zLkRh",
+            "dGEuQ2FwdHVyZS5DYXB0dXJlQXdhcmQiOwoGUmVzdWx0EgkKBVVOU0VUEAAS",
+            "CwoHU1VDQ0VTUxABEhkKFUVSUk9SX0lOVkFMSURfUE9LRU1PThACYgZwcm90",
+            "bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Data.Capture.CaptureAwardReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse), global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Parser, new[]{ "Result", "PokemonData", "CaptureAward" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EncounterTutorialCompleteResponse : pb::IMessage<EncounterTutorialCompleteResponse> {
+    private static readonly pb::MessageParser<EncounterTutorialCompleteResponse> _parser = new pb::MessageParser<EncounterTutorialCompleteResponse>(() => new EncounterTutorialCompleteResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterTutorialCompleteResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteResponse(EncounterTutorialCompleteResponse other) : this() {
+      result_ = other.result_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      CaptureAward = other.captureAward_ != null ? other.CaptureAward.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteResponse Clone() {
+      return new EncounterTutorialCompleteResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_award" field.</summary>
+    public const int CaptureAwardFieldNumber = 3;
+    private global::POGOProtos.Data.Capture.CaptureAward captureAward_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureAward CaptureAward {
+      get { return captureAward_; }
+      set {
+        captureAward_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterTutorialCompleteResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterTutorialCompleteResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(CaptureAward, other.CaptureAward)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (captureAward_ != null) hash ^= CaptureAward.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PokemonData);
+      }
+      if (captureAward_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (captureAward_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureAward);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterTutorialCompleteResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.captureAward_ != null) {
+        if (captureAward_ == null) {
+          captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+        }
+        CaptureAward.MergeFrom(other.CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 26: {
+            if (captureAward_ == null) {
+              captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+            }
+            input.ReadMessage(captureAward_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EncounterTutorialCompleteResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_POKEMON")] ErrorInvalidPokemon = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/EquipBadgeResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/EquipBadgeResponse.cs
new file mode 100644
index 0000000..581b0f7
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/EquipBadgeResponse.cs
@@ -0,0 +1,213 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/EquipBadgeResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/EquipBadgeResponse.proto</summary>
+  public static partial class EquipBadgeResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/EquipBadgeResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EquipBadgeResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjhQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0VxdWlwQmFkZ2VS",
+            "ZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNl",
+            "cxoqUE9HT1Byb3Rvcy9EYXRhL1BsYXllci9FcXVpcHBlZEJhZGdlLnByb3Rv",
+            "IuMBChJFcXVpcEJhZGdlUmVzcG9uc2USSgoGcmVzdWx0GAEgASgOMjouUE9H",
+            "T1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5FcXVpcEJhZGdlUmVzcG9u",
+            "c2UuUmVzdWx0EjcKCGVxdWlwcGVkGAIgASgLMiUuUE9HT1Byb3Rvcy5EYXRh",
+            "LlBsYXllci5FcXVpcHBlZEJhZGdlIkgKBlJlc3VsdBIJCgVVTlNFVBAAEgsK",
+            "B1NVQ0NFU1MQARITCg9DT09MRE9XTl9BQ1RJVkUQAhIRCg1OT1RfUVVBTElG",
+            "SUVEEANiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Player.EquippedBadgeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EquipBadgeResponse), global::POGOProtos.Networking.Responses.EquipBadgeResponse.Parser, new[]{ "Result", "Equipped" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EquipBadgeResponse : pb::IMessage<EquipBadgeResponse> {
+    private static readonly pb::MessageParser<EquipBadgeResponse> _parser = new pb::MessageParser<EquipBadgeResponse>(() => new EquipBadgeResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquipBadgeResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.EquipBadgeResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeResponse(EquipBadgeResponse other) : this() {
+      result_ = other.result_;
+      Equipped = other.equipped_ != null ? other.Equipped.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeResponse Clone() {
+      return new EquipBadgeResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "equipped" field.</summary>
+    public const int EquippedFieldNumber = 2;
+    private global::POGOProtos.Data.Player.EquippedBadge equipped_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.EquippedBadge Equipped {
+      get { return equipped_; }
+      set {
+        equipped_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquipBadgeResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquipBadgeResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(Equipped, other.Equipped)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (equipped_ != null) hash ^= Equipped.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (equipped_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Equipped);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (equipped_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Equipped);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquipBadgeResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.equipped_ != null) {
+        if (equipped_ == null) {
+          equipped_ = new global::POGOProtos.Data.Player.EquippedBadge();
+        }
+        Equipped.MergeFrom(other.Equipped);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (equipped_ == null) {
+              equipped_ = new global::POGOProtos.Data.Player.EquippedBadge();
+            }
+            input.ReadMessage(equipped_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EquipBadgeResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("COOLDOWN_ACTIVE")] CooldownActive = 2,
+        [pbr::OriginalName("NOT_QUALIFIED")] NotQualified = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/EvolvePokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/EvolvePokemonResponse.cs
new file mode 100644
index 0000000..d97b781
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/EvolvePokemonResponse.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/EvolvePokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/EvolvePokemonResponse.proto</summary>
+  public static partial class EvolvePokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/EvolvePokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EvolvePokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0V2b2x2ZVBva2Vt",
+            "b25SZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcxohUE9HT1Byb3Rvcy9EYXRhL1Bva2Vtb25EYXRhLnByb3RvIvkCChVF",
+            "dm9sdmVQb2tlbW9uUmVzcG9uc2USTQoGcmVzdWx0GAEgASgOMj0uUE9HT1By",
+            "b3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5Fdm9sdmVQb2tlbW9uUmVzcG9u",
+            "c2UuUmVzdWx0EjoKFGV2b2x2ZWRfcG9rZW1vbl9kYXRhGAIgASgLMhwuUE9H",
+            "T1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEhoKEmV4cGVyaWVuY2VfYXdhcmRl",
+            "ZBgDIAEoBRIVCg1jYW5keV9hd2FyZGVkGAQgASgFIqEBCgZSZXN1bHQSCQoF",
+            "VU5TRVQQABILCgdTVUNDRVNTEAESGgoWRkFJTEVEX1BPS0VNT05fTUlTU0lO",
+            "RxACEiEKHUZBSUxFRF9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTEAMSIAocRkFJ",
+            "TEVEX1BPS0VNT05fQ0FOTk9UX0VWT0xWRRAEEh4KGkZBSUxFRF9QT0tFTU9O",
+            "X0lTX0RFUExPWUVEEAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EvolvePokemonResponse), global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Parser, new[]{ "Result", "EvolvedPokemonData", "ExperienceAwarded", "CandyAwarded" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EvolvePokemonResponse : pb::IMessage<EvolvePokemonResponse> {
+    private static readonly pb::MessageParser<EvolvePokemonResponse> _parser = new pb::MessageParser<EvolvePokemonResponse>(() => new EvolvePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EvolvePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.EvolvePokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonResponse(EvolvePokemonResponse other) : this() {
+      result_ = other.result_;
+      EvolvedPokemonData = other.evolvedPokemonData_ != null ? other.EvolvedPokemonData.Clone() : null;
+      experienceAwarded_ = other.experienceAwarded_;
+      candyAwarded_ = other.candyAwarded_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonResponse Clone() {
+      return new EvolvePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolved_pokemon_data" field.</summary>
+    public const int EvolvedPokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData evolvedPokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData EvolvedPokemonData {
+      get { return evolvedPokemonData_; }
+      set {
+        evolvedPokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "experience_awarded" field.</summary>
+    public const int ExperienceAwardedFieldNumber = 3;
+    private int experienceAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ExperienceAwarded {
+      get { return experienceAwarded_; }
+      set {
+        experienceAwarded_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_awarded" field.</summary>
+    public const int CandyAwardedFieldNumber = 4;
+    private int candyAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CandyAwarded {
+      get { return candyAwarded_; }
+      set {
+        candyAwarded_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EvolvePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EvolvePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(EvolvedPokemonData, other.EvolvedPokemonData)) return false;
+      if (ExperienceAwarded != other.ExperienceAwarded) return false;
+      if (CandyAwarded != other.CandyAwarded) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (evolvedPokemonData_ != null) hash ^= EvolvedPokemonData.GetHashCode();
+      if (ExperienceAwarded != 0) hash ^= ExperienceAwarded.GetHashCode();
+      if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (evolvedPokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(EvolvedPokemonData);
+      }
+      if (ExperienceAwarded != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(ExperienceAwarded);
+      }
+      if (CandyAwarded != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(CandyAwarded);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (evolvedPokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EvolvedPokemonData);
+      }
+      if (ExperienceAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ExperienceAwarded);
+      }
+      if (CandyAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EvolvePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.evolvedPokemonData_ != null) {
+        if (evolvedPokemonData_ == null) {
+          evolvedPokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        EvolvedPokemonData.MergeFrom(other.EvolvedPokemonData);
+      }
+      if (other.ExperienceAwarded != 0) {
+        ExperienceAwarded = other.ExperienceAwarded;
+      }
+      if (other.CandyAwarded != 0) {
+        CandyAwarded = other.CandyAwarded;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (evolvedPokemonData_ == null) {
+              evolvedPokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(evolvedPokemonData_);
+            break;
+          }
+          case 24: {
+            ExperienceAwarded = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            CandyAwarded = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EvolvePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILED_POKEMON_MISSING")] FailedPokemonMissing = 2,
+        [pbr::OriginalName("FAILED_INSUFFICIENT_RESOURCES")] FailedInsufficientResources = 3,
+        [pbr::OriginalName("FAILED_POKEMON_CANNOT_EVOLVE")] FailedPokemonCannotEvolve = 4,
+        [pbr::OriginalName("FAILED_POKEMON_IS_DEPLOYED")] FailedPokemonIsDeployed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/FortDeployPokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/FortDeployPokemonResponse.cs
new file mode 100644
index 0000000..d59c774
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/FortDeployPokemonResponse.cs
@@ -0,0 +1,295 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/FortDeployPokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/FortDeployPokemonResponse.proto</summary>
+  public static partial class FortDeployPokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/FortDeployPokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortDeployPokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0ZvcnREZXBsb3lQ",
+            "b2tlbW9uUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXNwb25zZXMaIVBPR09Qcm90b3MvRGF0YS9Qb2tlbW9uRGF0YS5wcm90bxoi",
+            "UE9HT1Byb3Rvcy9EYXRhL0d5bS9HeW1TdGF0ZS5wcm90bxo5UE9HT1Byb3Rv",
+            "cy9OZXR3b3JraW5nL1Jlc3BvbnNlcy9Gb3J0RGV0YWlsc1Jlc3BvbnNlLnBy",
+            "b3RvIqgEChlGb3J0RGVwbG95UG9rZW1vblJlc3BvbnNlElEKBnJlc3VsdBgB",
+            "IAEoDjJBLlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuRm9ydERl",
+            "cGxveVBva2Vtb25SZXNwb25zZS5SZXN1bHQSSgoMZm9ydF9kZXRhaWxzGAIg",
+            "ASgLMjQuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5Gb3J0RGV0",
+            "YWlsc1Jlc3BvbnNlEjIKDHBva2Vtb25fZGF0YRgDIAEoCzIcLlBPR09Qcm90",
+            "b3MuRGF0YS5Qb2tlbW9uRGF0YRIwCglneW1fc3RhdGUYBCABKAsyHS5QT0dP",
+            "UHJvdG9zLkRhdGEuR3ltLkd5bVN0YXRlIoUCCgZSZXN1bHQSEQoNTk9fUkVT",
+            "VUxUX1NFVBAAEgsKB1NVQ0NFU1MQARIlCiFFUlJPUl9BTFJFQURZX0hBU19Q",
+            "T0tFTU9OX09OX0ZPUlQQAhIhCh1FUlJPUl9PUFBPU0lOR19URUFNX09XTlNf",
+            "Rk9SVBADEhYKEkVSUk9SX0ZPUlRfSVNfRlVMTBAEEhYKEkVSUk9SX05PVF9J",
+            "Tl9SQU5HRRAFEhwKGEVSUk9SX1BMQVlFUl9IQVNfTk9fVEVBTRAGEh0KGUVS",
+            "Uk9SX1BPS0VNT05fTk9UX0ZVTExfSFAQBxIkCiBFUlJPUl9QTEFZRVJfQkVM",
+            "T1dfTUlOSU1VTV9MRVZFTBAIYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Data.Gym.GymStateReflection.Descriptor, global::POGOProtos.Networking.Responses.FortDetailsResponseReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortDeployPokemonResponse), global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Parser, new[]{ "Result", "FortDetails", "PokemonData", "GymState" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortDeployPokemonResponse : pb::IMessage<FortDeployPokemonResponse> {
+    private static readonly pb::MessageParser<FortDeployPokemonResponse> _parser = new pb::MessageParser<FortDeployPokemonResponse>(() => new FortDeployPokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDeployPokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.FortDeployPokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonResponse(FortDeployPokemonResponse other) : this() {
+      result_ = other.result_;
+      FortDetails = other.fortDetails_ != null ? other.FortDetails.Clone() : null;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      GymState = other.gymState_ != null ? other.GymState.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonResponse Clone() {
+      return new FortDeployPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_details" field.</summary>
+    public const int FortDetailsFieldNumber = 2;
+    private global::POGOProtos.Networking.Responses.FortDetailsResponse fortDetails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortDetailsResponse FortDetails {
+      get { return fortDetails_; }
+      set {
+        fortDetails_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 3;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_state" field.</summary>
+    public const int GymStateFieldNumber = 4;
+    private global::POGOProtos.Data.Gym.GymState gymState_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Gym.GymState GymState {
+      get { return gymState_; }
+      set {
+        gymState_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDeployPokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDeployPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(FortDetails, other.FortDetails)) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(GymState, other.GymState)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (fortDetails_ != null) hash ^= FortDetails.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (gymState_ != null) hash ^= GymState.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (fortDetails_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(FortDetails);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PokemonData);
+      }
+      if (gymState_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(GymState);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (fortDetails_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortDetails);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (gymState_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymState);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDeployPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.fortDetails_ != null) {
+        if (fortDetails_ == null) {
+          fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+        }
+        FortDetails.MergeFrom(other.FortDetails);
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.gymState_ != null) {
+        if (gymState_ == null) {
+          gymState_ = new global::POGOProtos.Data.Gym.GymState();
+        }
+        GymState.MergeFrom(other.GymState);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (fortDetails_ == null) {
+              fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+            }
+            input.ReadMessage(fortDetails_);
+            break;
+          }
+          case 26: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 34: {
+            if (gymState_ == null) {
+              gymState_ = new global::POGOProtos.Data.Gym.GymState();
+            }
+            input.ReadMessage(gymState_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortDeployPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("NO_RESULT_SET")] NoResultSet = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_ALREADY_HAS_POKEMON_ON_FORT")] ErrorAlreadyHasPokemonOnFort = 2,
+        [pbr::OriginalName("ERROR_OPPOSING_TEAM_OWNS_FORT")] ErrorOpposingTeamOwnsFort = 3,
+        [pbr::OriginalName("ERROR_FORT_IS_FULL")] ErrorFortIsFull = 4,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 5,
+        [pbr::OriginalName("ERROR_PLAYER_HAS_NO_TEAM")] ErrorPlayerHasNoTeam = 6,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FULL_HP")] ErrorPokemonNotFullHp = 7,
+        [pbr::OriginalName("ERROR_PLAYER_BELOW_MINIMUM_LEVEL")] ErrorPlayerBelowMinimumLevel = 8,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/FortDetailsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/FortDetailsResponse.cs
new file mode 100644
index 0000000..7ca2ea9
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/FortDetailsResponse.cs
@@ -0,0 +1,496 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/FortDetailsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/FortDetailsResponse.proto</summary>
+  public static partial class FortDetailsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/FortDetailsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortDetailsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjlQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0ZvcnREZXRhaWxz",
+            "UmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25z",
+            "ZXMaIVBPR09Qcm90b3MvRGF0YS9Qb2tlbW9uRGF0YS5wcm90bxogUE9HT1By",
+            "b3Rvcy9FbnVtcy9UZWFtQ29sb3IucHJvdG8aIlBPR09Qcm90b3MvTWFwL0Zv",
+            "cnQvRm9ydFR5cGUucHJvdG8aJlBPR09Qcm90b3MvTWFwL0ZvcnQvRm9ydE1v",
+            "ZGlmaWVyLnByb3RvIvwCChNGb3J0RGV0YWlsc1Jlc3BvbnNlEg8KB2ZvcnRf",
+            "aWQYASABKAkSLwoKdGVhbV9jb2xvchgCIAEoDjIbLlBPR09Qcm90b3MuRW51",
+            "bXMuVGVhbUNvbG9yEjIKDHBva2Vtb25fZGF0YRgDIAEoCzIcLlBPR09Qcm90",
+            "b3MuRGF0YS5Qb2tlbW9uRGF0YRIMCgRuYW1lGAQgASgJEhIKCmltYWdlX3Vy",
+            "bHMYBSADKAkSCgoCZnAYBiABKAUSDwoHc3RhbWluYRgHIAEoBRITCgttYXhf",
+            "c3RhbWluYRgIIAEoBRIrCgR0eXBlGAkgASgOMh0uUE9HT1Byb3Rvcy5NYXAu",
+            "Rm9ydC5Gb3J0VHlwZRIQCghsYXRpdHVkZRgKIAEoARIRCglsb25naXR1ZGUY",
+            "CyABKAESEwoLZGVzY3JpcHRpb24YDCABKAkSNAoJbW9kaWZpZXJzGA0gAygL",
+            "MiEuUE9HT1Byb3Rvcy5NYXAuRm9ydC5Gb3J0TW9kaWZpZXJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Enums.TeamColorReflection.Descriptor, global::POGOProtos.Map.Fort.FortTypeReflection.Descriptor, global::POGOProtos.Map.Fort.FortModifierReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortDetailsResponse), global::POGOProtos.Networking.Responses.FortDetailsResponse.Parser, new[]{ "FortId", "TeamColor", "PokemonData", "Name", "ImageUrls", "Fp", "Stamina", "MaxStamina", "Type", "Latitude", "Longitude", "Description", "Modifiers" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortDetailsResponse : pb::IMessage<FortDetailsResponse> {
+    private static readonly pb::MessageParser<FortDetailsResponse> _parser = new pb::MessageParser<FortDetailsResponse>(() => new FortDetailsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDetailsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.FortDetailsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsResponse(FortDetailsResponse other) : this() {
+      fortId_ = other.fortId_;
+      teamColor_ = other.teamColor_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      name_ = other.name_;
+      imageUrls_ = other.imageUrls_.Clone();
+      fp_ = other.fp_;
+      stamina_ = other.stamina_;
+      maxStamina_ = other.maxStamina_;
+      type_ = other.type_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      description_ = other.description_;
+      modifiers_ = other.modifiers_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsResponse Clone() {
+      return new FortDetailsResponse(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "team_color" field.</summary>
+    public const int TeamColorFieldNumber = 2;
+    private global::POGOProtos.Enums.TeamColor teamColor_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor TeamColor {
+      get { return teamColor_; }
+      set {
+        teamColor_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 3;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 4;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "image_urls" field.</summary>
+    public const int ImageUrlsFieldNumber = 5;
+    private static readonly pb::FieldCodec<string> _repeated_imageUrls_codec
+        = pb::FieldCodec.ForString(42);
+    private readonly pbc::RepeatedField<string> imageUrls_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> ImageUrls {
+      get { return imageUrls_; }
+    }
+
+    /// <summary>Field number for the "fp" field.</summary>
+    public const int FpFieldNumber = 6;
+    private int fp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Fp {
+      get { return fp_; }
+      set {
+        fp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 7;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_stamina" field.</summary>
+    public const int MaxStaminaFieldNumber = 8;
+    private int maxStamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxStamina {
+      get { return maxStamina_; }
+      set {
+        maxStamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type" field.</summary>
+    public const int TypeFieldNumber = 9;
+    private global::POGOProtos.Map.Fort.FortType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 10;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 11;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "description" field.</summary>
+    public const int DescriptionFieldNumber = 12;
+    private string description_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Description {
+      get { return description_; }
+      set {
+        description_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "modifiers" field.</summary>
+    public const int ModifiersFieldNumber = 13;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortModifier> _repeated_modifiers_codec
+        = pb::FieldCodec.ForMessage(106, global::POGOProtos.Map.Fort.FortModifier.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortModifier> modifiers_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortModifier>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortModifier> Modifiers {
+      get { return modifiers_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDetailsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDetailsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (TeamColor != other.TeamColor) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (Name != other.Name) return false;
+      if(!imageUrls_.Equals(other.imageUrls_)) return false;
+      if (Fp != other.Fp) return false;
+      if (Stamina != other.Stamina) return false;
+      if (MaxStamina != other.MaxStamina) return false;
+      if (Type != other.Type) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (Description != other.Description) return false;
+      if(!modifiers_.Equals(other.modifiers_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (TeamColor != 0) hash ^= TeamColor.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      hash ^= imageUrls_.GetHashCode();
+      if (Fp != 0) hash ^= Fp.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      if (MaxStamina != 0) hash ^= MaxStamina.GetHashCode();
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (Description.Length != 0) hash ^= Description.GetHashCode();
+      hash ^= modifiers_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (TeamColor != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) TeamColor);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PokemonData);
+      }
+      if (Name.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Name);
+      }
+      imageUrls_.WriteTo(output, _repeated_imageUrls_codec);
+      if (Fp != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(Fp);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(Stamina);
+      }
+      if (MaxStamina != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(MaxStamina);
+      }
+      if (Type != 0) {
+        output.WriteRawTag(72);
+        output.WriteEnum((int) Type);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(81);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(89);
+        output.WriteDouble(Longitude);
+      }
+      if (Description.Length != 0) {
+        output.WriteRawTag(98);
+        output.WriteString(Description);
+      }
+      modifiers_.WriteTo(output, _repeated_modifiers_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (TeamColor != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) TeamColor);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      size += imageUrls_.CalculateSize(_repeated_imageUrls_codec);
+      if (Fp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Fp);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      if (MaxStamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxStamina);
+      }
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Description.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Description);
+      }
+      size += modifiers_.CalculateSize(_repeated_modifiers_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDetailsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.TeamColor != 0) {
+        TeamColor = other.TeamColor;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      imageUrls_.Add(other.imageUrls_);
+      if (other.Fp != 0) {
+        Fp = other.Fp;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+      if (other.MaxStamina != 0) {
+        MaxStamina = other.MaxStamina;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.Description.Length != 0) {
+        Description = other.Description;
+      }
+      modifiers_.Add(other.modifiers_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 16: {
+            teamColor_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+          case 26: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 34: {
+            Name = input.ReadString();
+            break;
+          }
+          case 42: {
+            imageUrls_.AddEntriesFrom(input, _repeated_imageUrls_codec);
+            break;
+          }
+          case 48: {
+            Fp = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            MaxStamina = input.ReadInt32();
+            break;
+          }
+          case 72: {
+            type_ = (global::POGOProtos.Map.Fort.FortType) input.ReadEnum();
+            break;
+          }
+          case 81: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 89: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 98: {
+            Description = input.ReadString();
+            break;
+          }
+          case 106: {
+            modifiers_.AddEntriesFrom(input, _repeated_modifiers_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/FortRecallPokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/FortRecallPokemonResponse.cs
new file mode 100644
index 0000000..9698cd1
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/FortRecallPokemonResponse.cs
@@ -0,0 +1,216 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/FortRecallPokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/FortRecallPokemonResponse.proto</summary>
+  public static partial class FortRecallPokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/FortRecallPokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortRecallPokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0ZvcnRSZWNhbGxQ",
+            "b2tlbW9uUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXNwb25zZXMaOVBPR09Qcm90b3MvTmV0d29ya2luZy9SZXNwb25zZXMvRm9y",
+            "dERldGFpbHNSZXNwb25zZS5wcm90byKwAgoZRm9ydFJlY2FsbFBva2Vtb25S",
+            "ZXNwb25zZRJRCgZyZXN1bHQYASABKA4yQS5QT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVzcG9uc2VzLkZvcnRSZWNhbGxQb2tlbW9uUmVzcG9uc2UuUmVzdWx0",
+            "EkoKDGZvcnRfZGV0YWlscxgCIAEoCzI0LlBPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXNwb25zZXMuRm9ydERldGFpbHNSZXNwb25zZSJ0CgZSZXN1bHQSEQoN",
+            "Tk9fUkVTVUxUX1NFVBAAEgsKB1NVQ0NFU1MQARIWChJFUlJPUl9OT1RfSU5f",
+            "UkFOR0UQAhIdChlFUlJPUl9QT0tFTU9OX05PVF9PTl9GT1JUEAMSEwoPRVJS",
+            "T1JfTk9fUExBWUVSEARiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Networking.Responses.FortDetailsResponseReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortRecallPokemonResponse), global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Parser, new[]{ "Result", "FortDetails" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortRecallPokemonResponse : pb::IMessage<FortRecallPokemonResponse> {
+    private static readonly pb::MessageParser<FortRecallPokemonResponse> _parser = new pb::MessageParser<FortRecallPokemonResponse>(() => new FortRecallPokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortRecallPokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.FortRecallPokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonResponse(FortRecallPokemonResponse other) : this() {
+      result_ = other.result_;
+      FortDetails = other.fortDetails_ != null ? other.FortDetails.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonResponse Clone() {
+      return new FortRecallPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_details" field.</summary>
+    public const int FortDetailsFieldNumber = 2;
+    private global::POGOProtos.Networking.Responses.FortDetailsResponse fortDetails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortDetailsResponse FortDetails {
+      get { return fortDetails_; }
+      set {
+        fortDetails_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortRecallPokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortRecallPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(FortDetails, other.FortDetails)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (fortDetails_ != null) hash ^= FortDetails.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (fortDetails_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(FortDetails);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (fortDetails_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortDetails);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortRecallPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.fortDetails_ != null) {
+        if (fortDetails_ == null) {
+          fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+        }
+        FortDetails.MergeFrom(other.FortDetails);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (fortDetails_ == null) {
+              fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+            }
+            input.ReadMessage(fortDetails_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortRecallPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("NO_RESULT_SET")] NoResultSet = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 2,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_ON_FORT")] ErrorPokemonNotOnFort = 3,
+        [pbr::OriginalName("ERROR_NO_PLAYER")] ErrorNoPlayer = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/FortSearchResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/FortSearchResponse.cs
new file mode 100644
index 0000000..03f9478
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/FortSearchResponse.cs
@@ -0,0 +1,351 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/FortSearchResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/FortSearchResponse.proto</summary>
+  public static partial class FortSearchResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/FortSearchResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortSearchResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjhQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0ZvcnRTZWFyY2hS",
+            "ZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNl",
+            "cxohUE9HT1Byb3Rvcy9EYXRhL1Bva2Vtb25EYXRhLnByb3RvGilQT0dPUHJv",
+            "dG9zL0ludmVudG9yeS9JdGVtL0l0ZW1Bd2FyZC5wcm90byK7AwoSRm9ydFNl",
+            "YXJjaFJlc3BvbnNlEkoKBnJlc3VsdBgBIAEoDjI6LlBPR09Qcm90b3MuTmV0",
+            "d29ya2luZy5SZXNwb25zZXMuRm9ydFNlYXJjaFJlc3BvbnNlLlJlc3VsdBI7",
+            "Cg1pdGVtc19hd2FyZGVkGAIgAygLMiQuUE9HT1Byb3Rvcy5JbnZlbnRvcnku",
+            "SXRlbS5JdGVtQXdhcmQSFAoMZ2Vtc19hd2FyZGVkGAMgASgFEjYKEHBva2Vt",
+            "b25fZGF0YV9lZ2cYBCABKAsyHC5QT0dPUHJvdG9zLkRhdGEuUG9rZW1vbkRh",
+            "dGESGgoSZXhwZXJpZW5jZV9hd2FyZGVkGAUgASgFEiYKHmNvb2xkb3duX2Nv",
+            "bXBsZXRlX3RpbWVzdGFtcF9tcxgGIAEoAxIiChpjaGFpbl9oYWNrX3NlcXVl",
+            "bmNlX251bWJlchgHIAEoBSJmCgZSZXN1bHQSEQoNTk9fUkVTVUxUX1NFVBAA",
+            "EgsKB1NVQ0NFU1MQARIQCgxPVVRfT0ZfUkFOR0UQAhIWChJJTl9DT09MRE9X",
+            "Tl9QRVJJT0QQAxISCg5JTlZFTlRPUllfRlVMTBAEYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemAwardReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortSearchResponse), global::POGOProtos.Networking.Responses.FortSearchResponse.Parser, new[]{ "Result", "ItemsAwarded", "GemsAwarded", "PokemonDataEgg", "ExperienceAwarded", "CooldownCompleteTimestampMs", "ChainHackSequenceNumber" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortSearchResponse : pb::IMessage<FortSearchResponse> {
+    private static readonly pb::MessageParser<FortSearchResponse> _parser = new pb::MessageParser<FortSearchResponse>(() => new FortSearchResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSearchResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.FortSearchResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchResponse(FortSearchResponse other) : this() {
+      result_ = other.result_;
+      itemsAwarded_ = other.itemsAwarded_.Clone();
+      gemsAwarded_ = other.gemsAwarded_;
+      PokemonDataEgg = other.pokemonDataEgg_ != null ? other.PokemonDataEgg.Clone() : null;
+      experienceAwarded_ = other.experienceAwarded_;
+      cooldownCompleteTimestampMs_ = other.cooldownCompleteTimestampMs_;
+      chainHackSequenceNumber_ = other.chainHackSequenceNumber_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchResponse Clone() {
+      return new FortSearchResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "items_awarded" field.</summary>
+    public const int ItemsAwardedFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemAward> _repeated_itemsAwarded_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Inventory.Item.ItemAward.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> itemsAwarded_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> ItemsAwarded {
+      get { return itemsAwarded_; }
+    }
+
+    /// <summary>Field number for the "gems_awarded" field.</summary>
+    public const int GemsAwardedFieldNumber = 3;
+    private int gemsAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GemsAwarded {
+      get { return gemsAwarded_; }
+      set {
+        gemsAwarded_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data_egg" field.</summary>
+    public const int PokemonDataEggFieldNumber = 4;
+    private global::POGOProtos.Data.PokemonData pokemonDataEgg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonDataEgg {
+      get { return pokemonDataEgg_; }
+      set {
+        pokemonDataEgg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "experience_awarded" field.</summary>
+    public const int ExperienceAwardedFieldNumber = 5;
+    private int experienceAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ExperienceAwarded {
+      get { return experienceAwarded_; }
+      set {
+        experienceAwarded_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cooldown_complete_timestamp_ms" field.</summary>
+    public const int CooldownCompleteTimestampMsFieldNumber = 6;
+    private long cooldownCompleteTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CooldownCompleteTimestampMs {
+      get { return cooldownCompleteTimestampMs_; }
+      set {
+        cooldownCompleteTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "chain_hack_sequence_number" field.</summary>
+    public const int ChainHackSequenceNumberFieldNumber = 7;
+    private int chainHackSequenceNumber_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ChainHackSequenceNumber {
+      get { return chainHackSequenceNumber_; }
+      set {
+        chainHackSequenceNumber_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSearchResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSearchResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!itemsAwarded_.Equals(other.itemsAwarded_)) return false;
+      if (GemsAwarded != other.GemsAwarded) return false;
+      if (!object.Equals(PokemonDataEgg, other.PokemonDataEgg)) return false;
+      if (ExperienceAwarded != other.ExperienceAwarded) return false;
+      if (CooldownCompleteTimestampMs != other.CooldownCompleteTimestampMs) return false;
+      if (ChainHackSequenceNumber != other.ChainHackSequenceNumber) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= itemsAwarded_.GetHashCode();
+      if (GemsAwarded != 0) hash ^= GemsAwarded.GetHashCode();
+      if (pokemonDataEgg_ != null) hash ^= PokemonDataEgg.GetHashCode();
+      if (ExperienceAwarded != 0) hash ^= ExperienceAwarded.GetHashCode();
+      if (CooldownCompleteTimestampMs != 0L) hash ^= CooldownCompleteTimestampMs.GetHashCode();
+      if (ChainHackSequenceNumber != 0) hash ^= ChainHackSequenceNumber.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      itemsAwarded_.WriteTo(output, _repeated_itemsAwarded_codec);
+      if (GemsAwarded != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(GemsAwarded);
+      }
+      if (pokemonDataEgg_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(PokemonDataEgg);
+      }
+      if (ExperienceAwarded != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(ExperienceAwarded);
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        output.WriteRawTag(48);
+        output.WriteInt64(CooldownCompleteTimestampMs);
+      }
+      if (ChainHackSequenceNumber != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(ChainHackSequenceNumber);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += itemsAwarded_.CalculateSize(_repeated_itemsAwarded_codec);
+      if (GemsAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GemsAwarded);
+      }
+      if (pokemonDataEgg_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonDataEgg);
+      }
+      if (ExperienceAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ExperienceAwarded);
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CooldownCompleteTimestampMs);
+      }
+      if (ChainHackSequenceNumber != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ChainHackSequenceNumber);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSearchResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      itemsAwarded_.Add(other.itemsAwarded_);
+      if (other.GemsAwarded != 0) {
+        GemsAwarded = other.GemsAwarded;
+      }
+      if (other.pokemonDataEgg_ != null) {
+        if (pokemonDataEgg_ == null) {
+          pokemonDataEgg_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonDataEgg.MergeFrom(other.PokemonDataEgg);
+      }
+      if (other.ExperienceAwarded != 0) {
+        ExperienceAwarded = other.ExperienceAwarded;
+      }
+      if (other.CooldownCompleteTimestampMs != 0L) {
+        CooldownCompleteTimestampMs = other.CooldownCompleteTimestampMs;
+      }
+      if (other.ChainHackSequenceNumber != 0) {
+        ChainHackSequenceNumber = other.ChainHackSequenceNumber;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            itemsAwarded_.AddEntriesFrom(input, _repeated_itemsAwarded_codec);
+            break;
+          }
+          case 24: {
+            GemsAwarded = input.ReadInt32();
+            break;
+          }
+          case 34: {
+            if (pokemonDataEgg_ == null) {
+              pokemonDataEgg_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonDataEgg_);
+            break;
+          }
+          case 40: {
+            ExperienceAwarded = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            CooldownCompleteTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 56: {
+            ChainHackSequenceNumber = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortSearchResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("NO_RESULT_SET")] NoResultSet = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("OUT_OF_RANGE")] OutOfRange = 2,
+        [pbr::OriginalName("IN_COOLDOWN_PERIOD")] InCooldownPeriod = 3,
+        [pbr::OriginalName("INVENTORY_FULL")] InventoryFull = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetAssetDigestResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetAssetDigestResponse.cs
new file mode 100644
index 0000000..58a95d4
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetAssetDigestResponse.cs
@@ -0,0 +1,182 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetAssetDigestResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetAssetDigestResponse.proto</summary>
+  public static partial class GetAssetDigestResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetAssetDigestResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetAssetDigestResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldEFzc2V0RGln",
+            "ZXN0UmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMaJlBPR09Qcm90b3MvRGF0YS9Bc3NldERpZ2VzdEVudHJ5LnByb3Rv",
+            "ImEKFkdldEFzc2V0RGlnZXN0UmVzcG9uc2USMQoGZGlnZXN0GAEgAygLMiEu",
+            "UE9HT1Byb3Rvcy5EYXRhLkFzc2V0RGlnZXN0RW50cnkSFAoMdGltZXN0YW1w",
+            "X21zGAIgASgEYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.AssetDigestEntryReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetAssetDigestResponse), global::POGOProtos.Networking.Responses.GetAssetDigestResponse.Parser, new[]{ "Digest", "TimestampMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetAssetDigestResponse : pb::IMessage<GetAssetDigestResponse> {
+    private static readonly pb::MessageParser<GetAssetDigestResponse> _parser = new pb::MessageParser<GetAssetDigestResponse>(() => new GetAssetDigestResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetAssetDigestResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetAssetDigestResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestResponse(GetAssetDigestResponse other) : this() {
+      digest_ = other.digest_.Clone();
+      timestampMs_ = other.timestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestResponse Clone() {
+      return new GetAssetDigestResponse(this);
+    }
+
+    /// <summary>Field number for the "digest" field.</summary>
+    public const int DigestFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.AssetDigestEntry> _repeated_digest_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Data.AssetDigestEntry.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.AssetDigestEntry> digest_ = new pbc::RepeatedField<global::POGOProtos.Data.AssetDigestEntry>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.AssetDigestEntry> Digest {
+      get { return digest_; }
+    }
+
+    /// <summary>Field number for the "timestamp_ms" field.</summary>
+    public const int TimestampMsFieldNumber = 2;
+    private ulong timestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong TimestampMs {
+      get { return timestampMs_; }
+      set {
+        timestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetAssetDigestResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetAssetDigestResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!digest_.Equals(other.digest_)) return false;
+      if (TimestampMs != other.TimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= digest_.GetHashCode();
+      if (TimestampMs != 0UL) hash ^= TimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      digest_.WriteTo(output, _repeated_digest_codec);
+      if (TimestampMs != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(TimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += digest_.CalculateSize(_repeated_digest_codec);
+      if (TimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetAssetDigestResponse other) {
+      if (other == null) {
+        return;
+      }
+      digest_.Add(other.digest_);
+      if (other.TimestampMs != 0UL) {
+        TimestampMs = other.TimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            digest_.AddEntriesFrom(input, _repeated_digest_codec);
+            break;
+          }
+          case 16: {
+            TimestampMs = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetDownloadUrlsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetDownloadUrlsResponse.cs
new file mode 100644
index 0000000..35dc75b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetDownloadUrlsResponse.cs
@@ -0,0 +1,157 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetDownloadUrlsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetDownloadUrlsResponse.proto</summary>
+  public static partial class GetDownloadUrlsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetDownloadUrlsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetDownloadUrlsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj1QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldERvd25sb2Fk",
+            "VXJsc1Jlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVz",
+            "cG9uc2VzGiZQT0dPUHJvdG9zL0RhdGEvRG93bmxvYWRVcmxFbnRyeS5wcm90",
+            "byJTChdHZXREb3dubG9hZFVybHNSZXNwb25zZRI4Cg1kb3dubG9hZF91cmxz",
+            "GAEgAygLMiEuUE9HT1Byb3Rvcy5EYXRhLkRvd25sb2FkVXJsRW50cnliBnBy",
+            "b3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.DownloadUrlEntryReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetDownloadUrlsResponse), global::POGOProtos.Networking.Responses.GetDownloadUrlsResponse.Parser, new[]{ "DownloadUrls" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// <summary>
+  ///  UNTESTED
+  /// </summary>
+  public sealed partial class GetDownloadUrlsResponse : pb::IMessage<GetDownloadUrlsResponse> {
+    private static readonly pb::MessageParser<GetDownloadUrlsResponse> _parser = new pb::MessageParser<GetDownloadUrlsResponse>(() => new GetDownloadUrlsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetDownloadUrlsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetDownloadUrlsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsResponse(GetDownloadUrlsResponse other) : this() {
+      downloadUrls_ = other.downloadUrls_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsResponse Clone() {
+      return new GetDownloadUrlsResponse(this);
+    }
+
+    /// <summary>Field number for the "download_urls" field.</summary>
+    public const int DownloadUrlsFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.DownloadUrlEntry> _repeated_downloadUrls_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Data.DownloadUrlEntry.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.DownloadUrlEntry> downloadUrls_ = new pbc::RepeatedField<global::POGOProtos.Data.DownloadUrlEntry>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.DownloadUrlEntry> DownloadUrls {
+      get { return downloadUrls_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetDownloadUrlsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetDownloadUrlsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!downloadUrls_.Equals(other.downloadUrls_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= downloadUrls_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      downloadUrls_.WriteTo(output, _repeated_downloadUrls_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += downloadUrls_.CalculateSize(_repeated_downloadUrls_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetDownloadUrlsResponse other) {
+      if (other == null) {
+        return;
+      }
+      downloadUrls_.Add(other.downloadUrls_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            downloadUrls_.AddEntriesFrom(input, _repeated_downloadUrls_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetGymDetailsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetGymDetailsResponse.cs
new file mode 100644
index 0000000..a10d0ab
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetGymDetailsResponse.cs
@@ -0,0 +1,288 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetGymDetailsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetGymDetailsResponse.proto</summary>
+  public static partial class GetGymDetailsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetGymDetailsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetGymDetailsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldEd5bURldGFp",
+            "bHNSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcxoiUE9HT1Byb3Rvcy9EYXRhL0d5bS9HeW1TdGF0ZS5wcm90byKDAgoV",
+            "R2V0R3ltRGV0YWlsc1Jlc3BvbnNlEjAKCWd5bV9zdGF0ZRgBIAEoCzIdLlBP",
+            "R09Qcm90b3MuRGF0YS5HeW0uR3ltU3RhdGUSDAoEbmFtZRgCIAEoCRIMCgR1",
+            "cmxzGAMgAygJEk0KBnJlc3VsdBgEIAEoDjI9LlBPR09Qcm90b3MuTmV0d29y",
+            "a2luZy5SZXNwb25zZXMuR2V0R3ltRGV0YWlsc1Jlc3BvbnNlLlJlc3VsdBIT",
+            "CgtkZXNjcmlwdGlvbhgFIAEoCSI4CgZSZXN1bHQSCQoFVU5TRVQQABILCgdT",
+            "VUNDRVNTEAESFgoSRVJST1JfTk9UX0lOX1JBTkdFEAJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Gym.GymStateReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetGymDetailsResponse), global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Parser, new[]{ "GymState", "Name", "Urls", "Result", "Description" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetGymDetailsResponse : pb::IMessage<GetGymDetailsResponse> {
+    private static readonly pb::MessageParser<GetGymDetailsResponse> _parser = new pb::MessageParser<GetGymDetailsResponse>(() => new GetGymDetailsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetGymDetailsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetGymDetailsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsResponse(GetGymDetailsResponse other) : this() {
+      GymState = other.gymState_ != null ? other.GymState.Clone() : null;
+      name_ = other.name_;
+      urls_ = other.urls_.Clone();
+      result_ = other.result_;
+      description_ = other.description_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsResponse Clone() {
+      return new GetGymDetailsResponse(this);
+    }
+
+    /// <summary>Field number for the "gym_state" field.</summary>
+    public const int GymStateFieldNumber = 1;
+    private global::POGOProtos.Data.Gym.GymState gymState_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Gym.GymState GymState {
+      get { return gymState_; }
+      set {
+        gymState_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 2;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "urls" field.</summary>
+    public const int UrlsFieldNumber = 3;
+    private static readonly pb::FieldCodec<string> _repeated_urls_codec
+        = pb::FieldCodec.ForString(26);
+    private readonly pbc::RepeatedField<string> urls_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> Urls {
+      get { return urls_; }
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 4;
+    private global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "description" field.</summary>
+    public const int DescriptionFieldNumber = 5;
+    private string description_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Description {
+      get { return description_; }
+      set {
+        description_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetGymDetailsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetGymDetailsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(GymState, other.GymState)) return false;
+      if (Name != other.Name) return false;
+      if(!urls_.Equals(other.urls_)) return false;
+      if (Result != other.Result) return false;
+      if (Description != other.Description) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (gymState_ != null) hash ^= GymState.GetHashCode();
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      hash ^= urls_.GetHashCode();
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (Description.Length != 0) hash ^= Description.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (gymState_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(GymState);
+      }
+      if (Name.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Name);
+      }
+      urls_.WriteTo(output, _repeated_urls_codec);
+      if (Result != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Result);
+      }
+      if (Description.Length != 0) {
+        output.WriteRawTag(42);
+        output.WriteString(Description);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (gymState_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymState);
+      }
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      size += urls_.CalculateSize(_repeated_urls_codec);
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (Description.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Description);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetGymDetailsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.gymState_ != null) {
+        if (gymState_ == null) {
+          gymState_ = new global::POGOProtos.Data.Gym.GymState();
+        }
+        GymState.MergeFrom(other.GymState);
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      urls_.Add(other.urls_);
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.Description.Length != 0) {
+        Description = other.Description;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (gymState_ == null) {
+              gymState_ = new global::POGOProtos.Data.Gym.GymState();
+            }
+            input.ReadMessage(gymState_);
+            break;
+          }
+          case 18: {
+            Name = input.ReadString();
+            break;
+          }
+          case 26: {
+            urls_.AddEntriesFrom(input, _repeated_urls_codec);
+            break;
+          }
+          case 32: {
+            result_ = (global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 42: {
+            Description = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the GetGymDetailsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetHatchedEggsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetHatchedEggsResponse.cs
new file mode 100644
index 0000000..18550c4
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetHatchedEggsResponse.cs
@@ -0,0 +1,246 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetHatchedEggsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetHatchedEggsResponse.proto</summary>
+  public static partial class GetHatchedEggsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetHatchedEggsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetHatchedEggsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldEhhdGNoZWRF",
+            "Z2dzUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMijgEKFkdldEhhdGNoZWRFZ2dzUmVzcG9uc2USDwoHc3VjY2VzcxgB",
+            "IAEoCBIWCgpwb2tlbW9uX2lkGAIgAygGQgIQARIaChJleHBlcmllbmNlX2F3",
+            "YXJkZWQYAyADKAUSFQoNY2FuZHlfYXdhcmRlZBgEIAMoBRIYChBzdGFyZHVz",
+            "dF9hd2FyZGVkGAUgAygFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetHatchedEggsResponse), global::POGOProtos.Networking.Responses.GetHatchedEggsResponse.Parser, new[]{ "Success", "PokemonId", "ExperienceAwarded", "CandyAwarded", "StardustAwarded" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetHatchedEggsResponse : pb::IMessage<GetHatchedEggsResponse> {
+    private static readonly pb::MessageParser<GetHatchedEggsResponse> _parser = new pb::MessageParser<GetHatchedEggsResponse>(() => new GetHatchedEggsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetHatchedEggsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetHatchedEggsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsResponse(GetHatchedEggsResponse other) : this() {
+      success_ = other.success_;
+      pokemonId_ = other.pokemonId_.Clone();
+      experienceAwarded_ = other.experienceAwarded_.Clone();
+      candyAwarded_ = other.candyAwarded_.Clone();
+      stardustAwarded_ = other.stardustAwarded_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsResponse Clone() {
+      return new GetHatchedEggsResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private static readonly pb::FieldCodec<ulong> _repeated_pokemonId_codec
+        = pb::FieldCodec.ForFixed64(18);
+    private readonly pbc::RepeatedField<ulong> pokemonId_ = new pbc::RepeatedField<ulong>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<ulong> PokemonId {
+      get { return pokemonId_; }
+    }
+
+    /// <summary>Field number for the "experience_awarded" field.</summary>
+    public const int ExperienceAwardedFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_experienceAwarded_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> experienceAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> ExperienceAwarded {
+      get { return experienceAwarded_; }
+    }
+
+    /// <summary>Field number for the "candy_awarded" field.</summary>
+    public const int CandyAwardedFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_candyAwarded_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> candyAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> CandyAwarded {
+      get { return candyAwarded_; }
+    }
+
+    /// <summary>Field number for the "stardust_awarded" field.</summary>
+    public const int StardustAwardedFieldNumber = 5;
+    private static readonly pb::FieldCodec<int> _repeated_stardustAwarded_codec
+        = pb::FieldCodec.ForInt32(42);
+    private readonly pbc::RepeatedField<int> stardustAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> StardustAwarded {
+      get { return stardustAwarded_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetHatchedEggsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetHatchedEggsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if(!pokemonId_.Equals(other.pokemonId_)) return false;
+      if(!experienceAwarded_.Equals(other.experienceAwarded_)) return false;
+      if(!candyAwarded_.Equals(other.candyAwarded_)) return false;
+      if(!stardustAwarded_.Equals(other.stardustAwarded_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      hash ^= pokemonId_.GetHashCode();
+      hash ^= experienceAwarded_.GetHashCode();
+      hash ^= candyAwarded_.GetHashCode();
+      hash ^= stardustAwarded_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      pokemonId_.WriteTo(output, _repeated_pokemonId_codec);
+      experienceAwarded_.WriteTo(output, _repeated_experienceAwarded_codec);
+      candyAwarded_.WriteTo(output, _repeated_candyAwarded_codec);
+      stardustAwarded_.WriteTo(output, _repeated_stardustAwarded_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      size += pokemonId_.CalculateSize(_repeated_pokemonId_codec);
+      size += experienceAwarded_.CalculateSize(_repeated_experienceAwarded_codec);
+      size += candyAwarded_.CalculateSize(_repeated_candyAwarded_codec);
+      size += stardustAwarded_.CalculateSize(_repeated_stardustAwarded_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetHatchedEggsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      pokemonId_.Add(other.pokemonId_);
+      experienceAwarded_.Add(other.experienceAwarded_);
+      candyAwarded_.Add(other.candyAwarded_);
+      stardustAwarded_.Add(other.stardustAwarded_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18:
+          case 17: {
+            pokemonId_.AddEntriesFrom(input, _repeated_pokemonId_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            experienceAwarded_.AddEntriesFrom(input, _repeated_experienceAwarded_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            candyAwarded_.AddEntriesFrom(input, _repeated_candyAwarded_codec);
+            break;
+          }
+          case 42:
+          case 40: {
+            stardustAwarded_.AddEntriesFrom(input, _repeated_stardustAwarded_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetIncensePokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetIncensePokemonResponse.cs
new file mode 100644
index 0000000..b7efc67
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetIncensePokemonResponse.cs
@@ -0,0 +1,349 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetIncensePokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetIncensePokemonResponse.proto</summary>
+  public static partial class GetIncensePokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetIncensePokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetIncensePokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldEluY2Vuc2VQ",
+            "b2tlbW9uUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5S",
+            "ZXNwb25zZXMaIFBPR09Qcm90b3MvRW51bXMvUG9rZW1vbklkLnByb3RvIoUD",
+            "ChlHZXRJbmNlbnNlUG9rZW1vblJlc3BvbnNlElEKBnJlc3VsdBgBIAEoDjJB",
+            "LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuR2V0SW5jZW5zZVBv",
+            "a2Vtb25SZXNwb25zZS5SZXN1bHQSLwoKcG9rZW1vbl9pZBgCIAEoDjIbLlBP",
+            "R09Qcm90b3MuRW51bXMuUG9rZW1vbklkEhAKCGxhdGl0dWRlGAMgASgBEhEK",
+            "CWxvbmdpdHVkZRgEIAEoARIaChJlbmNvdW50ZXJfbG9jYXRpb24YBSABKAkS",
+            "FAoMZW5jb3VudGVyX2lkGAYgASgGEh4KFmRpc2FwcGVhcl90aW1lc3RhbXBf",
+            "bXMYByABKAMibQoGUmVzdWx0Eh0KGUlOQ0VOU0VfRU5DT1VOVEVSX1VOS05P",
+            "V04QABIfChtJTkNFTlNFX0VOQ09VTlRFUl9BVkFJTEFCTEUQARIjCh9JTkNF",
+            "TlNFX0VOQ09VTlRFUl9OT1RfQVZBSUxBQkxFEAJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetIncensePokemonResponse), global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Parser, new[]{ "Result", "PokemonId", "Latitude", "Longitude", "EncounterLocation", "EncounterId", "DisappearTimestampMs" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetIncensePokemonResponse : pb::IMessage<GetIncensePokemonResponse> {
+    private static readonly pb::MessageParser<GetIncensePokemonResponse> _parser = new pb::MessageParser<GetIncensePokemonResponse>(() => new GetIncensePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetIncensePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetIncensePokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonResponse(GetIncensePokemonResponse other) : this() {
+      result_ = other.result_;
+      pokemonId_ = other.pokemonId_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      encounterLocation_ = other.encounterLocation_;
+      encounterId_ = other.encounterId_;
+      disappearTimestampMs_ = other.disappearTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonResponse Clone() {
+      return new GetIncensePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_location" field.</summary>
+    public const int EncounterLocationFieldNumber = 5;
+    private string encounterLocation_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string EncounterLocation {
+      get { return encounterLocation_; }
+      set {
+        encounterLocation_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 6;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "disappear_timestamp_ms" field.</summary>
+    public const int DisappearTimestampMsFieldNumber = 7;
+    private long disappearTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DisappearTimestampMs {
+      get { return disappearTimestampMs_; }
+      set {
+        disappearTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetIncensePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetIncensePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (EncounterLocation != other.EncounterLocation) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (DisappearTimestampMs != other.DisappearTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (EncounterLocation.Length != 0) hash ^= EncounterLocation.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (DisappearTimestampMs != 0L) hash ^= DisappearTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+      if (EncounterLocation.Length != 0) {
+        output.WriteRawTag(42);
+        output.WriteString(EncounterLocation);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(49);
+        output.WriteFixed64(EncounterId);
+      }
+      if (DisappearTimestampMs != 0L) {
+        output.WriteRawTag(56);
+        output.WriteInt64(DisappearTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (EncounterLocation.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(EncounterLocation);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (DisappearTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DisappearTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetIncensePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.EncounterLocation.Length != 0) {
+        EncounterLocation = other.EncounterLocation;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.DisappearTimestampMs != 0L) {
+        DisappearTimestampMs = other.DisappearTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 42: {
+            EncounterLocation = input.ReadString();
+            break;
+          }
+          case 49: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 56: {
+            DisappearTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the GetIncensePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("INCENSE_ENCOUNTER_UNKNOWN")] IncenseEncounterUnknown = 0,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_AVAILABLE")] IncenseEncounterAvailable = 1,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_NOT_AVAILABLE")] IncenseEncounterNotAvailable = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetInventoryResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetInventoryResponse.cs
new file mode 100644
index 0000000..4318745
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetInventoryResponse.cs
@@ -0,0 +1,196 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetInventoryResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetInventoryResponse.proto</summary>
+  public static partial class GetInventoryResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetInventoryResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetInventoryResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjpQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldEludmVudG9y",
+            "eVJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9u",
+            "c2VzGilQT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlEZWx0YS5wcm90",
+            "byJmChRHZXRJbnZlbnRvcnlSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEj0K",
+            "D2ludmVudG9yeV9kZWx0YRgCIAEoCzIkLlBPR09Qcm90b3MuSW52ZW50b3J5",
+            "LkludmVudG9yeURlbHRhYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.InventoryDeltaReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetInventoryResponse), global::POGOProtos.Networking.Responses.GetInventoryResponse.Parser, new[]{ "Success", "InventoryDelta" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetInventoryResponse : pb::IMessage<GetInventoryResponse> {
+    private static readonly pb::MessageParser<GetInventoryResponse> _parser = new pb::MessageParser<GetInventoryResponse>(() => new GetInventoryResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetInventoryResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetInventoryResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryResponse(GetInventoryResponse other) : this() {
+      success_ = other.success_;
+      InventoryDelta = other.inventoryDelta_ != null ? other.InventoryDelta.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryResponse Clone() {
+      return new GetInventoryResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_delta" field.</summary>
+    public const int InventoryDeltaFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryDelta inventoryDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryDelta InventoryDelta {
+      get { return inventoryDelta_; }
+      set {
+        inventoryDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetInventoryResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetInventoryResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (!object.Equals(InventoryDelta, other.InventoryDelta)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (inventoryDelta_ != null) hash ^= InventoryDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (inventoryDelta_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(InventoryDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (inventoryDelta_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetInventoryResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.inventoryDelta_ != null) {
+        if (inventoryDelta_ == null) {
+          inventoryDelta_ = new global::POGOProtos.Inventory.InventoryDelta();
+        }
+        InventoryDelta.MergeFrom(other.InventoryDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            if (inventoryDelta_ == null) {
+              inventoryDelta_ = new global::POGOProtos.Inventory.InventoryDelta();
+            }
+            input.ReadMessage(inventoryDelta_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetMapObjectsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetMapObjectsResponse.cs
new file mode 100644
index 0000000..e151596
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetMapObjectsResponse.cs
@@ -0,0 +1,183 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetMapObjectsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetMapObjectsResponse.proto</summary>
+  public static partial class GetMapObjectsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetMapObjectsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetMapObjectsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldE1hcE9iamVj",
+            "dHNSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcxocUE9HT1Byb3Rvcy9NYXAvTWFwQ2VsbC5wcm90bxolUE9HT1Byb3Rv",
+            "cy9NYXAvTWFwT2JqZWN0c1N0YXR1cy5wcm90byJ1ChVHZXRNYXBPYmplY3Rz",
+            "UmVzcG9uc2USKgoJbWFwX2NlbGxzGAEgAygLMhcuUE9HT1Byb3Rvcy5NYXAu",
+            "TWFwQ2VsbBIwCgZzdGF0dXMYAiABKA4yIC5QT0dPUHJvdG9zLk1hcC5NYXBP",
+            "YmplY3RzU3RhdHVzYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Map.MapCellReflection.Descriptor, global::POGOProtos.Map.MapObjectsStatusReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetMapObjectsResponse), global::POGOProtos.Networking.Responses.GetMapObjectsResponse.Parser, new[]{ "MapCells", "Status" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetMapObjectsResponse : pb::IMessage<GetMapObjectsResponse> {
+    private static readonly pb::MessageParser<GetMapObjectsResponse> _parser = new pb::MessageParser<GetMapObjectsResponse>(() => new GetMapObjectsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetMapObjectsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetMapObjectsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsResponse(GetMapObjectsResponse other) : this() {
+      mapCells_ = other.mapCells_.Clone();
+      status_ = other.status_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsResponse Clone() {
+      return new GetMapObjectsResponse(this);
+    }
+
+    /// <summary>Field number for the "map_cells" field.</summary>
+    public const int MapCellsFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.MapCell> _repeated_mapCells_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Map.MapCell.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.MapCell> mapCells_ = new pbc::RepeatedField<global::POGOProtos.Map.MapCell>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.MapCell> MapCells {
+      get { return mapCells_; }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 2;
+    private global::POGOProtos.Map.MapObjectsStatus status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.MapObjectsStatus Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetMapObjectsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetMapObjectsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!mapCells_.Equals(other.mapCells_)) return false;
+      if (Status != other.Status) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= mapCells_.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      mapCells_.WriteTo(output, _repeated_mapCells_codec);
+      if (Status != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Status);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += mapCells_.CalculateSize(_repeated_mapCells_codec);
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetMapObjectsResponse other) {
+      if (other == null) {
+        return;
+      }
+      mapCells_.Add(other.mapCells_);
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            mapCells_.AddEntriesFrom(input, _repeated_mapCells_codec);
+            break;
+          }
+          case 16: {
+            status_ = (global::POGOProtos.Map.MapObjectsStatus) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetPlayerProfileResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetPlayerProfileResponse.cs
new file mode 100644
index 0000000..bcdc77d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetPlayerProfileResponse.cs
@@ -0,0 +1,224 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetPlayerProfileResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetPlayerProfileResponse.proto</summary>
+  public static partial class GetPlayerProfileResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetPlayerProfileResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetPlayerProfileResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldFBsYXllclBy",
+            "b2ZpbGVSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "c3BvbnNlcxohUE9HT1Byb3Rvcy9EYXRhL1BsYXllckJhZGdlLnByb3RvItAB",
+            "ChhHZXRQbGF5ZXJQcm9maWxlUmVzcG9uc2USUAoGcmVzdWx0GAEgASgOMkAu",
+            "UE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5HZXRQbGF5ZXJQcm9m",
+            "aWxlUmVzcG9uc2UuUmVzdWx0EhIKCnN0YXJ0X3RpbWUYAiABKAMSLAoGYmFk",
+            "Z2VzGAMgAygLMhwuUE9HT1Byb3Rvcy5EYXRhLlBsYXllckJhZGdlIiAKBlJl",
+            "c3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PlayerBadgeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetPlayerProfileResponse), global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Parser, new[]{ "Result", "StartTime", "Badges" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetPlayerProfileResponse : pb::IMessage<GetPlayerProfileResponse> {
+    private static readonly pb::MessageParser<GetPlayerProfileResponse> _parser = new pb::MessageParser<GetPlayerProfileResponse>(() => new GetPlayerProfileResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerProfileResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetPlayerProfileResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileResponse(GetPlayerProfileResponse other) : this() {
+      result_ = other.result_;
+      startTime_ = other.startTime_;
+      badges_ = other.badges_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileResponse Clone() {
+      return new GetPlayerProfileResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "start_time" field.</summary>
+    public const int StartTimeFieldNumber = 2;
+    private long startTime_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long StartTime {
+      get { return startTime_; }
+      set {
+        startTime_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "badges" field.</summary>
+    public const int BadgesFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.PlayerBadge> _repeated_badges_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.PlayerBadge.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.PlayerBadge> badges_ = new pbc::RepeatedField<global::POGOProtos.Data.PlayerBadge>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.PlayerBadge> Badges {
+      get { return badges_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerProfileResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerProfileResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (StartTime != other.StartTime) return false;
+      if(!badges_.Equals(other.badges_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (StartTime != 0L) hash ^= StartTime.GetHashCode();
+      hash ^= badges_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (StartTime != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(StartTime);
+      }
+      badges_.WriteTo(output, _repeated_badges_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (StartTime != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(StartTime);
+      }
+      size += badges_.CalculateSize(_repeated_badges_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerProfileResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.StartTime != 0L) {
+        StartTime = other.StartTime;
+      }
+      badges_.Add(other.badges_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            StartTime = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            badges_.AddEntriesFrom(input, _repeated_badges_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the GetPlayerProfileResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetPlayerResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetPlayerResponse.cs
new file mode 100644
index 0000000..aafb322
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetPlayerResponse.cs
@@ -0,0 +1,195 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetPlayerResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetPlayerResponse.proto</summary>
+  public static partial class GetPlayerResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetPlayerResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetPlayerResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldFBsYXllclJl",
+            "c3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2Vz",
+            "GiBQT0dPUHJvdG9zL0RhdGEvUGxheWVyRGF0YS5wcm90byJWChFHZXRQbGF5",
+            "ZXJSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEjAKC3BsYXllcl9kYXRhGAIg",
+            "ASgLMhsuUE9HT1Byb3Rvcy5EYXRhLlBsYXllckRhdGFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PlayerDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetPlayerResponse), global::POGOProtos.Networking.Responses.GetPlayerResponse.Parser, new[]{ "Success", "PlayerData" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetPlayerResponse : pb::IMessage<GetPlayerResponse> {
+    private static readonly pb::MessageParser<GetPlayerResponse> _parser = new pb::MessageParser<GetPlayerResponse>(() => new GetPlayerResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetPlayerResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerResponse(GetPlayerResponse other) : this() {
+      success_ = other.success_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerResponse Clone() {
+      return new GetPlayerResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.cs
new file mode 100644
index 0000000..1a0c4bd
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.cs
@@ -0,0 +1,180 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.proto</summary>
+  public static partial class GetSuggestedCodenamesResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/GetSuggestedCodenamesResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GetSuggestedCodenamesResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkNQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0dldFN1Z2dlc3Rl",
+            "ZENvZGVuYW1lc1Jlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVzcG9uc2VzIkMKHUdldFN1Z2dlc3RlZENvZGVuYW1lc1Jlc3BvbnNl",
+            "EhEKCWNvZGVuYW1lcxgBIAMoCRIPCgdzdWNjZXNzGAIgASgIYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetSuggestedCodenamesResponse), global::POGOProtos.Networking.Responses.GetSuggestedCodenamesResponse.Parser, new[]{ "Codenames", "Success" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GetSuggestedCodenamesResponse : pb::IMessage<GetSuggestedCodenamesResponse> {
+    private static readonly pb::MessageParser<GetSuggestedCodenamesResponse> _parser = new pb::MessageParser<GetSuggestedCodenamesResponse>(() => new GetSuggestedCodenamesResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetSuggestedCodenamesResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.GetSuggestedCodenamesResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesResponse(GetSuggestedCodenamesResponse other) : this() {
+      codenames_ = other.codenames_.Clone();
+      success_ = other.success_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesResponse Clone() {
+      return new GetSuggestedCodenamesResponse(this);
+    }
+
+    /// <summary>Field number for the "codenames" field.</summary>
+    public const int CodenamesFieldNumber = 1;
+    private static readonly pb::FieldCodec<string> _repeated_codenames_codec
+        = pb::FieldCodec.ForString(10);
+    private readonly pbc::RepeatedField<string> codenames_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> Codenames {
+      get { return codenames_; }
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 2;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetSuggestedCodenamesResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetSuggestedCodenamesResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!codenames_.Equals(other.codenames_)) return false;
+      if (Success != other.Success) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= codenames_.GetHashCode();
+      if (Success != false) hash ^= Success.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      codenames_.WriteTo(output, _repeated_codenames_codec);
+      if (Success != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(Success);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += codenames_.CalculateSize(_repeated_codenames_codec);
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetSuggestedCodenamesResponse other) {
+      if (other == null) {
+        return;
+      }
+      codenames_.Add(other.codenames_);
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            codenames_.AddEntriesFrom(input, _repeated_codenames_codec);
+            break;
+          }
+          case 16: {
+            Success = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/IncenseEncounterResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/IncenseEncounterResponse.cs
new file mode 100644
index 0000000..33d48df
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/IncenseEncounterResponse.cs
@@ -0,0 +1,251 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/IncenseEncounterResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/IncenseEncounterResponse.proto</summary>
+  public static partial class IncenseEncounterResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/IncenseEncounterResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static IncenseEncounterResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj5QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0luY2Vuc2VFbmNv",
+            "dW50ZXJSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "c3BvbnNlcxohUE9HT1Byb3Rvcy9EYXRhL1Bva2Vtb25EYXRhLnByb3RvGjBQ",
+            "T0dPUHJvdG9zL0RhdGEvQ2FwdHVyZS9DYXB0dXJlUHJvYmFiaWxpdHkucHJv",
+            "dG8i9AIKGEluY2Vuc2VFbmNvdW50ZXJSZXNwb25zZRJQCgZyZXN1bHQYASAB",
+            "KA4yQC5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkluY2Vuc2VF",
+            "bmNvdW50ZXJSZXNwb25zZS5SZXN1bHQSMgoMcG9rZW1vbl9kYXRhGAIgASgL",
+            "MhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEkgKE2NhcHR1cmVfcHJv",
+            "YmFiaWxpdHkYAyABKAsyKy5QT0dPUHJvdG9zLkRhdGEuQ2FwdHVyZS5DYXB0",
+            "dXJlUHJvYmFiaWxpdHkihwEKBlJlc3VsdBIdChlJTkNFTlNFX0VOQ09VTlRF",
+            "Ul9VTktOT1dOEAASHQoZSU5DRU5TRV9FTkNPVU5URVJfU1VDQ0VTUxABEiMK",
+            "H0lOQ0VOU0VfRU5DT1VOVEVSX05PVF9BVkFJTEFCTEUQAhIaChZQT0tFTU9O",
+            "X0lOVkVOVE9SWV9GVUxMEANiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, global::POGOProtos.Data.Capture.CaptureProbabilityReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.IncenseEncounterResponse), global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Parser, new[]{ "Result", "PokemonData", "CaptureProbability" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class IncenseEncounterResponse : pb::IMessage<IncenseEncounterResponse> {
+    private static readonly pb::MessageParser<IncenseEncounterResponse> _parser = new pb::MessageParser<IncenseEncounterResponse>(() => new IncenseEncounterResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IncenseEncounterResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.IncenseEncounterResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterResponse(IncenseEncounterResponse other) : this() {
+      result_ = other.result_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterResponse Clone() {
+      return new IncenseEncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbabilityFieldNumber = 3;
+    private global::POGOProtos.Data.Capture.CaptureProbability captureProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureProbability CaptureProbability {
+      get { return captureProbability_; }
+      set {
+        captureProbability_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IncenseEncounterResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IncenseEncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(CaptureProbability, other.CaptureProbability)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IncenseEncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.captureProbability_ != null) {
+        if (captureProbability_ == null) {
+          captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+        }
+        CaptureProbability.MergeFrom(other.CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 26: {
+            if (captureProbability_ == null) {
+              captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+            }
+            input.ReadMessage(captureProbability_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the IncenseEncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("INCENSE_ENCOUNTER_UNKNOWN")] IncenseEncounterUnknown = 0,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_SUCCESS")] IncenseEncounterSuccess = 1,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_NOT_AVAILABLE")] IncenseEncounterNotAvailable = 2,
+        [pbr::OriginalName("POKEMON_INVENTORY_FULL")] PokemonInventoryFull = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/LevelUpRewardsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/LevelUpRewardsResponse.cs
new file mode 100644
index 0000000..3a1e6c1
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/LevelUpRewardsResponse.cs
@@ -0,0 +1,221 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/LevelUpRewardsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/LevelUpRewardsResponse.proto</summary>
+  public static partial class LevelUpRewardsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/LevelUpRewardsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static LevelUpRewardsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL0xldmVsVXBSZXdh",
+            "cmRzUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMaJlBPR09Qcm90b3MvSW52ZW50b3J5L0l0ZW0vSXRlbUlkLnByb3Rv",
+            "GilQT0dPUHJvdG9zL0ludmVudG9yeS9JdGVtL0l0ZW1Bd2FyZC5wcm90byKX",
+            "AgoWTGV2ZWxVcFJld2FyZHNSZXNwb25zZRJOCgZyZXN1bHQYASABKA4yPi5Q",
+            "T0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkxldmVsVXBSZXdhcmRz",
+            "UmVzcG9uc2UuUmVzdWx0EjsKDWl0ZW1zX2F3YXJkZWQYAiADKAsyJC5QT0dP",
+            "UHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1Bd2FyZBI5Cg5pdGVtc191bmxv",
+            "Y2tlZBgEIAMoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlk",
+            "IjUKBlJlc3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQARITCg9BV0FSREVE",
+            "X0FMUkVBRFkQAmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemAwardReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.LevelUpRewardsResponse), global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Parser, new[]{ "Result", "ItemsAwarded", "ItemsUnlocked" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class LevelUpRewardsResponse : pb::IMessage<LevelUpRewardsResponse> {
+    private static readonly pb::MessageParser<LevelUpRewardsResponse> _parser = new pb::MessageParser<LevelUpRewardsResponse>(() => new LevelUpRewardsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<LevelUpRewardsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.LevelUpRewardsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsResponse(LevelUpRewardsResponse other) : this() {
+      result_ = other.result_;
+      itemsAwarded_ = other.itemsAwarded_.Clone();
+      itemsUnlocked_ = other.itemsUnlocked_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsResponse Clone() {
+      return new LevelUpRewardsResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "items_awarded" field.</summary>
+    public const int ItemsAwardedFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemAward> _repeated_itemsAwarded_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Inventory.Item.ItemAward.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> itemsAwarded_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> ItemsAwarded {
+      get { return itemsAwarded_; }
+    }
+
+    /// <summary>Field number for the "items_unlocked" field.</summary>
+    public const int ItemsUnlockedFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemId> _repeated_itemsUnlocked_codec
+        = pb::FieldCodec.ForEnum(34, x => (int) x, x => (global::POGOProtos.Inventory.Item.ItemId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> itemsUnlocked_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> ItemsUnlocked {
+      get { return itemsUnlocked_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as LevelUpRewardsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(LevelUpRewardsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!itemsAwarded_.Equals(other.itemsAwarded_)) return false;
+      if(!itemsUnlocked_.Equals(other.itemsUnlocked_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= itemsAwarded_.GetHashCode();
+      hash ^= itemsUnlocked_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      itemsAwarded_.WriteTo(output, _repeated_itemsAwarded_codec);
+      itemsUnlocked_.WriteTo(output, _repeated_itemsUnlocked_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += itemsAwarded_.CalculateSize(_repeated_itemsAwarded_codec);
+      size += itemsUnlocked_.CalculateSize(_repeated_itemsUnlocked_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(LevelUpRewardsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      itemsAwarded_.Add(other.itemsAwarded_);
+      itemsUnlocked_.Add(other.itemsUnlocked_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            itemsAwarded_.AddEntriesFrom(input, _repeated_itemsAwarded_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            itemsUnlocked_.AddEntriesFrom(input, _repeated_itemsUnlocked_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the LevelUpRewardsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("AWARDED_ALREADY")] AwardedAlready = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.cs
new file mode 100644
index 0000000..8b4f73d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.cs
@@ -0,0 +1,196 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.proto</summary>
+  public static partial class MarkTutorialCompleteResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/MarkTutorialCompleteResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MarkTutorialCompleteResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL01hcmtUdXRvcmlh",
+            "bENvbXBsZXRlUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXNwb25zZXMaIFBPR09Qcm90b3MvRGF0YS9QbGF5ZXJEYXRhLnByb3Rv",
+            "ImEKHE1hcmtUdXRvcmlhbENvbXBsZXRlUmVzcG9uc2USDwoHc3VjY2VzcxgB",
+            "IAEoCBIwCgtwbGF5ZXJfZGF0YRgCIAEoCzIbLlBPR09Qcm90b3MuRGF0YS5Q",
+            "bGF5ZXJEYXRhYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PlayerDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.MarkTutorialCompleteResponse), global::POGOProtos.Networking.Responses.MarkTutorialCompleteResponse.Parser, new[]{ "Success", "PlayerData" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MarkTutorialCompleteResponse : pb::IMessage<MarkTutorialCompleteResponse> {
+    private static readonly pb::MessageParser<MarkTutorialCompleteResponse> _parser = new pb::MessageParser<MarkTutorialCompleteResponse>(() => new MarkTutorialCompleteResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MarkTutorialCompleteResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.MarkTutorialCompleteResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteResponse(MarkTutorialCompleteResponse other) : this() {
+      success_ = other.success_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteResponse Clone() {
+      return new MarkTutorialCompleteResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MarkTutorialCompleteResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MarkTutorialCompleteResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MarkTutorialCompleteResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/NicknamePokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/NicknamePokemonResponse.cs
new file mode 100644
index 0000000..fe208f4
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/NicknamePokemonResponse.cs
@@ -0,0 +1,179 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/NicknamePokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/NicknamePokemonResponse.proto</summary>
+  public static partial class NicknamePokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/NicknamePokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static NicknamePokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj1QT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL05pY2tuYW1lUG9r",
+            "ZW1vblJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVz",
+            "cG9uc2VzIt8BChdOaWNrbmFtZVBva2Vtb25SZXNwb25zZRJPCgZyZXN1bHQY",
+            "ASABKA4yPy5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLk5pY2tu",
+            "YW1lUG9rZW1vblJlc3BvbnNlLlJlc3VsdCJzCgZSZXN1bHQSCQoFVU5TRVQQ",
+            "ABILCgdTVUNDRVNTEAESGgoWRVJST1JfSU5WQUxJRF9OSUNLTkFNRRACEhsK",
+            "F0VSUk9SX1BPS0VNT05fTk9UX0ZPVU5EEAMSGAoURVJST1JfUE9LRU1PTl9J",
+            "U19FR0cQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.NicknamePokemonResponse), global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Parser, new[]{ "Result" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class NicknamePokemonResponse : pb::IMessage<NicknamePokemonResponse> {
+    private static readonly pb::MessageParser<NicknamePokemonResponse> _parser = new pb::MessageParser<NicknamePokemonResponse>(() => new NicknamePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<NicknamePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.NicknamePokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonResponse(NicknamePokemonResponse other) : this() {
+      result_ = other.result_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonResponse Clone() {
+      return new NicknamePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as NicknamePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(NicknamePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(NicknamePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the NicknamePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_NICKNAME")] ErrorInvalidNickname = 2,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FOUND")] ErrorPokemonNotFound = 3,
+        [pbr::OriginalName("ERROR_POKEMON_IS_EGG")] ErrorPokemonIsEgg = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/POGOProtosNetworkingResponses.cs b/PokemonGo/POGOProtos/Networking/Responses/POGOProtosNetworkingResponses.cs
new file mode 100644
index 0000000..06683e7
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/POGOProtosNetworkingResponses.cs
@@ -0,0 +1,10739 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Networking.Responses.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Networking.Responses.proto</summary>
+  public static partial class POGOProtosNetworkingResponsesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Networking.Responses.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosNetworkingResponsesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLnByb3RvEh9QT0dP",
+            "UHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzGhpQT0dPUHJvdG9zLkludmVu",
+            "dG9yeS5wcm90bxoVUE9HT1Byb3Rvcy5EYXRhLnByb3RvGh1QT0dPUHJvdG9z",
+            "LkRhdGEuQ2FwdHVyZS5wcm90bxogUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0",
+            "ZXIucHJvdG8aFFBPR09Qcm90b3MuTWFwLnByb3RvGhxQT0dPUHJvdG9zLkRh",
+            "dGEuQmF0dGxlLnByb3RvGhZQT0dPUHJvdG9zLkVudW1zLnByb3RvGhxQT0dP",
+            "UHJvdG9zLkRhdGEuUGxheWVyLnByb3RvGhlQT0dPUHJvdG9zLkRhdGEuR3lt",
+            "LnByb3RvGh9QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLnByb3RvGhxQT0dP",
+            "UHJvdG9zLk1hcC5Qb2tlbW9uLnByb3RvGhlQT0dPUHJvdG9zLk1hcC5Gb3J0",
+            "LnByb3RvGhpQT0dPUHJvdG9zLkRhdGEuTG9ncy5wcm90bxoZUE9HT1Byb3Rv",
+            "cy5TZXR0aW5ncy5wcm90byLJAQoaU2V0RmF2b3JpdGVQb2tlbW9uUmVzcG9u",
+            "c2USUgoGcmVzdWx0GAEgASgOMkIuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "c3BvbnNlcy5TZXRGYXZvcml0ZVBva2Vtb25SZXNwb25zZS5SZXN1bHQiVwoG",
+            "UmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhsKF0VSUk9SX1BPS0VN",
+            "T05fTk9UX0ZPVU5EEAISGAoURVJST1JfUE9LRU1PTl9JU19FR0cQAyK+AgoW",
+            "VXNlSXRlbVhwQm9vc3RSZXNwb25zZRJOCgZyZXN1bHQYASABKA4yPi5QT0dP",
+            "UHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlVzZUl0ZW1YcEJvb3N0UmVz",
+            "cG9uc2UuUmVzdWx0EjkKDWFwcGxpZWRfaXRlbXMYAiABKAsyIi5QT0dPUHJv",
+            "dG9zLkludmVudG9yeS5BcHBsaWVkSXRlbXMimAEKBlJlc3VsdBIJCgVVTlNF",
+            "VBAAEgsKB1NVQ0NFU1MQARIbChdFUlJPUl9JTlZBTElEX0lURU1fVFlQRRAC",
+            "EiEKHUVSUk9SX1hQX0JPT1NUX0FMUkVBRFlfQUNUSVZFEAMSHAoYRVJST1Jf",
+            "Tk9fSVRFTVNfUkVNQUlOSU5HEAQSGAoURVJST1JfTE9DQVRJT05fVU5TRVQQ",
+            "BSLsAQojRG93bmxvYWRSZW1vdGVDb25maWdWZXJzaW9uUmVzcG9uc2USWwoG",
+            "cmVzdWx0GAEgASgOMksuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNl",
+            "cy5Eb3dubG9hZFJlbW90ZUNvbmZpZ1ZlcnNpb25SZXNwb25zZS5SZXN1bHQS",
+            "IwobaXRlbV90ZW1wbGF0ZXNfdGltZXN0YW1wX21zGAIgASgEEiEKGWFzc2V0",
+            "X2RpZ2VzdF90aW1lc3RhbXBfbXMYAyABKAQiIAoGUmVzdWx0EgkKBVVOU0VU",
+            "EAASCwoHU1VDQ0VTUxABImYKFEdldEludmVudG9yeVJlc3BvbnNlEg8KB3N1",
+            "Y2Nlc3MYASABKAgSPQoPaW52ZW50b3J5X2RlbHRhGAIgASgLMiQuUE9HT1By",
+            "b3Rvcy5JbnZlbnRvcnkuSW52ZW50b3J5RGVsdGEirQIKIUVuY291bnRlclR1",
+            "dG9yaWFsQ29tcGxldGVSZXNwb25zZRJZCgZyZXN1bHQYASABKA4ySS5QT0dP",
+            "UHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkVuY291bnRlclR1dG9yaWFs",
+            "Q29tcGxldGVSZXNwb25zZS5SZXN1bHQSMgoMcG9rZW1vbl9kYXRhGAIgASgL",
+            "MhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEjwKDWNhcHR1cmVfYXdh",
+            "cmQYAyABKAsyJS5QT0dPUHJvdG9zLkRhdGEuQ2FwdHVyZS5DYXB0dXJlQXdh",
+            "cmQiOwoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhkKFUVSUk9S",
+            "X0lOVkFMSURfUE9LRU1PThACIuEBChVVc2VJdGVtUG90aW9uUmVzcG9uc2US",
+            "TQoGcmVzdWx0GAEgASgOMj0uUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcy5Vc2VJdGVtUG90aW9uUmVzcG9uc2UuUmVzdWx0Eg8KB3N0YW1pbmEY",
+            "AiABKAUiaAoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhQKEEVS",
+            "Uk9SX05PX1BPS0VNT04QAhIUChBFUlJPUl9DQU5OT1RfVVNFEAMSGgoWRVJS",
+            "T1JfREVQTE9ZRURfVE9fRk9SVBAEIvAJCh1Eb3dubG9hZEl0ZW1UZW1wbGF0",
+            "ZXNSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEmMKDml0ZW1fdGVtcGxhdGVz",
+            "GAIgAygLMksuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5Eb3du",
+            "bG9hZEl0ZW1UZW1wbGF0ZXNSZXNwb25zZS5JdGVtVGVtcGxhdGUSFAoMdGlt",
+            "ZXN0YW1wX21zGAMgASgEGsIICgxJdGVtVGVtcGxhdGUSEwoLdGVtcGxhdGVf",
+            "aWQYASABKAkSRQoQcG9rZW1vbl9zZXR0aW5ncxgCIAEoCzIrLlBPR09Qcm90",
+            "b3MuU2V0dGluZ3MuTWFzdGVyLlBva2Vtb25TZXR0aW5ncxI/Cg1pdGVtX3Nl",
+            "dHRpbmdzGAMgASgLMiguUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuSXRl",
+            "bVNldHRpbmdzEj8KDW1vdmVfc2V0dGluZ3MYBCABKAsyKC5QT0dPUHJvdG9z",
+            "LlNldHRpbmdzLk1hc3Rlci5Nb3ZlU2V0dGluZ3MSUAoWbW92ZV9zZXF1ZW5j",
+            "ZV9zZXR0aW5ncxgFIAEoCzIwLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVy",
+            "Lk1vdmVTZXF1ZW5jZVNldHRpbmdzEkkKDnR5cGVfZWZmZWN0aXZlGAggASgL",
+            "MjEuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuVHlwZUVmZmVjdGl2ZVNl",
+            "dHRpbmdzEkEKDmJhZGdlX3NldHRpbmdzGAogASgLMikuUE9HT1Byb3Rvcy5T",
+            "ZXR0aW5ncy5NYXN0ZXIuQmFkZ2VTZXR0aW5ncxI6CgZjYW1lcmEYCyABKAsy",
+            "Ki5QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5DYW1lcmFTZXR0aW5ncxJF",
+            "CgxwbGF5ZXJfbGV2ZWwYDCABKAsyLy5QT0dPUHJvdG9zLlNldHRpbmdzLk1h",
+            "c3Rlci5QbGF5ZXJMZXZlbFNldHRpbmdzEj8KCWd5bV9sZXZlbBgNIAEoCzIs",
+            "LlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkd5bUxldmVsU2V0dGluZ3MS",
+            "RgoPYmF0dGxlX3NldHRpbmdzGA4gASgLMi0uUE9HT1Byb3Rvcy5TZXR0aW5n",
+            "cy5NYXN0ZXIuR3ltQmF0dGxlU2V0dGluZ3MSSQoSZW5jb3VudGVyX3NldHRp",
+            "bmdzGA8gASgLMi0uUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuRW5jb3Vu",
+            "dGVyU2V0dGluZ3MSRAoQaWFwX2l0ZW1fZGlzcGxheRgQIAEoCzIqLlBPR09Q",
+            "cm90b3MuU2V0dGluZ3MuTWFzdGVyLklhcEl0ZW1EaXNwbGF5Ej0KDGlhcF9z",
+            "ZXR0aW5ncxgRIAEoCzInLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLklh",
+            "cFNldHRpbmdzEkwKEHBva2Vtb25fdXBncmFkZXMYEiABKAsyMi5QT0dPUHJv",
+            "dG9zLlNldHRpbmdzLk1hc3Rlci5Qb2tlbW9uVXBncmFkZVNldHRpbmdzEkoK",
+            "D2VxdWlwcGVkX2JhZGdlcxgTIAEoCzIxLlBPR09Qcm90b3MuU2V0dGluZ3Mu",
+            "TWFzdGVyLkVxdWlwcGVkQmFkZ2VTZXR0aW5ncyJTChdHZXREb3dubG9hZFVy",
+            "bHNSZXNwb25zZRI4Cg1kb3dubG9hZF91cmxzGAEgAygLMiEuUE9HT1Byb3Rv",
+            "cy5EYXRhLkRvd25sb2FkVXJsRW50cnkiqwEKGUNvbGxlY3REYWlseUJvbnVz",
+            "UmVzcG9uc2USUQoGcmVzdWx0GAEgASgOMkEuUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlc3BvbnNlcy5Db2xsZWN0RGFpbHlCb251c1Jlc3BvbnNlLlJlc3Vs",
+            "dCI7CgZSZXN1bHQSCQoFVU5TRVQQABILCgdTVUNDRVNTEAESCwoHRkFJTFVS",
+            "RRACEgwKCFRPT19TT09OEAMi6gIKFURpc2tFbmNvdW50ZXJSZXNwb25zZRJN",
+            "CgZyZXN1bHQYASABKA4yPS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9u",
+            "c2VzLkRpc2tFbmNvdW50ZXJSZXNwb25zZS5SZXN1bHQSMgoMcG9rZW1vbl9k",
+            "YXRhGAIgASgLMhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEkgKE2Nh",
+            "cHR1cmVfcHJvYmFiaWxpdHkYAyABKAsyKy5QT0dPUHJvdG9zLkRhdGEuQ2Fw",
+            "dHVyZS5DYXB0dXJlUHJvYmFiaWxpdHkigwEKBlJlc3VsdBILCgdVTktOT1dO",
+            "EAASCwoHU1VDQ0VTUxABEhEKDU5PVF9BVkFJTEFCTEUQAhIQCgxOT1RfSU5f",
+            "UkFOR0UQAxIeChpFTkNPVU5URVJfQUxSRUFEWV9GSU5JU0hFRBAEEhoKFlBP",
+            "S0VNT05fSU5WRU5UT1JZX0ZVTEwQBSLQAQoYR2V0UGxheWVyUHJvZmlsZVJl",
+            "c3BvbnNlElAKBnJlc3VsdBgBIAEoDjJALlBPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXNwb25zZXMuR2V0UGxheWVyUHJvZmlsZVJlc3BvbnNlLlJlc3VsdBIS",
+            "CgpzdGFydF90aW1lGAIgASgDEiwKBmJhZGdlcxgDIAMoCzIcLlBPR09Qcm90",
+            "b3MuRGF0YS5QbGF5ZXJCYWRnZSIgCgZSZXN1bHQSCQoFVU5TRVQQABILCgdT",
+            "VUNDRVNTEAEidQoVR2V0TWFwT2JqZWN0c1Jlc3BvbnNlEioKCW1hcF9jZWxs",
+            "cxgBIAMoCzIXLlBPR09Qcm90b3MuTWFwLk1hcENlbGwSMAoGc3RhdHVzGAIg",
+            "ASgOMiAuUE9HT1Byb3Rvcy5NYXAuTWFwT2JqZWN0c1N0YXR1cyKxAQoWVXNl",
+            "SXRlbUNhcHR1cmVSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEhkKEWl0ZW1f",
+            "Y2FwdHVyZV9tdWx0GAIgASgBEhYKDml0ZW1fZmxlZV9tdWx0GAMgASgBEhUK",
+            "DXN0b3BfbW92ZW1lbnQYBCABKAgSEwoLc3RvcF9hdHRhY2sYBSABKAgSEgoK",
+            "dGFyZ2V0X21heBgGIAEoCBITCgt0YXJnZXRfc2xvdxgHIAEoCCKMAwoRQXR0",
+            "YWNrR3ltUmVzcG9uc2USSQoGcmVzdWx0GAEgASgOMjkuUE9HT1Byb3Rvcy5O",
+            "ZXR3b3JraW5nLlJlc3BvbnNlcy5BdHRhY2tHeW1SZXNwb25zZS5SZXN1bHQS",
+            "NQoKYmF0dGxlX2xvZxgCIAEoCzIhLlBPR09Qcm90b3MuRGF0YS5CYXR0bGUu",
+            "QmF0dGxlTG9nEhEKCWJhdHRsZV9pZBgDIAEoCRJCCg9hY3RpdmVfZGVmZW5k",
+            "ZXIYBCABKAsyKS5QT0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRsZVBva2Vt",
+            "b25JbmZvEkIKD2FjdGl2ZV9hdHRhY2tlchgFIAEoCzIpLlBPR09Qcm90b3Mu",
+            "RGF0YS5CYXR0bGUuQmF0dGxlUG9rZW1vbkluZm8iWgoGUmVzdWx0EgkKBVVO",
+            "U0VUEAASCwoHU1VDQ0VTUxABEiAKHEVSUk9SX0lOVkFMSURfQVRUQUNLX0FD",
+            "VElPTlMQAhIWChJFUlJPUl9OT1RfSU5fUkFOR0UQAyJhChxNYXJrVHV0b3Jp",
+            "YWxDb21wbGV0ZVJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgSMAoLcGxheWVy",
+            "X2RhdGEYAiABKAsyGy5QT0dPUHJvdG9zLkRhdGEuUGxheWVyRGF0YSLRAQoa",
+            "U2V0Q29udGFjdFNldHRpbmdzUmVzcG9uc2USUgoGc3RhdHVzGAEgASgOMkIu",
+            "UE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5TZXRDb250YWN0U2V0",
+            "dGluZ3NSZXNwb25zZS5TdGF0dXMSMAoLcGxheWVyX2RhdGEYAiABKAsyGy5Q",
+            "T0dPUHJvdG9zLkRhdGEuUGxheWVyRGF0YSItCgZTdGF0dXMSCQoFVU5TRVQQ",
+            "ABILCgdTVUNDRVNTEAESCwoHRkFJTFVSRRACIoUDChlHZXRJbmNlbnNlUG9r",
+            "ZW1vblJlc3BvbnNlElEKBnJlc3VsdBgBIAEoDjJBLlBPR09Qcm90b3MuTmV0",
+            "d29ya2luZy5SZXNwb25zZXMuR2V0SW5jZW5zZVBva2Vtb25SZXNwb25zZS5S",
+            "ZXN1bHQSLwoKcG9rZW1vbl9pZBgCIAEoDjIbLlBPR09Qcm90b3MuRW51bXMu",
+            "UG9rZW1vbklkEhAKCGxhdGl0dWRlGAMgASgBEhEKCWxvbmdpdHVkZRgEIAEo",
+            "ARIaChJlbmNvdW50ZXJfbG9jYXRpb24YBSABKAkSFAoMZW5jb3VudGVyX2lk",
+            "GAYgASgGEh4KFmRpc2FwcGVhcl90aW1lc3RhbXBfbXMYByABKAMibQoGUmVz",
+            "dWx0Eh0KGUlOQ0VOU0VfRU5DT1VOVEVSX1VOS05PV04QABIfChtJTkNFTlNF",
+            "X0VOQ09VTlRFUl9BVkFJTEFCTEUQARIjCh9JTkNFTlNFX0VOQ09VTlRFUl9O",
+            "T1RfQVZBSUxBQkxFEAIiVgoRR2V0UGxheWVyUmVzcG9uc2USDwoHc3VjY2Vz",
+            "cxgBIAEoCBIwCgtwbGF5ZXJfZGF0YRgCIAEoCzIbLlBPR09Qcm90b3MuRGF0",
+            "YS5QbGF5ZXJEYXRhIuMBChJFcXVpcEJhZGdlUmVzcG9uc2USSgoGcmVzdWx0",
+            "GAEgASgOMjouUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5FcXVp",
+            "cEJhZGdlUmVzcG9uc2UuUmVzdWx0EjcKCGVxdWlwcGVkGAIgASgLMiUuUE9H",
+            "T1Byb3Rvcy5EYXRhLlBsYXllci5FcXVpcHBlZEJhZGdlIkgKBlJlc3VsdBIJ",
+            "CgVVTlNFVBAAEgsKB1NVQ0NFU1MQARITCg9DT09MRE9XTl9BQ1RJVkUQAhIR",
+            "Cg1OT1RfUVVBTElGSUVEEAMiqAQKGUZvcnREZXBsb3lQb2tlbW9uUmVzcG9u",
+            "c2USUQoGcmVzdWx0GAEgASgOMkEuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJl",
+            "c3BvbnNlcy5Gb3J0RGVwbG95UG9rZW1vblJlc3BvbnNlLlJlc3VsdBJKCgxm",
+            "b3J0X2RldGFpbHMYAiABKAsyNC5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVz",
+            "cG9uc2VzLkZvcnREZXRhaWxzUmVzcG9uc2USMgoMcG9rZW1vbl9kYXRhGAMg",
+            "ASgLMhwuUE9HT1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEjAKCWd5bV9zdGF0",
+            "ZRgEIAEoCzIdLlBPR09Qcm90b3MuRGF0YS5HeW0uR3ltU3RhdGUihQIKBlJl",
+            "c3VsdBIRCg1OT19SRVNVTFRfU0VUEAASCwoHU1VDQ0VTUxABEiUKIUVSUk9S",
+            "X0FMUkVBRFlfSEFTX1BPS0VNT05fT05fRk9SVBACEiEKHUVSUk9SX09QUE9T",
+            "SU5HX1RFQU1fT1dOU19GT1JUEAMSFgoSRVJST1JfRk9SVF9JU19GVUxMEAQS",
+            "FgoSRVJST1JfTk9UX0lOX1JBTkdFEAUSHAoYRVJST1JfUExBWUVSX0hBU19O",
+            "T19URUFNEAYSHQoZRVJST1JfUE9LRU1PTl9OT1RfRlVMTF9IUBAHEiQKIEVS",
+            "Uk9SX1BMQVlFUl9CRUxPV19NSU5JTVVNX0xFVkVMEAgiQwodR2V0U3VnZ2Vz",
+            "dGVkQ29kZW5hbWVzUmVzcG9uc2USEQoJY29kZW5hbWVzGAEgAygJEg8KB3N1",
+            "Y2Nlc3MYAiABKAgiuwMKEkZvcnRTZWFyY2hSZXNwb25zZRJKCgZyZXN1bHQY",
+            "ASABKA4yOi5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkZvcnRT",
+            "ZWFyY2hSZXNwb25zZS5SZXN1bHQSOwoNaXRlbXNfYXdhcmRlZBgCIAMoCzIk",
+            "LlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUF3YXJkEhQKDGdlbXNf",
+            "YXdhcmRlZBgDIAEoBRI2ChBwb2tlbW9uX2RhdGFfZWdnGAQgASgLMhwuUE9H",
+            "T1Byb3Rvcy5EYXRhLlBva2Vtb25EYXRhEhoKEmV4cGVyaWVuY2VfYXdhcmRl",
+            "ZBgFIAEoBRImCh5jb29sZG93bl9jb21wbGV0ZV90aW1lc3RhbXBfbXMYBiAB",
+            "KAMSIgoaY2hhaW5faGFja19zZXF1ZW5jZV9udW1iZXIYByABKAUiZgoGUmVz",
+            "dWx0EhEKDU5PX1JFU1VMVF9TRVQQABILCgdTVUNDRVNTEAESEAoMT1VUX09G",
+            "X1JBTkdFEAISFgoSSU5fQ09PTERPV05fUEVSSU9EEAMSEgoOSU5WRU5UT1JZ",
+            "X0ZVTEwQBCLXAQoRU2V0QXZhdGFyUmVzcG9uc2USSQoGc3RhdHVzGAEgASgO",
+            "MjkuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5TZXRBdmF0YXJS",
+            "ZXNwb25zZS5TdGF0dXMSMAoLcGxheWVyX2RhdGEYAiABKAsyGy5QT0dPUHJv",
+            "dG9zLkRhdGEuUGxheWVyRGF0YSJFCgZTdGF0dXMSCQoFVU5TRVQQABILCgdT",
+            "VUNDRVNTEAESFgoSQVZBVEFSX0FMUkVBRFlfU0VUEAISCwoHRkFJTFVSRRAD",
+            "IrQEChFFbmNvdW50ZXJSZXNwb25zZRI5Cgx3aWxkX3Bva2Vtb24YASABKAsy",
+            "Iy5QT0dPUHJvdG9zLk1hcC5Qb2tlbW9uLldpbGRQb2tlbW9uElEKCmJhY2tn",
+            "cm91bmQYAiABKA4yPS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2Vz",
+            "LkVuY291bnRlclJlc3BvbnNlLkJhY2tncm91bmQSSQoGc3RhdHVzGAMgASgO",
+            "MjkuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5FbmNvdW50ZXJS",
+            "ZXNwb25zZS5TdGF0dXMSSAoTY2FwdHVyZV9wcm9iYWJpbGl0eRgEIAEoCzIr",
+            "LlBPR09Qcm90b3MuRGF0YS5DYXB0dXJlLkNhcHR1cmVQcm9iYWJpbGl0eSIi",
+            "CgpCYWNrZ3JvdW5kEggKBFBBUksQABIKCgZERVNFUlQQASLXAQoGU3RhdHVz",
+            "EhMKD0VOQ09VTlRFUl9FUlJPUhAAEhUKEUVOQ09VTlRFUl9TVUNDRVNTEAES",
+            "FwoTRU5DT1VOVEVSX05PVF9GT1VORBACEhQKEEVOQ09VTlRFUl9DTE9TRUQQ",
+            "AxIaChZFTkNPVU5URVJfUE9LRU1PTl9GTEVEEAQSGgoWRU5DT1VOVEVSX05P",
+            "VF9JTl9SQU5HRRAFEh4KGkVOQ09VTlRFUl9BTFJFQURZX0hBUFBFTkVEEAYS",
+            "GgoWUE9LRU1PTl9JTlZFTlRPUllfRlVMTBAHIuEBChVVc2VJdGVtUmV2aXZl",
+            "UmVzcG9uc2USTQoGcmVzdWx0GAEgASgOMj0uUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlc3BvbnNlcy5Vc2VJdGVtUmV2aXZlUmVzcG9uc2UuUmVzdWx0Eg8K",
+            "B3N0YW1pbmEYAiABKAUiaAoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VT",
+            "UxABEhQKEEVSUk9SX05PX1BPS0VNT04QAhIUChBFUlJPUl9DQU5OT1RfVVNF",
+            "EAMSGgoWRVJST1JfREVQTE9ZRURfVE9fRk9SVBAEIoABChpDaGVja0F3YXJk",
+            "ZWRCYWRnZXNSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEjMKDmF3YXJkZWRf",
+            "YmFkZ2VzGAIgAygOMhsuUE9HT1Byb3Rvcy5FbnVtcy5CYWRnZVR5cGUSHAoU",
+            "YXdhcmRlZF9iYWRnZV9sZXZlbHMYAyADKAUisAIKFUNsYWltQ29kZW5hbWVS",
+            "ZXNwb25zZRIQCghjb2RlbmFtZRgBIAEoCRIUCgx1c2VyX21lc3NhZ2UYAiAB",
+            "KAkSFQoNaXNfYXNzaWduYWJsZRgDIAEoCBJNCgZzdGF0dXMYBCABKA4yPS5Q",
+            "T0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkNsYWltQ29kZW5hbWVS",
+            "ZXNwb25zZS5TdGF0dXMiiAEKBlN0YXR1cxIJCgVVTlNFVBAAEgsKB1NVQ0NF",
+            "U1MQARIaChZDT0RFTkFNRV9OT1RfQVZBSUxBQkxFEAISFgoSQ09ERU5BTUVf",
+            "Tk9UX1ZBTElEEAMSEQoNQ1VSUkVOVF9PV05FUhAEEh8KG0NPREVOQU1FX0NI",
+            "QU5HRV9OT1RfQUxMT1dFRBAFIsQBChJVc2VJdGVtR3ltUmVzcG9uc2USSgoG",
+            "cmVzdWx0GAEgASgOMjouUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNl",
+            "cy5Vc2VJdGVtR3ltUmVzcG9uc2UuUmVzdWx0EhIKCnVwZGF0ZWRfZ3AYAiAB",
+            "KAMiTgoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhQKEEVSUk9S",
+            "X0NBTk5PVF9VU0UQAhIWChJFUlJPUl9OT1RfSU5fUkFOR0UQAyIZChdBZGRG",
+            "b3J0TW9kaWZpZXJSZXNwb25zZSLCAgoeQ2hlY2tDb2RlbmFtZUF2YWlsYWJs",
+            "ZVJlc3BvbnNlEhAKCGNvZGVuYW1lGAEgASgJEhQKDHVzZXJfbWVzc2FnZRgC",
+            "IAEoCRIVCg1pc19hc3NpZ25hYmxlGAMgASgIElYKBnN0YXR1cxgEIAEoDjJG",
+            "LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuQ2hlY2tDb2RlbmFt",
+            "ZUF2YWlsYWJsZVJlc3BvbnNlLlN0YXR1cyKIAQoGU3RhdHVzEgkKBVVOU0VU",
+            "EAASCwoHU1VDQ0VTUxABEhoKFkNPREVOQU1FX05PVF9BVkFJTEFCTEUQAhIW",
+            "ChJDT0RFTkFNRV9OT1RfVkFMSUQQAxIRCg1DVVJSRU5UX09XTkVSEAQSHwob",
+            "Q09ERU5BTUVfQ0hBTkdFX05PVF9BTExPV0VEEAUiHwoMRWNob1Jlc3BvbnNl",
+            "Eg8KB2NvbnRleHQYASABKAkilgEKFFBsYXllclVwZGF0ZVJlc3BvbnNlEjoK",
+            "DXdpbGRfcG9rZW1vbnMYASADKAsyIy5QT0dPUHJvdG9zLk1hcC5Qb2tlbW9u",
+            "LldpbGRQb2tlbW9uEiwKBWZvcnRzGAIgAygLMh0uUE9HT1Byb3Rvcy5NYXAu",
+            "Rm9ydC5Gb3J0RGF0YRIUCgxmb3J0c19uZWFyYnkYAyABKAUiwgIKFlVwZ3Jh",
+            "ZGVQb2tlbW9uUmVzcG9uc2USTgoGcmVzdWx0GAEgASgOMj4uUE9HT1Byb3Rv",
+            "cy5OZXR3b3JraW5nLlJlc3BvbnNlcy5VcGdyYWRlUG9rZW1vblJlc3BvbnNl",
+            "LlJlc3VsdBI2ChB1cGdyYWRlZF9wb2tlbW9uGAIgASgLMhwuUE9HT1Byb3Rv",
+            "cy5EYXRhLlBva2Vtb25EYXRhIp8BCgZSZXN1bHQSCQoFVU5TRVQQABILCgdT",
+            "VUNDRVNTEAESGwoXRVJST1JfUE9LRU1PTl9OT1RfRk9VTkQQAhIgChxFUlJP",
+            "Ul9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTEAMSHwobRVJST1JfVVBHUkFERV9O",
+            "T1RfQVZBSUxBQkxFEAQSHQoZRVJST1JfUE9LRU1PTl9JU19ERVBMT1lFRBAF",
+            "IsECChRDYXRjaFBva2Vtb25SZXNwb25zZRJRCgZzdGF0dXMYASABKA4yQS5Q",
+            "T0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkNhdGNoUG9rZW1vblJl",
+            "c3BvbnNlLkNhdGNoU3RhdHVzEhQKDG1pc3NfcGVyY2VudBgCIAEoARIbChNj",
+            "YXB0dXJlZF9wb2tlbW9uX2lkGAMgASgGEjwKDWNhcHR1cmVfYXdhcmQYBCAB",
+            "KAsyJS5QT0dPUHJvdG9zLkRhdGEuQ2FwdHVyZS5DYXB0dXJlQXdhcmQiZQoL",
+            "Q2F0Y2hTdGF0dXMSDwoLQ0FUQ0hfRVJST1IQABIRCg1DQVRDSF9TVUNDRVNT",
+            "EAESEAoMQ0FUQ0hfRVNDQVBFEAISDgoKQ0FUQ0hfRkxFRRADEhAKDENBVENI",
+            "X01JU1NFRBAEIq8FChZTdGFydEd5bUJhdHRsZVJlc3BvbnNlEk4KBnJlc3Vs",
+            "dBgBIAEoDjI+LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuU3Rh",
+            "cnRHeW1CYXR0bGVSZXNwb25zZS5SZXN1bHQSIQoZYmF0dGxlX3N0YXJ0X3Rp",
+            "bWVzdGFtcF9tcxgCIAEoAxIfChdiYXR0bGVfZW5kX3RpbWVzdGFtcF9tcxgD",
+            "IAEoAxIRCgliYXR0bGVfaWQYBCABKAkSOwoIZGVmZW5kZXIYBSABKAsyKS5Q",
+            "T0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRsZVBhcnRpY2lwYW50EjUKCmJh",
+            "dHRsZV9sb2cYBiABKAsyIS5QT0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRs",
+            "ZUxvZyL5AgoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhcKE0VS",
+            "Uk9SX0dZTV9OT1RfRk9VTkQQAhIVChFFUlJPUl9HWU1fTkVVVFJBTBADEhgK",
+            "FEVSUk9SX0dZTV9XUk9OR19URUFNEAQSEwoPRVJST1JfR1lNX0VNUFRZEAUS",
+            "GgoWRVJST1JfSU5WQUxJRF9ERUZFTkRFUhAGEikKJUVSUk9SX1RSQUlOSU5H",
+            "X0lOVkFMSURfQVRUQUNLRVJfQ09VTlQQBxIdChlFUlJPUl9BTExfUE9LRU1P",
+            "Tl9GQUlOVEVEEAgSGgoWRVJST1JfVE9PX01BTllfQkFUVExFUxAJEhoKFkVS",
+            "Uk9SX1RPT19NQU5ZX1BMQVlFUlMQChIcChhFUlJPUl9HWU1fQkFUVExFX0xP",
+            "Q0tPVVQQCxIkCiBFUlJPUl9QTEFZRVJfQkVMT1dfTUlOSU1VTV9MRVZFTBAM",
+            "EhYKEkVSUk9SX05PVF9JTl9SQU5HRRANIpcCChZMZXZlbFVwUmV3YXJkc1Jl",
+            "c3BvbnNlEk4KBnJlc3VsdBgBIAEoDjI+LlBPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXNwb25zZXMuTGV2ZWxVcFJld2FyZHNSZXNwb25zZS5SZXN1bHQSOwoN",
+            "aXRlbXNfYXdhcmRlZBgCIAMoCzIkLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0",
+            "ZW0uSXRlbUF3YXJkEjkKDml0ZW1zX3VubG9ja2VkGAQgAygOMiEuUE9HT1By",
+            "b3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQiNQoGUmVzdWx0EgkKBVVOU0VU",
+            "EAASCwoHU1VDQ0VTUxABEhMKD0FXQVJERURfQUxSRUFEWRACIvwCChNGb3J0",
+            "RGV0YWlsc1Jlc3BvbnNlEg8KB2ZvcnRfaWQYASABKAkSLwoKdGVhbV9jb2xv",
+            "chgCIAEoDjIbLlBPR09Qcm90b3MuRW51bXMuVGVhbUNvbG9yEjIKDHBva2Vt",
+            "b25fZGF0YRgDIAEoCzIcLlBPR09Qcm90b3MuRGF0YS5Qb2tlbW9uRGF0YRIM",
+            "CgRuYW1lGAQgASgJEhIKCmltYWdlX3VybHMYBSADKAkSCgoCZnAYBiABKAUS",
+            "DwoHc3RhbWluYRgHIAEoBRITCgttYXhfc3RhbWluYRgIIAEoBRIrCgR0eXBl",
+            "GAkgASgOMh0uUE9HT1Byb3Rvcy5NYXAuRm9ydC5Gb3J0VHlwZRIQCghsYXRp",
+            "dHVkZRgKIAEoARIRCglsb25naXR1ZGUYCyABKAESEwoLZGVzY3JpcHRpb24Y",
+            "DCABKAkSNAoJbW9kaWZpZXJzGA0gAygLMiEuUE9HT1Byb3Rvcy5NYXAuRm9y",
+            "dC5Gb3J0TW9kaWZpZXIilwIKIUNvbGxlY3REYWlseURlZmVuZGVyQm9udXNS",
+            "ZXNwb25zZRJZCgZyZXN1bHQYASABKA4ySS5QT0dPUHJvdG9zLk5ldHdvcmtp",
+            "bmcuUmVzcG9uc2VzLkNvbGxlY3REYWlseURlZmVuZGVyQm9udXNSZXNwb25z",
+            "ZS5SZXN1bHQSFQoNY3VycmVuY3lfdHlwZRgCIAMoCRIYChBjdXJyZW5jeV9h",
+            "d2FyZGVkGAMgAygFEhcKD2RlZmVuZGVyc19jb3VudBgEIAEoBSJNCgZSZXN1",
+            "bHQSCQoFVU5TRVQQABILCgdTVUNDRVNTEAESCwoHRkFJTFVSRRACEgwKCFRP",
+            "T19TT09OEAMSEAoMTk9fREVGRU5ERVJTEAQixQEKFlNmaWRhQWN0aW9uTG9n",
+            "UmVzcG9uc2USTgoGcmVzdWx0GAEgASgOMj4uUE9HT1Byb3Rvcy5OZXR3b3Jr",
+            "aW5nLlJlc3BvbnNlcy5TZmlkYUFjdGlvbkxvZ1Jlc3BvbnNlLlJlc3VsdBI5",
+            "Cgtsb2dfZW50cmllcxgCIAMoCzIkLlBPR09Qcm90b3MuRGF0YS5Mb2dzLkFj",
+            "dGlvbkxvZ0VudHJ5IiAKBlJlc3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQ",
+            "ASLrAQocUmVjeWNsZUludmVudG9yeUl0ZW1SZXNwb25zZRJUCgZyZXN1bHQY",
+            "ASABKA4yRC5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlJlY3lj",
+            "bGVJbnZlbnRvcnlJdGVtUmVzcG9uc2UuUmVzdWx0EhEKCW5ld19jb3VudBgC",
+            "IAEoBSJiCgZSZXN1bHQSCQoFVU5TRVQQABILCgdTVUNDRVNTEAESGwoXRVJS",
+            "T1JfTk9UX0VOT1VHSF9DT1BJRVMQAhIjCh9FUlJPUl9DQU5OT1RfUkVDWUNM",
+            "RV9JTkNVQkFUT1JTEAMiYQoWR2V0QXNzZXREaWdlc3RSZXNwb25zZRIxCgZk",
+            "aWdlc3QYASADKAsyIS5QT0dPUHJvdG9zLkRhdGEuQXNzZXREaWdlc3RFbnRy",
+            "eRIUCgx0aW1lc3RhbXBfbXMYAiABKAQijgEKFkdldEhhdGNoZWRFZ2dzUmVz",
+            "cG9uc2USDwoHc3VjY2VzcxgBIAEoCBIWCgpwb2tlbW9uX2lkGAIgAygGQgIQ",
+            "ARIaChJleHBlcmllbmNlX2F3YXJkZWQYAyADKAUSFQoNY2FuZHlfYXdhcmRl",
+            "ZBgEIAMoBRIYChBzdGFyZHVzdF9hd2FyZGVkGAUgAygFIm4KGERvd25sb2Fk",
+            "U2V0dGluZ3NSZXNwb25zZRINCgVlcnJvchgBIAEoCRIMCgRoYXNoGAIgASgJ",
+            "EjUKCHNldHRpbmdzGAMgASgLMiMuUE9HT1Byb3Rvcy5TZXR0aW5ncy5HbG9i",
+            "YWxTZXR0aW5ncyLdAQoVU2V0UGxheWVyVGVhbVJlc3BvbnNlEk0KBnN0YXR1",
+            "cxgBIAEoDjI9LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuU2V0",
+            "UGxheWVyVGVhbVJlc3BvbnNlLlN0YXR1cxIwCgtwbGF5ZXJfZGF0YRgCIAEo",
+            "CzIbLlBPR09Qcm90b3MuRGF0YS5QbGF5ZXJEYXRhIkMKBlN0YXR1cxIJCgVV",
+            "TlNFVBAAEgsKB1NVQ0NFU1MQARIUChBURUFNX0FMUkVBRFlfU0VUEAISCwoH",
+            "RkFJTFVSRRADIvQCChhJbmNlbnNlRW5jb3VudGVyUmVzcG9uc2USUAoGcmVz",
+            "dWx0GAEgASgOMkAuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5J",
+            "bmNlbnNlRW5jb3VudGVyUmVzcG9uc2UuUmVzdWx0EjIKDHBva2Vtb25fZGF0",
+            "YRgCIAEoCzIcLlBPR09Qcm90b3MuRGF0YS5Qb2tlbW9uRGF0YRJIChNjYXB0",
+            "dXJlX3Byb2JhYmlsaXR5GAMgASgLMisuUE9HT1Byb3Rvcy5EYXRhLkNhcHR1",
+            "cmUuQ2FwdHVyZVByb2JhYmlsaXR5IocBCgZSZXN1bHQSHQoZSU5DRU5TRV9F",
+            "TkNPVU5URVJfVU5LTk9XThAAEh0KGUlOQ0VOU0VfRU5DT1VOVEVSX1NVQ0NF",
+            "U1MQARIjCh9JTkNFTlNFX0VOQ09VTlRFUl9OT1RfQVZBSUxBQkxFEAISGgoW",
+            "UE9LRU1PTl9JTlZFTlRPUllfRlVMTBADIvkCChVFdm9sdmVQb2tlbW9uUmVz",
+            "cG9uc2USTQoGcmVzdWx0GAEgASgOMj0uUE9HT1Byb3Rvcy5OZXR3b3JraW5n",
+            "LlJlc3BvbnNlcy5Fdm9sdmVQb2tlbW9uUmVzcG9uc2UuUmVzdWx0EjoKFGV2",
+            "b2x2ZWRfcG9rZW1vbl9kYXRhGAIgASgLMhwuUE9HT1Byb3Rvcy5EYXRhLlBv",
+            "a2Vtb25EYXRhEhoKEmV4cGVyaWVuY2VfYXdhcmRlZBgDIAEoBRIVCg1jYW5k",
+            "eV9hd2FyZGVkGAQgASgFIqEBCgZSZXN1bHQSCQoFVU5TRVQQABILCgdTVUND",
+            "RVNTEAESGgoWRkFJTEVEX1BPS0VNT05fTUlTU0lORxACEiEKHUZBSUxFRF9J",
+            "TlNVRkZJQ0lFTlRfUkVTT1VSQ0VTEAMSIAocRkFJTEVEX1BPS0VNT05fQ0FO",
+            "Tk9UX0VWT0xWRRAEEh4KGkZBSUxFRF9QT0tFTU9OX0lTX0RFUExPWUVEEAUi",
+            "nwMKG1VzZUl0ZW1FZ2dJbmN1YmF0b3JSZXNwb25zZRJTCgZyZXN1bHQYASAB",
+            "KA4yQy5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlVzZUl0ZW1F",
+            "Z2dJbmN1YmF0b3JSZXNwb25zZS5SZXN1bHQSOQoNZWdnX2luY3ViYXRvchgC",
+            "IAEoCzIiLlBPR09Qcm90b3MuSW52ZW50b3J5LkVnZ0luY3ViYXRvciLvAQoG",
+            "UmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEh0KGUVSUk9SX0lOQ1VC",
+            "QVRPUl9OT1RfRk9VTkQQAhIfChtFUlJPUl9QT0tFTU9OX0VHR19OT1RfRk9V",
+            "TkQQAxIcChhFUlJPUl9QT0tFTU9OX0lEX05PVF9FR0cQBBIiCh5FUlJPUl9J",
+            "TkNVQkFUT1JfQUxSRUFEWV9JTl9VU0UQBRIkCiBFUlJPUl9QT0tFTU9OX0FM",
+            "UkVBRFlfSU5DVUJBVElORxAGEiUKIUVSUk9SX0lOQ1VCQVRPUl9OT19VU0VT",
+            "X1JFTUFJTklORxAHIt0BChZSZWxlYXNlUG9rZW1vblJlc3BvbnNlEk4KBnJl",
+            "c3VsdBgBIAEoDjI+LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMu",
+            "UmVsZWFzZVBva2Vtb25SZXNwb25zZS5SZXN1bHQSFQoNY2FuZHlfYXdhcmRl",
+            "ZBgCIAEoBSJcCgZSZXN1bHQSCQoFVU5TRVQQABILCgdTVUNDRVNTEAESFAoQ",
+            "UE9LRU1PTl9ERVBMT1lFRBACEgoKBkZBSUxFRBADEhgKFEVSUk9SX1BPS0VN",
+            "T05fSVNfRUdHEAQigwIKFUdldEd5bURldGFpbHNSZXNwb25zZRIwCglneW1f",
+            "c3RhdGUYASABKAsyHS5QT0dPUHJvdG9zLkRhdGEuR3ltLkd5bVN0YXRlEgwK",
+            "BG5hbWUYAiABKAkSDAoEdXJscxgDIAMoCRJNCgZyZXN1bHQYBCABKA4yPS5Q",
+            "T0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLkdldEd5bURldGFpbHNS",
+            "ZXNwb25zZS5SZXN1bHQSEwoLZGVzY3JpcHRpb24YBSABKAkiOAoGUmVzdWx0",
+            "EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhYKEkVSUk9SX05PVF9JTl9SQU5H",
+            "RRACIrACChlGb3J0UmVjYWxsUG9rZW1vblJlc3BvbnNlElEKBnJlc3VsdBgB",
+            "IAEoDjJBLlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuRm9ydFJl",
+            "Y2FsbFBva2Vtb25SZXNwb25zZS5SZXN1bHQSSgoMZm9ydF9kZXRhaWxzGAIg",
+            "ASgLMjQuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5Gb3J0RGV0",
+            "YWlsc1Jlc3BvbnNlInQKBlJlc3VsdBIRCg1OT19SRVNVTFRfU0VUEAASCwoH",
+            "U1VDQ0VTUxABEhYKEkVSUk9SX05PVF9JTl9SQU5HRRACEh0KGUVSUk9SX1BP",
+            "S0VNT05fTk9UX09OX0ZPUlQQAxITCg9FUlJPUl9OT19QTEFZRVIQBCKHAgoS",
+            "VXNlSW5jZW5zZVJlc3BvbnNlEkoKBnJlc3VsdBgBIAEoDjI6LlBPR09Qcm90",
+            "b3MuTmV0d29ya2luZy5SZXNwb25zZXMuVXNlSW5jZW5zZVJlc3BvbnNlLlJl",
+            "c3VsdBI6Cg9hcHBsaWVkX2luY2Vuc2UYAiABKAsyIS5QT0dPUHJvdG9zLklu",
+            "dmVudG9yeS5BcHBsaWVkSXRlbSJpCgZSZXN1bHQSCwoHVU5LTk9XThAAEgsK",
+            "B1NVQ0NFU1MQARIaChZJTkNFTlNFX0FMUkVBRFlfQUNUSVZFEAISFQoRTk9O",
+            "RV9JTl9JTlZFTlRPUlkQAxISCg5MT0NBVElPTl9VTlNFVBAEIt8BChdOaWNr",
+            "bmFtZVBva2Vtb25SZXNwb25zZRJPCgZyZXN1bHQYASABKA4yPy5QT0dPUHJv",
+            "dG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLk5pY2tuYW1lUG9rZW1vblJlc3Bv",
+            "bnNlLlJlc3VsdCJzCgZSZXN1bHQSCQoFVU5TRVQQABILCgdTVUNDRVNTEAES",
+            "GgoWRVJST1JfSU5WQUxJRF9OSUNLTkFNRRACEhsKF0VSUk9SX1BPS0VNT05f",
+            "Tk9UX0ZPVU5EEAMSGAoURVJST1JfUE9LRU1PTl9JU19FR0cQBFAAUAFQAlAD",
+            "UARQBVAGUAdQCFAJUApQC1AMUA1iBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor, global::POGOProtos.Data.POGOProtosDataReflection.Descriptor, global::POGOProtos.Data.Capture.POGOProtosDataCaptureReflection.Descriptor, global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor, global::POGOProtos.Map.POGOProtosMapReflection.Descriptor, global::POGOProtos.Data.Battle.POGOProtosDataBattleReflection.Descriptor, global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Data.Player.POGOProtosDataPlayerReflection.Descriptor, global::POGOProtos.Data.Gym.POGOProtosDataGymReflection.Descriptor, global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Map.Pokemon.POGOProtosMapPokemonReflection.Descriptor, global::POGOProtos.Map.Fort.POGOProtosMapFortReflection.Descriptor, global::POGOProtos.Data.Logs.POGOProtosDataLogsReflection.Descriptor, global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse), global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Parser, new[]{ "Result" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemXpBoostResponse), global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Parser, new[]{ "Result", "AppliedItems" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse), global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Parser, new[]{ "Result", "ItemTemplatesTimestampMs", "AssetDigestTimestampMs" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetInventoryResponse), global::POGOProtos.Networking.Responses.GetInventoryResponse.Parser, new[]{ "Success", "InventoryDelta" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse), global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Parser, new[]{ "Result", "PokemonData", "CaptureAward" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemPotionResponse), global::POGOProtos.Networking.Responses.UseItemPotionResponse.Parser, new[]{ "Result", "Stamina" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse), global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Parser, new[]{ "Success", "ItemTemplates", "TimestampMs" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate), global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate.Parser, new[]{ "TemplateId", "PokemonSettings", "ItemSettings", "MoveSettings", "MoveSequenceSettings", "TypeEffective", "BadgeSettings", "Camera", "PlayerLevel", "GymLevel", "BattleSettings", "EncounterSettings", "IapItemDisplay", "IapSettings", "PokemonUpgrades", "EquippedBadges" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetDownloadUrlsResponse), global::POGOProtos.Networking.Responses.GetDownloadUrlsResponse.Parser, new[]{ "DownloadUrls" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CollectDailyBonusResponse), global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Parser, new[]{ "Result" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DiskEncounterResponse), global::POGOProtos.Networking.Responses.DiskEncounterResponse.Parser, new[]{ "Result", "PokemonData", "CaptureProbability" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetPlayerProfileResponse), global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Parser, new[]{ "Result", "StartTime", "Badges" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetMapObjectsResponse), global::POGOProtos.Networking.Responses.GetMapObjectsResponse.Parser, new[]{ "MapCells", "Status" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemCaptureResponse), global::POGOProtos.Networking.Responses.UseItemCaptureResponse.Parser, new[]{ "Success", "ItemCaptureMult", "ItemFleeMult", "StopMovement", "StopAttack", "TargetMax", "TargetSlow" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.AttackGymResponse), global::POGOProtos.Networking.Responses.AttackGymResponse.Parser, new[]{ "Result", "BattleLog", "BattleId", "ActiveDefender", "ActiveAttacker" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.MarkTutorialCompleteResponse), global::POGOProtos.Networking.Responses.MarkTutorialCompleteResponse.Parser, new[]{ "Success", "PlayerData" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetContactSettingsResponse), global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Parser, new[]{ "Status", "PlayerData" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetIncensePokemonResponse), global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Parser, new[]{ "Result", "PokemonId", "Latitude", "Longitude", "EncounterLocation", "EncounterId", "DisappearTimestampMs" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetPlayerResponse), global::POGOProtos.Networking.Responses.GetPlayerResponse.Parser, new[]{ "Success", "PlayerData" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EquipBadgeResponse), global::POGOProtos.Networking.Responses.EquipBadgeResponse.Parser, new[]{ "Result", "Equipped" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortDeployPokemonResponse), global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Parser, new[]{ "Result", "FortDetails", "PokemonData", "GymState" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetSuggestedCodenamesResponse), global::POGOProtos.Networking.Responses.GetSuggestedCodenamesResponse.Parser, new[]{ "Codenames", "Success" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortSearchResponse), global::POGOProtos.Networking.Responses.FortSearchResponse.Parser, new[]{ "Result", "ItemsAwarded", "GemsAwarded", "PokemonDataEgg", "ExperienceAwarded", "CooldownCompleteTimestampMs", "ChainHackSequenceNumber" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetAvatarResponse), global::POGOProtos.Networking.Responses.SetAvatarResponse.Parser, new[]{ "Status", "PlayerData" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EncounterResponse), global::POGOProtos.Networking.Responses.EncounterResponse.Parser, new[]{ "WildPokemon", "Background", "Status", "CaptureProbability" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background), typeof(global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemReviveResponse), global::POGOProtos.Networking.Responses.UseItemReviveResponse.Parser, new[]{ "Result", "Stamina" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CheckAwardedBadgesResponse), global::POGOProtos.Networking.Responses.CheckAwardedBadgesResponse.Parser, new[]{ "Success", "AwardedBadges", "AwardedBadgeLevels" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.ClaimCodenameResponse), global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Parser, new[]{ "Codename", "UserMessage", "IsAssignable", "Status" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemGymResponse), global::POGOProtos.Networking.Responses.UseItemGymResponse.Parser, new[]{ "Result", "UpdatedGp" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.AddFortModifierResponse), global::POGOProtos.Networking.Responses.AddFortModifierResponse.Parser, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse), global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Parser, new[]{ "Codename", "UserMessage", "IsAssignable", "Status" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EchoResponse), global::POGOProtos.Networking.Responses.EchoResponse.Parser, new[]{ "Context" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.PlayerUpdateResponse), global::POGOProtos.Networking.Responses.PlayerUpdateResponse.Parser, new[]{ "WildPokemons", "Forts", "FortsNearby" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UpgradePokemonResponse), global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Parser, new[]{ "Result", "UpgradedPokemon" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CatchPokemonResponse), global::POGOProtos.Networking.Responses.CatchPokemonResponse.Parser, new[]{ "Status", "MissPercent", "CapturedPokemonId", "CaptureAward" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.StartGymBattleResponse), global::POGOProtos.Networking.Responses.StartGymBattleResponse.Parser, new[]{ "Result", "BattleStartTimestampMs", "BattleEndTimestampMs", "BattleId", "Defender", "BattleLog" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.LevelUpRewardsResponse), global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Parser, new[]{ "Result", "ItemsAwarded", "ItemsUnlocked" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortDetailsResponse), global::POGOProtos.Networking.Responses.FortDetailsResponse.Parser, new[]{ "FortId", "TeamColor", "PokemonData", "Name", "ImageUrls", "Fp", "Stamina", "MaxStamina", "Type", "Latitude", "Longitude", "Description", "Modifiers" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse), global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Parser, new[]{ "Result", "CurrencyType", "CurrencyAwarded", "DefendersCount" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SfidaActionLogResponse), global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Parser, new[]{ "Result", "LogEntries" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse), global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Parser, new[]{ "Result", "NewCount" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetAssetDigestResponse), global::POGOProtos.Networking.Responses.GetAssetDigestResponse.Parser, new[]{ "Digest", "TimestampMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetHatchedEggsResponse), global::POGOProtos.Networking.Responses.GetHatchedEggsResponse.Parser, new[]{ "Success", "PokemonId", "ExperienceAwarded", "CandyAwarded", "StardustAwarded" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.DownloadSettingsResponse), global::POGOProtos.Networking.Responses.DownloadSettingsResponse.Parser, new[]{ "Error", "Hash", "Settings" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetPlayerTeamResponse), global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Parser, new[]{ "Status", "PlayerData" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.IncenseEncounterResponse), global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Parser, new[]{ "Result", "PokemonData", "CaptureProbability" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.EvolvePokemonResponse), global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Parser, new[]{ "Result", "EvolvedPokemonData", "ExperienceAwarded", "CandyAwarded" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse), global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Parser, new[]{ "Result", "EggIncubator" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.ReleasePokemonResponse), global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Parser, new[]{ "Result", "CandyAwarded" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.GetGymDetailsResponse), global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Parser, new[]{ "GymState", "Name", "Urls", "Result", "Description" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.FortRecallPokemonResponse), global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Parser, new[]{ "Result", "FortDetails" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseIncenseResponse), global::POGOProtos.Networking.Responses.UseIncenseResponse.Parser, new[]{ "Result", "AppliedIncense" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.NicknamePokemonResponse), global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Parser, new[]{ "Result" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetFavoritePokemonResponse : pb::IMessage<SetFavoritePokemonResponse> {
+    private static readonly pb::MessageParser<SetFavoritePokemonResponse> _parser = new pb::MessageParser<SetFavoritePokemonResponse>(() => new SetFavoritePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetFavoritePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonResponse(SetFavoritePokemonResponse other) : this() {
+      result_ = other.result_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonResponse Clone() {
+      return new SetFavoritePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetFavoritePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetFavoritePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetFavoritePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetFavoritePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FOUND")] ErrorPokemonNotFound = 2,
+        [pbr::OriginalName("ERROR_POKEMON_IS_EGG")] ErrorPokemonIsEgg = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class UseItemXpBoostResponse : pb::IMessage<UseItemXpBoostResponse> {
+    private static readonly pb::MessageParser<UseItemXpBoostResponse> _parser = new pb::MessageParser<UseItemXpBoostResponse>(() => new UseItemXpBoostResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemXpBoostResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostResponse(UseItemXpBoostResponse other) : this() {
+      result_ = other.result_;
+      AppliedItems = other.appliedItems_ != null ? other.AppliedItems.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostResponse Clone() {
+      return new UseItemXpBoostResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_items" field.</summary>
+    public const int AppliedItemsFieldNumber = 2;
+    private global::POGOProtos.Inventory.AppliedItems appliedItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.AppliedItems AppliedItems {
+      get { return appliedItems_; }
+      set {
+        appliedItems_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemXpBoostResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemXpBoostResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(AppliedItems, other.AppliedItems)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (appliedItems_ != null) hash ^= AppliedItems.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (appliedItems_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(AppliedItems);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (appliedItems_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedItems);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemXpBoostResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.appliedItems_ != null) {
+        if (appliedItems_ == null) {
+          appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+        }
+        AppliedItems.MergeFrom(other.AppliedItems);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (appliedItems_ == null) {
+              appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+            }
+            input.ReadMessage(appliedItems_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemXpBoostResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_ITEM_TYPE")] ErrorInvalidItemType = 2,
+        [pbr::OriginalName("ERROR_XP_BOOST_ALREADY_ACTIVE")] ErrorXpBoostAlreadyActive = 3,
+        [pbr::OriginalName("ERROR_NO_ITEMS_REMAINING")] ErrorNoItemsRemaining = 4,
+        [pbr::OriginalName("ERROR_LOCATION_UNSET")] ErrorLocationUnset = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class DownloadRemoteConfigVersionResponse : pb::IMessage<DownloadRemoteConfigVersionResponse> {
+    private static readonly pb::MessageParser<DownloadRemoteConfigVersionResponse> _parser = new pb::MessageParser<DownloadRemoteConfigVersionResponse>(() => new DownloadRemoteConfigVersionResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadRemoteConfigVersionResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionResponse(DownloadRemoteConfigVersionResponse other) : this() {
+      result_ = other.result_;
+      itemTemplatesTimestampMs_ = other.itemTemplatesTimestampMs_;
+      assetDigestTimestampMs_ = other.assetDigestTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadRemoteConfigVersionResponse Clone() {
+      return new DownloadRemoteConfigVersionResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_templates_timestamp_ms" field.</summary>
+    public const int ItemTemplatesTimestampMsFieldNumber = 2;
+    private ulong itemTemplatesTimestampMs_;
+    /// <summary>
+    ///  Latest available?
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong ItemTemplatesTimestampMs {
+      get { return itemTemplatesTimestampMs_; }
+      set {
+        itemTemplatesTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "asset_digest_timestamp_ms" field.</summary>
+    public const int AssetDigestTimestampMsFieldNumber = 3;
+    private ulong assetDigestTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong AssetDigestTimestampMs {
+      get { return assetDigestTimestampMs_; }
+      set {
+        assetDigestTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadRemoteConfigVersionResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadRemoteConfigVersionResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (ItemTemplatesTimestampMs != other.ItemTemplatesTimestampMs) return false;
+      if (AssetDigestTimestampMs != other.AssetDigestTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (ItemTemplatesTimestampMs != 0UL) hash ^= ItemTemplatesTimestampMs.GetHashCode();
+      if (AssetDigestTimestampMs != 0UL) hash ^= AssetDigestTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (ItemTemplatesTimestampMs != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(ItemTemplatesTimestampMs);
+      }
+      if (AssetDigestTimestampMs != 0UL) {
+        output.WriteRawTag(24);
+        output.WriteUInt64(AssetDigestTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (ItemTemplatesTimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(ItemTemplatesTimestampMs);
+      }
+      if (AssetDigestTimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(AssetDigestTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadRemoteConfigVersionResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.ItemTemplatesTimestampMs != 0UL) {
+        ItemTemplatesTimestampMs = other.ItemTemplatesTimestampMs;
+      }
+      if (other.AssetDigestTimestampMs != 0UL) {
+        AssetDigestTimestampMs = other.AssetDigestTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.DownloadRemoteConfigVersionResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            ItemTemplatesTimestampMs = input.ReadUInt64();
+            break;
+          }
+          case 24: {
+            AssetDigestTimestampMs = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the DownloadRemoteConfigVersionResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetInventoryResponse : pb::IMessage<GetInventoryResponse> {
+    private static readonly pb::MessageParser<GetInventoryResponse> _parser = new pb::MessageParser<GetInventoryResponse>(() => new GetInventoryResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetInventoryResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryResponse(GetInventoryResponse other) : this() {
+      success_ = other.success_;
+      InventoryDelta = other.inventoryDelta_ != null ? other.InventoryDelta.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetInventoryResponse Clone() {
+      return new GetInventoryResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_delta" field.</summary>
+    public const int InventoryDeltaFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryDelta inventoryDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryDelta InventoryDelta {
+      get { return inventoryDelta_; }
+      set {
+        inventoryDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetInventoryResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetInventoryResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (!object.Equals(InventoryDelta, other.InventoryDelta)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (inventoryDelta_ != null) hash ^= InventoryDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (inventoryDelta_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(InventoryDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (inventoryDelta_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetInventoryResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.inventoryDelta_ != null) {
+        if (inventoryDelta_ == null) {
+          inventoryDelta_ = new global::POGOProtos.Inventory.InventoryDelta();
+        }
+        InventoryDelta.MergeFrom(other.InventoryDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            if (inventoryDelta_ == null) {
+              inventoryDelta_ = new global::POGOProtos.Inventory.InventoryDelta();
+            }
+            input.ReadMessage(inventoryDelta_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EncounterTutorialCompleteResponse : pb::IMessage<EncounterTutorialCompleteResponse> {
+    private static readonly pb::MessageParser<EncounterTutorialCompleteResponse> _parser = new pb::MessageParser<EncounterTutorialCompleteResponse>(() => new EncounterTutorialCompleteResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterTutorialCompleteResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteResponse(EncounterTutorialCompleteResponse other) : this() {
+      result_ = other.result_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      CaptureAward = other.captureAward_ != null ? other.CaptureAward.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterTutorialCompleteResponse Clone() {
+      return new EncounterTutorialCompleteResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_award" field.</summary>
+    public const int CaptureAwardFieldNumber = 3;
+    private global::POGOProtos.Data.Capture.CaptureAward captureAward_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureAward CaptureAward {
+      get { return captureAward_; }
+      set {
+        captureAward_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterTutorialCompleteResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterTutorialCompleteResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(CaptureAward, other.CaptureAward)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (captureAward_ != null) hash ^= CaptureAward.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PokemonData);
+      }
+      if (captureAward_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (captureAward_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureAward);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterTutorialCompleteResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.captureAward_ != null) {
+        if (captureAward_ == null) {
+          captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+        }
+        CaptureAward.MergeFrom(other.CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.EncounterTutorialCompleteResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 26: {
+            if (captureAward_ == null) {
+              captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+            }
+            input.ReadMessage(captureAward_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EncounterTutorialCompleteResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_POKEMON")] ErrorInvalidPokemon = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class UseItemPotionResponse : pb::IMessage<UseItemPotionResponse> {
+    private static readonly pb::MessageParser<UseItemPotionResponse> _parser = new pb::MessageParser<UseItemPotionResponse>(() => new UseItemPotionResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemPotionResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionResponse(UseItemPotionResponse other) : this() {
+      result_ = other.result_;
+      stamina_ = other.stamina_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionResponse Clone() {
+      return new UseItemPotionResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 2;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemPotionResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemPotionResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (Stamina != other.Stamina) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Stamina);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemPotionResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemPotionResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NO_POKEMON")] ErrorNoPokemon = 2,
+        [pbr::OriginalName("ERROR_CANNOT_USE")] ErrorCannotUse = 3,
+        [pbr::OriginalName("ERROR_DEPLOYED_TO_FORT")] ErrorDeployedToFort = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class DownloadItemTemplatesResponse : pb::IMessage<DownloadItemTemplatesResponse> {
+    private static readonly pb::MessageParser<DownloadItemTemplatesResponse> _parser = new pb::MessageParser<DownloadItemTemplatesResponse>(() => new DownloadItemTemplatesResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadItemTemplatesResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesResponse(DownloadItemTemplatesResponse other) : this() {
+      success_ = other.success_;
+      itemTemplates_ = other.itemTemplates_.Clone();
+      timestampMs_ = other.timestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadItemTemplatesResponse Clone() {
+      return new DownloadItemTemplatesResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_templates" field.</summary>
+    public const int ItemTemplatesFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate> _repeated_itemTemplates_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate> itemTemplates_ = new pbc::RepeatedField<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Types.ItemTemplate> ItemTemplates {
+      get { return itemTemplates_; }
+    }
+
+    /// <summary>Field number for the "timestamp_ms" field.</summary>
+    public const int TimestampMsFieldNumber = 3;
+    private ulong timestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong TimestampMs {
+      get { return timestampMs_; }
+      set {
+        timestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadItemTemplatesResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadItemTemplatesResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if(!itemTemplates_.Equals(other.itemTemplates_)) return false;
+      if (TimestampMs != other.TimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      hash ^= itemTemplates_.GetHashCode();
+      if (TimestampMs != 0UL) hash ^= TimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      itemTemplates_.WriteTo(output, _repeated_itemTemplates_codec);
+      if (TimestampMs != 0UL) {
+        output.WriteRawTag(24);
+        output.WriteUInt64(TimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      size += itemTemplates_.CalculateSize(_repeated_itemTemplates_codec);
+      if (TimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadItemTemplatesResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      itemTemplates_.Add(other.itemTemplates_);
+      if (other.TimestampMs != 0UL) {
+        TimestampMs = other.TimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            itemTemplates_.AddEntriesFrom(input, _repeated_itemTemplates_codec);
+            break;
+          }
+          case 24: {
+            TimestampMs = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the DownloadItemTemplatesResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class ItemTemplate : pb::IMessage<ItemTemplate> {
+        private static readonly pb::MessageParser<ItemTemplate> _parser = new pb::MessageParser<ItemTemplate>(() => new ItemTemplate());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<ItemTemplate> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ItemTemplate() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ItemTemplate(ItemTemplate other) : this() {
+          templateId_ = other.templateId_;
+          PokemonSettings = other.pokemonSettings_ != null ? other.PokemonSettings.Clone() : null;
+          ItemSettings = other.itemSettings_ != null ? other.ItemSettings.Clone() : null;
+          MoveSettings = other.moveSettings_ != null ? other.MoveSettings.Clone() : null;
+          MoveSequenceSettings = other.moveSequenceSettings_ != null ? other.MoveSequenceSettings.Clone() : null;
+          TypeEffective = other.typeEffective_ != null ? other.TypeEffective.Clone() : null;
+          BadgeSettings = other.badgeSettings_ != null ? other.BadgeSettings.Clone() : null;
+          Camera = other.camera_ != null ? other.Camera.Clone() : null;
+          PlayerLevel = other.playerLevel_ != null ? other.PlayerLevel.Clone() : null;
+          GymLevel = other.gymLevel_ != null ? other.GymLevel.Clone() : null;
+          BattleSettings = other.battleSettings_ != null ? other.BattleSettings.Clone() : null;
+          EncounterSettings = other.encounterSettings_ != null ? other.EncounterSettings.Clone() : null;
+          IapItemDisplay = other.iapItemDisplay_ != null ? other.IapItemDisplay.Clone() : null;
+          IapSettings = other.iapSettings_ != null ? other.IapSettings.Clone() : null;
+          PokemonUpgrades = other.pokemonUpgrades_ != null ? other.PokemonUpgrades.Clone() : null;
+          EquippedBadges = other.equippedBadges_ != null ? other.EquippedBadges.Clone() : null;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ItemTemplate Clone() {
+          return new ItemTemplate(this);
+        }
+
+        /// <summary>Field number for the "template_id" field.</summary>
+        public const int TemplateIdFieldNumber = 1;
+        private string templateId_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string TemplateId {
+          get { return templateId_; }
+          set {
+            templateId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "pokemon_settings" field.</summary>
+        public const int PokemonSettingsFieldNumber = 2;
+        private global::POGOProtos.Settings.Master.PokemonSettings pokemonSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.PokemonSettings PokemonSettings {
+          get { return pokemonSettings_; }
+          set {
+            pokemonSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "item_settings" field.</summary>
+        public const int ItemSettingsFieldNumber = 3;
+        private global::POGOProtos.Settings.Master.ItemSettings itemSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.ItemSettings ItemSettings {
+          get { return itemSettings_; }
+          set {
+            itemSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "move_settings" field.</summary>
+        public const int MoveSettingsFieldNumber = 4;
+        private global::POGOProtos.Settings.Master.MoveSettings moveSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.MoveSettings MoveSettings {
+          get { return moveSettings_; }
+          set {
+            moveSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "move_sequence_settings" field.</summary>
+        public const int MoveSequenceSettingsFieldNumber = 5;
+        private global::POGOProtos.Settings.Master.MoveSequenceSettings moveSequenceSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.MoveSequenceSettings MoveSequenceSettings {
+          get { return moveSequenceSettings_; }
+          set {
+            moveSequenceSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "type_effective" field.</summary>
+        public const int TypeEffectiveFieldNumber = 8;
+        private global::POGOProtos.Settings.Master.TypeEffectiveSettings typeEffective_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.TypeEffectiveSettings TypeEffective {
+          get { return typeEffective_; }
+          set {
+            typeEffective_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "badge_settings" field.</summary>
+        public const int BadgeSettingsFieldNumber = 10;
+        private global::POGOProtos.Settings.Master.BadgeSettings badgeSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.BadgeSettings BadgeSettings {
+          get { return badgeSettings_; }
+          set {
+            badgeSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "camera" field.</summary>
+        public const int CameraFieldNumber = 11;
+        private global::POGOProtos.Settings.Master.CameraSettings camera_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.CameraSettings Camera {
+          get { return camera_; }
+          set {
+            camera_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "player_level" field.</summary>
+        public const int PlayerLevelFieldNumber = 12;
+        private global::POGOProtos.Settings.Master.PlayerLevelSettings playerLevel_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.PlayerLevelSettings PlayerLevel {
+          get { return playerLevel_; }
+          set {
+            playerLevel_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "gym_level" field.</summary>
+        public const int GymLevelFieldNumber = 13;
+        private global::POGOProtos.Settings.Master.GymLevelSettings gymLevel_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.GymLevelSettings GymLevel {
+          get { return gymLevel_; }
+          set {
+            gymLevel_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "battle_settings" field.</summary>
+        public const int BattleSettingsFieldNumber = 14;
+        private global::POGOProtos.Settings.Master.GymBattleSettings battleSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.GymBattleSettings BattleSettings {
+          get { return battleSettings_; }
+          set {
+            battleSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "encounter_settings" field.</summary>
+        public const int EncounterSettingsFieldNumber = 15;
+        private global::POGOProtos.Settings.Master.EncounterSettings encounterSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.EncounterSettings EncounterSettings {
+          get { return encounterSettings_; }
+          set {
+            encounterSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "iap_item_display" field.</summary>
+        public const int IapItemDisplayFieldNumber = 16;
+        private global::POGOProtos.Settings.Master.IapItemDisplay iapItemDisplay_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.IapItemDisplay IapItemDisplay {
+          get { return iapItemDisplay_; }
+          set {
+            iapItemDisplay_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "iap_settings" field.</summary>
+        public const int IapSettingsFieldNumber = 17;
+        private global::POGOProtos.Settings.Master.IapSettings iapSettings_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.IapSettings IapSettings {
+          get { return iapSettings_; }
+          set {
+            iapSettings_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "pokemon_upgrades" field.</summary>
+        public const int PokemonUpgradesFieldNumber = 18;
+        private global::POGOProtos.Settings.Master.PokemonUpgradeSettings pokemonUpgrades_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.PokemonUpgradeSettings PokemonUpgrades {
+          get { return pokemonUpgrades_; }
+          set {
+            pokemonUpgrades_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "equipped_badges" field.</summary>
+        public const int EquippedBadgesFieldNumber = 19;
+        private global::POGOProtos.Settings.Master.EquippedBadgeSettings equippedBadges_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Settings.Master.EquippedBadgeSettings EquippedBadges {
+          get { return equippedBadges_; }
+          set {
+            equippedBadges_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as ItemTemplate);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(ItemTemplate other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (TemplateId != other.TemplateId) return false;
+          if (!object.Equals(PokemonSettings, other.PokemonSettings)) return false;
+          if (!object.Equals(ItemSettings, other.ItemSettings)) return false;
+          if (!object.Equals(MoveSettings, other.MoveSettings)) return false;
+          if (!object.Equals(MoveSequenceSettings, other.MoveSequenceSettings)) return false;
+          if (!object.Equals(TypeEffective, other.TypeEffective)) return false;
+          if (!object.Equals(BadgeSettings, other.BadgeSettings)) return false;
+          if (!object.Equals(Camera, other.Camera)) return false;
+          if (!object.Equals(PlayerLevel, other.PlayerLevel)) return false;
+          if (!object.Equals(GymLevel, other.GymLevel)) return false;
+          if (!object.Equals(BattleSettings, other.BattleSettings)) return false;
+          if (!object.Equals(EncounterSettings, other.EncounterSettings)) return false;
+          if (!object.Equals(IapItemDisplay, other.IapItemDisplay)) return false;
+          if (!object.Equals(IapSettings, other.IapSettings)) return false;
+          if (!object.Equals(PokemonUpgrades, other.PokemonUpgrades)) return false;
+          if (!object.Equals(EquippedBadges, other.EquippedBadges)) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (TemplateId.Length != 0) hash ^= TemplateId.GetHashCode();
+          if (pokemonSettings_ != null) hash ^= PokemonSettings.GetHashCode();
+          if (itemSettings_ != null) hash ^= ItemSettings.GetHashCode();
+          if (moveSettings_ != null) hash ^= MoveSettings.GetHashCode();
+          if (moveSequenceSettings_ != null) hash ^= MoveSequenceSettings.GetHashCode();
+          if (typeEffective_ != null) hash ^= TypeEffective.GetHashCode();
+          if (badgeSettings_ != null) hash ^= BadgeSettings.GetHashCode();
+          if (camera_ != null) hash ^= Camera.GetHashCode();
+          if (playerLevel_ != null) hash ^= PlayerLevel.GetHashCode();
+          if (gymLevel_ != null) hash ^= GymLevel.GetHashCode();
+          if (battleSettings_ != null) hash ^= BattleSettings.GetHashCode();
+          if (encounterSettings_ != null) hash ^= EncounterSettings.GetHashCode();
+          if (iapItemDisplay_ != null) hash ^= IapItemDisplay.GetHashCode();
+          if (iapSettings_ != null) hash ^= IapSettings.GetHashCode();
+          if (pokemonUpgrades_ != null) hash ^= PokemonUpgrades.GetHashCode();
+          if (equippedBadges_ != null) hash ^= EquippedBadges.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (TemplateId.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(TemplateId);
+          }
+          if (pokemonSettings_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(PokemonSettings);
+          }
+          if (itemSettings_ != null) {
+            output.WriteRawTag(26);
+            output.WriteMessage(ItemSettings);
+          }
+          if (moveSettings_ != null) {
+            output.WriteRawTag(34);
+            output.WriteMessage(MoveSettings);
+          }
+          if (moveSequenceSettings_ != null) {
+            output.WriteRawTag(42);
+            output.WriteMessage(MoveSequenceSettings);
+          }
+          if (typeEffective_ != null) {
+            output.WriteRawTag(66);
+            output.WriteMessage(TypeEffective);
+          }
+          if (badgeSettings_ != null) {
+            output.WriteRawTag(82);
+            output.WriteMessage(BadgeSettings);
+          }
+          if (camera_ != null) {
+            output.WriteRawTag(90);
+            output.WriteMessage(Camera);
+          }
+          if (playerLevel_ != null) {
+            output.WriteRawTag(98);
+            output.WriteMessage(PlayerLevel);
+          }
+          if (gymLevel_ != null) {
+            output.WriteRawTag(106);
+            output.WriteMessage(GymLevel);
+          }
+          if (battleSettings_ != null) {
+            output.WriteRawTag(114);
+            output.WriteMessage(BattleSettings);
+          }
+          if (encounterSettings_ != null) {
+            output.WriteRawTag(122);
+            output.WriteMessage(EncounterSettings);
+          }
+          if (iapItemDisplay_ != null) {
+            output.WriteRawTag(130, 1);
+            output.WriteMessage(IapItemDisplay);
+          }
+          if (iapSettings_ != null) {
+            output.WriteRawTag(138, 1);
+            output.WriteMessage(IapSettings);
+          }
+          if (pokemonUpgrades_ != null) {
+            output.WriteRawTag(146, 1);
+            output.WriteMessage(PokemonUpgrades);
+          }
+          if (equippedBadges_ != null) {
+            output.WriteRawTag(154, 1);
+            output.WriteMessage(EquippedBadges);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (TemplateId.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(TemplateId);
+          }
+          if (pokemonSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonSettings);
+          }
+          if (itemSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(ItemSettings);
+          }
+          if (moveSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(MoveSettings);
+          }
+          if (moveSequenceSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(MoveSequenceSettings);
+          }
+          if (typeEffective_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeEffective);
+          }
+          if (badgeSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(BadgeSettings);
+          }
+          if (camera_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Camera);
+          }
+          if (playerLevel_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerLevel);
+          }
+          if (gymLevel_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymLevel);
+          }
+          if (battleSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleSettings);
+          }
+          if (encounterSettings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(EncounterSettings);
+          }
+          if (iapItemDisplay_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(IapItemDisplay);
+          }
+          if (iapSettings_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(IapSettings);
+          }
+          if (pokemonUpgrades_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(PokemonUpgrades);
+          }
+          if (equippedBadges_ != null) {
+            size += 2 + pb::CodedOutputStream.ComputeMessageSize(EquippedBadges);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(ItemTemplate other) {
+          if (other == null) {
+            return;
+          }
+          if (other.TemplateId.Length != 0) {
+            TemplateId = other.TemplateId;
+          }
+          if (other.pokemonSettings_ != null) {
+            if (pokemonSettings_ == null) {
+              pokemonSettings_ = new global::POGOProtos.Settings.Master.PokemonSettings();
+            }
+            PokemonSettings.MergeFrom(other.PokemonSettings);
+          }
+          if (other.itemSettings_ != null) {
+            if (itemSettings_ == null) {
+              itemSettings_ = new global::POGOProtos.Settings.Master.ItemSettings();
+            }
+            ItemSettings.MergeFrom(other.ItemSettings);
+          }
+          if (other.moveSettings_ != null) {
+            if (moveSettings_ == null) {
+              moveSettings_ = new global::POGOProtos.Settings.Master.MoveSettings();
+            }
+            MoveSettings.MergeFrom(other.MoveSettings);
+          }
+          if (other.moveSequenceSettings_ != null) {
+            if (moveSequenceSettings_ == null) {
+              moveSequenceSettings_ = new global::POGOProtos.Settings.Master.MoveSequenceSettings();
+            }
+            MoveSequenceSettings.MergeFrom(other.MoveSequenceSettings);
+          }
+          if (other.typeEffective_ != null) {
+            if (typeEffective_ == null) {
+              typeEffective_ = new global::POGOProtos.Settings.Master.TypeEffectiveSettings();
+            }
+            TypeEffective.MergeFrom(other.TypeEffective);
+          }
+          if (other.badgeSettings_ != null) {
+            if (badgeSettings_ == null) {
+              badgeSettings_ = new global::POGOProtos.Settings.Master.BadgeSettings();
+            }
+            BadgeSettings.MergeFrom(other.BadgeSettings);
+          }
+          if (other.camera_ != null) {
+            if (camera_ == null) {
+              camera_ = new global::POGOProtos.Settings.Master.CameraSettings();
+            }
+            Camera.MergeFrom(other.Camera);
+          }
+          if (other.playerLevel_ != null) {
+            if (playerLevel_ == null) {
+              playerLevel_ = new global::POGOProtos.Settings.Master.PlayerLevelSettings();
+            }
+            PlayerLevel.MergeFrom(other.PlayerLevel);
+          }
+          if (other.gymLevel_ != null) {
+            if (gymLevel_ == null) {
+              gymLevel_ = new global::POGOProtos.Settings.Master.GymLevelSettings();
+            }
+            GymLevel.MergeFrom(other.GymLevel);
+          }
+          if (other.battleSettings_ != null) {
+            if (battleSettings_ == null) {
+              battleSettings_ = new global::POGOProtos.Settings.Master.GymBattleSettings();
+            }
+            BattleSettings.MergeFrom(other.BattleSettings);
+          }
+          if (other.encounterSettings_ != null) {
+            if (encounterSettings_ == null) {
+              encounterSettings_ = new global::POGOProtos.Settings.Master.EncounterSettings();
+            }
+            EncounterSettings.MergeFrom(other.EncounterSettings);
+          }
+          if (other.iapItemDisplay_ != null) {
+            if (iapItemDisplay_ == null) {
+              iapItemDisplay_ = new global::POGOProtos.Settings.Master.IapItemDisplay();
+            }
+            IapItemDisplay.MergeFrom(other.IapItemDisplay);
+          }
+          if (other.iapSettings_ != null) {
+            if (iapSettings_ == null) {
+              iapSettings_ = new global::POGOProtos.Settings.Master.IapSettings();
+            }
+            IapSettings.MergeFrom(other.IapSettings);
+          }
+          if (other.pokemonUpgrades_ != null) {
+            if (pokemonUpgrades_ == null) {
+              pokemonUpgrades_ = new global::POGOProtos.Settings.Master.PokemonUpgradeSettings();
+            }
+            PokemonUpgrades.MergeFrom(other.PokemonUpgrades);
+          }
+          if (other.equippedBadges_ != null) {
+            if (equippedBadges_ == null) {
+              equippedBadges_ = new global::POGOProtos.Settings.Master.EquippedBadgeSettings();
+            }
+            EquippedBadges.MergeFrom(other.EquippedBadges);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                TemplateId = input.ReadString();
+                break;
+              }
+              case 18: {
+                if (pokemonSettings_ == null) {
+                  pokemonSettings_ = new global::POGOProtos.Settings.Master.PokemonSettings();
+                }
+                input.ReadMessage(pokemonSettings_);
+                break;
+              }
+              case 26: {
+                if (itemSettings_ == null) {
+                  itemSettings_ = new global::POGOProtos.Settings.Master.ItemSettings();
+                }
+                input.ReadMessage(itemSettings_);
+                break;
+              }
+              case 34: {
+                if (moveSettings_ == null) {
+                  moveSettings_ = new global::POGOProtos.Settings.Master.MoveSettings();
+                }
+                input.ReadMessage(moveSettings_);
+                break;
+              }
+              case 42: {
+                if (moveSequenceSettings_ == null) {
+                  moveSequenceSettings_ = new global::POGOProtos.Settings.Master.MoveSequenceSettings();
+                }
+                input.ReadMessage(moveSequenceSettings_);
+                break;
+              }
+              case 66: {
+                if (typeEffective_ == null) {
+                  typeEffective_ = new global::POGOProtos.Settings.Master.TypeEffectiveSettings();
+                }
+                input.ReadMessage(typeEffective_);
+                break;
+              }
+              case 82: {
+                if (badgeSettings_ == null) {
+                  badgeSettings_ = new global::POGOProtos.Settings.Master.BadgeSettings();
+                }
+                input.ReadMessage(badgeSettings_);
+                break;
+              }
+              case 90: {
+                if (camera_ == null) {
+                  camera_ = new global::POGOProtos.Settings.Master.CameraSettings();
+                }
+                input.ReadMessage(camera_);
+                break;
+              }
+              case 98: {
+                if (playerLevel_ == null) {
+                  playerLevel_ = new global::POGOProtos.Settings.Master.PlayerLevelSettings();
+                }
+                input.ReadMessage(playerLevel_);
+                break;
+              }
+              case 106: {
+                if (gymLevel_ == null) {
+                  gymLevel_ = new global::POGOProtos.Settings.Master.GymLevelSettings();
+                }
+                input.ReadMessage(gymLevel_);
+                break;
+              }
+              case 114: {
+                if (battleSettings_ == null) {
+                  battleSettings_ = new global::POGOProtos.Settings.Master.GymBattleSettings();
+                }
+                input.ReadMessage(battleSettings_);
+                break;
+              }
+              case 122: {
+                if (encounterSettings_ == null) {
+                  encounterSettings_ = new global::POGOProtos.Settings.Master.EncounterSettings();
+                }
+                input.ReadMessage(encounterSettings_);
+                break;
+              }
+              case 130: {
+                if (iapItemDisplay_ == null) {
+                  iapItemDisplay_ = new global::POGOProtos.Settings.Master.IapItemDisplay();
+                }
+                input.ReadMessage(iapItemDisplay_);
+                break;
+              }
+              case 138: {
+                if (iapSettings_ == null) {
+                  iapSettings_ = new global::POGOProtos.Settings.Master.IapSettings();
+                }
+                input.ReadMessage(iapSettings_);
+                break;
+              }
+              case 146: {
+                if (pokemonUpgrades_ == null) {
+                  pokemonUpgrades_ = new global::POGOProtos.Settings.Master.PokemonUpgradeSettings();
+                }
+                input.ReadMessage(pokemonUpgrades_);
+                break;
+              }
+              case 154: {
+                if (equippedBadges_ == null) {
+                  equippedBadges_ = new global::POGOProtos.Settings.Master.EquippedBadgeSettings();
+                }
+                input.ReadMessage(equippedBadges_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetDownloadUrlsResponse : pb::IMessage<GetDownloadUrlsResponse> {
+    private static readonly pb::MessageParser<GetDownloadUrlsResponse> _parser = new pb::MessageParser<GetDownloadUrlsResponse>(() => new GetDownloadUrlsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetDownloadUrlsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsResponse(GetDownloadUrlsResponse other) : this() {
+      downloadUrls_ = other.downloadUrls_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetDownloadUrlsResponse Clone() {
+      return new GetDownloadUrlsResponse(this);
+    }
+
+    /// <summary>Field number for the "download_urls" field.</summary>
+    public const int DownloadUrlsFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.DownloadUrlEntry> _repeated_downloadUrls_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Data.DownloadUrlEntry.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.DownloadUrlEntry> downloadUrls_ = new pbc::RepeatedField<global::POGOProtos.Data.DownloadUrlEntry>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.DownloadUrlEntry> DownloadUrls {
+      get { return downloadUrls_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetDownloadUrlsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetDownloadUrlsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!downloadUrls_.Equals(other.downloadUrls_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= downloadUrls_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      downloadUrls_.WriteTo(output, _repeated_downloadUrls_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += downloadUrls_.CalculateSize(_repeated_downloadUrls_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetDownloadUrlsResponse other) {
+      if (other == null) {
+        return;
+      }
+      downloadUrls_.Add(other.downloadUrls_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            downloadUrls_.AddEntriesFrom(input, _repeated_downloadUrls_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CollectDailyBonusResponse : pb::IMessage<CollectDailyBonusResponse> {
+    private static readonly pb::MessageParser<CollectDailyBonusResponse> _parser = new pb::MessageParser<CollectDailyBonusResponse>(() => new CollectDailyBonusResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyBonusResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusResponse(CollectDailyBonusResponse other) : this() {
+      result_ = other.result_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyBonusResponse Clone() {
+      return new CollectDailyBonusResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyBonusResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyBonusResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyBonusResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.CollectDailyBonusResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CollectDailyBonusResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILURE")] Failure = 2,
+        [pbr::OriginalName("TOO_SOON")] TooSoon = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class DiskEncounterResponse : pb::IMessage<DiskEncounterResponse> {
+    private static readonly pb::MessageParser<DiskEncounterResponse> _parser = new pb::MessageParser<DiskEncounterResponse>(() => new DiskEncounterResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DiskEncounterResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[9]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterResponse(DiskEncounterResponse other) : this() {
+      result_ = other.result_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DiskEncounterResponse Clone() {
+      return new DiskEncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbabilityFieldNumber = 3;
+    private global::POGOProtos.Data.Capture.CaptureProbability captureProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureProbability CaptureProbability {
+      get { return captureProbability_; }
+      set {
+        captureProbability_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DiskEncounterResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DiskEncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(CaptureProbability, other.CaptureProbability)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DiskEncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.captureProbability_ != null) {
+        if (captureProbability_ == null) {
+          captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+        }
+        CaptureProbability.MergeFrom(other.CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.DiskEncounterResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 26: {
+            if (captureProbability_ == null) {
+              captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+            }
+            input.ReadMessage(captureProbability_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the DiskEncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNKNOWN")] Unknown = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("NOT_AVAILABLE")] NotAvailable = 2,
+        [pbr::OriginalName("NOT_IN_RANGE")] NotInRange = 3,
+        [pbr::OriginalName("ENCOUNTER_ALREADY_FINISHED")] EncounterAlreadyFinished = 4,
+        [pbr::OriginalName("POKEMON_INVENTORY_FULL")] PokemonInventoryFull = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetPlayerProfileResponse : pb::IMessage<GetPlayerProfileResponse> {
+    private static readonly pb::MessageParser<GetPlayerProfileResponse> _parser = new pb::MessageParser<GetPlayerProfileResponse>(() => new GetPlayerProfileResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerProfileResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[10]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileResponse(GetPlayerProfileResponse other) : this() {
+      result_ = other.result_;
+      startTime_ = other.startTime_;
+      badges_ = other.badges_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerProfileResponse Clone() {
+      return new GetPlayerProfileResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "start_time" field.</summary>
+    public const int StartTimeFieldNumber = 2;
+    private long startTime_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long StartTime {
+      get { return startTime_; }
+      set {
+        startTime_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "badges" field.</summary>
+    public const int BadgesFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.PlayerBadge> _repeated_badges_codec
+        = pb::FieldCodec.ForMessage(26, global::POGOProtos.Data.PlayerBadge.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.PlayerBadge> badges_ = new pbc::RepeatedField<global::POGOProtos.Data.PlayerBadge>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.PlayerBadge> Badges {
+      get { return badges_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerProfileResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerProfileResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (StartTime != other.StartTime) return false;
+      if(!badges_.Equals(other.badges_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (StartTime != 0L) hash ^= StartTime.GetHashCode();
+      hash ^= badges_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (StartTime != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(StartTime);
+      }
+      badges_.WriteTo(output, _repeated_badges_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (StartTime != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(StartTime);
+      }
+      size += badges_.CalculateSize(_repeated_badges_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerProfileResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.StartTime != 0L) {
+        StartTime = other.StartTime;
+      }
+      badges_.Add(other.badges_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.GetPlayerProfileResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            StartTime = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            badges_.AddEntriesFrom(input, _repeated_badges_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the GetPlayerProfileResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetMapObjectsResponse : pb::IMessage<GetMapObjectsResponse> {
+    private static readonly pb::MessageParser<GetMapObjectsResponse> _parser = new pb::MessageParser<GetMapObjectsResponse>(() => new GetMapObjectsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetMapObjectsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[11]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsResponse(GetMapObjectsResponse other) : this() {
+      mapCells_ = other.mapCells_.Clone();
+      status_ = other.status_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetMapObjectsResponse Clone() {
+      return new GetMapObjectsResponse(this);
+    }
+
+    /// <summary>Field number for the "map_cells" field.</summary>
+    public const int MapCellsFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.MapCell> _repeated_mapCells_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Map.MapCell.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.MapCell> mapCells_ = new pbc::RepeatedField<global::POGOProtos.Map.MapCell>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.MapCell> MapCells {
+      get { return mapCells_; }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 2;
+    private global::POGOProtos.Map.MapObjectsStatus status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.MapObjectsStatus Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetMapObjectsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetMapObjectsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!mapCells_.Equals(other.mapCells_)) return false;
+      if (Status != other.Status) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= mapCells_.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      mapCells_.WriteTo(output, _repeated_mapCells_codec);
+      if (Status != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Status);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += mapCells_.CalculateSize(_repeated_mapCells_codec);
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetMapObjectsResponse other) {
+      if (other == null) {
+        return;
+      }
+      mapCells_.Add(other.mapCells_);
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            mapCells_.AddEntriesFrom(input, _repeated_mapCells_codec);
+            break;
+          }
+          case 16: {
+            status_ = (global::POGOProtos.Map.MapObjectsStatus) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UseItemCaptureResponse : pb::IMessage<UseItemCaptureResponse> {
+    private static readonly pb::MessageParser<UseItemCaptureResponse> _parser = new pb::MessageParser<UseItemCaptureResponse>(() => new UseItemCaptureResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemCaptureResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[12]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureResponse(UseItemCaptureResponse other) : this() {
+      success_ = other.success_;
+      itemCaptureMult_ = other.itemCaptureMult_;
+      itemFleeMult_ = other.itemFleeMult_;
+      stopMovement_ = other.stopMovement_;
+      stopAttack_ = other.stopAttack_;
+      targetMax_ = other.targetMax_;
+      targetSlow_ = other.targetSlow_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureResponse Clone() {
+      return new UseItemCaptureResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_capture_mult" field.</summary>
+    public const int ItemCaptureMultFieldNumber = 2;
+    private double itemCaptureMult_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ItemCaptureMult {
+      get { return itemCaptureMult_; }
+      set {
+        itemCaptureMult_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_flee_mult" field.</summary>
+    public const int ItemFleeMultFieldNumber = 3;
+    private double itemFleeMult_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ItemFleeMult {
+      get { return itemFleeMult_; }
+      set {
+        itemFleeMult_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stop_movement" field.</summary>
+    public const int StopMovementFieldNumber = 4;
+    private bool stopMovement_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool StopMovement {
+      get { return stopMovement_; }
+      set {
+        stopMovement_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stop_attack" field.</summary>
+    public const int StopAttackFieldNumber = 5;
+    private bool stopAttack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool StopAttack {
+      get { return stopAttack_; }
+      set {
+        stopAttack_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_max" field.</summary>
+    public const int TargetMaxFieldNumber = 6;
+    private bool targetMax_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool TargetMax {
+      get { return targetMax_; }
+      set {
+        targetMax_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_slow" field.</summary>
+    public const int TargetSlowFieldNumber = 7;
+    private bool targetSlow_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool TargetSlow {
+      get { return targetSlow_; }
+      set {
+        targetSlow_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemCaptureResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemCaptureResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (ItemCaptureMult != other.ItemCaptureMult) return false;
+      if (ItemFleeMult != other.ItemFleeMult) return false;
+      if (StopMovement != other.StopMovement) return false;
+      if (StopAttack != other.StopAttack) return false;
+      if (TargetMax != other.TargetMax) return false;
+      if (TargetSlow != other.TargetSlow) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (ItemCaptureMult != 0D) hash ^= ItemCaptureMult.GetHashCode();
+      if (ItemFleeMult != 0D) hash ^= ItemFleeMult.GetHashCode();
+      if (StopMovement != false) hash ^= StopMovement.GetHashCode();
+      if (StopAttack != false) hash ^= StopAttack.GetHashCode();
+      if (TargetMax != false) hash ^= TargetMax.GetHashCode();
+      if (TargetSlow != false) hash ^= TargetSlow.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (ItemCaptureMult != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(ItemCaptureMult);
+      }
+      if (ItemFleeMult != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(ItemFleeMult);
+      }
+      if (StopMovement != false) {
+        output.WriteRawTag(32);
+        output.WriteBool(StopMovement);
+      }
+      if (StopAttack != false) {
+        output.WriteRawTag(40);
+        output.WriteBool(StopAttack);
+      }
+      if (TargetMax != false) {
+        output.WriteRawTag(48);
+        output.WriteBool(TargetMax);
+      }
+      if (TargetSlow != false) {
+        output.WriteRawTag(56);
+        output.WriteBool(TargetSlow);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (ItemCaptureMult != 0D) {
+        size += 1 + 8;
+      }
+      if (ItemFleeMult != 0D) {
+        size += 1 + 8;
+      }
+      if (StopMovement != false) {
+        size += 1 + 1;
+      }
+      if (StopAttack != false) {
+        size += 1 + 1;
+      }
+      if (TargetMax != false) {
+        size += 1 + 1;
+      }
+      if (TargetSlow != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemCaptureResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.ItemCaptureMult != 0D) {
+        ItemCaptureMult = other.ItemCaptureMult;
+      }
+      if (other.ItemFleeMult != 0D) {
+        ItemFleeMult = other.ItemFleeMult;
+      }
+      if (other.StopMovement != false) {
+        StopMovement = other.StopMovement;
+      }
+      if (other.StopAttack != false) {
+        StopAttack = other.StopAttack;
+      }
+      if (other.TargetMax != false) {
+        TargetMax = other.TargetMax;
+      }
+      if (other.TargetSlow != false) {
+        TargetSlow = other.TargetSlow;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 17: {
+            ItemCaptureMult = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            ItemFleeMult = input.ReadDouble();
+            break;
+          }
+          case 32: {
+            StopMovement = input.ReadBool();
+            break;
+          }
+          case 40: {
+            StopAttack = input.ReadBool();
+            break;
+          }
+          case 48: {
+            TargetMax = input.ReadBool();
+            break;
+          }
+          case 56: {
+            TargetSlow = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class AttackGymResponse : pb::IMessage<AttackGymResponse> {
+    private static readonly pb::MessageParser<AttackGymResponse> _parser = new pb::MessageParser<AttackGymResponse>(() => new AttackGymResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AttackGymResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[13]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymResponse(AttackGymResponse other) : this() {
+      result_ = other.result_;
+      BattleLog = other.battleLog_ != null ? other.BattleLog.Clone() : null;
+      battleId_ = other.battleId_;
+      ActiveDefender = other.activeDefender_ != null ? other.ActiveDefender.Clone() : null;
+      ActiveAttacker = other.activeAttacker_ != null ? other.ActiveAttacker.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AttackGymResponse Clone() {
+      return new AttackGymResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_log" field.</summary>
+    public const int BattleLogFieldNumber = 2;
+    private global::POGOProtos.Data.Battle.BattleLog battleLog_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleLog BattleLog {
+      get { return battleLog_; }
+      set {
+        battleLog_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_id" field.</summary>
+    public const int BattleIdFieldNumber = 3;
+    private string battleId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BattleId {
+      get { return battleId_; }
+      set {
+        battleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "active_defender" field.</summary>
+    public const int ActiveDefenderFieldNumber = 4;
+    private global::POGOProtos.Data.Battle.BattlePokemonInfo activeDefender_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattlePokemonInfo ActiveDefender {
+      get { return activeDefender_; }
+      set {
+        activeDefender_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "active_attacker" field.</summary>
+    public const int ActiveAttackerFieldNumber = 5;
+    private global::POGOProtos.Data.Battle.BattlePokemonInfo activeAttacker_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattlePokemonInfo ActiveAttacker {
+      get { return activeAttacker_; }
+      set {
+        activeAttacker_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AttackGymResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AttackGymResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(BattleLog, other.BattleLog)) return false;
+      if (BattleId != other.BattleId) return false;
+      if (!object.Equals(ActiveDefender, other.ActiveDefender)) return false;
+      if (!object.Equals(ActiveAttacker, other.ActiveAttacker)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (battleLog_ != null) hash ^= BattleLog.GetHashCode();
+      if (BattleId.Length != 0) hash ^= BattleId.GetHashCode();
+      if (activeDefender_ != null) hash ^= ActiveDefender.GetHashCode();
+      if (activeAttacker_ != null) hash ^= ActiveAttacker.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (battleLog_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(BattleLog);
+      }
+      if (BattleId.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(BattleId);
+      }
+      if (activeDefender_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(ActiveDefender);
+      }
+      if (activeAttacker_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(ActiveAttacker);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (battleLog_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleLog);
+      }
+      if (BattleId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BattleId);
+      }
+      if (activeDefender_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActiveDefender);
+      }
+      if (activeAttacker_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActiveAttacker);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AttackGymResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.battleLog_ != null) {
+        if (battleLog_ == null) {
+          battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+        }
+        BattleLog.MergeFrom(other.BattleLog);
+      }
+      if (other.BattleId.Length != 0) {
+        BattleId = other.BattleId;
+      }
+      if (other.activeDefender_ != null) {
+        if (activeDefender_ == null) {
+          activeDefender_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+        }
+        ActiveDefender.MergeFrom(other.ActiveDefender);
+      }
+      if (other.activeAttacker_ != null) {
+        if (activeAttacker_ == null) {
+          activeAttacker_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+        }
+        ActiveAttacker.MergeFrom(other.ActiveAttacker);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.AttackGymResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (battleLog_ == null) {
+              battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+            }
+            input.ReadMessage(battleLog_);
+            break;
+          }
+          case 26: {
+            BattleId = input.ReadString();
+            break;
+          }
+          case 34: {
+            if (activeDefender_ == null) {
+              activeDefender_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+            }
+            input.ReadMessage(activeDefender_);
+            break;
+          }
+          case 42: {
+            if (activeAttacker_ == null) {
+              activeAttacker_ = new global::POGOProtos.Data.Battle.BattlePokemonInfo();
+            }
+            input.ReadMessage(activeAttacker_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the AttackGymResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_ATTACK_ACTIONS")] ErrorInvalidAttackActions = 2,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class MarkTutorialCompleteResponse : pb::IMessage<MarkTutorialCompleteResponse> {
+    private static readonly pb::MessageParser<MarkTutorialCompleteResponse> _parser = new pb::MessageParser<MarkTutorialCompleteResponse>(() => new MarkTutorialCompleteResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MarkTutorialCompleteResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[14]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteResponse(MarkTutorialCompleteResponse other) : this() {
+      success_ = other.success_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MarkTutorialCompleteResponse Clone() {
+      return new MarkTutorialCompleteResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MarkTutorialCompleteResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MarkTutorialCompleteResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MarkTutorialCompleteResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SetContactSettingsResponse : pb::IMessage<SetContactSettingsResponse> {
+    private static readonly pb::MessageParser<SetContactSettingsResponse> _parser = new pb::MessageParser<SetContactSettingsResponse>(() => new SetContactSettingsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetContactSettingsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[15]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsResponse(SetContactSettingsResponse other) : this() {
+      status_ = other.status_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsResponse Clone() {
+      return new SetContactSettingsResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetContactSettingsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetContactSettingsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetContactSettingsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetContactSettingsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILURE")] Failure = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetIncensePokemonResponse : pb::IMessage<GetIncensePokemonResponse> {
+    private static readonly pb::MessageParser<GetIncensePokemonResponse> _parser = new pb::MessageParser<GetIncensePokemonResponse>(() => new GetIncensePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetIncensePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[16]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonResponse(GetIncensePokemonResponse other) : this() {
+      result_ = other.result_;
+      pokemonId_ = other.pokemonId_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      encounterLocation_ = other.encounterLocation_;
+      encounterId_ = other.encounterId_;
+      disappearTimestampMs_ = other.disappearTimestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetIncensePokemonResponse Clone() {
+      return new GetIncensePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 3;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 4;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_location" field.</summary>
+    public const int EncounterLocationFieldNumber = 5;
+    private string encounterLocation_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string EncounterLocation {
+      get { return encounterLocation_; }
+      set {
+        encounterLocation_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "encounter_id" field.</summary>
+    public const int EncounterIdFieldNumber = 6;
+    private ulong encounterId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong EncounterId {
+      get { return encounterId_; }
+      set {
+        encounterId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "disappear_timestamp_ms" field.</summary>
+    public const int DisappearTimestampMsFieldNumber = 7;
+    private long disappearTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long DisappearTimestampMs {
+      get { return disappearTimestampMs_; }
+      set {
+        disappearTimestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetIncensePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetIncensePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (PokemonId != other.PokemonId) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (EncounterLocation != other.EncounterLocation) return false;
+      if (EncounterId != other.EncounterId) return false;
+      if (DisappearTimestampMs != other.DisappearTimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (EncounterLocation.Length != 0) hash ^= EncounterLocation.GetHashCode();
+      if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+      if (DisappearTimestampMs != 0L) hash ^= DisappearTimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (PokemonId != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(Longitude);
+      }
+      if (EncounterLocation.Length != 0) {
+        output.WriteRawTag(42);
+        output.WriteString(EncounterLocation);
+      }
+      if (EncounterId != 0UL) {
+        output.WriteRawTag(49);
+        output.WriteFixed64(EncounterId);
+      }
+      if (DisappearTimestampMs != 0L) {
+        output.WriteRawTag(56);
+        output.WriteInt64(DisappearTimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (EncounterLocation.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(EncounterLocation);
+      }
+      if (EncounterId != 0UL) {
+        size += 1 + 8;
+      }
+      if (DisappearTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(DisappearTimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetIncensePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.EncounterLocation.Length != 0) {
+        EncounterLocation = other.EncounterLocation;
+      }
+      if (other.EncounterId != 0UL) {
+        EncounterId = other.EncounterId;
+      }
+      if (other.DisappearTimestampMs != 0L) {
+        DisappearTimestampMs = other.DisappearTimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.GetIncensePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 25: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 33: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 42: {
+            EncounterLocation = input.ReadString();
+            break;
+          }
+          case 49: {
+            EncounterId = input.ReadFixed64();
+            break;
+          }
+          case 56: {
+            DisappearTimestampMs = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the GetIncensePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("INCENSE_ENCOUNTER_UNKNOWN")] IncenseEncounterUnknown = 0,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_AVAILABLE")] IncenseEncounterAvailable = 1,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_NOT_AVAILABLE")] IncenseEncounterNotAvailable = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetPlayerResponse : pb::IMessage<GetPlayerResponse> {
+    private static readonly pb::MessageParser<GetPlayerResponse> _parser = new pb::MessageParser<GetPlayerResponse>(() => new GetPlayerResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetPlayerResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[17]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerResponse(GetPlayerResponse other) : this() {
+      success_ = other.success_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetPlayerResponse Clone() {
+      return new GetPlayerResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetPlayerResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetPlayerResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetPlayerResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EquipBadgeResponse : pb::IMessage<EquipBadgeResponse> {
+    private static readonly pb::MessageParser<EquipBadgeResponse> _parser = new pb::MessageParser<EquipBadgeResponse>(() => new EquipBadgeResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquipBadgeResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[18]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeResponse(EquipBadgeResponse other) : this() {
+      result_ = other.result_;
+      Equipped = other.equipped_ != null ? other.Equipped.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquipBadgeResponse Clone() {
+      return new EquipBadgeResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "equipped" field.</summary>
+    public const int EquippedFieldNumber = 2;
+    private global::POGOProtos.Data.Player.EquippedBadge equipped_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Player.EquippedBadge Equipped {
+      get { return equipped_; }
+      set {
+        equipped_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquipBadgeResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquipBadgeResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(Equipped, other.Equipped)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (equipped_ != null) hash ^= Equipped.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (equipped_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(Equipped);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (equipped_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Equipped);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquipBadgeResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.equipped_ != null) {
+        if (equipped_ == null) {
+          equipped_ = new global::POGOProtos.Data.Player.EquippedBadge();
+        }
+        Equipped.MergeFrom(other.Equipped);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.EquipBadgeResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (equipped_ == null) {
+              equipped_ = new global::POGOProtos.Data.Player.EquippedBadge();
+            }
+            input.ReadMessage(equipped_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EquipBadgeResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("COOLDOWN_ACTIVE")] CooldownActive = 2,
+        [pbr::OriginalName("NOT_QUALIFIED")] NotQualified = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class FortDeployPokemonResponse : pb::IMessage<FortDeployPokemonResponse> {
+    private static readonly pb::MessageParser<FortDeployPokemonResponse> _parser = new pb::MessageParser<FortDeployPokemonResponse>(() => new FortDeployPokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDeployPokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[19]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonResponse(FortDeployPokemonResponse other) : this() {
+      result_ = other.result_;
+      FortDetails = other.fortDetails_ != null ? other.FortDetails.Clone() : null;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      GymState = other.gymState_ != null ? other.GymState.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDeployPokemonResponse Clone() {
+      return new FortDeployPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_details" field.</summary>
+    public const int FortDetailsFieldNumber = 2;
+    private global::POGOProtos.Networking.Responses.FortDetailsResponse fortDetails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortDetailsResponse FortDetails {
+      get { return fortDetails_; }
+      set {
+        fortDetails_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 3;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "gym_state" field.</summary>
+    public const int GymStateFieldNumber = 4;
+    private global::POGOProtos.Data.Gym.GymState gymState_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Gym.GymState GymState {
+      get { return gymState_; }
+      set {
+        gymState_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDeployPokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDeployPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(FortDetails, other.FortDetails)) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(GymState, other.GymState)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (fortDetails_ != null) hash ^= FortDetails.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (gymState_ != null) hash ^= GymState.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (fortDetails_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(FortDetails);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PokemonData);
+      }
+      if (gymState_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(GymState);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (fortDetails_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortDetails);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (gymState_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymState);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDeployPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.fortDetails_ != null) {
+        if (fortDetails_ == null) {
+          fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+        }
+        FortDetails.MergeFrom(other.FortDetails);
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.gymState_ != null) {
+        if (gymState_ == null) {
+          gymState_ = new global::POGOProtos.Data.Gym.GymState();
+        }
+        GymState.MergeFrom(other.GymState);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.FortDeployPokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (fortDetails_ == null) {
+              fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+            }
+            input.ReadMessage(fortDetails_);
+            break;
+          }
+          case 26: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 34: {
+            if (gymState_ == null) {
+              gymState_ = new global::POGOProtos.Data.Gym.GymState();
+            }
+            input.ReadMessage(gymState_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortDeployPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("NO_RESULT_SET")] NoResultSet = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_ALREADY_HAS_POKEMON_ON_FORT")] ErrorAlreadyHasPokemonOnFort = 2,
+        [pbr::OriginalName("ERROR_OPPOSING_TEAM_OWNS_FORT")] ErrorOpposingTeamOwnsFort = 3,
+        [pbr::OriginalName("ERROR_FORT_IS_FULL")] ErrorFortIsFull = 4,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 5,
+        [pbr::OriginalName("ERROR_PLAYER_HAS_NO_TEAM")] ErrorPlayerHasNoTeam = 6,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FULL_HP")] ErrorPokemonNotFullHp = 7,
+        [pbr::OriginalName("ERROR_PLAYER_BELOW_MINIMUM_LEVEL")] ErrorPlayerBelowMinimumLevel = 8,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetSuggestedCodenamesResponse : pb::IMessage<GetSuggestedCodenamesResponse> {
+    private static readonly pb::MessageParser<GetSuggestedCodenamesResponse> _parser = new pb::MessageParser<GetSuggestedCodenamesResponse>(() => new GetSuggestedCodenamesResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetSuggestedCodenamesResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[20]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesResponse(GetSuggestedCodenamesResponse other) : this() {
+      codenames_ = other.codenames_.Clone();
+      success_ = other.success_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetSuggestedCodenamesResponse Clone() {
+      return new GetSuggestedCodenamesResponse(this);
+    }
+
+    /// <summary>Field number for the "codenames" field.</summary>
+    public const int CodenamesFieldNumber = 1;
+    private static readonly pb::FieldCodec<string> _repeated_codenames_codec
+        = pb::FieldCodec.ForString(10);
+    private readonly pbc::RepeatedField<string> codenames_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> Codenames {
+      get { return codenames_; }
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 2;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetSuggestedCodenamesResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetSuggestedCodenamesResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!codenames_.Equals(other.codenames_)) return false;
+      if (Success != other.Success) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= codenames_.GetHashCode();
+      if (Success != false) hash ^= Success.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      codenames_.WriteTo(output, _repeated_codenames_codec);
+      if (Success != false) {
+        output.WriteRawTag(16);
+        output.WriteBool(Success);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += codenames_.CalculateSize(_repeated_codenames_codec);
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetSuggestedCodenamesResponse other) {
+      if (other == null) {
+        return;
+      }
+      codenames_.Add(other.codenames_);
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            codenames_.AddEntriesFrom(input, _repeated_codenames_codec);
+            break;
+          }
+          case 16: {
+            Success = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortSearchResponse : pb::IMessage<FortSearchResponse> {
+    private static readonly pb::MessageParser<FortSearchResponse> _parser = new pb::MessageParser<FortSearchResponse>(() => new FortSearchResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSearchResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[21]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchResponse(FortSearchResponse other) : this() {
+      result_ = other.result_;
+      itemsAwarded_ = other.itemsAwarded_.Clone();
+      gemsAwarded_ = other.gemsAwarded_;
+      PokemonDataEgg = other.pokemonDataEgg_ != null ? other.PokemonDataEgg.Clone() : null;
+      experienceAwarded_ = other.experienceAwarded_;
+      cooldownCompleteTimestampMs_ = other.cooldownCompleteTimestampMs_;
+      chainHackSequenceNumber_ = other.chainHackSequenceNumber_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSearchResponse Clone() {
+      return new FortSearchResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "items_awarded" field.</summary>
+    public const int ItemsAwardedFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemAward> _repeated_itemsAwarded_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Inventory.Item.ItemAward.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> itemsAwarded_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> ItemsAwarded {
+      get { return itemsAwarded_; }
+    }
+
+    /// <summary>Field number for the "gems_awarded" field.</summary>
+    public const int GemsAwardedFieldNumber = 3;
+    private int gemsAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GemsAwarded {
+      get { return gemsAwarded_; }
+      set {
+        gemsAwarded_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data_egg" field.</summary>
+    public const int PokemonDataEggFieldNumber = 4;
+    private global::POGOProtos.Data.PokemonData pokemonDataEgg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonDataEgg {
+      get { return pokemonDataEgg_; }
+      set {
+        pokemonDataEgg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "experience_awarded" field.</summary>
+    public const int ExperienceAwardedFieldNumber = 5;
+    private int experienceAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ExperienceAwarded {
+      get { return experienceAwarded_; }
+      set {
+        experienceAwarded_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cooldown_complete_timestamp_ms" field.</summary>
+    public const int CooldownCompleteTimestampMsFieldNumber = 6;
+    private long cooldownCompleteTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long CooldownCompleteTimestampMs {
+      get { return cooldownCompleteTimestampMs_; }
+      set {
+        cooldownCompleteTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "chain_hack_sequence_number" field.</summary>
+    public const int ChainHackSequenceNumberFieldNumber = 7;
+    private int chainHackSequenceNumber_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ChainHackSequenceNumber {
+      get { return chainHackSequenceNumber_; }
+      set {
+        chainHackSequenceNumber_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSearchResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSearchResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!itemsAwarded_.Equals(other.itemsAwarded_)) return false;
+      if (GemsAwarded != other.GemsAwarded) return false;
+      if (!object.Equals(PokemonDataEgg, other.PokemonDataEgg)) return false;
+      if (ExperienceAwarded != other.ExperienceAwarded) return false;
+      if (CooldownCompleteTimestampMs != other.CooldownCompleteTimestampMs) return false;
+      if (ChainHackSequenceNumber != other.ChainHackSequenceNumber) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= itemsAwarded_.GetHashCode();
+      if (GemsAwarded != 0) hash ^= GemsAwarded.GetHashCode();
+      if (pokemonDataEgg_ != null) hash ^= PokemonDataEgg.GetHashCode();
+      if (ExperienceAwarded != 0) hash ^= ExperienceAwarded.GetHashCode();
+      if (CooldownCompleteTimestampMs != 0L) hash ^= CooldownCompleteTimestampMs.GetHashCode();
+      if (ChainHackSequenceNumber != 0) hash ^= ChainHackSequenceNumber.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      itemsAwarded_.WriteTo(output, _repeated_itemsAwarded_codec);
+      if (GemsAwarded != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(GemsAwarded);
+      }
+      if (pokemonDataEgg_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(PokemonDataEgg);
+      }
+      if (ExperienceAwarded != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(ExperienceAwarded);
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        output.WriteRawTag(48);
+        output.WriteInt64(CooldownCompleteTimestampMs);
+      }
+      if (ChainHackSequenceNumber != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(ChainHackSequenceNumber);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += itemsAwarded_.CalculateSize(_repeated_itemsAwarded_codec);
+      if (GemsAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GemsAwarded);
+      }
+      if (pokemonDataEgg_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonDataEgg);
+      }
+      if (ExperienceAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ExperienceAwarded);
+      }
+      if (CooldownCompleteTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(CooldownCompleteTimestampMs);
+      }
+      if (ChainHackSequenceNumber != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ChainHackSequenceNumber);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSearchResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      itemsAwarded_.Add(other.itemsAwarded_);
+      if (other.GemsAwarded != 0) {
+        GemsAwarded = other.GemsAwarded;
+      }
+      if (other.pokemonDataEgg_ != null) {
+        if (pokemonDataEgg_ == null) {
+          pokemonDataEgg_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonDataEgg.MergeFrom(other.PokemonDataEgg);
+      }
+      if (other.ExperienceAwarded != 0) {
+        ExperienceAwarded = other.ExperienceAwarded;
+      }
+      if (other.CooldownCompleteTimestampMs != 0L) {
+        CooldownCompleteTimestampMs = other.CooldownCompleteTimestampMs;
+      }
+      if (other.ChainHackSequenceNumber != 0) {
+        ChainHackSequenceNumber = other.ChainHackSequenceNumber;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.FortSearchResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            itemsAwarded_.AddEntriesFrom(input, _repeated_itemsAwarded_codec);
+            break;
+          }
+          case 24: {
+            GemsAwarded = input.ReadInt32();
+            break;
+          }
+          case 34: {
+            if (pokemonDataEgg_ == null) {
+              pokemonDataEgg_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonDataEgg_);
+            break;
+          }
+          case 40: {
+            ExperienceAwarded = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            CooldownCompleteTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 56: {
+            ChainHackSequenceNumber = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortSearchResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("NO_RESULT_SET")] NoResultSet = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("OUT_OF_RANGE")] OutOfRange = 2,
+        [pbr::OriginalName("IN_COOLDOWN_PERIOD")] InCooldownPeriod = 3,
+        [pbr::OriginalName("INVENTORY_FULL")] InventoryFull = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class SetAvatarResponse : pb::IMessage<SetAvatarResponse> {
+    private static readonly pb::MessageParser<SetAvatarResponse> _parser = new pb::MessageParser<SetAvatarResponse>(() => new SetAvatarResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetAvatarResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[22]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarResponse(SetAvatarResponse other) : this() {
+      status_ = other.status_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarResponse Clone() {
+      return new SetAvatarResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetAvatarResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetAvatarResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetAvatarResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetAvatarResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("AVATAR_ALREADY_SET")] AvatarAlreadySet = 2,
+        [pbr::OriginalName("FAILURE")] Failure = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class EncounterResponse : pb::IMessage<EncounterResponse> {
+    private static readonly pb::MessageParser<EncounterResponse> _parser = new pb::MessageParser<EncounterResponse>(() => new EncounterResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[23]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterResponse(EncounterResponse other) : this() {
+      WildPokemon = other.wildPokemon_ != null ? other.WildPokemon.Clone() : null;
+      background_ = other.background_;
+      status_ = other.status_;
+      CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterResponse Clone() {
+      return new EncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "wild_pokemon" field.</summary>
+    public const int WildPokemonFieldNumber = 1;
+    private global::POGOProtos.Map.Pokemon.WildPokemon wildPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Pokemon.WildPokemon WildPokemon {
+      get { return wildPokemon_; }
+      set {
+        wildPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "background" field.</summary>
+    public const int BackgroundFieldNumber = 2;
+    private global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background background_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background Background {
+      get { return background_; }
+      set {
+        background_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 3;
+    private global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbabilityFieldNumber = 4;
+    private global::POGOProtos.Data.Capture.CaptureProbability captureProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureProbability CaptureProbability {
+      get { return captureProbability_; }
+      set {
+        captureProbability_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(WildPokemon, other.WildPokemon)) return false;
+      if (Background != other.Background) return false;
+      if (Status != other.Status) return false;
+      if (!object.Equals(CaptureProbability, other.CaptureProbability)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (wildPokemon_ != null) hash ^= WildPokemon.GetHashCode();
+      if (Background != 0) hash ^= Background.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (wildPokemon_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(WildPokemon);
+      }
+      if (Background != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Background);
+      }
+      if (Status != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) Status);
+      }
+      if (captureProbability_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (wildPokemon_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(WildPokemon);
+      }
+      if (Background != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Background);
+      }
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (captureProbability_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.wildPokemon_ != null) {
+        if (wildPokemon_ == null) {
+          wildPokemon_ = new global::POGOProtos.Map.Pokemon.WildPokemon();
+        }
+        WildPokemon.MergeFrom(other.WildPokemon);
+      }
+      if (other.Background != 0) {
+        Background = other.Background;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.captureProbability_ != null) {
+        if (captureProbability_ == null) {
+          captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+        }
+        CaptureProbability.MergeFrom(other.CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (wildPokemon_ == null) {
+              wildPokemon_ = new global::POGOProtos.Map.Pokemon.WildPokemon();
+            }
+            input.ReadMessage(wildPokemon_);
+            break;
+          }
+          case 16: {
+            background_ = (global::POGOProtos.Networking.Responses.EncounterResponse.Types.Background) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            status_ = (global::POGOProtos.Networking.Responses.EncounterResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 34: {
+            if (captureProbability_ == null) {
+              captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+            }
+            input.ReadMessage(captureProbability_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Background {
+        [pbr::OriginalName("PARK")] Park = 0,
+        [pbr::OriginalName("DESERT")] Desert = 1,
+      }
+
+      public enum Status {
+        [pbr::OriginalName("ENCOUNTER_ERROR")] EncounterError = 0,
+        [pbr::OriginalName("ENCOUNTER_SUCCESS")] EncounterSuccess = 1,
+        [pbr::OriginalName("ENCOUNTER_NOT_FOUND")] EncounterNotFound = 2,
+        [pbr::OriginalName("ENCOUNTER_CLOSED")] EncounterClosed = 3,
+        [pbr::OriginalName("ENCOUNTER_POKEMON_FLED")] EncounterPokemonFled = 4,
+        [pbr::OriginalName("ENCOUNTER_NOT_IN_RANGE")] EncounterNotInRange = 5,
+        [pbr::OriginalName("ENCOUNTER_ALREADY_HAPPENED")] EncounterAlreadyHappened = 6,
+        [pbr::OriginalName("POKEMON_INVENTORY_FULL")] PokemonInventoryFull = 7,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class UseItemReviveResponse : pb::IMessage<UseItemReviveResponse> {
+    private static readonly pb::MessageParser<UseItemReviveResponse> _parser = new pb::MessageParser<UseItemReviveResponse>(() => new UseItemReviveResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemReviveResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[24]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveResponse(UseItemReviveResponse other) : this() {
+      result_ = other.result_;
+      stamina_ = other.stamina_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveResponse Clone() {
+      return new UseItemReviveResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 2;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemReviveResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemReviveResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (Stamina != other.Stamina) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Stamina);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemReviveResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemReviveResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NO_POKEMON")] ErrorNoPokemon = 2,
+        [pbr::OriginalName("ERROR_CANNOT_USE")] ErrorCannotUse = 3,
+        [pbr::OriginalName("ERROR_DEPLOYED_TO_FORT")] ErrorDeployedToFort = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class CheckAwardedBadgesResponse : pb::IMessage<CheckAwardedBadgesResponse> {
+    private static readonly pb::MessageParser<CheckAwardedBadgesResponse> _parser = new pb::MessageParser<CheckAwardedBadgesResponse>(() => new CheckAwardedBadgesResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckAwardedBadgesResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[25]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesResponse(CheckAwardedBadgesResponse other) : this() {
+      success_ = other.success_;
+      awardedBadges_ = other.awardedBadges_.Clone();
+      awardedBadgeLevels_ = other.awardedBadgeLevels_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckAwardedBadgesResponse Clone() {
+      return new CheckAwardedBadgesResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "awarded_badges" field.</summary>
+    public const int AwardedBadgesFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.BadgeType> _repeated_awardedBadges_codec
+        = pb::FieldCodec.ForEnum(18, x => (int) x, x => (global::POGOProtos.Enums.BadgeType) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.BadgeType> awardedBadges_ = new pbc::RepeatedField<global::POGOProtos.Enums.BadgeType>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.BadgeType> AwardedBadges {
+      get { return awardedBadges_; }
+    }
+
+    /// <summary>Field number for the "awarded_badge_levels" field.</summary>
+    public const int AwardedBadgeLevelsFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_awardedBadgeLevels_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> awardedBadgeLevels_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> AwardedBadgeLevels {
+      get { return awardedBadgeLevels_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckAwardedBadgesResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckAwardedBadgesResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if(!awardedBadges_.Equals(other.awardedBadges_)) return false;
+      if(!awardedBadgeLevels_.Equals(other.awardedBadgeLevels_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      hash ^= awardedBadges_.GetHashCode();
+      hash ^= awardedBadgeLevels_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      awardedBadges_.WriteTo(output, _repeated_awardedBadges_codec);
+      awardedBadgeLevels_.WriteTo(output, _repeated_awardedBadgeLevels_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      size += awardedBadges_.CalculateSize(_repeated_awardedBadges_codec);
+      size += awardedBadgeLevels_.CalculateSize(_repeated_awardedBadgeLevels_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckAwardedBadgesResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      awardedBadges_.Add(other.awardedBadges_);
+      awardedBadgeLevels_.Add(other.awardedBadgeLevels_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18:
+          case 16: {
+            awardedBadges_.AddEntriesFrom(input, _repeated_awardedBadges_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            awardedBadgeLevels_.AddEntriesFrom(input, _repeated_awardedBadgeLevels_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ClaimCodenameResponse : pb::IMessage<ClaimCodenameResponse> {
+    private static readonly pb::MessageParser<ClaimCodenameResponse> _parser = new pb::MessageParser<ClaimCodenameResponse>(() => new ClaimCodenameResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ClaimCodenameResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[26]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameResponse(ClaimCodenameResponse other) : this() {
+      codename_ = other.codename_;
+      userMessage_ = other.userMessage_;
+      isAssignable_ = other.isAssignable_;
+      status_ = other.status_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ClaimCodenameResponse Clone() {
+      return new ClaimCodenameResponse(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "user_message" field.</summary>
+    public const int UserMessageFieldNumber = 2;
+    private string userMessage_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string UserMessage {
+      get { return userMessage_; }
+      set {
+        userMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "is_assignable" field.</summary>
+    public const int IsAssignableFieldNumber = 3;
+    private bool isAssignable_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsAssignable {
+      get { return isAssignable_; }
+      set {
+        isAssignable_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 4;
+    private global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ClaimCodenameResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ClaimCodenameResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      if (UserMessage != other.UserMessage) return false;
+      if (IsAssignable != other.IsAssignable) return false;
+      if (Status != other.Status) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      if (UserMessage.Length != 0) hash ^= UserMessage.GetHashCode();
+      if (IsAssignable != false) hash ^= IsAssignable.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(UserMessage);
+      }
+      if (IsAssignable != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(IsAssignable);
+      }
+      if (Status != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Status);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(UserMessage);
+      }
+      if (IsAssignable != false) {
+        size += 1 + 1;
+      }
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ClaimCodenameResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+      if (other.UserMessage.Length != 0) {
+        UserMessage = other.UserMessage;
+      }
+      if (other.IsAssignable != false) {
+        IsAssignable = other.IsAssignable;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+          case 18: {
+            UserMessage = input.ReadString();
+            break;
+          }
+          case 24: {
+            IsAssignable = input.ReadBool();
+            break;
+          }
+          case 32: {
+            status_ = (global::POGOProtos.Networking.Responses.ClaimCodenameResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the ClaimCodenameResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("CODENAME_NOT_AVAILABLE")] CodenameNotAvailable = 2,
+        [pbr::OriginalName("CODENAME_NOT_VALID")] CodenameNotValid = 3,
+        [pbr::OriginalName("CURRENT_OWNER")] CurrentOwner = 4,
+        [pbr::OriginalName("CODENAME_CHANGE_NOT_ALLOWED")] CodenameChangeNotAllowed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class UseItemGymResponse : pb::IMessage<UseItemGymResponse> {
+    private static readonly pb::MessageParser<UseItemGymResponse> _parser = new pb::MessageParser<UseItemGymResponse>(() => new UseItemGymResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemGymResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[27]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymResponse(UseItemGymResponse other) : this() {
+      result_ = other.result_;
+      updatedGp_ = other.updatedGp_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymResponse Clone() {
+      return new UseItemGymResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "updated_gp" field.</summary>
+    public const int UpdatedGpFieldNumber = 2;
+    private long updatedGp_;
+    /// <summary>
+    ///  Gym Points (?)
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long UpdatedGp {
+      get { return updatedGp_; }
+      set {
+        updatedGp_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemGymResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemGymResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (UpdatedGp != other.UpdatedGp) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (UpdatedGp != 0L) hash ^= UpdatedGp.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (UpdatedGp != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(UpdatedGp);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (UpdatedGp != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(UpdatedGp);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemGymResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.UpdatedGp != 0L) {
+        UpdatedGp = other.UpdatedGp;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            UpdatedGp = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemGymResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_CANNOT_USE")] ErrorCannotUse = 2,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  /// <summary>
+  ///  Initialized by assist.py
+  /// </summary>
+  public sealed partial class AddFortModifierResponse : pb::IMessage<AddFortModifierResponse> {
+    private static readonly pb::MessageParser<AddFortModifierResponse> _parser = new pb::MessageParser<AddFortModifierResponse>(() => new AddFortModifierResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<AddFortModifierResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[28]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierResponse(AddFortModifierResponse other) : this() {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public AddFortModifierResponse Clone() {
+      return new AddFortModifierResponse(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as AddFortModifierResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(AddFortModifierResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(AddFortModifierResponse other) {
+      if (other == null) {
+        return;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CheckCodenameAvailableResponse : pb::IMessage<CheckCodenameAvailableResponse> {
+    private static readonly pb::MessageParser<CheckCodenameAvailableResponse> _parser = new pb::MessageParser<CheckCodenameAvailableResponse>(() => new CheckCodenameAvailableResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CheckCodenameAvailableResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[29]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableResponse(CheckCodenameAvailableResponse other) : this() {
+      codename_ = other.codename_;
+      userMessage_ = other.userMessage_;
+      isAssignable_ = other.isAssignable_;
+      status_ = other.status_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CheckCodenameAvailableResponse Clone() {
+      return new CheckCodenameAvailableResponse(this);
+    }
+
+    /// <summary>Field number for the "codename" field.</summary>
+    public const int CodenameFieldNumber = 1;
+    private string codename_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Codename {
+      get { return codename_; }
+      set {
+        codename_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "user_message" field.</summary>
+    public const int UserMessageFieldNumber = 2;
+    private string userMessage_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string UserMessage {
+      get { return userMessage_; }
+      set {
+        userMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "is_assignable" field.</summary>
+    public const int IsAssignableFieldNumber = 3;
+    private bool isAssignable_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool IsAssignable {
+      get { return isAssignable_; }
+      set {
+        isAssignable_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 4;
+    private global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CheckCodenameAvailableResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CheckCodenameAvailableResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Codename != other.Codename) return false;
+      if (UserMessage != other.UserMessage) return false;
+      if (IsAssignable != other.IsAssignable) return false;
+      if (Status != other.Status) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Codename.Length != 0) hash ^= Codename.GetHashCode();
+      if (UserMessage.Length != 0) hash ^= UserMessage.GetHashCode();
+      if (IsAssignable != false) hash ^= IsAssignable.GetHashCode();
+      if (Status != 0) hash ^= Status.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Codename.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(UserMessage);
+      }
+      if (IsAssignable != false) {
+        output.WriteRawTag(24);
+        output.WriteBool(IsAssignable);
+      }
+      if (Status != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Status);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Codename.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Codename);
+      }
+      if (UserMessage.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(UserMessage);
+      }
+      if (IsAssignable != false) {
+        size += 1 + 1;
+      }
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CheckCodenameAvailableResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Codename.Length != 0) {
+        Codename = other.Codename;
+      }
+      if (other.UserMessage.Length != 0) {
+        UserMessage = other.UserMessage;
+      }
+      if (other.IsAssignable != false) {
+        IsAssignable = other.IsAssignable;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Codename = input.ReadString();
+            break;
+          }
+          case 18: {
+            UserMessage = input.ReadString();
+            break;
+          }
+          case 24: {
+            IsAssignable = input.ReadBool();
+            break;
+          }
+          case 32: {
+            status_ = (global::POGOProtos.Networking.Responses.CheckCodenameAvailableResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CheckCodenameAvailableResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("CODENAME_NOT_AVAILABLE")] CodenameNotAvailable = 2,
+        [pbr::OriginalName("CODENAME_NOT_VALID")] CodenameNotValid = 3,
+        [pbr::OriginalName("CURRENT_OWNER")] CurrentOwner = 4,
+        [pbr::OriginalName("CODENAME_CHANGE_NOT_ALLOWED")] CodenameChangeNotAllowed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class EchoResponse : pb::IMessage<EchoResponse> {
+    private static readonly pb::MessageParser<EchoResponse> _parser = new pb::MessageParser<EchoResponse>(() => new EchoResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EchoResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[30]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoResponse(EchoResponse other) : this() {
+      context_ = other.context_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EchoResponse Clone() {
+      return new EchoResponse(this);
+    }
+
+    /// <summary>Field number for the "context" field.</summary>
+    public const int ContextFieldNumber = 1;
+    private string context_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Context {
+      get { return context_; }
+      set {
+        context_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EchoResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EchoResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Context != other.Context) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Context.Length != 0) hash ^= Context.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Context.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Context);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Context.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Context);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EchoResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Context.Length != 0) {
+        Context = other.Context;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Context = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerUpdateResponse : pb::IMessage<PlayerUpdateResponse> {
+    private static readonly pb::MessageParser<PlayerUpdateResponse> _parser = new pb::MessageParser<PlayerUpdateResponse>(() => new PlayerUpdateResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerUpdateResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[31]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateResponse(PlayerUpdateResponse other) : this() {
+      wildPokemons_ = other.wildPokemons_.Clone();
+      forts_ = other.forts_.Clone();
+      fortsNearby_ = other.fortsNearby_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateResponse Clone() {
+      return new PlayerUpdateResponse(this);
+    }
+
+    /// <summary>Field number for the "wild_pokemons" field.</summary>
+    public const int WildPokemonsFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.WildPokemon> _repeated_wildPokemons_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Map.Pokemon.WildPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> wildPokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> WildPokemons {
+      get { return wildPokemons_; }
+    }
+
+    /// <summary>Field number for the "forts" field.</summary>
+    public const int FortsFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortData> _repeated_forts_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Map.Fort.FortData.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> forts_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> Forts {
+      get { return forts_; }
+    }
+
+    /// <summary>Field number for the "forts_nearby" field.</summary>
+    public const int FortsNearbyFieldNumber = 3;
+    private int fortsNearby_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int FortsNearby {
+      get { return fortsNearby_; }
+      set {
+        fortsNearby_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerUpdateResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerUpdateResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!wildPokemons_.Equals(other.wildPokemons_)) return false;
+      if(!forts_.Equals(other.forts_)) return false;
+      if (FortsNearby != other.FortsNearby) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= wildPokemons_.GetHashCode();
+      hash ^= forts_.GetHashCode();
+      if (FortsNearby != 0) hash ^= FortsNearby.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      wildPokemons_.WriteTo(output, _repeated_wildPokemons_codec);
+      forts_.WriteTo(output, _repeated_forts_codec);
+      if (FortsNearby != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(FortsNearby);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += wildPokemons_.CalculateSize(_repeated_wildPokemons_codec);
+      size += forts_.CalculateSize(_repeated_forts_codec);
+      if (FortsNearby != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(FortsNearby);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerUpdateResponse other) {
+      if (other == null) {
+        return;
+      }
+      wildPokemons_.Add(other.wildPokemons_);
+      forts_.Add(other.forts_);
+      if (other.FortsNearby != 0) {
+        FortsNearby = other.FortsNearby;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            wildPokemons_.AddEntriesFrom(input, _repeated_wildPokemons_codec);
+            break;
+          }
+          case 18: {
+            forts_.AddEntriesFrom(input, _repeated_forts_codec);
+            break;
+          }
+          case 24: {
+            FortsNearby = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class UpgradePokemonResponse : pb::IMessage<UpgradePokemonResponse> {
+    private static readonly pb::MessageParser<UpgradePokemonResponse> _parser = new pb::MessageParser<UpgradePokemonResponse>(() => new UpgradePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UpgradePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[32]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonResponse(UpgradePokemonResponse other) : this() {
+      result_ = other.result_;
+      UpgradedPokemon = other.upgradedPokemon_ != null ? other.UpgradedPokemon.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonResponse Clone() {
+      return new UpgradePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "upgraded_pokemon" field.</summary>
+    public const int UpgradedPokemonFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData upgradedPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData UpgradedPokemon {
+      get { return upgradedPokemon_; }
+      set {
+        upgradedPokemon_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UpgradePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UpgradePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(UpgradedPokemon, other.UpgradedPokemon)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (upgradedPokemon_ != null) hash ^= UpgradedPokemon.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (upgradedPokemon_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(UpgradedPokemon);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (upgradedPokemon_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(UpgradedPokemon);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UpgradePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.upgradedPokemon_ != null) {
+        if (upgradedPokemon_ == null) {
+          upgradedPokemon_ = new global::POGOProtos.Data.PokemonData();
+        }
+        UpgradedPokemon.MergeFrom(other.UpgradedPokemon);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (upgradedPokemon_ == null) {
+              upgradedPokemon_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(upgradedPokemon_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UpgradePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FOUND")] ErrorPokemonNotFound = 2,
+        [pbr::OriginalName("ERROR_INSUFFICIENT_RESOURCES")] ErrorInsufficientResources = 3,
+        [pbr::OriginalName("ERROR_UPGRADE_NOT_AVAILABLE")] ErrorUpgradeNotAvailable = 4,
+        [pbr::OriginalName("ERROR_POKEMON_IS_DEPLOYED")] ErrorPokemonIsDeployed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class CatchPokemonResponse : pb::IMessage<CatchPokemonResponse> {
+    private static readonly pb::MessageParser<CatchPokemonResponse> _parser = new pb::MessageParser<CatchPokemonResponse>(() => new CatchPokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CatchPokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[33]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonResponse(CatchPokemonResponse other) : this() {
+      status_ = other.status_;
+      missPercent_ = other.missPercent_;
+      capturedPokemonId_ = other.capturedPokemonId_;
+      CaptureAward = other.captureAward_ != null ? other.CaptureAward.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CatchPokemonResponse Clone() {
+      return new CatchPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "miss_percent" field.</summary>
+    public const int MissPercentFieldNumber = 2;
+    private double missPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double MissPercent {
+      get { return missPercent_; }
+      set {
+        missPercent_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "captured_pokemon_id" field.</summary>
+    public const int CapturedPokemonIdFieldNumber = 3;
+    private ulong capturedPokemonId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong CapturedPokemonId {
+      get { return capturedPokemonId_; }
+      set {
+        capturedPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_award" field.</summary>
+    public const int CaptureAwardFieldNumber = 4;
+    private global::POGOProtos.Data.Capture.CaptureAward captureAward_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureAward CaptureAward {
+      get { return captureAward_; }
+      set {
+        captureAward_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CatchPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (MissPercent != other.MissPercent) return false;
+      if (CapturedPokemonId != other.CapturedPokemonId) return false;
+      if (!object.Equals(CaptureAward, other.CaptureAward)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (MissPercent != 0D) hash ^= MissPercent.GetHashCode();
+      if (CapturedPokemonId != 0UL) hash ^= CapturedPokemonId.GetHashCode();
+      if (captureAward_ != null) hash ^= CaptureAward.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (MissPercent != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(MissPercent);
+      }
+      if (CapturedPokemonId != 0UL) {
+        output.WriteRawTag(25);
+        output.WriteFixed64(CapturedPokemonId);
+      }
+      if (captureAward_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (MissPercent != 0D) {
+        size += 1 + 8;
+      }
+      if (CapturedPokemonId != 0UL) {
+        size += 1 + 8;
+      }
+      if (captureAward_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureAward);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CatchPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.MissPercent != 0D) {
+        MissPercent = other.MissPercent;
+      }
+      if (other.CapturedPokemonId != 0UL) {
+        CapturedPokemonId = other.CapturedPokemonId;
+      }
+      if (other.captureAward_ != null) {
+        if (captureAward_ == null) {
+          captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+        }
+        CaptureAward.MergeFrom(other.CaptureAward);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.CatchPokemonResponse.Types.CatchStatus) input.ReadEnum();
+            break;
+          }
+          case 17: {
+            MissPercent = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            CapturedPokemonId = input.ReadFixed64();
+            break;
+          }
+          case 34: {
+            if (captureAward_ == null) {
+              captureAward_ = new global::POGOProtos.Data.Capture.CaptureAward();
+            }
+            input.ReadMessage(captureAward_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CatchPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum CatchStatus {
+        [pbr::OriginalName("CATCH_ERROR")] CatchError = 0,
+        [pbr::OriginalName("CATCH_SUCCESS")] CatchSuccess = 1,
+        [pbr::OriginalName("CATCH_ESCAPE")] CatchEscape = 2,
+        [pbr::OriginalName("CATCH_FLEE")] CatchFlee = 3,
+        [pbr::OriginalName("CATCH_MISSED")] CatchMissed = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class StartGymBattleResponse : pb::IMessage<StartGymBattleResponse> {
+    private static readonly pb::MessageParser<StartGymBattleResponse> _parser = new pb::MessageParser<StartGymBattleResponse>(() => new StartGymBattleResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<StartGymBattleResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[34]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleResponse(StartGymBattleResponse other) : this() {
+      result_ = other.result_;
+      battleStartTimestampMs_ = other.battleStartTimestampMs_;
+      battleEndTimestampMs_ = other.battleEndTimestampMs_;
+      battleId_ = other.battleId_;
+      Defender = other.defender_ != null ? other.Defender.Clone() : null;
+      BattleLog = other.battleLog_ != null ? other.BattleLog.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleResponse Clone() {
+      return new StartGymBattleResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_start_timestamp_ms" field.</summary>
+    public const int BattleStartTimestampMsFieldNumber = 2;
+    private long battleStartTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleStartTimestampMs {
+      get { return battleStartTimestampMs_; }
+      set {
+        battleStartTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_end_timestamp_ms" field.</summary>
+    public const int BattleEndTimestampMsFieldNumber = 3;
+    private long battleEndTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleEndTimestampMs {
+      get { return battleEndTimestampMs_; }
+      set {
+        battleEndTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_id" field.</summary>
+    public const int BattleIdFieldNumber = 4;
+    private string battleId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BattleId {
+      get { return battleId_; }
+      set {
+        battleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "defender" field.</summary>
+    public const int DefenderFieldNumber = 5;
+    private global::POGOProtos.Data.Battle.BattleParticipant defender_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleParticipant Defender {
+      get { return defender_; }
+      set {
+        defender_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_log" field.</summary>
+    public const int BattleLogFieldNumber = 6;
+    private global::POGOProtos.Data.Battle.BattleLog battleLog_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleLog BattleLog {
+      get { return battleLog_; }
+      set {
+        battleLog_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as StartGymBattleResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(StartGymBattleResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (BattleStartTimestampMs != other.BattleStartTimestampMs) return false;
+      if (BattleEndTimestampMs != other.BattleEndTimestampMs) return false;
+      if (BattleId != other.BattleId) return false;
+      if (!object.Equals(Defender, other.Defender)) return false;
+      if (!object.Equals(BattleLog, other.BattleLog)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (BattleStartTimestampMs != 0L) hash ^= BattleStartTimestampMs.GetHashCode();
+      if (BattleEndTimestampMs != 0L) hash ^= BattleEndTimestampMs.GetHashCode();
+      if (BattleId.Length != 0) hash ^= BattleId.GetHashCode();
+      if (defender_ != null) hash ^= Defender.GetHashCode();
+      if (battleLog_ != null) hash ^= BattleLog.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (BattleStartTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(BattleEndTimestampMs);
+      }
+      if (BattleId.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(BattleId);
+      }
+      if (defender_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(Defender);
+      }
+      if (battleLog_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(BattleLog);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (BattleStartTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleEndTimestampMs);
+      }
+      if (BattleId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BattleId);
+      }
+      if (defender_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Defender);
+      }
+      if (battleLog_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleLog);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(StartGymBattleResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.BattleStartTimestampMs != 0L) {
+        BattleStartTimestampMs = other.BattleStartTimestampMs;
+      }
+      if (other.BattleEndTimestampMs != 0L) {
+        BattleEndTimestampMs = other.BattleEndTimestampMs;
+      }
+      if (other.BattleId.Length != 0) {
+        BattleId = other.BattleId;
+      }
+      if (other.defender_ != null) {
+        if (defender_ == null) {
+          defender_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+        }
+        Defender.MergeFrom(other.Defender);
+      }
+      if (other.battleLog_ != null) {
+        if (battleLog_ == null) {
+          battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+        }
+        BattleLog.MergeFrom(other.BattleLog);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            BattleStartTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            BattleEndTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 34: {
+            BattleId = input.ReadString();
+            break;
+          }
+          case 42: {
+            if (defender_ == null) {
+              defender_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+            }
+            input.ReadMessage(defender_);
+            break;
+          }
+          case 50: {
+            if (battleLog_ == null) {
+              battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+            }
+            input.ReadMessage(battleLog_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the StartGymBattleResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_GYM_NOT_FOUND")] ErrorGymNotFound = 2,
+        [pbr::OriginalName("ERROR_GYM_NEUTRAL")] ErrorGymNeutral = 3,
+        [pbr::OriginalName("ERROR_GYM_WRONG_TEAM")] ErrorGymWrongTeam = 4,
+        [pbr::OriginalName("ERROR_GYM_EMPTY")] ErrorGymEmpty = 5,
+        [pbr::OriginalName("ERROR_INVALID_DEFENDER")] ErrorInvalidDefender = 6,
+        [pbr::OriginalName("ERROR_TRAINING_INVALID_ATTACKER_COUNT")] ErrorTrainingInvalidAttackerCount = 7,
+        [pbr::OriginalName("ERROR_ALL_POKEMON_FAINTED")] ErrorAllPokemonFainted = 8,
+        [pbr::OriginalName("ERROR_TOO_MANY_BATTLES")] ErrorTooManyBattles = 9,
+        [pbr::OriginalName("ERROR_TOO_MANY_PLAYERS")] ErrorTooManyPlayers = 10,
+        [pbr::OriginalName("ERROR_GYM_BATTLE_LOCKOUT")] ErrorGymBattleLockout = 11,
+        [pbr::OriginalName("ERROR_PLAYER_BELOW_MINIMUM_LEVEL")] ErrorPlayerBelowMinimumLevel = 12,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 13,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class LevelUpRewardsResponse : pb::IMessage<LevelUpRewardsResponse> {
+    private static readonly pb::MessageParser<LevelUpRewardsResponse> _parser = new pb::MessageParser<LevelUpRewardsResponse>(() => new LevelUpRewardsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<LevelUpRewardsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[35]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsResponse(LevelUpRewardsResponse other) : this() {
+      result_ = other.result_;
+      itemsAwarded_ = other.itemsAwarded_.Clone();
+      itemsUnlocked_ = other.itemsUnlocked_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelUpRewardsResponse Clone() {
+      return new LevelUpRewardsResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "items_awarded" field.</summary>
+    public const int ItemsAwardedFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemAward> _repeated_itemsAwarded_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Inventory.Item.ItemAward.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> itemsAwarded_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemAward> ItemsAwarded {
+      get { return itemsAwarded_; }
+    }
+
+    /// <summary>Field number for the "items_unlocked" field.</summary>
+    public const int ItemsUnlockedFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemId> _repeated_itemsUnlocked_codec
+        = pb::FieldCodec.ForEnum(34, x => (int) x, x => (global::POGOProtos.Inventory.Item.ItemId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> itemsUnlocked_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> ItemsUnlocked {
+      get { return itemsUnlocked_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as LevelUpRewardsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(LevelUpRewardsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!itemsAwarded_.Equals(other.itemsAwarded_)) return false;
+      if(!itemsUnlocked_.Equals(other.itemsUnlocked_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= itemsAwarded_.GetHashCode();
+      hash ^= itemsUnlocked_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      itemsAwarded_.WriteTo(output, _repeated_itemsAwarded_codec);
+      itemsUnlocked_.WriteTo(output, _repeated_itemsUnlocked_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += itemsAwarded_.CalculateSize(_repeated_itemsAwarded_codec);
+      size += itemsUnlocked_.CalculateSize(_repeated_itemsUnlocked_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(LevelUpRewardsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      itemsAwarded_.Add(other.itemsAwarded_);
+      itemsUnlocked_.Add(other.itemsUnlocked_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.LevelUpRewardsResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            itemsAwarded_.AddEntriesFrom(input, _repeated_itemsAwarded_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            itemsUnlocked_.AddEntriesFrom(input, _repeated_itemsUnlocked_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the LevelUpRewardsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("AWARDED_ALREADY")] AwardedAlready = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class FortDetailsResponse : pb::IMessage<FortDetailsResponse> {
+    private static readonly pb::MessageParser<FortDetailsResponse> _parser = new pb::MessageParser<FortDetailsResponse>(() => new FortDetailsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortDetailsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[36]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsResponse(FortDetailsResponse other) : this() {
+      fortId_ = other.fortId_;
+      teamColor_ = other.teamColor_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      name_ = other.name_;
+      imageUrls_ = other.imageUrls_.Clone();
+      fp_ = other.fp_;
+      stamina_ = other.stamina_;
+      maxStamina_ = other.maxStamina_;
+      type_ = other.type_;
+      latitude_ = other.latitude_;
+      longitude_ = other.longitude_;
+      description_ = other.description_;
+      modifiers_ = other.modifiers_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortDetailsResponse Clone() {
+      return new FortDetailsResponse(this);
+    }
+
+    /// <summary>Field number for the "fort_id" field.</summary>
+    public const int FortIdFieldNumber = 1;
+    private string fortId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string FortId {
+      get { return fortId_; }
+      set {
+        fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "team_color" field.</summary>
+    public const int TeamColorFieldNumber = 2;
+    private global::POGOProtos.Enums.TeamColor teamColor_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.TeamColor TeamColor {
+      get { return teamColor_; }
+      set {
+        teamColor_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 3;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 4;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "image_urls" field.</summary>
+    public const int ImageUrlsFieldNumber = 5;
+    private static readonly pb::FieldCodec<string> _repeated_imageUrls_codec
+        = pb::FieldCodec.ForString(42);
+    private readonly pbc::RepeatedField<string> imageUrls_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> ImageUrls {
+      get { return imageUrls_; }
+    }
+
+    /// <summary>Field number for the "fp" field.</summary>
+    public const int FpFieldNumber = 6;
+    private int fp_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Fp {
+      get { return fp_; }
+      set {
+        fp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 7;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_stamina" field.</summary>
+    public const int MaxStaminaFieldNumber = 8;
+    private int maxStamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxStamina {
+      get { return maxStamina_; }
+      set {
+        maxStamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type" field.</summary>
+    public const int TypeFieldNumber = 9;
+    private global::POGOProtos.Map.Fort.FortType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Map.Fort.FortType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "latitude" field.</summary>
+    public const int LatitudeFieldNumber = 10;
+    private double latitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Latitude {
+      get { return latitude_; }
+      set {
+        latitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "longitude" field.</summary>
+    public const int LongitudeFieldNumber = 11;
+    private double longitude_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double Longitude {
+      get { return longitude_; }
+      set {
+        longitude_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "description" field.</summary>
+    public const int DescriptionFieldNumber = 12;
+    private string description_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Description {
+      get { return description_; }
+      set {
+        description_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "modifiers" field.</summary>
+    public const int ModifiersFieldNumber = 13;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortModifier> _repeated_modifiers_codec
+        = pb::FieldCodec.ForMessage(106, global::POGOProtos.Map.Fort.FortModifier.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortModifier> modifiers_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortModifier>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortModifier> Modifiers {
+      get { return modifiers_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortDetailsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortDetailsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (FortId != other.FortId) return false;
+      if (TeamColor != other.TeamColor) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (Name != other.Name) return false;
+      if(!imageUrls_.Equals(other.imageUrls_)) return false;
+      if (Fp != other.Fp) return false;
+      if (Stamina != other.Stamina) return false;
+      if (MaxStamina != other.MaxStamina) return false;
+      if (Type != other.Type) return false;
+      if (Latitude != other.Latitude) return false;
+      if (Longitude != other.Longitude) return false;
+      if (Description != other.Description) return false;
+      if(!modifiers_.Equals(other.modifiers_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (FortId.Length != 0) hash ^= FortId.GetHashCode();
+      if (TeamColor != 0) hash ^= TeamColor.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      hash ^= imageUrls_.GetHashCode();
+      if (Fp != 0) hash ^= Fp.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      if (MaxStamina != 0) hash ^= MaxStamina.GetHashCode();
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (Latitude != 0D) hash ^= Latitude.GetHashCode();
+      if (Longitude != 0D) hash ^= Longitude.GetHashCode();
+      if (Description.Length != 0) hash ^= Description.GetHashCode();
+      hash ^= modifiers_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (FortId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(FortId);
+      }
+      if (TeamColor != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) TeamColor);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PokemonData);
+      }
+      if (Name.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Name);
+      }
+      imageUrls_.WriteTo(output, _repeated_imageUrls_codec);
+      if (Fp != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(Fp);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(Stamina);
+      }
+      if (MaxStamina != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(MaxStamina);
+      }
+      if (Type != 0) {
+        output.WriteRawTag(72);
+        output.WriteEnum((int) Type);
+      }
+      if (Latitude != 0D) {
+        output.WriteRawTag(81);
+        output.WriteDouble(Latitude);
+      }
+      if (Longitude != 0D) {
+        output.WriteRawTag(89);
+        output.WriteDouble(Longitude);
+      }
+      if (Description.Length != 0) {
+        output.WriteRawTag(98);
+        output.WriteString(Description);
+      }
+      modifiers_.WriteTo(output, _repeated_modifiers_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (FortId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
+      }
+      if (TeamColor != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) TeamColor);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      size += imageUrls_.CalculateSize(_repeated_imageUrls_codec);
+      if (Fp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Fp);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      if (MaxStamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxStamina);
+      }
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (Latitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Longitude != 0D) {
+        size += 1 + 8;
+      }
+      if (Description.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Description);
+      }
+      size += modifiers_.CalculateSize(_repeated_modifiers_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortDetailsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.FortId.Length != 0) {
+        FortId = other.FortId;
+      }
+      if (other.TeamColor != 0) {
+        TeamColor = other.TeamColor;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      imageUrls_.Add(other.imageUrls_);
+      if (other.Fp != 0) {
+        Fp = other.Fp;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+      if (other.MaxStamina != 0) {
+        MaxStamina = other.MaxStamina;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.Latitude != 0D) {
+        Latitude = other.Latitude;
+      }
+      if (other.Longitude != 0D) {
+        Longitude = other.Longitude;
+      }
+      if (other.Description.Length != 0) {
+        Description = other.Description;
+      }
+      modifiers_.Add(other.modifiers_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            FortId = input.ReadString();
+            break;
+          }
+          case 16: {
+            teamColor_ = (global::POGOProtos.Enums.TeamColor) input.ReadEnum();
+            break;
+          }
+          case 26: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 34: {
+            Name = input.ReadString();
+            break;
+          }
+          case 42: {
+            imageUrls_.AddEntriesFrom(input, _repeated_imageUrls_codec);
+            break;
+          }
+          case 48: {
+            Fp = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            MaxStamina = input.ReadInt32();
+            break;
+          }
+          case 72: {
+            type_ = (global::POGOProtos.Map.Fort.FortType) input.ReadEnum();
+            break;
+          }
+          case 81: {
+            Latitude = input.ReadDouble();
+            break;
+          }
+          case 89: {
+            Longitude = input.ReadDouble();
+            break;
+          }
+          case 98: {
+            Description = input.ReadString();
+            break;
+          }
+          case 106: {
+            modifiers_.AddEntriesFrom(input, _repeated_modifiers_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CollectDailyDefenderBonusResponse : pb::IMessage<CollectDailyDefenderBonusResponse> {
+    private static readonly pb::MessageParser<CollectDailyDefenderBonusResponse> _parser = new pb::MessageParser<CollectDailyDefenderBonusResponse>(() => new CollectDailyDefenderBonusResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CollectDailyDefenderBonusResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[37]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusResponse(CollectDailyDefenderBonusResponse other) : this() {
+      result_ = other.result_;
+      currencyType_ = other.currencyType_.Clone();
+      currencyAwarded_ = other.currencyAwarded_.Clone();
+      defendersCount_ = other.defendersCount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CollectDailyDefenderBonusResponse Clone() {
+      return new CollectDailyDefenderBonusResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "currency_type" field.</summary>
+    public const int CurrencyTypeFieldNumber = 2;
+    private static readonly pb::FieldCodec<string> _repeated_currencyType_codec
+        = pb::FieldCodec.ForString(18);
+    private readonly pbc::RepeatedField<string> currencyType_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> CurrencyType {
+      get { return currencyType_; }
+    }
+
+    /// <summary>Field number for the "currency_awarded" field.</summary>
+    public const int CurrencyAwardedFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_currencyAwarded_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> currencyAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> CurrencyAwarded {
+      get { return currencyAwarded_; }
+    }
+
+    /// <summary>Field number for the "defenders_count" field.</summary>
+    public const int DefendersCountFieldNumber = 4;
+    private int defendersCount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DefendersCount {
+      get { return defendersCount_; }
+      set {
+        defendersCount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CollectDailyDefenderBonusResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CollectDailyDefenderBonusResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!currencyType_.Equals(other.currencyType_)) return false;
+      if(!currencyAwarded_.Equals(other.currencyAwarded_)) return false;
+      if (DefendersCount != other.DefendersCount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= currencyType_.GetHashCode();
+      hash ^= currencyAwarded_.GetHashCode();
+      if (DefendersCount != 0) hash ^= DefendersCount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      currencyType_.WriteTo(output, _repeated_currencyType_codec);
+      currencyAwarded_.WriteTo(output, _repeated_currencyAwarded_codec);
+      if (DefendersCount != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(DefendersCount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += currencyType_.CalculateSize(_repeated_currencyType_codec);
+      size += currencyAwarded_.CalculateSize(_repeated_currencyAwarded_codec);
+      if (DefendersCount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DefendersCount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CollectDailyDefenderBonusResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      currencyType_.Add(other.currencyType_);
+      currencyAwarded_.Add(other.currencyAwarded_);
+      if (other.DefendersCount != 0) {
+        DefendersCount = other.DefendersCount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.CollectDailyDefenderBonusResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            currencyType_.AddEntriesFrom(input, _repeated_currencyType_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            currencyAwarded_.AddEntriesFrom(input, _repeated_currencyAwarded_codec);
+            break;
+          }
+          case 32: {
+            DefendersCount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CollectDailyDefenderBonusResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILURE")] Failure = 2,
+        [pbr::OriginalName("TOO_SOON")] TooSoon = 3,
+        [pbr::OriginalName("NO_DEFENDERS")] NoDefenders = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class SfidaActionLogResponse : pb::IMessage<SfidaActionLogResponse> {
+    private static readonly pb::MessageParser<SfidaActionLogResponse> _parser = new pb::MessageParser<SfidaActionLogResponse>(() => new SfidaActionLogResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SfidaActionLogResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[38]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogResponse(SfidaActionLogResponse other) : this() {
+      result_ = other.result_;
+      logEntries_ = other.logEntries_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogResponse Clone() {
+      return new SfidaActionLogResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "log_entries" field.</summary>
+    public const int LogEntriesFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Logs.ActionLogEntry> _repeated_logEntries_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Data.Logs.ActionLogEntry.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Logs.ActionLogEntry> logEntries_ = new pbc::RepeatedField<global::POGOProtos.Data.Logs.ActionLogEntry>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Logs.ActionLogEntry> LogEntries {
+      get { return logEntries_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SfidaActionLogResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SfidaActionLogResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!logEntries_.Equals(other.logEntries_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= logEntries_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      logEntries_.WriteTo(output, _repeated_logEntries_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += logEntries_.CalculateSize(_repeated_logEntries_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SfidaActionLogResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      logEntries_.Add(other.logEntries_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            logEntries_.AddEntriesFrom(input, _repeated_logEntries_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SfidaActionLogResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class RecycleInventoryItemResponse : pb::IMessage<RecycleInventoryItemResponse> {
+    private static readonly pb::MessageParser<RecycleInventoryItemResponse> _parser = new pb::MessageParser<RecycleInventoryItemResponse>(() => new RecycleInventoryItemResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<RecycleInventoryItemResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[39]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemResponse(RecycleInventoryItemResponse other) : this() {
+      result_ = other.result_;
+      newCount_ = other.newCount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemResponse Clone() {
+      return new RecycleInventoryItemResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "new_count" field.</summary>
+    public const int NewCountFieldNumber = 2;
+    private int newCount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int NewCount {
+      get { return newCount_; }
+      set {
+        newCount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as RecycleInventoryItemResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(RecycleInventoryItemResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (NewCount != other.NewCount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (NewCount != 0) hash ^= NewCount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (NewCount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(NewCount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (NewCount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(NewCount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(RecycleInventoryItemResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.NewCount != 0) {
+        NewCount = other.NewCount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            NewCount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the RecycleInventoryItemResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NOT_ENOUGH_COPIES")] ErrorNotEnoughCopies = 2,
+        [pbr::OriginalName("ERROR_CANNOT_RECYCLE_INCUBATORS")] ErrorCannotRecycleIncubators = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetAssetDigestResponse : pb::IMessage<GetAssetDigestResponse> {
+    private static readonly pb::MessageParser<GetAssetDigestResponse> _parser = new pb::MessageParser<GetAssetDigestResponse>(() => new GetAssetDigestResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetAssetDigestResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[40]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestResponse(GetAssetDigestResponse other) : this() {
+      digest_ = other.digest_.Clone();
+      timestampMs_ = other.timestampMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetAssetDigestResponse Clone() {
+      return new GetAssetDigestResponse(this);
+    }
+
+    /// <summary>Field number for the "digest" field.</summary>
+    public const int DigestFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.AssetDigestEntry> _repeated_digest_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Data.AssetDigestEntry.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.AssetDigestEntry> digest_ = new pbc::RepeatedField<global::POGOProtos.Data.AssetDigestEntry>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.AssetDigestEntry> Digest {
+      get { return digest_; }
+    }
+
+    /// <summary>Field number for the "timestamp_ms" field.</summary>
+    public const int TimestampMsFieldNumber = 2;
+    private ulong timestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong TimestampMs {
+      get { return timestampMs_; }
+      set {
+        timestampMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetAssetDigestResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetAssetDigestResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!digest_.Equals(other.digest_)) return false;
+      if (TimestampMs != other.TimestampMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= digest_.GetHashCode();
+      if (TimestampMs != 0UL) hash ^= TimestampMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      digest_.WriteTo(output, _repeated_digest_codec);
+      if (TimestampMs != 0UL) {
+        output.WriteRawTag(16);
+        output.WriteUInt64(TimestampMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += digest_.CalculateSize(_repeated_digest_codec);
+      if (TimestampMs != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetAssetDigestResponse other) {
+      if (other == null) {
+        return;
+      }
+      digest_.Add(other.digest_);
+      if (other.TimestampMs != 0UL) {
+        TimestampMs = other.TimestampMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            digest_.AddEntriesFrom(input, _repeated_digest_codec);
+            break;
+          }
+          case 16: {
+            TimestampMs = input.ReadUInt64();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GetHatchedEggsResponse : pb::IMessage<GetHatchedEggsResponse> {
+    private static readonly pb::MessageParser<GetHatchedEggsResponse> _parser = new pb::MessageParser<GetHatchedEggsResponse>(() => new GetHatchedEggsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetHatchedEggsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[41]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsResponse(GetHatchedEggsResponse other) : this() {
+      success_ = other.success_;
+      pokemonId_ = other.pokemonId_.Clone();
+      experienceAwarded_ = other.experienceAwarded_.Clone();
+      candyAwarded_ = other.candyAwarded_.Clone();
+      stardustAwarded_ = other.stardustAwarded_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetHatchedEggsResponse Clone() {
+      return new GetHatchedEggsResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 2;
+    private static readonly pb::FieldCodec<ulong> _repeated_pokemonId_codec
+        = pb::FieldCodec.ForFixed64(18);
+    private readonly pbc::RepeatedField<ulong> pokemonId_ = new pbc::RepeatedField<ulong>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<ulong> PokemonId {
+      get { return pokemonId_; }
+    }
+
+    /// <summary>Field number for the "experience_awarded" field.</summary>
+    public const int ExperienceAwardedFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_experienceAwarded_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> experienceAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> ExperienceAwarded {
+      get { return experienceAwarded_; }
+    }
+
+    /// <summary>Field number for the "candy_awarded" field.</summary>
+    public const int CandyAwardedFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_candyAwarded_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> candyAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> CandyAwarded {
+      get { return candyAwarded_; }
+    }
+
+    /// <summary>Field number for the "stardust_awarded" field.</summary>
+    public const int StardustAwardedFieldNumber = 5;
+    private static readonly pb::FieldCodec<int> _repeated_stardustAwarded_codec
+        = pb::FieldCodec.ForInt32(42);
+    private readonly pbc::RepeatedField<int> stardustAwarded_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> StardustAwarded {
+      get { return stardustAwarded_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetHatchedEggsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetHatchedEggsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if(!pokemonId_.Equals(other.pokemonId_)) return false;
+      if(!experienceAwarded_.Equals(other.experienceAwarded_)) return false;
+      if(!candyAwarded_.Equals(other.candyAwarded_)) return false;
+      if(!stardustAwarded_.Equals(other.stardustAwarded_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      hash ^= pokemonId_.GetHashCode();
+      hash ^= experienceAwarded_.GetHashCode();
+      hash ^= candyAwarded_.GetHashCode();
+      hash ^= stardustAwarded_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      pokemonId_.WriteTo(output, _repeated_pokemonId_codec);
+      experienceAwarded_.WriteTo(output, _repeated_experienceAwarded_codec);
+      candyAwarded_.WriteTo(output, _repeated_candyAwarded_codec);
+      stardustAwarded_.WriteTo(output, _repeated_stardustAwarded_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      size += pokemonId_.CalculateSize(_repeated_pokemonId_codec);
+      size += experienceAwarded_.CalculateSize(_repeated_experienceAwarded_codec);
+      size += candyAwarded_.CalculateSize(_repeated_candyAwarded_codec);
+      size += stardustAwarded_.CalculateSize(_repeated_stardustAwarded_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetHatchedEggsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      pokemonId_.Add(other.pokemonId_);
+      experienceAwarded_.Add(other.experienceAwarded_);
+      candyAwarded_.Add(other.candyAwarded_);
+      stardustAwarded_.Add(other.stardustAwarded_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 18:
+          case 17: {
+            pokemonId_.AddEntriesFrom(input, _repeated_pokemonId_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            experienceAwarded_.AddEntriesFrom(input, _repeated_experienceAwarded_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            candyAwarded_.AddEntriesFrom(input, _repeated_candyAwarded_codec);
+            break;
+          }
+          case 42:
+          case 40: {
+            stardustAwarded_.AddEntriesFrom(input, _repeated_stardustAwarded_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DownloadSettingsResponse : pb::IMessage<DownloadSettingsResponse> {
+    private static readonly pb::MessageParser<DownloadSettingsResponse> _parser = new pb::MessageParser<DownloadSettingsResponse>(() => new DownloadSettingsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadSettingsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[42]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsResponse(DownloadSettingsResponse other) : this() {
+      error_ = other.error_;
+      hash_ = other.hash_;
+      Settings = other.settings_ != null ? other.Settings.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsResponse Clone() {
+      return new DownloadSettingsResponse(this);
+    }
+
+    /// <summary>Field number for the "error" field.</summary>
+    public const int ErrorFieldNumber = 1;
+    private string error_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Error {
+      get { return error_; }
+      set {
+        error_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "hash" field.</summary>
+    public const int HashFieldNumber = 2;
+    private string hash_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Hash {
+      get { return hash_; }
+      set {
+        hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "settings" field.</summary>
+    public const int SettingsFieldNumber = 3;
+    private global::POGOProtos.Settings.GlobalSettings settings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.GlobalSettings Settings {
+      get { return settings_; }
+      set {
+        settings_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadSettingsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadSettingsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Error != other.Error) return false;
+      if (Hash != other.Hash) return false;
+      if (!object.Equals(Settings, other.Settings)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Error.Length != 0) hash ^= Error.GetHashCode();
+      if (Hash.Length != 0) hash ^= Hash.GetHashCode();
+      if (settings_ != null) hash ^= Settings.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Error.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Error);
+      }
+      if (Hash.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Hash);
+      }
+      if (settings_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(Settings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Error.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Error);
+      }
+      if (Hash.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
+      }
+      if (settings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Settings);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadSettingsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Error.Length != 0) {
+        Error = other.Error;
+      }
+      if (other.Hash.Length != 0) {
+        Hash = other.Hash;
+      }
+      if (other.settings_ != null) {
+        if (settings_ == null) {
+          settings_ = new global::POGOProtos.Settings.GlobalSettings();
+        }
+        Settings.MergeFrom(other.Settings);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Error = input.ReadString();
+            break;
+          }
+          case 18: {
+            Hash = input.ReadString();
+            break;
+          }
+          case 26: {
+            if (settings_ == null) {
+              settings_ = new global::POGOProtos.Settings.GlobalSettings();
+            }
+            input.ReadMessage(settings_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class SetPlayerTeamResponse : pb::IMessage<SetPlayerTeamResponse> {
+    private static readonly pb::MessageParser<SetPlayerTeamResponse> _parser = new pb::MessageParser<SetPlayerTeamResponse>(() => new SetPlayerTeamResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetPlayerTeamResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[43]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamResponse(SetPlayerTeamResponse other) : this() {
+      status_ = other.status_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamResponse Clone() {
+      return new SetPlayerTeamResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetPlayerTeamResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetPlayerTeamResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetPlayerTeamResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetPlayerTeamResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("TEAM_ALREADY_SET")] TeamAlreadySet = 2,
+        [pbr::OriginalName("FAILURE")] Failure = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class IncenseEncounterResponse : pb::IMessage<IncenseEncounterResponse> {
+    private static readonly pb::MessageParser<IncenseEncounterResponse> _parser = new pb::MessageParser<IncenseEncounterResponse>(() => new IncenseEncounterResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IncenseEncounterResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[44]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterResponse(IncenseEncounterResponse other) : this() {
+      result_ = other.result_;
+      PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
+      CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseEncounterResponse Clone() {
+      return new IncenseEncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_data" field.</summary>
+    public const int PokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData pokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData PokemonData {
+      get { return pokemonData_; }
+      set {
+        pokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_probability" field.</summary>
+    public const int CaptureProbabilityFieldNumber = 3;
+    private global::POGOProtos.Data.Capture.CaptureProbability captureProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Capture.CaptureProbability CaptureProbability {
+      get { return captureProbability_; }
+      set {
+        captureProbability_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IncenseEncounterResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IncenseEncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(PokemonData, other.PokemonData)) return false;
+      if (!object.Equals(CaptureProbability, other.CaptureProbability)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
+      if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (pokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (pokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
+      }
+      if (captureProbability_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IncenseEncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.pokemonData_ != null) {
+        if (pokemonData_ == null) {
+          pokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        PokemonData.MergeFrom(other.PokemonData);
+      }
+      if (other.captureProbability_ != null) {
+        if (captureProbability_ == null) {
+          captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+        }
+        CaptureProbability.MergeFrom(other.CaptureProbability);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.IncenseEncounterResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (pokemonData_ == null) {
+              pokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(pokemonData_);
+            break;
+          }
+          case 26: {
+            if (captureProbability_ == null) {
+              captureProbability_ = new global::POGOProtos.Data.Capture.CaptureProbability();
+            }
+            input.ReadMessage(captureProbability_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the IncenseEncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("INCENSE_ENCOUNTER_UNKNOWN")] IncenseEncounterUnknown = 0,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_SUCCESS")] IncenseEncounterSuccess = 1,
+        [pbr::OriginalName("INCENSE_ENCOUNTER_NOT_AVAILABLE")] IncenseEncounterNotAvailable = 2,
+        [pbr::OriginalName("POKEMON_INVENTORY_FULL")] PokemonInventoryFull = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class EvolvePokemonResponse : pb::IMessage<EvolvePokemonResponse> {
+    private static readonly pb::MessageParser<EvolvePokemonResponse> _parser = new pb::MessageParser<EvolvePokemonResponse>(() => new EvolvePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EvolvePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[45]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonResponse(EvolvePokemonResponse other) : this() {
+      result_ = other.result_;
+      EvolvedPokemonData = other.evolvedPokemonData_ != null ? other.EvolvedPokemonData.Clone() : null;
+      experienceAwarded_ = other.experienceAwarded_;
+      candyAwarded_ = other.candyAwarded_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EvolvePokemonResponse Clone() {
+      return new EvolvePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "evolved_pokemon_data" field.</summary>
+    public const int EvolvedPokemonDataFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData evolvedPokemonData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData EvolvedPokemonData {
+      get { return evolvedPokemonData_; }
+      set {
+        evolvedPokemonData_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "experience_awarded" field.</summary>
+    public const int ExperienceAwardedFieldNumber = 3;
+    private int experienceAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ExperienceAwarded {
+      get { return experienceAwarded_; }
+      set {
+        experienceAwarded_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_awarded" field.</summary>
+    public const int CandyAwardedFieldNumber = 4;
+    private int candyAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CandyAwarded {
+      get { return candyAwarded_; }
+      set {
+        candyAwarded_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EvolvePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EvolvePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(EvolvedPokemonData, other.EvolvedPokemonData)) return false;
+      if (ExperienceAwarded != other.ExperienceAwarded) return false;
+      if (CandyAwarded != other.CandyAwarded) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (evolvedPokemonData_ != null) hash ^= EvolvedPokemonData.GetHashCode();
+      if (ExperienceAwarded != 0) hash ^= ExperienceAwarded.GetHashCode();
+      if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (evolvedPokemonData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(EvolvedPokemonData);
+      }
+      if (ExperienceAwarded != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(ExperienceAwarded);
+      }
+      if (CandyAwarded != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(CandyAwarded);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (evolvedPokemonData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EvolvedPokemonData);
+      }
+      if (ExperienceAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ExperienceAwarded);
+      }
+      if (CandyAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EvolvePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.evolvedPokemonData_ != null) {
+        if (evolvedPokemonData_ == null) {
+          evolvedPokemonData_ = new global::POGOProtos.Data.PokemonData();
+        }
+        EvolvedPokemonData.MergeFrom(other.EvolvedPokemonData);
+      }
+      if (other.ExperienceAwarded != 0) {
+        ExperienceAwarded = other.ExperienceAwarded;
+      }
+      if (other.CandyAwarded != 0) {
+        CandyAwarded = other.CandyAwarded;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (evolvedPokemonData_ == null) {
+              evolvedPokemonData_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(evolvedPokemonData_);
+            break;
+          }
+          case 24: {
+            ExperienceAwarded = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            CandyAwarded = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EvolvePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILED_POKEMON_MISSING")] FailedPokemonMissing = 2,
+        [pbr::OriginalName("FAILED_INSUFFICIENT_RESOURCES")] FailedInsufficientResources = 3,
+        [pbr::OriginalName("FAILED_POKEMON_CANNOT_EVOLVE")] FailedPokemonCannotEvolve = 4,
+        [pbr::OriginalName("FAILED_POKEMON_IS_DEPLOYED")] FailedPokemonIsDeployed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class UseItemEggIncubatorResponse : pb::IMessage<UseItemEggIncubatorResponse> {
+    private static readonly pb::MessageParser<UseItemEggIncubatorResponse> _parser = new pb::MessageParser<UseItemEggIncubatorResponse>(() => new UseItemEggIncubatorResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemEggIncubatorResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[46]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorResponse(UseItemEggIncubatorResponse other) : this() {
+      result_ = other.result_;
+      EggIncubator = other.eggIncubator_ != null ? other.EggIncubator.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorResponse Clone() {
+      return new UseItemEggIncubatorResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubator" field.</summary>
+    public const int EggIncubatorFieldNumber = 2;
+    private global::POGOProtos.Inventory.EggIncubator eggIncubator_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubator EggIncubator {
+      get { return eggIncubator_; }
+      set {
+        eggIncubator_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemEggIncubatorResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemEggIncubatorResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(EggIncubator, other.EggIncubator)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (eggIncubator_ != null) hash ^= EggIncubator.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (eggIncubator_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(EggIncubator);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (eggIncubator_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubator);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemEggIncubatorResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.eggIncubator_ != null) {
+        if (eggIncubator_ == null) {
+          eggIncubator_ = new global::POGOProtos.Inventory.EggIncubator();
+        }
+        EggIncubator.MergeFrom(other.EggIncubator);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (eggIncubator_ == null) {
+              eggIncubator_ = new global::POGOProtos.Inventory.EggIncubator();
+            }
+            input.ReadMessage(eggIncubator_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemEggIncubatorResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INCUBATOR_NOT_FOUND")] ErrorIncubatorNotFound = 2,
+        [pbr::OriginalName("ERROR_POKEMON_EGG_NOT_FOUND")] ErrorPokemonEggNotFound = 3,
+        [pbr::OriginalName("ERROR_POKEMON_ID_NOT_EGG")] ErrorPokemonIdNotEgg = 4,
+        [pbr::OriginalName("ERROR_INCUBATOR_ALREADY_IN_USE")] ErrorIncubatorAlreadyInUse = 5,
+        [pbr::OriginalName("ERROR_POKEMON_ALREADY_INCUBATING")] ErrorPokemonAlreadyIncubating = 6,
+        [pbr::OriginalName("ERROR_INCUBATOR_NO_USES_REMAINING")] ErrorIncubatorNoUsesRemaining = 7,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class ReleasePokemonResponse : pb::IMessage<ReleasePokemonResponse> {
+    private static readonly pb::MessageParser<ReleasePokemonResponse> _parser = new pb::MessageParser<ReleasePokemonResponse>(() => new ReleasePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ReleasePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[47]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonResponse(ReleasePokemonResponse other) : this() {
+      result_ = other.result_;
+      candyAwarded_ = other.candyAwarded_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonResponse Clone() {
+      return new ReleasePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_awarded" field.</summary>
+    public const int CandyAwardedFieldNumber = 2;
+    private int candyAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CandyAwarded {
+      get { return candyAwarded_; }
+      set {
+        candyAwarded_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ReleasePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ReleasePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (CandyAwarded != other.CandyAwarded) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (CandyAwarded != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(CandyAwarded);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (CandyAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ReleasePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.CandyAwarded != 0) {
+        CandyAwarded = other.CandyAwarded;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            CandyAwarded = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the ReleasePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("POKEMON_DEPLOYED")] PokemonDeployed = 2,
+        [pbr::OriginalName("FAILED")] Failed = 3,
+        [pbr::OriginalName("ERROR_POKEMON_IS_EGG")] ErrorPokemonIsEgg = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class GetGymDetailsResponse : pb::IMessage<GetGymDetailsResponse> {
+    private static readonly pb::MessageParser<GetGymDetailsResponse> _parser = new pb::MessageParser<GetGymDetailsResponse>(() => new GetGymDetailsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GetGymDetailsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[48]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsResponse(GetGymDetailsResponse other) : this() {
+      GymState = other.gymState_ != null ? other.GymState.Clone() : null;
+      name_ = other.name_;
+      urls_ = other.urls_.Clone();
+      result_ = other.result_;
+      description_ = other.description_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GetGymDetailsResponse Clone() {
+      return new GetGymDetailsResponse(this);
+    }
+
+    /// <summary>Field number for the "gym_state" field.</summary>
+    public const int GymStateFieldNumber = 1;
+    private global::POGOProtos.Data.Gym.GymState gymState_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Gym.GymState GymState {
+      get { return gymState_; }
+      set {
+        gymState_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "name" field.</summary>
+    public const int NameFieldNumber = 2;
+    private string name_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Name {
+      get { return name_; }
+      set {
+        name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "urls" field.</summary>
+    public const int UrlsFieldNumber = 3;
+    private static readonly pb::FieldCodec<string> _repeated_urls_codec
+        = pb::FieldCodec.ForString(26);
+    private readonly pbc::RepeatedField<string> urls_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> Urls {
+      get { return urls_; }
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 4;
+    private global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "description" field.</summary>
+    public const int DescriptionFieldNumber = 5;
+    private string description_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Description {
+      get { return description_; }
+      set {
+        description_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GetGymDetailsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GetGymDetailsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(GymState, other.GymState)) return false;
+      if (Name != other.Name) return false;
+      if(!urls_.Equals(other.urls_)) return false;
+      if (Result != other.Result) return false;
+      if (Description != other.Description) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (gymState_ != null) hash ^= GymState.GetHashCode();
+      if (Name.Length != 0) hash ^= Name.GetHashCode();
+      hash ^= urls_.GetHashCode();
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (Description.Length != 0) hash ^= Description.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (gymState_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(GymState);
+      }
+      if (Name.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Name);
+      }
+      urls_.WriteTo(output, _repeated_urls_codec);
+      if (Result != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Result);
+      }
+      if (Description.Length != 0) {
+        output.WriteRawTag(42);
+        output.WriteString(Description);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (gymState_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymState);
+      }
+      if (Name.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+      }
+      size += urls_.CalculateSize(_repeated_urls_codec);
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (Description.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Description);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GetGymDetailsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.gymState_ != null) {
+        if (gymState_ == null) {
+          gymState_ = new global::POGOProtos.Data.Gym.GymState();
+        }
+        GymState.MergeFrom(other.GymState);
+      }
+      if (other.Name.Length != 0) {
+        Name = other.Name;
+      }
+      urls_.Add(other.urls_);
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.Description.Length != 0) {
+        Description = other.Description;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            if (gymState_ == null) {
+              gymState_ = new global::POGOProtos.Data.Gym.GymState();
+            }
+            input.ReadMessage(gymState_);
+            break;
+          }
+          case 18: {
+            Name = input.ReadString();
+            break;
+          }
+          case 26: {
+            urls_.AddEntriesFrom(input, _repeated_urls_codec);
+            break;
+          }
+          case 32: {
+            result_ = (global::POGOProtos.Networking.Responses.GetGymDetailsResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 42: {
+            Description = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the GetGymDetailsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class FortRecallPokemonResponse : pb::IMessage<FortRecallPokemonResponse> {
+    private static readonly pb::MessageParser<FortRecallPokemonResponse> _parser = new pb::MessageParser<FortRecallPokemonResponse>(() => new FortRecallPokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortRecallPokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[49]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonResponse(FortRecallPokemonResponse other) : this() {
+      result_ = other.result_;
+      FortDetails = other.fortDetails_ != null ? other.FortDetails.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortRecallPokemonResponse Clone() {
+      return new FortRecallPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_details" field.</summary>
+    public const int FortDetailsFieldNumber = 2;
+    private global::POGOProtos.Networking.Responses.FortDetailsResponse fortDetails_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.FortDetailsResponse FortDetails {
+      get { return fortDetails_; }
+      set {
+        fortDetails_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortRecallPokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortRecallPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(FortDetails, other.FortDetails)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (fortDetails_ != null) hash ^= FortDetails.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (fortDetails_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(FortDetails);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (fortDetails_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortDetails);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortRecallPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.fortDetails_ != null) {
+        if (fortDetails_ == null) {
+          fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+        }
+        FortDetails.MergeFrom(other.FortDetails);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.FortRecallPokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (fortDetails_ == null) {
+              fortDetails_ = new global::POGOProtos.Networking.Responses.FortDetailsResponse();
+            }
+            input.ReadMessage(fortDetails_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the FortRecallPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("NO_RESULT_SET")] NoResultSet = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 2,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_ON_FORT")] ErrorPokemonNotOnFort = 3,
+        [pbr::OriginalName("ERROR_NO_PLAYER")] ErrorNoPlayer = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class UseIncenseResponse : pb::IMessage<UseIncenseResponse> {
+    private static readonly pb::MessageParser<UseIncenseResponse> _parser = new pb::MessageParser<UseIncenseResponse>(() => new UseIncenseResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseIncenseResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[50]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseResponse(UseIncenseResponse other) : this() {
+      result_ = other.result_;
+      AppliedIncense = other.appliedIncense_ != null ? other.AppliedIncense.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseResponse Clone() {
+      return new UseIncenseResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_incense" field.</summary>
+    public const int AppliedIncenseFieldNumber = 2;
+    private global::POGOProtos.Inventory.AppliedItem appliedIncense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.AppliedItem AppliedIncense {
+      get { return appliedIncense_; }
+      set {
+        appliedIncense_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseIncenseResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseIncenseResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(AppliedIncense, other.AppliedIncense)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (appliedIncense_ != null) hash ^= AppliedIncense.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (appliedIncense_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(AppliedIncense);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (appliedIncense_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedIncense);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseIncenseResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.appliedIncense_ != null) {
+        if (appliedIncense_ == null) {
+          appliedIncense_ = new global::POGOProtos.Inventory.AppliedItem();
+        }
+        AppliedIncense.MergeFrom(other.AppliedIncense);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (appliedIncense_ == null) {
+              appliedIncense_ = new global::POGOProtos.Inventory.AppliedItem();
+            }
+            input.ReadMessage(appliedIncense_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseIncenseResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNKNOWN")] Unknown = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("INCENSE_ALREADY_ACTIVE")] IncenseAlreadyActive = 2,
+        [pbr::OriginalName("NONE_IN_INVENTORY")] NoneInInventory = 3,
+        [pbr::OriginalName("LOCATION_UNSET")] LocationUnset = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  public sealed partial class NicknamePokemonResponse : pb::IMessage<NicknamePokemonResponse> {
+    private static readonly pb::MessageParser<NicknamePokemonResponse> _parser = new pb::MessageParser<NicknamePokemonResponse>(() => new NicknamePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<NicknamePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.POGOProtosNetworkingResponsesReflection.Descriptor.MessageTypes[51]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonResponse(NicknamePokemonResponse other) : this() {
+      result_ = other.result_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public NicknamePokemonResponse Clone() {
+      return new NicknamePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as NicknamePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(NicknamePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(NicknamePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.NicknamePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the NicknamePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_NICKNAME")] ErrorInvalidNickname = 2,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FOUND")] ErrorPokemonNotFound = 3,
+        [pbr::OriginalName("ERROR_POKEMON_IS_EGG")] ErrorPokemonIsEgg = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/PlayerUpdateResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/PlayerUpdateResponse.cs
new file mode 100644
index 0000000..464f334
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/PlayerUpdateResponse.cs
@@ -0,0 +1,204 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/PlayerUpdateResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/PlayerUpdateResponse.proto</summary>
+  public static partial class PlayerUpdateResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/PlayerUpdateResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerUpdateResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjpQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1BsYXllclVwZGF0",
+            "ZVJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9u",
+            "c2VzGiJQT0dPUHJvdG9zL01hcC9Gb3J0L0ZvcnREYXRhLnByb3RvGihQT0dP",
+            "UHJvdG9zL01hcC9Qb2tlbW9uL1dpbGRQb2tlbW9uLnByb3RvIpYBChRQbGF5",
+            "ZXJVcGRhdGVSZXNwb25zZRI6Cg13aWxkX3Bva2Vtb25zGAEgAygLMiMuUE9H",
+            "T1Byb3Rvcy5NYXAuUG9rZW1vbi5XaWxkUG9rZW1vbhIsCgVmb3J0cxgCIAMo",
+            "CzIdLlBPR09Qcm90b3MuTWFwLkZvcnQuRm9ydERhdGESFAoMZm9ydHNfbmVh",
+            "cmJ5GAMgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Map.Fort.FortDataReflection.Descriptor, global::POGOProtos.Map.Pokemon.WildPokemonReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.PlayerUpdateResponse), global::POGOProtos.Networking.Responses.PlayerUpdateResponse.Parser, new[]{ "WildPokemons", "Forts", "FortsNearby" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerUpdateResponse : pb::IMessage<PlayerUpdateResponse> {
+    private static readonly pb::MessageParser<PlayerUpdateResponse> _parser = new pb::MessageParser<PlayerUpdateResponse>(() => new PlayerUpdateResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerUpdateResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.PlayerUpdateResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateResponse(PlayerUpdateResponse other) : this() {
+      wildPokemons_ = other.wildPokemons_.Clone();
+      forts_ = other.forts_.Clone();
+      fortsNearby_ = other.fortsNearby_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerUpdateResponse Clone() {
+      return new PlayerUpdateResponse(this);
+    }
+
+    /// <summary>Field number for the "wild_pokemons" field.</summary>
+    public const int WildPokemonsFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Pokemon.WildPokemon> _repeated_wildPokemons_codec
+        = pb::FieldCodec.ForMessage(10, global::POGOProtos.Map.Pokemon.WildPokemon.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> wildPokemons_ = new pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Pokemon.WildPokemon> WildPokemons {
+      get { return wildPokemons_; }
+    }
+
+    /// <summary>Field number for the "forts" field.</summary>
+    public const int FortsFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Map.Fort.FortData> _repeated_forts_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Map.Fort.FortData.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> forts_ = new pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Map.Fort.FortData> Forts {
+      get { return forts_; }
+    }
+
+    /// <summary>Field number for the "forts_nearby" field.</summary>
+    public const int FortsNearbyFieldNumber = 3;
+    private int fortsNearby_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int FortsNearby {
+      get { return fortsNearby_; }
+      set {
+        fortsNearby_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerUpdateResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerUpdateResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!wildPokemons_.Equals(other.wildPokemons_)) return false;
+      if(!forts_.Equals(other.forts_)) return false;
+      if (FortsNearby != other.FortsNearby) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= wildPokemons_.GetHashCode();
+      hash ^= forts_.GetHashCode();
+      if (FortsNearby != 0) hash ^= FortsNearby.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      wildPokemons_.WriteTo(output, _repeated_wildPokemons_codec);
+      forts_.WriteTo(output, _repeated_forts_codec);
+      if (FortsNearby != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(FortsNearby);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += wildPokemons_.CalculateSize(_repeated_wildPokemons_codec);
+      size += forts_.CalculateSize(_repeated_forts_codec);
+      if (FortsNearby != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(FortsNearby);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerUpdateResponse other) {
+      if (other == null) {
+        return;
+      }
+      wildPokemons_.Add(other.wildPokemons_);
+      forts_.Add(other.forts_);
+      if (other.FortsNearby != 0) {
+        FortsNearby = other.FortsNearby;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            wildPokemons_.AddEntriesFrom(input, _repeated_wildPokemons_codec);
+            break;
+          }
+          case 18: {
+            forts_.AddEntriesFrom(input, _repeated_forts_codec);
+            break;
+          }
+          case 24: {
+            FortsNearby = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/RecycleInventoryItemResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/RecycleInventoryItemResponse.cs
new file mode 100644
index 0000000..52c8ee1
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/RecycleInventoryItemResponse.cs
@@ -0,0 +1,206 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/RecycleInventoryItemResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/RecycleInventoryItemResponse.proto</summary>
+  public static partial class RecycleInventoryItemResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/RecycleInventoryItemResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static RecycleInventoryItemResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkJQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1JlY3ljbGVJbnZl",
+            "bnRvcnlJdGVtUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2lu",
+            "Zy5SZXNwb25zZXMi6wEKHFJlY3ljbGVJbnZlbnRvcnlJdGVtUmVzcG9uc2US",
+            "VAoGcmVzdWx0GAEgASgOMkQuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcy5SZWN5Y2xlSW52ZW50b3J5SXRlbVJlc3BvbnNlLlJlc3VsdBIRCglu",
+            "ZXdfY291bnQYAiABKAUiYgoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VT",
+            "UxABEhsKF0VSUk9SX05PVF9FTk9VR0hfQ09QSUVTEAISIwofRVJST1JfQ0FO",
+            "Tk9UX1JFQ1lDTEVfSU5DVUJBVE9SUxADYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse), global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Parser, new[]{ "Result", "NewCount" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class RecycleInventoryItemResponse : pb::IMessage<RecycleInventoryItemResponse> {
+    private static readonly pb::MessageParser<RecycleInventoryItemResponse> _parser = new pb::MessageParser<RecycleInventoryItemResponse>(() => new RecycleInventoryItemResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<RecycleInventoryItemResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.RecycleInventoryItemResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemResponse(RecycleInventoryItemResponse other) : this() {
+      result_ = other.result_;
+      newCount_ = other.newCount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public RecycleInventoryItemResponse Clone() {
+      return new RecycleInventoryItemResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "new_count" field.</summary>
+    public const int NewCountFieldNumber = 2;
+    private int newCount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int NewCount {
+      get { return newCount_; }
+      set {
+        newCount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as RecycleInventoryItemResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(RecycleInventoryItemResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (NewCount != other.NewCount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (NewCount != 0) hash ^= NewCount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (NewCount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(NewCount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (NewCount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(NewCount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(RecycleInventoryItemResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.NewCount != 0) {
+        NewCount = other.NewCount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.RecycleInventoryItemResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            NewCount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the RecycleInventoryItemResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NOT_ENOUGH_COPIES")] ErrorNotEnoughCopies = 2,
+        [pbr::OriginalName("ERROR_CANNOT_RECYCLE_INCUBATORS")] ErrorCannotRecycleIncubators = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/ReleasePokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/ReleasePokemonResponse.cs
new file mode 100644
index 0000000..6b4f3cf
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/ReleasePokemonResponse.cs
@@ -0,0 +1,207 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/ReleasePokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/ReleasePokemonResponse.proto</summary>
+  public static partial class ReleasePokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/ReleasePokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ReleasePokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1JlbGVhc2VQb2tl",
+            "bW9uUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMi3QEKFlJlbGVhc2VQb2tlbW9uUmVzcG9uc2USTgoGcmVzdWx0GAEg",
+            "ASgOMj4uUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5SZWxlYXNl",
+            "UG9rZW1vblJlc3BvbnNlLlJlc3VsdBIVCg1jYW5keV9hd2FyZGVkGAIgASgF",
+            "IlwKBlJlc3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQARIUChBQT0tFTU9O",
+            "X0RFUExPWUVEEAISCgoGRkFJTEVEEAMSGAoURVJST1JfUE9LRU1PTl9JU19F",
+            "R0cQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.ReleasePokemonResponse), global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Parser, new[]{ "Result", "CandyAwarded" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ReleasePokemonResponse : pb::IMessage<ReleasePokemonResponse> {
+    private static readonly pb::MessageParser<ReleasePokemonResponse> _parser = new pb::MessageParser<ReleasePokemonResponse>(() => new ReleasePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ReleasePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.ReleasePokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonResponse(ReleasePokemonResponse other) : this() {
+      result_ = other.result_;
+      candyAwarded_ = other.candyAwarded_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReleasePokemonResponse Clone() {
+      return new ReleasePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_awarded" field.</summary>
+    public const int CandyAwardedFieldNumber = 2;
+    private int candyAwarded_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CandyAwarded {
+      get { return candyAwarded_; }
+      set {
+        candyAwarded_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ReleasePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ReleasePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (CandyAwarded != other.CandyAwarded) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (CandyAwarded != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(CandyAwarded);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (CandyAwarded != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ReleasePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.CandyAwarded != 0) {
+        CandyAwarded = other.CandyAwarded;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            CandyAwarded = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the ReleasePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("POKEMON_DEPLOYED")] PokemonDeployed = 2,
+        [pbr::OriginalName("FAILED")] Failed = 3,
+        [pbr::OriginalName("ERROR_POKEMON_IS_EGG")] ErrorPokemonIsEgg = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/SetAvatarResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/SetAvatarResponse.cs
new file mode 100644
index 0000000..311390c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/SetAvatarResponse.cs
@@ -0,0 +1,212 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/SetAvatarResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/SetAvatarResponse.proto</summary>
+  public static partial class SetAvatarResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/SetAvatarResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetAvatarResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjdQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1NldEF2YXRhclJl",
+            "c3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2Vz",
+            "GiBQT0dPUHJvdG9zL0RhdGEvUGxheWVyRGF0YS5wcm90byLXAQoRU2V0QXZh",
+            "dGFyUmVzcG9uc2USSQoGc3RhdHVzGAEgASgOMjkuUE9HT1Byb3Rvcy5OZXR3",
+            "b3JraW5nLlJlc3BvbnNlcy5TZXRBdmF0YXJSZXNwb25zZS5TdGF0dXMSMAoL",
+            "cGxheWVyX2RhdGEYAiABKAsyGy5QT0dPUHJvdG9zLkRhdGEuUGxheWVyRGF0",
+            "YSJFCgZTdGF0dXMSCQoFVU5TRVQQABILCgdTVUNDRVNTEAESFgoSQVZBVEFS",
+            "X0FMUkVBRFlfU0VUEAISCwoHRkFJTFVSRRADYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PlayerDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetAvatarResponse), global::POGOProtos.Networking.Responses.SetAvatarResponse.Parser, new[]{ "Status", "PlayerData" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetAvatarResponse : pb::IMessage<SetAvatarResponse> {
+    private static readonly pb::MessageParser<SetAvatarResponse> _parser = new pb::MessageParser<SetAvatarResponse>(() => new SetAvatarResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetAvatarResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.SetAvatarResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarResponse(SetAvatarResponse other) : this() {
+      status_ = other.status_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetAvatarResponse Clone() {
+      return new SetAvatarResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetAvatarResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetAvatarResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetAvatarResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.SetAvatarResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetAvatarResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("AVATAR_ALREADY_SET")] AvatarAlreadySet = 2,
+        [pbr::OriginalName("FAILURE")] Failure = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/SetContactSettingsResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/SetContactSettingsResponse.cs
new file mode 100644
index 0000000..c94ab00
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/SetContactSettingsResponse.cs
@@ -0,0 +1,211 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/SetContactSettingsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/SetContactSettingsResponse.proto</summary>
+  public static partial class SetContactSettingsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/SetContactSettingsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetContactSettingsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkBQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1NldENvbnRhY3RT",
+            "ZXR0aW5nc1Jlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcu",
+            "UmVzcG9uc2VzGiBQT0dPUHJvdG9zL0RhdGEvUGxheWVyRGF0YS5wcm90byLR",
+            "AQoaU2V0Q29udGFjdFNldHRpbmdzUmVzcG9uc2USUgoGc3RhdHVzGAEgASgO",
+            "MkIuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5TZXRDb250YWN0",
+            "U2V0dGluZ3NSZXNwb25zZS5TdGF0dXMSMAoLcGxheWVyX2RhdGEYAiABKAsy",
+            "Gy5QT0dPUHJvdG9zLkRhdGEuUGxheWVyRGF0YSItCgZTdGF0dXMSCQoFVU5T",
+            "RVQQABILCgdTVUNDRVNTEAESCwoHRkFJTFVSRRACYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PlayerDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetContactSettingsResponse), global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Parser, new[]{ "Status", "PlayerData" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetContactSettingsResponse : pb::IMessage<SetContactSettingsResponse> {
+    private static readonly pb::MessageParser<SetContactSettingsResponse> _parser = new pb::MessageParser<SetContactSettingsResponse>(() => new SetContactSettingsResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetContactSettingsResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.SetContactSettingsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsResponse(SetContactSettingsResponse other) : this() {
+      status_ = other.status_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetContactSettingsResponse Clone() {
+      return new SetContactSettingsResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetContactSettingsResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetContactSettingsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetContactSettingsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.SetContactSettingsResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetContactSettingsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("FAILURE")] Failure = 2,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/SetFavoritePokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/SetFavoritePokemonResponse.cs
new file mode 100644
index 0000000..65e08a8
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/SetFavoritePokemonResponse.cs
@@ -0,0 +1,177 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/SetFavoritePokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/SetFavoritePokemonResponse.proto</summary>
+  public static partial class SetFavoritePokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/SetFavoritePokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetFavoritePokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkBQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1NldEZhdm9yaXRl",
+            "UG9rZW1vblJlc3BvbnNlLnByb3RvEh9QT0dPUHJvdG9zLk5ldHdvcmtpbmcu",
+            "UmVzcG9uc2VzIskBChpTZXRGYXZvcml0ZVBva2Vtb25SZXNwb25zZRJSCgZy",
+            "ZXN1bHQYASABKA4yQi5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2Vz",
+            "LlNldEZhdm9yaXRlUG9rZW1vblJlc3BvbnNlLlJlc3VsdCJXCgZSZXN1bHQS",
+            "CQoFVU5TRVQQABILCgdTVUNDRVNTEAESGwoXRVJST1JfUE9LRU1PTl9OT1Rf",
+            "Rk9VTkQQAhIYChRFUlJPUl9QT0tFTU9OX0lTX0VHRxADYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse), global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Parser, new[]{ "Result" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetFavoritePokemonResponse : pb::IMessage<SetFavoritePokemonResponse> {
+    private static readonly pb::MessageParser<SetFavoritePokemonResponse> _parser = new pb::MessageParser<SetFavoritePokemonResponse>(() => new SetFavoritePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetFavoritePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.SetFavoritePokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonResponse(SetFavoritePokemonResponse other) : this() {
+      result_ = other.result_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetFavoritePokemonResponse Clone() {
+      return new SetFavoritePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetFavoritePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetFavoritePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetFavoritePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.SetFavoritePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetFavoritePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FOUND")] ErrorPokemonNotFound = 2,
+        [pbr::OriginalName("ERROR_POKEMON_IS_EGG")] ErrorPokemonIsEgg = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/SetPlayerTeamResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/SetPlayerTeamResponse.cs
new file mode 100644
index 0000000..772b4d9
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/SetPlayerTeamResponse.cs
@@ -0,0 +1,212 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/SetPlayerTeamResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/SetPlayerTeamResponse.proto</summary>
+  public static partial class SetPlayerTeamResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/SetPlayerTeamResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SetPlayerTeamResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1NldFBsYXllclRl",
+            "YW1SZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcxogUE9HT1Byb3Rvcy9EYXRhL1BsYXllckRhdGEucHJvdG8i3QEKFVNl",
+            "dFBsYXllclRlYW1SZXNwb25zZRJNCgZzdGF0dXMYASABKA4yPS5QT0dPUHJv",
+            "dG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlNldFBsYXllclRlYW1SZXNwb25z",
+            "ZS5TdGF0dXMSMAoLcGxheWVyX2RhdGEYAiABKAsyGy5QT0dPUHJvdG9zLkRh",
+            "dGEuUGxheWVyRGF0YSJDCgZTdGF0dXMSCQoFVU5TRVQQABILCgdTVUNDRVNT",
+            "EAESFAoQVEVBTV9BTFJFQURZX1NFVBACEgsKB0ZBSUxVUkUQA2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PlayerDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SetPlayerTeamResponse), global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Parser, new[]{ "Status", "PlayerData" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SetPlayerTeamResponse : pb::IMessage<SetPlayerTeamResponse> {
+    private static readonly pb::MessageParser<SetPlayerTeamResponse> _parser = new pb::MessageParser<SetPlayerTeamResponse>(() => new SetPlayerTeamResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SetPlayerTeamResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.SetPlayerTeamResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamResponse(SetPlayerTeamResponse other) : this() {
+      status_ = other.status_;
+      PlayerData = other.playerData_ != null ? other.PlayerData.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SetPlayerTeamResponse Clone() {
+      return new SetPlayerTeamResponse(this);
+    }
+
+    /// <summary>Field number for the "status" field.</summary>
+    public const int StatusFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status status_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status Status {
+      get { return status_; }
+      set {
+        status_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "player_data" field.</summary>
+    public const int PlayerDataFieldNumber = 2;
+    private global::POGOProtos.Data.PlayerData playerData_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PlayerData PlayerData {
+      get { return playerData_; }
+      set {
+        playerData_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SetPlayerTeamResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SetPlayerTeamResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Status != other.Status) return false;
+      if (!object.Equals(PlayerData, other.PlayerData)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Status != 0) hash ^= Status.GetHashCode();
+      if (playerData_ != null) hash ^= PlayerData.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Status != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Status);
+      }
+      if (playerData_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Status != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+      }
+      if (playerData_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerData);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SetPlayerTeamResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Status != 0) {
+        Status = other.Status;
+      }
+      if (other.playerData_ != null) {
+        if (playerData_ == null) {
+          playerData_ = new global::POGOProtos.Data.PlayerData();
+        }
+        PlayerData.MergeFrom(other.PlayerData);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            status_ = (global::POGOProtos.Networking.Responses.SetPlayerTeamResponse.Types.Status) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (playerData_ == null) {
+              playerData_ = new global::POGOProtos.Data.PlayerData();
+            }
+            input.ReadMessage(playerData_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SetPlayerTeamResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Status {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("TEAM_ALREADY_SET")] TeamAlreadySet = 2,
+        [pbr::OriginalName("FAILURE")] Failure = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/SfidaActionLogResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/SfidaActionLogResponse.cs
new file mode 100644
index 0000000..0ae21e0
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/SfidaActionLogResponse.cs
@@ -0,0 +1,196 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/SfidaActionLogResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/SfidaActionLogResponse.proto</summary>
+  public static partial class SfidaActionLogResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/SfidaActionLogResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SfidaActionLogResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1NmaWRhQWN0aW9u",
+            "TG9nUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMaKVBPR09Qcm90b3MvRGF0YS9Mb2dzL0FjdGlvbkxvZ0VudHJ5LnBy",
+            "b3RvIsUBChZTZmlkYUFjdGlvbkxvZ1Jlc3BvbnNlEk4KBnJlc3VsdBgBIAEo",
+            "DjI+LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuU2ZpZGFBY3Rp",
+            "b25Mb2dSZXNwb25zZS5SZXN1bHQSOQoLbG9nX2VudHJpZXMYAiADKAsyJC5Q",
+            "T0dPUHJvdG9zLkRhdGEuTG9ncy5BY3Rpb25Mb2dFbnRyeSIgCgZSZXN1bHQS",
+            "CQoFVU5TRVQQABILCgdTVUNDRVNTEAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Logs.ActionLogEntryReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.SfidaActionLogResponse), global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Parser, new[]{ "Result", "LogEntries" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class SfidaActionLogResponse : pb::IMessage<SfidaActionLogResponse> {
+    private static readonly pb::MessageParser<SfidaActionLogResponse> _parser = new pb::MessageParser<SfidaActionLogResponse>(() => new SfidaActionLogResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<SfidaActionLogResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.SfidaActionLogResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogResponse(SfidaActionLogResponse other) : this() {
+      result_ = other.result_;
+      logEntries_ = other.logEntries_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public SfidaActionLogResponse Clone() {
+      return new SfidaActionLogResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "log_entries" field.</summary>
+    public const int LogEntriesFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Data.Logs.ActionLogEntry> _repeated_logEntries_codec
+        = pb::FieldCodec.ForMessage(18, global::POGOProtos.Data.Logs.ActionLogEntry.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Data.Logs.ActionLogEntry> logEntries_ = new pbc::RepeatedField<global::POGOProtos.Data.Logs.ActionLogEntry>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Data.Logs.ActionLogEntry> LogEntries {
+      get { return logEntries_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as SfidaActionLogResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(SfidaActionLogResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if(!logEntries_.Equals(other.logEntries_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      hash ^= logEntries_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      logEntries_.WriteTo(output, _repeated_logEntries_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      size += logEntries_.CalculateSize(_repeated_logEntries_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(SfidaActionLogResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      logEntries_.Add(other.logEntries_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.SfidaActionLogResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            logEntries_.AddEntriesFrom(input, _repeated_logEntries_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SfidaActionLogResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/StartGymBattleResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/StartGymBattleResponse.cs
new file mode 100644
index 0000000..336b586
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/StartGymBattleResponse.cs
@@ -0,0 +1,352 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/StartGymBattleResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/StartGymBattleResponse.proto</summary>
+  public static partial class StartGymBattleResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/StartGymBattleResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static StartGymBattleResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1N0YXJ0R3ltQmF0",
+            "dGxlUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMaJlBPR09Qcm90b3MvRGF0YS9CYXR0bGUvQmF0dGxlTG9nLnByb3Rv",
+            "Gi5QT0dPUHJvdG9zL0RhdGEvQmF0dGxlL0JhdHRsZVBhcnRpY2lwYW50LnBy",
+            "b3RvIq8FChZTdGFydEd5bUJhdHRsZVJlc3BvbnNlEk4KBnJlc3VsdBgBIAEo",
+            "DjI+LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuU3RhcnRHeW1C",
+            "YXR0bGVSZXNwb25zZS5SZXN1bHQSIQoZYmF0dGxlX3N0YXJ0X3RpbWVzdGFt",
+            "cF9tcxgCIAEoAxIfChdiYXR0bGVfZW5kX3RpbWVzdGFtcF9tcxgDIAEoAxIR",
+            "CgliYXR0bGVfaWQYBCABKAkSOwoIZGVmZW5kZXIYBSABKAsyKS5QT0dPUHJv",
+            "dG9zLkRhdGEuQmF0dGxlLkJhdHRsZVBhcnRpY2lwYW50EjUKCmJhdHRsZV9s",
+            "b2cYBiABKAsyIS5QT0dPUHJvdG9zLkRhdGEuQmF0dGxlLkJhdHRsZUxvZyL5",
+            "AgoGUmVzdWx0EgkKBVVOU0VUEAASCwoHU1VDQ0VTUxABEhcKE0VSUk9SX0dZ",
+            "TV9OT1RfRk9VTkQQAhIVChFFUlJPUl9HWU1fTkVVVFJBTBADEhgKFEVSUk9S",
+            "X0dZTV9XUk9OR19URUFNEAQSEwoPRVJST1JfR1lNX0VNUFRZEAUSGgoWRVJS",
+            "T1JfSU5WQUxJRF9ERUZFTkRFUhAGEikKJUVSUk9SX1RSQUlOSU5HX0lOVkFM",
+            "SURfQVRUQUNLRVJfQ09VTlQQBxIdChlFUlJPUl9BTExfUE9LRU1PTl9GQUlO",
+            "VEVEEAgSGgoWRVJST1JfVE9PX01BTllfQkFUVExFUxAJEhoKFkVSUk9SX1RP",
+            "T19NQU5ZX1BMQVlFUlMQChIcChhFUlJPUl9HWU1fQkFUVExFX0xPQ0tPVVQQ",
+            "CxIkCiBFUlJPUl9QTEFZRVJfQkVMT1dfTUlOSU1VTV9MRVZFTBAMEhYKEkVS",
+            "Uk9SX05PVF9JTl9SQU5HRRANYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.Battle.BattleLogReflection.Descriptor, global::POGOProtos.Data.Battle.BattleParticipantReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.StartGymBattleResponse), global::POGOProtos.Networking.Responses.StartGymBattleResponse.Parser, new[]{ "Result", "BattleStartTimestampMs", "BattleEndTimestampMs", "BattleId", "Defender", "BattleLog" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class StartGymBattleResponse : pb::IMessage<StartGymBattleResponse> {
+    private static readonly pb::MessageParser<StartGymBattleResponse> _parser = new pb::MessageParser<StartGymBattleResponse>(() => new StartGymBattleResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<StartGymBattleResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.StartGymBattleResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleResponse(StartGymBattleResponse other) : this() {
+      result_ = other.result_;
+      battleStartTimestampMs_ = other.battleStartTimestampMs_;
+      battleEndTimestampMs_ = other.battleEndTimestampMs_;
+      battleId_ = other.battleId_;
+      Defender = other.defender_ != null ? other.Defender.Clone() : null;
+      BattleLog = other.battleLog_ != null ? other.BattleLog.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StartGymBattleResponse Clone() {
+      return new StartGymBattleResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_start_timestamp_ms" field.</summary>
+    public const int BattleStartTimestampMsFieldNumber = 2;
+    private long battleStartTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleStartTimestampMs {
+      get { return battleStartTimestampMs_; }
+      set {
+        battleStartTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_end_timestamp_ms" field.</summary>
+    public const int BattleEndTimestampMsFieldNumber = 3;
+    private long battleEndTimestampMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long BattleEndTimestampMs {
+      get { return battleEndTimestampMs_; }
+      set {
+        battleEndTimestampMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_id" field.</summary>
+    public const int BattleIdFieldNumber = 4;
+    private string battleId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string BattleId {
+      get { return battleId_; }
+      set {
+        battleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "defender" field.</summary>
+    public const int DefenderFieldNumber = 5;
+    private global::POGOProtos.Data.Battle.BattleParticipant defender_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleParticipant Defender {
+      get { return defender_; }
+      set {
+        defender_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle_log" field.</summary>
+    public const int BattleLogFieldNumber = 6;
+    private global::POGOProtos.Data.Battle.BattleLog battleLog_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.Battle.BattleLog BattleLog {
+      get { return battleLog_; }
+      set {
+        battleLog_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as StartGymBattleResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(StartGymBattleResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (BattleStartTimestampMs != other.BattleStartTimestampMs) return false;
+      if (BattleEndTimestampMs != other.BattleEndTimestampMs) return false;
+      if (BattleId != other.BattleId) return false;
+      if (!object.Equals(Defender, other.Defender)) return false;
+      if (!object.Equals(BattleLog, other.BattleLog)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (BattleStartTimestampMs != 0L) hash ^= BattleStartTimestampMs.GetHashCode();
+      if (BattleEndTimestampMs != 0L) hash ^= BattleEndTimestampMs.GetHashCode();
+      if (BattleId.Length != 0) hash ^= BattleId.GetHashCode();
+      if (defender_ != null) hash ^= Defender.GetHashCode();
+      if (battleLog_ != null) hash ^= BattleLog.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (BattleStartTimestampMs != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        output.WriteRawTag(24);
+        output.WriteInt64(BattleEndTimestampMs);
+      }
+      if (BattleId.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(BattleId);
+      }
+      if (defender_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(Defender);
+      }
+      if (battleLog_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(BattleLog);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (BattleStartTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleStartTimestampMs);
+      }
+      if (BattleEndTimestampMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(BattleEndTimestampMs);
+      }
+      if (BattleId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(BattleId);
+      }
+      if (defender_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Defender);
+      }
+      if (battleLog_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleLog);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(StartGymBattleResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.BattleStartTimestampMs != 0L) {
+        BattleStartTimestampMs = other.BattleStartTimestampMs;
+      }
+      if (other.BattleEndTimestampMs != 0L) {
+        BattleEndTimestampMs = other.BattleEndTimestampMs;
+      }
+      if (other.BattleId.Length != 0) {
+        BattleId = other.BattleId;
+      }
+      if (other.defender_ != null) {
+        if (defender_ == null) {
+          defender_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+        }
+        Defender.MergeFrom(other.Defender);
+      }
+      if (other.battleLog_ != null) {
+        if (battleLog_ == null) {
+          battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+        }
+        BattleLog.MergeFrom(other.BattleLog);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.StartGymBattleResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            BattleStartTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            BattleEndTimestampMs = input.ReadInt64();
+            break;
+          }
+          case 34: {
+            BattleId = input.ReadString();
+            break;
+          }
+          case 42: {
+            if (defender_ == null) {
+              defender_ = new global::POGOProtos.Data.Battle.BattleParticipant();
+            }
+            input.ReadMessage(defender_);
+            break;
+          }
+          case 50: {
+            if (battleLog_ == null) {
+              battleLog_ = new global::POGOProtos.Data.Battle.BattleLog();
+            }
+            input.ReadMessage(battleLog_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the StartGymBattleResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_GYM_NOT_FOUND")] ErrorGymNotFound = 2,
+        [pbr::OriginalName("ERROR_GYM_NEUTRAL")] ErrorGymNeutral = 3,
+        [pbr::OriginalName("ERROR_GYM_WRONG_TEAM")] ErrorGymWrongTeam = 4,
+        [pbr::OriginalName("ERROR_GYM_EMPTY")] ErrorGymEmpty = 5,
+        [pbr::OriginalName("ERROR_INVALID_DEFENDER")] ErrorInvalidDefender = 6,
+        [pbr::OriginalName("ERROR_TRAINING_INVALID_ATTACKER_COUNT")] ErrorTrainingInvalidAttackerCount = 7,
+        [pbr::OriginalName("ERROR_ALL_POKEMON_FAINTED")] ErrorAllPokemonFainted = 8,
+        [pbr::OriginalName("ERROR_TOO_MANY_BATTLES")] ErrorTooManyBattles = 9,
+        [pbr::OriginalName("ERROR_TOO_MANY_PLAYERS")] ErrorTooManyPlayers = 10,
+        [pbr::OriginalName("ERROR_GYM_BATTLE_LOCKOUT")] ErrorGymBattleLockout = 11,
+        [pbr::OriginalName("ERROR_PLAYER_BELOW_MINIMUM_LEVEL")] ErrorPlayerBelowMinimumLevel = 12,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 13,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UpgradePokemonResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UpgradePokemonResponse.cs
new file mode 100644
index 0000000..5d21bdb
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UpgradePokemonResponse.cs
@@ -0,0 +1,217 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UpgradePokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UpgradePokemonResponse.proto</summary>
+  public static partial class UpgradePokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UpgradePokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UpgradePokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VwZ3JhZGVQb2tl",
+            "bW9uUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMaIVBPR09Qcm90b3MvRGF0YS9Qb2tlbW9uRGF0YS5wcm90byLCAgoW",
+            "VXBncmFkZVBva2Vtb25SZXNwb25zZRJOCgZyZXN1bHQYASABKA4yPi5QT0dP",
+            "UHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlVwZ3JhZGVQb2tlbW9uUmVz",
+            "cG9uc2UuUmVzdWx0EjYKEHVwZ3JhZGVkX3Bva2Vtb24YAiABKAsyHC5QT0dP",
+            "UHJvdG9zLkRhdGEuUG9rZW1vbkRhdGEinwEKBlJlc3VsdBIJCgVVTlNFVBAA",
+            "EgsKB1NVQ0NFU1MQARIbChdFUlJPUl9QT0tFTU9OX05PVF9GT1VORBACEiAK",
+            "HEVSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMQAxIfChtFUlJPUl9VUEdS",
+            "QURFX05PVF9BVkFJTEFCTEUQBBIdChlFUlJPUl9QT0tFTU9OX0lTX0RFUExP",
+            "WUVEEAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Data.PokemonDataReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UpgradePokemonResponse), global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Parser, new[]{ "Result", "UpgradedPokemon" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UpgradePokemonResponse : pb::IMessage<UpgradePokemonResponse> {
+    private static readonly pb::MessageParser<UpgradePokemonResponse> _parser = new pb::MessageParser<UpgradePokemonResponse>(() => new UpgradePokemonResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UpgradePokemonResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UpgradePokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonResponse(UpgradePokemonResponse other) : this() {
+      result_ = other.result_;
+      UpgradedPokemon = other.upgradedPokemon_ != null ? other.UpgradedPokemon.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UpgradePokemonResponse Clone() {
+      return new UpgradePokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "upgraded_pokemon" field.</summary>
+    public const int UpgradedPokemonFieldNumber = 2;
+    private global::POGOProtos.Data.PokemonData upgradedPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Data.PokemonData UpgradedPokemon {
+      get { return upgradedPokemon_; }
+      set {
+        upgradedPokemon_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UpgradePokemonResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UpgradePokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(UpgradedPokemon, other.UpgradedPokemon)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (upgradedPokemon_ != null) hash ^= UpgradedPokemon.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (upgradedPokemon_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(UpgradedPokemon);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (upgradedPokemon_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(UpgradedPokemon);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UpgradePokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.upgradedPokemon_ != null) {
+        if (upgradedPokemon_ == null) {
+          upgradedPokemon_ = new global::POGOProtos.Data.PokemonData();
+        }
+        UpgradedPokemon.MergeFrom(other.UpgradedPokemon);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (upgradedPokemon_ == null) {
+              upgradedPokemon_ = new global::POGOProtos.Data.PokemonData();
+            }
+            input.ReadMessage(upgradedPokemon_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UpgradePokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_POKEMON_NOT_FOUND")] ErrorPokemonNotFound = 2,
+        [pbr::OriginalName("ERROR_INSUFFICIENT_RESOURCES")] ErrorInsufficientResources = 3,
+        [pbr::OriginalName("ERROR_UPGRADE_NOT_AVAILABLE")] ErrorUpgradeNotAvailable = 4,
+        [pbr::OriginalName("ERROR_POKEMON_IS_DEPLOYED")] ErrorPokemonIsDeployed = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseIncenseResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseIncenseResponse.cs
new file mode 100644
index 0000000..9db7ffd
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseIncenseResponse.cs
@@ -0,0 +1,214 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseIncenseResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseIncenseResponse.proto</summary>
+  public static partial class UseIncenseResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseIncenseResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseIncenseResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjhQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUluY2Vuc2VS",
+            "ZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNl",
+            "cxomUE9HT1Byb3Rvcy9JbnZlbnRvcnkvQXBwbGllZEl0ZW0ucHJvdG8ihwIK",
+            "ElVzZUluY2Vuc2VSZXNwb25zZRJKCgZyZXN1bHQYASABKA4yOi5QT0dPUHJv",
+            "dG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlVzZUluY2Vuc2VSZXNwb25zZS5S",
+            "ZXN1bHQSOgoPYXBwbGllZF9pbmNlbnNlGAIgASgLMiEuUE9HT1Byb3Rvcy5J",
+            "bnZlbnRvcnkuQXBwbGllZEl0ZW0iaQoGUmVzdWx0EgsKB1VOS05PV04QABIL",
+            "CgdTVUNDRVNTEAESGgoWSU5DRU5TRV9BTFJFQURZX0FDVElWRRACEhUKEU5P",
+            "TkVfSU5fSU5WRU5UT1JZEAMSEgoOTE9DQVRJT05fVU5TRVQQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.AppliedItemReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseIncenseResponse), global::POGOProtos.Networking.Responses.UseIncenseResponse.Parser, new[]{ "Result", "AppliedIncense" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseIncenseResponse : pb::IMessage<UseIncenseResponse> {
+    private static readonly pb::MessageParser<UseIncenseResponse> _parser = new pb::MessageParser<UseIncenseResponse>(() => new UseIncenseResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseIncenseResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseIncenseResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseResponse(UseIncenseResponse other) : this() {
+      result_ = other.result_;
+      AppliedIncense = other.appliedIncense_ != null ? other.AppliedIncense.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseIncenseResponse Clone() {
+      return new UseIncenseResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_incense" field.</summary>
+    public const int AppliedIncenseFieldNumber = 2;
+    private global::POGOProtos.Inventory.AppliedItem appliedIncense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.AppliedItem AppliedIncense {
+      get { return appliedIncense_; }
+      set {
+        appliedIncense_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseIncenseResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseIncenseResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(AppliedIncense, other.AppliedIncense)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (appliedIncense_ != null) hash ^= AppliedIncense.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (appliedIncense_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(AppliedIncense);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (appliedIncense_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedIncense);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseIncenseResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.appliedIncense_ != null) {
+        if (appliedIncense_ == null) {
+          appliedIncense_ = new global::POGOProtos.Inventory.AppliedItem();
+        }
+        AppliedIncense.MergeFrom(other.AppliedIncense);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseIncenseResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (appliedIncense_ == null) {
+              appliedIncense_ = new global::POGOProtos.Inventory.AppliedItem();
+            }
+            input.ReadMessage(appliedIncense_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseIncenseResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNKNOWN")] Unknown = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("INCENSE_ALREADY_ACTIVE")] IncenseAlreadyActive = 2,
+        [pbr::OriginalName("NONE_IN_INVENTORY")] NoneInInventory = 3,
+        [pbr::OriginalName("LOCATION_UNSET")] LocationUnset = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseItemCaptureResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseItemCaptureResponse.cs
new file mode 100644
index 0000000..cd9fcac
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseItemCaptureResponse.cs
@@ -0,0 +1,331 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseItemCaptureResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseItemCaptureResponse.proto</summary>
+  public static partial class UseItemCaptureResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseItemCaptureResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemCaptureResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUl0ZW1DYXB0",
+            "dXJlUmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMisQEKFlVzZUl0ZW1DYXB0dXJlUmVzcG9uc2USDwoHc3VjY2VzcxgB",
+            "IAEoCBIZChFpdGVtX2NhcHR1cmVfbXVsdBgCIAEoARIWCg5pdGVtX2ZsZWVf",
+            "bXVsdBgDIAEoARIVCg1zdG9wX21vdmVtZW50GAQgASgIEhMKC3N0b3BfYXR0",
+            "YWNrGAUgASgIEhIKCnRhcmdldF9tYXgYBiABKAgSEwoLdGFyZ2V0X3Nsb3cY",
+            "ByABKAhiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemCaptureResponse), global::POGOProtos.Networking.Responses.UseItemCaptureResponse.Parser, new[]{ "Success", "ItemCaptureMult", "ItemFleeMult", "StopMovement", "StopAttack", "TargetMax", "TargetSlow" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemCaptureResponse : pb::IMessage<UseItemCaptureResponse> {
+    private static readonly pb::MessageParser<UseItemCaptureResponse> _parser = new pb::MessageParser<UseItemCaptureResponse>(() => new UseItemCaptureResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemCaptureResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseItemCaptureResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureResponse(UseItemCaptureResponse other) : this() {
+      success_ = other.success_;
+      itemCaptureMult_ = other.itemCaptureMult_;
+      itemFleeMult_ = other.itemFleeMult_;
+      stopMovement_ = other.stopMovement_;
+      stopAttack_ = other.stopAttack_;
+      targetMax_ = other.targetMax_;
+      targetSlow_ = other.targetSlow_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemCaptureResponse Clone() {
+      return new UseItemCaptureResponse(this);
+    }
+
+    /// <summary>Field number for the "success" field.</summary>
+    public const int SuccessFieldNumber = 1;
+    private bool success_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Success {
+      get { return success_; }
+      set {
+        success_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_capture_mult" field.</summary>
+    public const int ItemCaptureMultFieldNumber = 2;
+    private double itemCaptureMult_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ItemCaptureMult {
+      get { return itemCaptureMult_; }
+      set {
+        itemCaptureMult_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_flee_mult" field.</summary>
+    public const int ItemFleeMultFieldNumber = 3;
+    private double itemFleeMult_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ItemFleeMult {
+      get { return itemFleeMult_; }
+      set {
+        itemFleeMult_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stop_movement" field.</summary>
+    public const int StopMovementFieldNumber = 4;
+    private bool stopMovement_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool StopMovement {
+      get { return stopMovement_; }
+      set {
+        stopMovement_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stop_attack" field.</summary>
+    public const int StopAttackFieldNumber = 5;
+    private bool stopAttack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool StopAttack {
+      get { return stopAttack_; }
+      set {
+        stopAttack_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_max" field.</summary>
+    public const int TargetMaxFieldNumber = 6;
+    private bool targetMax_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool TargetMax {
+      get { return targetMax_; }
+      set {
+        targetMax_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "target_slow" field.</summary>
+    public const int TargetSlowFieldNumber = 7;
+    private bool targetSlow_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool TargetSlow {
+      get { return targetSlow_; }
+      set {
+        targetSlow_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemCaptureResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemCaptureResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Success != other.Success) return false;
+      if (ItemCaptureMult != other.ItemCaptureMult) return false;
+      if (ItemFleeMult != other.ItemFleeMult) return false;
+      if (StopMovement != other.StopMovement) return false;
+      if (StopAttack != other.StopAttack) return false;
+      if (TargetMax != other.TargetMax) return false;
+      if (TargetSlow != other.TargetSlow) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Success != false) hash ^= Success.GetHashCode();
+      if (ItemCaptureMult != 0D) hash ^= ItemCaptureMult.GetHashCode();
+      if (ItemFleeMult != 0D) hash ^= ItemFleeMult.GetHashCode();
+      if (StopMovement != false) hash ^= StopMovement.GetHashCode();
+      if (StopAttack != false) hash ^= StopAttack.GetHashCode();
+      if (TargetMax != false) hash ^= TargetMax.GetHashCode();
+      if (TargetSlow != false) hash ^= TargetSlow.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Success != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Success);
+      }
+      if (ItemCaptureMult != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(ItemCaptureMult);
+      }
+      if (ItemFleeMult != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(ItemFleeMult);
+      }
+      if (StopMovement != false) {
+        output.WriteRawTag(32);
+        output.WriteBool(StopMovement);
+      }
+      if (StopAttack != false) {
+        output.WriteRawTag(40);
+        output.WriteBool(StopAttack);
+      }
+      if (TargetMax != false) {
+        output.WriteRawTag(48);
+        output.WriteBool(TargetMax);
+      }
+      if (TargetSlow != false) {
+        output.WriteRawTag(56);
+        output.WriteBool(TargetSlow);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Success != false) {
+        size += 1 + 1;
+      }
+      if (ItemCaptureMult != 0D) {
+        size += 1 + 8;
+      }
+      if (ItemFleeMult != 0D) {
+        size += 1 + 8;
+      }
+      if (StopMovement != false) {
+        size += 1 + 1;
+      }
+      if (StopAttack != false) {
+        size += 1 + 1;
+      }
+      if (TargetMax != false) {
+        size += 1 + 1;
+      }
+      if (TargetSlow != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemCaptureResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Success != false) {
+        Success = other.Success;
+      }
+      if (other.ItemCaptureMult != 0D) {
+        ItemCaptureMult = other.ItemCaptureMult;
+      }
+      if (other.ItemFleeMult != 0D) {
+        ItemFleeMult = other.ItemFleeMult;
+      }
+      if (other.StopMovement != false) {
+        StopMovement = other.StopMovement;
+      }
+      if (other.StopAttack != false) {
+        StopAttack = other.StopAttack;
+      }
+      if (other.TargetMax != false) {
+        TargetMax = other.TargetMax;
+      }
+      if (other.TargetSlow != false) {
+        TargetSlow = other.TargetSlow;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Success = input.ReadBool();
+            break;
+          }
+          case 17: {
+            ItemCaptureMult = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            ItemFleeMult = input.ReadDouble();
+            break;
+          }
+          case 32: {
+            StopMovement = input.ReadBool();
+            break;
+          }
+          case 40: {
+            StopAttack = input.ReadBool();
+            break;
+          }
+          case 48: {
+            TargetMax = input.ReadBool();
+            break;
+          }
+          case 56: {
+            TargetSlow = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.cs
new file mode 100644
index 0000000..eeacaa3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.cs
@@ -0,0 +1,221 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.proto</summary>
+  public static partial class UseItemEggIncubatorResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseItemEggIncubatorResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemEggIncubatorResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkFQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUl0ZW1FZ2dJ",
+            "bmN1YmF0b3JSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5n",
+            "LlJlc3BvbnNlcxonUE9HT1Byb3Rvcy9JbnZlbnRvcnkvRWdnSW5jdWJhdG9y",
+            "LnByb3RvIp8DChtVc2VJdGVtRWdnSW5jdWJhdG9yUmVzcG9uc2USUwoGcmVz",
+            "dWx0GAEgASgOMkMuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNlcy5V",
+            "c2VJdGVtRWdnSW5jdWJhdG9yUmVzcG9uc2UuUmVzdWx0EjkKDWVnZ19pbmN1",
+            "YmF0b3IYAiABKAsyIi5QT0dPUHJvdG9zLkludmVudG9yeS5FZ2dJbmN1YmF0",
+            "b3Ii7wEKBlJlc3VsdBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQARIdChlFUlJP",
+            "Ul9JTkNVQkFUT1JfTk9UX0ZPVU5EEAISHwobRVJST1JfUE9LRU1PTl9FR0df",
+            "Tk9UX0ZPVU5EEAMSHAoYRVJST1JfUE9LRU1PTl9JRF9OT1RfRUdHEAQSIgoe",
+            "RVJST1JfSU5DVUJBVE9SX0FMUkVBRFlfSU5fVVNFEAUSJAogRVJST1JfUE9L",
+            "RU1PTl9BTFJFQURZX0lOQ1VCQVRJTkcQBhIlCiFFUlJPUl9JTkNVQkFUT1Jf",
+            "Tk9fVVNFU19SRU1BSU5JTkcQB2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.EggIncubatorReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse), global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Parser, new[]{ "Result", "EggIncubator" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemEggIncubatorResponse : pb::IMessage<UseItemEggIncubatorResponse> {
+    private static readonly pb::MessageParser<UseItemEggIncubatorResponse> _parser = new pb::MessageParser<UseItemEggIncubatorResponse>(() => new UseItemEggIncubatorResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemEggIncubatorResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorResponse(UseItemEggIncubatorResponse other) : this() {
+      result_ = other.result_;
+      EggIncubator = other.eggIncubator_ != null ? other.EggIncubator.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemEggIncubatorResponse Clone() {
+      return new UseItemEggIncubatorResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubator" field.</summary>
+    public const int EggIncubatorFieldNumber = 2;
+    private global::POGOProtos.Inventory.EggIncubator eggIncubator_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubator EggIncubator {
+      get { return eggIncubator_; }
+      set {
+        eggIncubator_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemEggIncubatorResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemEggIncubatorResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(EggIncubator, other.EggIncubator)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (eggIncubator_ != null) hash ^= EggIncubator.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (eggIncubator_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(EggIncubator);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (eggIncubator_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubator);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemEggIncubatorResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.eggIncubator_ != null) {
+        if (eggIncubator_ == null) {
+          eggIncubator_ = new global::POGOProtos.Inventory.EggIncubator();
+        }
+        EggIncubator.MergeFrom(other.EggIncubator);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemEggIncubatorResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (eggIncubator_ == null) {
+              eggIncubator_ = new global::POGOProtos.Inventory.EggIncubator();
+            }
+            input.ReadMessage(eggIncubator_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemEggIncubatorResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INCUBATOR_NOT_FOUND")] ErrorIncubatorNotFound = 2,
+        [pbr::OriginalName("ERROR_POKEMON_EGG_NOT_FOUND")] ErrorPokemonEggNotFound = 3,
+        [pbr::OriginalName("ERROR_POKEMON_ID_NOT_EGG")] ErrorPokemonIdNotEgg = 4,
+        [pbr::OriginalName("ERROR_INCUBATOR_ALREADY_IN_USE")] ErrorIncubatorAlreadyInUse = 5,
+        [pbr::OriginalName("ERROR_POKEMON_ALREADY_INCUBATING")] ErrorPokemonAlreadyIncubating = 6,
+        [pbr::OriginalName("ERROR_INCUBATOR_NO_USES_REMAINING")] ErrorIncubatorNoUsesRemaining = 7,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseItemGymResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseItemGymResponse.cs
new file mode 100644
index 0000000..6012e62
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseItemGymResponse.cs
@@ -0,0 +1,208 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseItemGymResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseItemGymResponse.proto</summary>
+  public static partial class UseItemGymResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseItemGymResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemGymResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjhQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUl0ZW1HeW1S",
+            "ZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3BvbnNl",
+            "cyLEAQoSVXNlSXRlbUd5bVJlc3BvbnNlEkoKBnJlc3VsdBgBIAEoDjI6LlBP",
+            "R09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuVXNlSXRlbUd5bVJlc3Bv",
+            "bnNlLlJlc3VsdBISCgp1cGRhdGVkX2dwGAIgASgDIk4KBlJlc3VsdBIJCgVV",
+            "TlNFVBAAEgsKB1NVQ0NFU1MQARIUChBFUlJPUl9DQU5OT1RfVVNFEAISFgoS",
+            "RVJST1JfTk9UX0lOX1JBTkdFEANiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemGymResponse), global::POGOProtos.Networking.Responses.UseItemGymResponse.Parser, new[]{ "Result", "UpdatedGp" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemGymResponse : pb::IMessage<UseItemGymResponse> {
+    private static readonly pb::MessageParser<UseItemGymResponse> _parser = new pb::MessageParser<UseItemGymResponse>(() => new UseItemGymResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemGymResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseItemGymResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymResponse(UseItemGymResponse other) : this() {
+      result_ = other.result_;
+      updatedGp_ = other.updatedGp_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemGymResponse Clone() {
+      return new UseItemGymResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "updated_gp" field.</summary>
+    public const int UpdatedGpFieldNumber = 2;
+    private long updatedGp_;
+    /// <summary>
+    ///  Gym Points (?)
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long UpdatedGp {
+      get { return updatedGp_; }
+      set {
+        updatedGp_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemGymResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemGymResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (UpdatedGp != other.UpdatedGp) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (UpdatedGp != 0L) hash ^= UpdatedGp.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (UpdatedGp != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(UpdatedGp);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (UpdatedGp != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(UpdatedGp);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemGymResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.UpdatedGp != 0L) {
+        UpdatedGp = other.UpdatedGp;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemGymResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            UpdatedGp = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemGymResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_CANNOT_USE")] ErrorCannotUse = 2,
+        [pbr::OriginalName("ERROR_NOT_IN_RANGE")] ErrorNotInRange = 3,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseItemPotionResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseItemPotionResponse.cs
new file mode 100644
index 0000000..830baaf
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseItemPotionResponse.cs
@@ -0,0 +1,207 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseItemPotionResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseItemPotionResponse.proto</summary>
+  public static partial class UseItemPotionResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseItemPotionResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemPotionResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUl0ZW1Qb3Rp",
+            "b25SZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcyLhAQoVVXNlSXRlbVBvdGlvblJlc3BvbnNlEk0KBnJlc3VsdBgBIAEo",
+            "DjI9LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuVXNlSXRlbVBv",
+            "dGlvblJlc3BvbnNlLlJlc3VsdBIPCgdzdGFtaW5hGAIgASgFImgKBlJlc3Vs",
+            "dBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQARIUChBFUlJPUl9OT19QT0tFTU9O",
+            "EAISFAoQRVJST1JfQ0FOTk9UX1VTRRADEhoKFkVSUk9SX0RFUExPWUVEX1RP",
+            "X0ZPUlQQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemPotionResponse), global::POGOProtos.Networking.Responses.UseItemPotionResponse.Parser, new[]{ "Result", "Stamina" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemPotionResponse : pb::IMessage<UseItemPotionResponse> {
+    private static readonly pb::MessageParser<UseItemPotionResponse> _parser = new pb::MessageParser<UseItemPotionResponse>(() => new UseItemPotionResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemPotionResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseItemPotionResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionResponse(UseItemPotionResponse other) : this() {
+      result_ = other.result_;
+      stamina_ = other.stamina_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemPotionResponse Clone() {
+      return new UseItemPotionResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 2;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemPotionResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemPotionResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (Stamina != other.Stamina) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Stamina);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemPotionResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemPotionResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemPotionResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NO_POKEMON")] ErrorNoPokemon = 2,
+        [pbr::OriginalName("ERROR_CANNOT_USE")] ErrorCannotUse = 3,
+        [pbr::OriginalName("ERROR_DEPLOYED_TO_FORT")] ErrorDeployedToFort = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseItemReviveResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseItemReviveResponse.cs
new file mode 100644
index 0000000..cf262f6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseItemReviveResponse.cs
@@ -0,0 +1,207 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseItemReviveResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseItemReviveResponse.proto</summary>
+  public static partial class UseItemReviveResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseItemReviveResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemReviveResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjtQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUl0ZW1SZXZp",
+            "dmVSZXNwb25zZS5wcm90bxIfUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlJlc3Bv",
+            "bnNlcyLhAQoVVXNlSXRlbVJldml2ZVJlc3BvbnNlEk0KBnJlc3VsdBgBIAEo",
+            "DjI9LlBPR09Qcm90b3MuTmV0d29ya2luZy5SZXNwb25zZXMuVXNlSXRlbVJl",
+            "dml2ZVJlc3BvbnNlLlJlc3VsdBIPCgdzdGFtaW5hGAIgASgFImgKBlJlc3Vs",
+            "dBIJCgVVTlNFVBAAEgsKB1NVQ0NFU1MQARIUChBFUlJPUl9OT19QT0tFTU9O",
+            "EAISFAoQRVJST1JfQ0FOTk9UX1VTRRADEhoKFkVSUk9SX0RFUExPWUVEX1RP",
+            "X0ZPUlQQBGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemReviveResponse), global::POGOProtos.Networking.Responses.UseItemReviveResponse.Parser, new[]{ "Result", "Stamina" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemReviveResponse : pb::IMessage<UseItemReviveResponse> {
+    private static readonly pb::MessageParser<UseItemReviveResponse> _parser = new pb::MessageParser<UseItemReviveResponse>(() => new UseItemReviveResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemReviveResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseItemReviveResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveResponse(UseItemReviveResponse other) : this() {
+      result_ = other.result_;
+      stamina_ = other.stamina_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemReviveResponse Clone() {
+      return new UseItemReviveResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina" field.</summary>
+    public const int StaminaFieldNumber = 2;
+    private int stamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Stamina {
+      get { return stamina_; }
+      set {
+        stamina_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemReviveResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemReviveResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (Stamina != other.Stamina) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (Stamina != 0) hash ^= Stamina.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (Stamina != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Stamina);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (Stamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemReviveResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.Stamina != 0) {
+        Stamina = other.Stamina;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemReviveResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Stamina = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemReviveResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_NO_POKEMON")] ErrorNoPokemon = 2,
+        [pbr::OriginalName("ERROR_CANNOT_USE")] ErrorCannotUse = 3,
+        [pbr::OriginalName("ERROR_DEPLOYED_TO_FORT")] ErrorDeployedToFort = 4,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Responses/UseItemXpBoostResponse.cs b/PokemonGo/POGOProtos/Networking/Responses/UseItemXpBoostResponse.cs
new file mode 100644
index 0000000..8ae3616
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Responses/UseItemXpBoostResponse.cs
@@ -0,0 +1,217 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Responses/UseItemXpBoostResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Responses {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Networking/Responses/UseItemXpBoostResponse.proto</summary>
+  public static partial class UseItemXpBoostResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Networking/Responses/UseItemXpBoostResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static UseItemXpBoostResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL05ldHdvcmtpbmcvUmVzcG9uc2VzL1VzZUl0ZW1YcEJv",
+            "b3N0UmVzcG9uc2UucHJvdG8SH1BPR09Qcm90b3MuTmV0d29ya2luZy5SZXNw",
+            "b25zZXMaJ1BPR09Qcm90b3MvSW52ZW50b3J5L0FwcGxpZWRJdGVtcy5wcm90",
+            "byK+AgoWVXNlSXRlbVhwQm9vc3RSZXNwb25zZRJOCgZyZXN1bHQYASABKA4y",
+            "Pi5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuUmVzcG9uc2VzLlVzZUl0ZW1YcEJv",
+            "b3N0UmVzcG9uc2UuUmVzdWx0EjkKDWFwcGxpZWRfaXRlbXMYAiABKAsyIi5Q",
+            "T0dPUHJvdG9zLkludmVudG9yeS5BcHBsaWVkSXRlbXMimAEKBlJlc3VsdBIJ",
+            "CgVVTlNFVBAAEgsKB1NVQ0NFU1MQARIbChdFUlJPUl9JTlZBTElEX0lURU1f",
+            "VFlQRRACEiEKHUVSUk9SX1hQX0JPT1NUX0FMUkVBRFlfQUNUSVZFEAMSHAoY",
+            "RVJST1JfTk9fSVRFTVNfUkVNQUlOSU5HEAQSGAoURVJST1JfTE9DQVRJT05f",
+            "VU5TRVQQBWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.AppliedItemsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Responses.UseItemXpBoostResponse), global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Parser, new[]{ "Result", "AppliedItems" }, null, new[]{ typeof(global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result) }, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class UseItemXpBoostResponse : pb::IMessage<UseItemXpBoostResponse> {
+    private static readonly pb::MessageParser<UseItemXpBoostResponse> _parser = new pb::MessageParser<UseItemXpBoostResponse>(() => new UseItemXpBoostResponse());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<UseItemXpBoostResponse> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Responses.UseItemXpBoostResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostResponse(UseItemXpBoostResponse other) : this() {
+      result_ = other.result_;
+      AppliedItems = other.appliedItems_ != null ? other.AppliedItems.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public UseItemXpBoostResponse Clone() {
+      return new UseItemXpBoostResponse(this);
+    }
+
+    /// <summary>Field number for the "result" field.</summary>
+    public const int ResultFieldNumber = 1;
+    private global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result result_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result Result {
+      get { return result_; }
+      set {
+        result_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "applied_items" field.</summary>
+    public const int AppliedItemsFieldNumber = 2;
+    private global::POGOProtos.Inventory.AppliedItems appliedItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.AppliedItems AppliedItems {
+      get { return appliedItems_; }
+      set {
+        appliedItems_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as UseItemXpBoostResponse);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(UseItemXpBoostResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Result != other.Result) return false;
+      if (!object.Equals(AppliedItems, other.AppliedItems)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Result != 0) hash ^= Result.GetHashCode();
+      if (appliedItems_ != null) hash ^= AppliedItems.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Result != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) Result);
+      }
+      if (appliedItems_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(AppliedItems);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Result != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Result);
+      }
+      if (appliedItems_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedItems);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(UseItemXpBoostResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Result != 0) {
+        Result = other.Result;
+      }
+      if (other.appliedItems_ != null) {
+        if (appliedItems_ == null) {
+          appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+        }
+        AppliedItems.MergeFrom(other.AppliedItems);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            result_ = (global::POGOProtos.Networking.Responses.UseItemXpBoostResponse.Types.Result) input.ReadEnum();
+            break;
+          }
+          case 18: {
+            if (appliedItems_ == null) {
+              appliedItems_ = new global::POGOProtos.Inventory.AppliedItems();
+            }
+            input.ReadMessage(appliedItems_);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the UseItemXpBoostResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public enum Result {
+        [pbr::OriginalName("UNSET")] Unset = 0,
+        [pbr::OriginalName("SUCCESS")] Success = 1,
+        [pbr::OriginalName("ERROR_INVALID_ITEM_TYPE")] ErrorInvalidItemType = 2,
+        [pbr::OriginalName("ERROR_XP_BOOST_ALREADY_ACTIVE")] ErrorXpBoostAlreadyActive = 3,
+        [pbr::OriginalName("ERROR_NO_ITEMS_REMAINING")] ErrorNoItemsRemaining = 4,
+        [pbr::OriginalName("ERROR_LOCATION_UNSET")] ErrorLocationUnset = 5,
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Signature.cs b/PokemonGo/POGOProtos/Networking/Signature.cs
new file mode 100644
index 0000000..6162efb
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Signature.cs
@@ -0,0 +1,3072 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Networking/Signature.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking
+{
+    /// <summary>Holder for reflection information generated from POGOProtos/Networking/Signature.proto</summary>
+    public static partial class SignatureReflection
+    {
+
+        #region Descriptor
+        /// <summary>File descriptor for POGOProtos/Networking/Signature.proto</summary>
+        public static pbr::FileDescriptor Descriptor
+        {
+            get { return descriptor; }
+        }
+        private static pbr::FileDescriptor descriptor;
+
+        static SignatureReflection()
+        {
+            byte[] descriptorData = global::System.Convert.FromBase64String(
+                string.Concat(
+                  "CiVQT0dPUHJvdG9zL05ldHdvcmtpbmcvU2lnbmF0dXJlLnByb3RvIvYNCglT",
+                  "aWduYXR1cmUSHQoVdGltZXN0YW1wX3NpbmNlX3N0YXJ0GAIgASgEEiwKDGxv",
+                  "Y2F0aW9uX2ZpeBgEIAMoCzIWLlNpZ25hdHVyZS5Mb2NhdGlvbkZpeBIrCghn",
+                  "cHNfaW5mbxgFIAEoCzIZLlNpZ25hdHVyZS5BbmRyb2lkR3BzSW5mbxIqCgtz",
+                  "ZW5zb3JfaW5mbxgHIAEoCzIVLlNpZ25hdHVyZS5TZW5zb3JJbmZvEioKC2Rl",
+                  "dmljZV9pbmZvGAggASgLMhUuU2lnbmF0dXJlLkRldmljZUluZm8SMgoPYWN0",
+                  "aXZpdHlfc3RhdHVzGAkgASgLMhkuU2lnbmF0dXJlLkFjdGl2aXR5U3RhdHVz",
+                  "EhYKDmxvY2F0aW9uX2hhc2gxGAogASgNEhYKDmxvY2F0aW9uX2hhc2gyGBQg",
+                  "ASgNEg0KBXVuazIyGBYgASgMEhEKCXRpbWVzdGFtcBgXIAEoBBIUCgxyZXF1",
+                  "ZXN0X2hhc2gYGCADKAQa7AEKC0xvY2F0aW9uRml4EhAKCHByb3ZpZGVyGAEg",
+                  "ASgJEh0KFXRpbWVzdGFtcF9zaW5jZV9zdGFydBgCIAEoBBIQCghsYXRpdHVk",
+                  "ZRgNIAEoAhIRCglsb25naXR1ZGUYDiABKAISGwoTaG9yaXpvbnRhbF9hY2N1",
+                  "cmFjeRgUIAEoAhIQCghhbHRpdHVkZRgVIAEoAhIZChF2ZXJ0aWNhbF9hY2N1",
+                  "cmFjeRgWIAEoAhIXCg9wcm92aWRlcl9zdGF0dXMYGiABKAQSDQoFZmxvb3IY",
+                  "GyABKA0SFQoNbG9jYXRpb25fdHlwZRgcIAEoBBqvAQoOQW5kcm9pZEdwc0lu",
+                  "Zm8SEwoLdGltZV90b19maXgYASABKAQSFgoOc2F0ZWxsaXRlc19wcm4YAiAD",
+                  "KAUSCwoDc25yGAMgAygCEg8KB2F6aW11dGgYBCADKAISEQoJZWxldmF0aW9u",
+                  "GAUgAygCEhMKC2hhc19hbG1hbmFjGAYgAygIEhUKDWhhc19lcGhlbWVyaXMY",
+                  "ByADKAgSEwoLdXNlZF9pbl9maXgYCCADKAgavgMKClNlbnNvckluZm8SGgoS",
+                  "dGltZXN0YW1wX3NuYXBzaG90GAEgASgEEhYKDm1hZ25ldG9tZXRlcl94GAMg",
+                  "ASgBEhYKDm1hZ25ldG9tZXRlcl95GAQgASgBEhYKDm1hZ25ldG9tZXRlcl96",
+                  "GAUgASgBEhoKEmFuZ2xlX25vcm1hbGl6ZWRfeBgGIAEoARIaChJhbmdsZV9u",
+                  "b3JtYWxpemVkX3kYByABKAESGgoSYW5nbGVfbm9ybWFsaXplZF96GAggASgB",
+                  "EhMKC2FjY2VsX3Jhd194GAogASgBEhMKC2FjY2VsX3Jhd195GAsgASgBEhMK",
+                  "C2FjY2VsX3Jhd196GAwgASgBEhcKD2d5cm9zY29wZV9yYXdfeBgNIAEoARIX",
+                  "Cg9neXJvc2NvcGVfcmF3X3kYDiABKAESFwoPZ3lyb3Njb3BlX3Jhd196GA8g",
+                  "ASgBEhoKEmFjY2VsX25vcm1hbGl6ZWRfeBgQIAEoARIaChJhY2NlbF9ub3Jt",
+                  "YWxpemVkX3kYESABKAESGgoSYWNjZWxfbm9ybWFsaXplZF96GBIgASgBEhoK",
+                  "EmFjY2VsZXJvbWV0ZXJfYXhlcxgTIAEoBBraAgoKRGV2aWNlSW5mbxIRCglk",
+                  "ZXZpY2VfaWQYASABKAkSGgoSYW5kcm9pZF9ib2FyZF9uYW1lGAIgASgJEhoK",
+                  "EmFuZHJvaWRfYm9vdGxvYWRlchgDIAEoCRIUCgxkZXZpY2VfYnJhbmQYBCAB",
+                  "KAkSFAoMZGV2aWNlX21vZGVsGAUgASgJEh8KF2RldmljZV9tb2RlbF9pZGVu",
+                  "dGlmaWVyGAYgASgJEhkKEWRldmljZV9tb2RlbF9ib290GAcgASgJEh0KFWhh",
+                  "cmR3YXJlX21hbnVmYWN0dXJlchgIIAEoCRIWCg5oYXJkd2FyZV9tb2RlbBgJ",
+                  "IAEoCRIWCg5maXJtd2FyZV9icmFuZBgKIAEoCRIVCg1maXJtd2FyZV90YWdz",
+                  "GAwgASgJEhUKDWZpcm13YXJlX3R5cGUYDSABKAkSHAoUZmlybXdhcmVfZmlu",
+                  "Z2VycHJpbnQYDiABKAkauwEKDkFjdGl2aXR5U3RhdHVzEhUKDXN0YXJ0X3Rp",
+                  "bWVfbXMYASABKAQSFgoOdW5rbm93bl9zdGF0dXMYAiABKAgSDwoHd2Fsa2lu",
+                  "ZxgDIAEoCBIPCgdydW5uaW5nGAQgASgIEhIKCnN0YXRpb25hcnkYBSABKAgS",
+                  "EgoKYXV0b21vdGl2ZRgGIAEoCBIPCgd0aWx0aW5nGAcgASgIEg8KB2N5Y2xp",
+                  "bmcYCCABKAgSDgoGc3RhdHVzGAkgASgMYgZwcm90bzM="));
+            descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+                new pbr::FileDescriptor[] { },
+                new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+          new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature), global::POGOProtos.Networking.Signature.Parser, new[]{ "TimestampSinceStart", "LocationFix", "GpsInfo", "SensorInfo", "DeviceInfo", "ActivityStatus", "LocationHash1", "LocationHash2", "Unk22", "Timestamp", "RequestHash" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Types.LocationFix), global::POGOProtos.Networking.Signature.Types.LocationFix.Parser, new[]{ "Provider", "TimestampSinceStart", "Latitude", "Longitude", "HorizontalAccuracy", "Altitude", "VerticalAccuracy", "ProviderStatus", "Floor", "LocationType" }, null, null, null),
+          new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Types.AndroidGpsInfo), global::POGOProtos.Networking.Signature.Types.AndroidGpsInfo.Parser, new[]{ "TimeToFix", "SatellitesPrn", "Snr", "Azimuth", "Elevation", "HasAlmanac", "HasEphemeris", "UsedInFix" }, null, null, null),
+          new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Types.SensorInfo), global::POGOProtos.Networking.Signature.Types.SensorInfo.Parser, new[]{ "TimestampSnapshot", "MagnetometerX", "MagnetometerY", "MagnetometerZ", "AngleNormalizedX", "AngleNormalizedY", "AngleNormalizedZ", "AccelRawX", "AccelRawY", "AccelRawZ", "GyroscopeRawX", "GyroscopeRawY", "GyroscopeRawZ", "AccelNormalizedX", "AccelNormalizedY", "AccelNormalizedZ", "AccelerometerAxes" }, null, null, null),
+          new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Types.DeviceInfo), global::POGOProtos.Networking.Signature.Types.DeviceInfo.Parser, new[]{ "DeviceId", "AndroidBoardName", "AndroidBootloader", "DeviceBrand", "DeviceModel", "DeviceModelIdentifier", "DeviceModelBoot", "HardwareManufacturer", "HardwareModel", "FirmwareBrand", "FirmwareTags", "FirmwareType", "FirmwareFingerprint" }, null, null, null),
+          new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Types.ActivityStatus), global::POGOProtos.Networking.Signature.Types.ActivityStatus.Parser, new[]{ "StartTimeMs", "UnknownStatus", "Walking", "Running", "Stationary", "Automotive", "Tilting", "Cycling", "Status" }, null, null, null)})
+                }));
+        }
+        #endregion
+
+    }
+    #region Messages
+    public sealed partial class Signature : pb::IMessage<Signature>
+    {
+        private static readonly pb::MessageParser<Signature> _parser = new pb::MessageParser<Signature>(() => new Signature());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Signature> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor
+        {
+            get { return global::POGOProtos.Networking.SignatureReflection.Descriptor.MessageTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor
+        {
+            get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Signature()
+        {
+            OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Signature(Signature other) : this()
+        {
+            timestampSinceStart_ = other.timestampSinceStart_;
+            locationFix_ = other.locationFix_.Clone();
+            GpsInfo = other.gpsInfo_ != null ? other.GpsInfo.Clone() : null;
+            SensorInfo = other.sensorInfo_ != null ? other.SensorInfo.Clone() : null;
+            DeviceInfo = other.deviceInfo_ != null ? other.DeviceInfo.Clone() : null;
+            ActivityStatus = other.activityStatus_ != null ? other.ActivityStatus.Clone() : null;
+            locationHash1_ = other.locationHash1_;
+            locationHash2_ = other.locationHash2_;
+            unk22_ = other.unk22_;
+            timestamp_ = other.timestamp_;
+            requestHash_ = other.requestHash_.Clone();
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Signature Clone()
+        {
+            return new Signature(this);
+        }
+
+        /// <summary>Field number for the "timestamp_since_start" field.</summary>
+        public const int TimestampSinceStartFieldNumber = 2;
+        private ulong timestampSinceStart_;
+        /// <summary>
+        ///  in ms
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong TimestampSinceStart
+        {
+            get { return timestampSinceStart_; }
+            set
+            {
+                timestampSinceStart_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "location_fix" field.</summary>
+        public const int LocationFixFieldNumber = 4;
+        private static readonly pb::FieldCodec<global::POGOProtos.Networking.Signature.Types.LocationFix> _repeated_locationFix_codec
+            = pb::FieldCodec.ForMessage(34, global::POGOProtos.Networking.Signature.Types.LocationFix.Parser);
+        private readonly pbc::RepeatedField<global::POGOProtos.Networking.Signature.Types.LocationFix> locationFix_ = new pbc::RepeatedField<global::POGOProtos.Networking.Signature.Types.LocationFix>();
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<global::POGOProtos.Networking.Signature.Types.LocationFix> LocationFix
+        {
+            get { return locationFix_; }
+        }
+
+        /// <summary>Field number for the "gps_info" field.</summary>
+        public const int GpsInfoFieldNumber = 5;
+        private global::POGOProtos.Networking.Signature.Types.AndroidGpsInfo gpsInfo_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Networking.Signature.Types.AndroidGpsInfo GpsInfo
+        {
+            get { return gpsInfo_; }
+            set
+            {
+                gpsInfo_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "sensor_info" field.</summary>
+        public const int SensorInfoFieldNumber = 7;
+        private global::POGOProtos.Networking.Signature.Types.SensorInfo sensorInfo_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Networking.Signature.Types.SensorInfo SensorInfo
+        {
+            get { return sensorInfo_; }
+            set
+            {
+                sensorInfo_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "device_info" field.</summary>
+        public const int DeviceInfoFieldNumber = 8;
+        private global::POGOProtos.Networking.Signature.Types.DeviceInfo deviceInfo_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Networking.Signature.Types.DeviceInfo DeviceInfo
+        {
+            get { return deviceInfo_; }
+            set
+            {
+                deviceInfo_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "activity_status" field.</summary>
+        public const int ActivityStatusFieldNumber = 9;
+        private global::POGOProtos.Networking.Signature.Types.ActivityStatus activityStatus_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public global::POGOProtos.Networking.Signature.Types.ActivityStatus ActivityStatus
+        {
+            get { return activityStatus_; }
+            set
+            {
+                activityStatus_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "location_hash1" field.</summary>
+        public const int LocationHash1FieldNumber = 10;
+        private uint locationHash1_;
+        /// <summary>
+        ///  Location1 hashed based on the auth_token - xxHash32
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public uint LocationHash1
+        {
+            get { return locationHash1_; }
+            set
+            {
+                locationHash1_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "location_hash2" field.</summary>
+        public const int LocationHash2FieldNumber = 20;
+        private uint locationHash2_;
+        /// <summary>
+        ///  Location2 hashed based on the auth_token - xxHash32
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public uint LocationHash2
+        {
+            get { return locationHash2_; }
+            set
+            {
+                locationHash2_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "unk22" field.</summary>
+        public const int Unk22FieldNumber = 22;
+        private pb::ByteString unk22_ = pb::ByteString.Empty;
+        /// <summary>
+        ///  possibly replay check. Generation unknown but pointed to by 0001B8614
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unk22
+        {
+            get { return unk22_; }
+            set
+            {
+                unk22_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+            }
+        }
+
+        /// <summary>Field number for the "timestamp" field.</summary>
+        public const int TimestampFieldNumber = 23;
+        private ulong timestamp_;
+        /// <summary>
+        ///  epoch timestamp in ms
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Timestamp
+        {
+            get { return timestamp_; }
+            set
+            {
+                timestamp_ = value;
+            }
+        }
+
+        /// <summary>Field number for the "request_hash" field.</summary>
+        public const int RequestHashFieldNumber = 24;
+        private static readonly pb::FieldCodec<ulong> _repeated_requestHash_codec
+            = pb::FieldCodec.ForUInt64(194);
+        private readonly pbc::RepeatedField<ulong> requestHash_ = new pbc::RepeatedField<ulong>();
+        /// <summary>
+        ///  hashes of each request message in a hashArray - xxhash64
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<ulong> RequestHash
+        {
+            get { return requestHash_; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other)
+        {
+            return Equals(other as Signature);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Signature other)
+        {
+            if (ReferenceEquals(other, null))
+            {
+                return false;
+            }
+            if (ReferenceEquals(other, this))
+            {
+                return true;
+            }
+            if (TimestampSinceStart != other.TimestampSinceStart) return false;
+            if (!locationFix_.Equals(other.locationFix_)) return false;
+            if (!object.Equals(GpsInfo, other.GpsInfo)) return false;
+            if (!object.Equals(SensorInfo, other.SensorInfo)) return false;
+            if (!object.Equals(DeviceInfo, other.DeviceInfo)) return false;
+            if (!object.Equals(ActivityStatus, other.ActivityStatus)) return false;
+            if (LocationHash1 != other.LocationHash1) return false;
+            if (LocationHash2 != other.LocationHash2) return false;
+            if (Unk22 != other.Unk22) return false;
+            if (Timestamp != other.Timestamp) return false;
+            if (!requestHash_.Equals(other.requestHash_)) return false;
+            return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode()
+        {
+            int hash = 1;
+            if (TimestampSinceStart != 0UL) hash ^= TimestampSinceStart.GetHashCode();
+            hash ^= locationFix_.GetHashCode();
+            if (gpsInfo_ != null) hash ^= GpsInfo.GetHashCode();
+            if (sensorInfo_ != null) hash ^= SensorInfo.GetHashCode();
+            if (deviceInfo_ != null) hash ^= DeviceInfo.GetHashCode();
+            if (activityStatus_ != null) hash ^= ActivityStatus.GetHashCode();
+            if (LocationHash1 != 0) hash ^= LocationHash1.GetHashCode();
+            if (LocationHash2 != 0) hash ^= LocationHash2.GetHashCode();
+            if (Unk22.Length != 0) hash ^= Unk22.GetHashCode();
+            if (Timestamp != 0UL) hash ^= Timestamp.GetHashCode();
+            hash ^= requestHash_.GetHashCode();
+            return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString()
+        {
+            return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output)
+        {
+            if (TimestampSinceStart != 0UL)
+            {
+                output.WriteRawTag(16);
+                output.WriteUInt64(TimestampSinceStart);
+            }
+            locationFix_.WriteTo(output, _repeated_locationFix_codec);
+            if (gpsInfo_ != null)
+            {
+                output.WriteRawTag(42);
+                output.WriteMessage(GpsInfo);
+            }
+            if (sensorInfo_ != null)
+            {
+                output.WriteRawTag(58);
+                output.WriteMessage(SensorInfo);
+            }
+            if (deviceInfo_ != null)
+            {
+                output.WriteRawTag(66);
+                output.WriteMessage(DeviceInfo);
+            }
+            if (activityStatus_ != null)
+            {
+                output.WriteRawTag(74);
+                output.WriteMessage(ActivityStatus);
+            }
+            if (LocationHash1 != 0)
+            {
+                output.WriteRawTag(80);
+                output.WriteUInt32(LocationHash1);
+            }
+            if (LocationHash2 != 0)
+            {
+                output.WriteRawTag(160, 1);
+                output.WriteUInt32(LocationHash2);
+            }
+            if (Unk22.Length != 0)
+            {
+                output.WriteRawTag(178, 1);
+                output.WriteBytes(Unk22);
+            }
+            if (Timestamp != 0UL)
+            {
+                output.WriteRawTag(184, 1);
+                output.WriteUInt64(Timestamp);
+            }
+            requestHash_.WriteTo(output, _repeated_requestHash_codec);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize()
+        {
+            int size = 0;
+            if (TimestampSinceStart != 0UL)
+            {
+                size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampSinceStart);
+            }
+            size += locationFix_.CalculateSize(_repeated_locationFix_codec);
+            if (gpsInfo_ != null)
+            {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(GpsInfo);
+            }
+            if (sensorInfo_ != null)
+            {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(SensorInfo);
+            }
+            if (deviceInfo_ != null)
+            {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(DeviceInfo);
+            }
+            if (activityStatus_ != null)
+            {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActivityStatus);
+            }
+            if (LocationHash1 != 0)
+            {
+                size += 1 + pb::CodedOutputStream.ComputeUInt32Size(LocationHash1);
+            }
+            if (LocationHash2 != 0)
+            {
+                size += 2 + pb::CodedOutputStream.ComputeUInt32Size(LocationHash2);
+            }
+            if (Unk22.Length != 0)
+            {
+                size += 2 + pb::CodedOutputStream.ComputeBytesSize(Unk22);
+            }
+            if (Timestamp != 0UL)
+            {
+                size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Timestamp);
+            }
+            size += requestHash_.CalculateSize(_repeated_requestHash_codec);
+            return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Signature other)
+        {
+            if (other == null)
+            {
+                return;
+            }
+            if (other.TimestampSinceStart != 0UL)
+            {
+                TimestampSinceStart = other.TimestampSinceStart;
+            }
+            locationFix_.Add(other.locationFix_);
+            if (other.gpsInfo_ != null)
+            {
+                if (gpsInfo_ == null)
+                {
+                    gpsInfo_ = new global::POGOProtos.Networking.Signature.Types.AndroidGpsInfo();
+                }
+                GpsInfo.MergeFrom(other.GpsInfo);
+            }
+            if (other.sensorInfo_ != null)
+            {
+                if (sensorInfo_ == null)
+                {
+                    sensorInfo_ = new global::POGOProtos.Networking.Signature.Types.SensorInfo();
+                }
+                SensorInfo.MergeFrom(other.SensorInfo);
+            }
+            if (other.deviceInfo_ != null)
+            {
+                if (deviceInfo_ == null)
+                {
+                    deviceInfo_ = new global::POGOProtos.Networking.Signature.Types.DeviceInfo();
+                }
+                DeviceInfo.MergeFrom(other.DeviceInfo);
+            }
+            if (other.activityStatus_ != null)
+            {
+                if (activityStatus_ == null)
+                {
+                    activityStatus_ = new global::POGOProtos.Networking.Signature.Types.ActivityStatus();
+                }
+                ActivityStatus.MergeFrom(other.ActivityStatus);
+            }
+            if (other.LocationHash1 != 0)
+            {
+                LocationHash1 = other.LocationHash1;
+            }
+            if (other.LocationHash2 != 0)
+            {
+                LocationHash2 = other.LocationHash2;
+            }
+            if (other.Unk22.Length != 0)
+            {
+                Unk22 = other.Unk22;
+            }
+            if (other.Timestamp != 0UL)
+            {
+                Timestamp = other.Timestamp;
+            }
+            requestHash_.Add(other.requestHash_);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input)
+        {
+            uint tag;
+            while ((tag = input.ReadTag()) != 0)
+            {
+                switch (tag)
+                {
+                    default:
+                        input.SkipLastField();
+                        break;
+                    case 16:
+                        {
+                            TimestampSinceStart = input.ReadUInt64();
+                            break;
+                        }
+                    case 34:
+                        {
+                            locationFix_.AddEntriesFrom(input, _repeated_locationFix_codec);
+                            break;
+                        }
+                    case 42:
+                        {
+                            if (gpsInfo_ == null)
+                            {
+                                gpsInfo_ = new global::POGOProtos.Networking.Signature.Types.AndroidGpsInfo();
+                            }
+                            input.ReadMessage(gpsInfo_);
+                            break;
+                        }
+                    case 58:
+                        {
+                            if (sensorInfo_ == null)
+                            {
+                                sensorInfo_ = new global::POGOProtos.Networking.Signature.Types.SensorInfo();
+                            }
+                            input.ReadMessage(sensorInfo_);
+                            break;
+                        }
+                    case 66:
+                        {
+                            if (deviceInfo_ == null)
+                            {
+                                deviceInfo_ = new global::POGOProtos.Networking.Signature.Types.DeviceInfo();
+                            }
+                            input.ReadMessage(deviceInfo_);
+                            break;
+                        }
+                    case 74:
+                        {
+                            if (activityStatus_ == null)
+                            {
+                                activityStatus_ = new global::POGOProtos.Networking.Signature.Types.ActivityStatus();
+                            }
+                            input.ReadMessage(activityStatus_);
+                            break;
+                        }
+                    case 80:
+                        {
+                            LocationHash1 = input.ReadUInt32();
+                            break;
+                        }
+                    case 160:
+                        {
+                            LocationHash2 = input.ReadUInt32();
+                            break;
+                        }
+                    case 178:
+                        {
+                            Unk22 = input.ReadBytes();
+                            break;
+                        }
+                    case 184:
+                        {
+                            Timestamp = input.ReadUInt64();
+                            break;
+                        }
+                    case 194:
+                    case 192:
+                        {
+                            requestHash_.AddEntriesFrom(input, _repeated_requestHash_codec);
+                            break;
+                        }
+                }
+            }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Signature message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static partial class Types
+        {
+            public sealed partial class LocationFix : pb::IMessage<LocationFix>
+            {
+                private static readonly pb::MessageParser<LocationFix> _parser = new pb::MessageParser<LocationFix>(() => new LocationFix());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<LocationFix> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor
+                {
+                    get { return global::POGOProtos.Networking.Signature.Descriptor.NestedTypes[0]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor
+                {
+                    get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public LocationFix()
+                {
+                    OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public LocationFix(LocationFix other) : this()
+                {
+                    provider_ = other.provider_;
+                    timestampSinceStart_ = other.timestampSinceStart_;
+                    latitude_ = other.latitude_;
+                    longitude_ = other.longitude_;
+                    horizontalAccuracy_ = other.horizontalAccuracy_;
+                    altitude_ = other.altitude_;
+                    verticalAccuracy_ = other.verticalAccuracy_;
+                    providerStatus_ = other.providerStatus_;
+                    floor_ = other.floor_;
+                    locationType_ = other.locationType_;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public LocationFix Clone()
+                {
+                    return new LocationFix(this);
+                }
+
+                /// <summary>Field number for the "provider" field.</summary>
+                public const int ProviderFieldNumber = 1;
+                private string provider_ = "";
+                /// <summary>
+                ///  "network", "gps", "fused", possibly others
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string Provider
+                {
+                    get { return provider_; }
+                    set
+                    {
+                        provider_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "timestamp_since_start" field.</summary>
+                public const int TimestampSinceStartFieldNumber = 2;
+                private ulong timestampSinceStart_;
+                /// <summary>
+                ///  in ms
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong TimestampSinceStart
+                {
+                    get { return timestampSinceStart_; }
+                    set
+                    {
+                        timestampSinceStart_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "latitude" field.</summary>
+                public const int LatitudeFieldNumber = 13;
+                private float latitude_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public float Latitude
+                {
+                    get { return latitude_; }
+                    set
+                    {
+                        latitude_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "longitude" field.</summary>
+                public const int LongitudeFieldNumber = 14;
+                private float longitude_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public float Longitude
+                {
+                    get { return longitude_; }
+                    set
+                    {
+                        longitude_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "horizontal_accuracy" field.</summary>
+                public const int HorizontalAccuracyFieldNumber = 20;
+                private float horizontalAccuracy_;
+                /// <summary>
+                ///  ??? shows up in struct, dunno where these go
+                ///  float device_speed;
+                ///  float device_course;
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public float HorizontalAccuracy
+                {
+                    get { return horizontalAccuracy_; }
+                    set
+                    {
+                        horizontalAccuracy_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "altitude" field.</summary>
+                public const int AltitudeFieldNumber = 21;
+                private float altitude_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public float Altitude
+                {
+                    get { return altitude_; }
+                    set
+                    {
+                        altitude_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "vertical_accuracy" field.</summary>
+                public const int VerticalAccuracyFieldNumber = 22;
+                private float verticalAccuracy_;
+                /// <summary>
+                ///  iOS only? (range seems to be ~10-12)
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public float VerticalAccuracy
+                {
+                    get { return verticalAccuracy_; }
+                    set
+                    {
+                        verticalAccuracy_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "provider_status" field.</summary>
+                public const int ProviderStatusFieldNumber = 26;
+                private ulong providerStatus_;
+                /// <summary>
+                ///  Usually 3 (possibly GPS status: 1 = no fix, 2 = acquiring/inaccurate, 3 = fix acquired)
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong ProviderStatus
+                {
+                    get { return providerStatus_; }
+                    set
+                    {
+                        providerStatus_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "floor" field.</summary>
+                public const int FloorFieldNumber = 27;
+                private uint floor_;
+                /// <summary>
+                ///  On iOS there are some LocationFixes with unk26=1 and everything else empty
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public uint Floor
+                {
+                    get { return floor_; }
+                    set
+                    {
+                        floor_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "location_type" field.</summary>
+                public const int LocationTypeFieldNumber = 28;
+                private ulong locationType_;
+                /// <summary>
+                ///  Always 1 (if there is data at all)
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong LocationType
+                {
+                    get { return locationType_; }
+                    set
+                    {
+                        locationType_ = value;
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other)
+                {
+                    return Equals(other as LocationFix);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(LocationFix other)
+                {
+                    if (ReferenceEquals(other, null))
+                    {
+                        return false;
+                    }
+                    if (ReferenceEquals(other, this))
+                    {
+                        return true;
+                    }
+                    if (Provider != other.Provider) return false;
+                    if (TimestampSinceStart != other.TimestampSinceStart) return false;
+                    if (Latitude != other.Latitude) return false;
+                    if (Longitude != other.Longitude) return false;
+                    if (HorizontalAccuracy != other.HorizontalAccuracy) return false;
+                    if (Altitude != other.Altitude) return false;
+                    if (VerticalAccuracy != other.VerticalAccuracy) return false;
+                    if (ProviderStatus != other.ProviderStatus) return false;
+                    if (Floor != other.Floor) return false;
+                    if (LocationType != other.LocationType) return false;
+                    return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode()
+                {
+                    int hash = 1;
+                    if (Provider.Length != 0) hash ^= Provider.GetHashCode();
+                    if (TimestampSinceStart != 0UL) hash ^= TimestampSinceStart.GetHashCode();
+                    if (Latitude != 0F) hash ^= Latitude.GetHashCode();
+                    if (Longitude != 0F) hash ^= Longitude.GetHashCode();
+                    if (HorizontalAccuracy != 0F) hash ^= HorizontalAccuracy.GetHashCode();
+                    if (Altitude != 0F) hash ^= Altitude.GetHashCode();
+                    if (VerticalAccuracy != 0F) hash ^= VerticalAccuracy.GetHashCode();
+                    if (ProviderStatus != 0UL) hash ^= ProviderStatus.GetHashCode();
+                    if (Floor != 0) hash ^= Floor.GetHashCode();
+                    if (LocationType != 0UL) hash ^= LocationType.GetHashCode();
+                    return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString()
+                {
+                    return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output)
+                {
+                    if (Provider.Length != 0)
+                    {
+                        output.WriteRawTag(10);
+                        output.WriteString(Provider);
+                    }
+                    if (TimestampSinceStart != 0UL)
+                    {
+                        output.WriteRawTag(16);
+                        output.WriteUInt64(TimestampSinceStart);
+                    }
+                    if (Latitude != 0F)
+                    {
+                        output.WriteRawTag(109);
+                        output.WriteFloat(Latitude);
+                    }
+                    if (Longitude != 0F)
+                    {
+                        output.WriteRawTag(117);
+                        output.WriteFloat(Longitude);
+                    }
+                    if (HorizontalAccuracy != 0F)
+                    {
+                        output.WriteRawTag(165, 1);
+                        output.WriteFloat(HorizontalAccuracy);
+                    }
+                    if (Altitude != 0F)
+                    {
+                        output.WriteRawTag(173, 1);
+                        output.WriteFloat(Altitude);
+                    }
+                    if (VerticalAccuracy != 0F)
+                    {
+                        output.WriteRawTag(181, 1);
+                        output.WriteFloat(VerticalAccuracy);
+                    }
+                    if (ProviderStatus != 0UL)
+                    {
+                        output.WriteRawTag(208, 1);
+                        output.WriteUInt64(ProviderStatus);
+                    }
+                    if (Floor != 0)
+                    {
+                        output.WriteRawTag(216, 1);
+                        output.WriteUInt32(Floor);
+                    }
+                    if (LocationType != 0UL)
+                    {
+                        output.WriteRawTag(224, 1);
+                        output.WriteUInt64(LocationType);
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize()
+                {
+                    int size = 0;
+                    if (Provider.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(Provider);
+                    }
+                    if (TimestampSinceStart != 0UL)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampSinceStart);
+                    }
+                    if (Latitude != 0F)
+                    {
+                        size += 1 + 4;
+                    }
+                    if (Longitude != 0F)
+                    {
+                        size += 1 + 4;
+                    }
+                    if (HorizontalAccuracy != 0F)
+                    {
+                        size += 2 + 4;
+                    }
+                    if (Altitude != 0F)
+                    {
+                        size += 2 + 4;
+                    }
+                    if (VerticalAccuracy != 0F)
+                    {
+                        size += 2 + 4;
+                    }
+                    if (ProviderStatus != 0UL)
+                    {
+                        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(ProviderStatus);
+                    }
+                    if (Floor != 0)
+                    {
+                        size += 2 + pb::CodedOutputStream.ComputeUInt32Size(Floor);
+                    }
+                    if (LocationType != 0UL)
+                    {
+                        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(LocationType);
+                    }
+                    return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(LocationFix other)
+                {
+                    if (other == null)
+                    {
+                        return;
+                    }
+                    if (other.Provider.Length != 0)
+                    {
+                        Provider = other.Provider;
+                    }
+                    if (other.TimestampSinceStart != 0UL)
+                    {
+                        TimestampSinceStart = other.TimestampSinceStart;
+                    }
+                    if (other.Latitude != 0F)
+                    {
+                        Latitude = other.Latitude;
+                    }
+                    if (other.Longitude != 0F)
+                    {
+                        Longitude = other.Longitude;
+                    }
+                    if (other.HorizontalAccuracy != 0F)
+                    {
+                        HorizontalAccuracy = other.HorizontalAccuracy;
+                    }
+                    if (other.Altitude != 0F)
+                    {
+                        Altitude = other.Altitude;
+                    }
+                    if (other.VerticalAccuracy != 0F)
+                    {
+                        VerticalAccuracy = other.VerticalAccuracy;
+                    }
+                    if (other.ProviderStatus != 0UL)
+                    {
+                        ProviderStatus = other.ProviderStatus;
+                    }
+                    if (other.Floor != 0)
+                    {
+                        Floor = other.Floor;
+                    }
+                    if (other.LocationType != 0UL)
+                    {
+                        LocationType = other.LocationType;
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input)
+                {
+                    uint tag;
+                    while ((tag = input.ReadTag()) != 0)
+                    {
+                        switch (tag)
+                        {
+                            default:
+                                input.SkipLastField();
+                                break;
+                            case 10:
+                                {
+                                    Provider = input.ReadString();
+                                    break;
+                                }
+                            case 16:
+                                {
+                                    TimestampSinceStart = input.ReadUInt64();
+                                    break;
+                                }
+                            case 109:
+                                {
+                                    Latitude = input.ReadFloat();
+                                    break;
+                                }
+                            case 117:
+                                {
+                                    Longitude = input.ReadFloat();
+                                    break;
+                                }
+                            case 165:
+                                {
+                                    HorizontalAccuracy = input.ReadFloat();
+                                    break;
+                                }
+                            case 173:
+                                {
+                                    Altitude = input.ReadFloat();
+                                    break;
+                                }
+                            case 181:
+                                {
+                                    VerticalAccuracy = input.ReadFloat();
+                                    break;
+                                }
+                            case 208:
+                                {
+                                    ProviderStatus = input.ReadUInt64();
+                                    break;
+                                }
+                            case 216:
+                                {
+                                    Floor = input.ReadUInt32();
+                                    break;
+                                }
+                            case 224:
+                                {
+                                    LocationType = input.ReadUInt64();
+                                    break;
+                                }
+                        }
+                    }
+                }
+
+            }
+
+            /// <summary>
+            ///  don't really care about this since we're not using it
+            /// </summary>
+            public sealed partial class AndroidGpsInfo : pb::IMessage<AndroidGpsInfo>
+            {
+                private static readonly pb::MessageParser<AndroidGpsInfo> _parser = new pb::MessageParser<AndroidGpsInfo>(() => new AndroidGpsInfo());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<AndroidGpsInfo> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor
+                {
+                    get { return global::POGOProtos.Networking.Signature.Descriptor.NestedTypes[1]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor
+                {
+                    get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public AndroidGpsInfo()
+                {
+                    OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public AndroidGpsInfo(AndroidGpsInfo other) : this()
+                {
+                    timeToFix_ = other.timeToFix_;
+                    satellitesPrn_ = other.satellitesPrn_.Clone();
+                    snr_ = other.snr_.Clone();
+                    azimuth_ = other.azimuth_.Clone();
+                    elevation_ = other.elevation_.Clone();
+                    hasAlmanac_ = other.hasAlmanac_.Clone();
+                    hasEphemeris_ = other.hasEphemeris_.Clone();
+                    usedInFix_ = other.usedInFix_.Clone();
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public AndroidGpsInfo Clone()
+                {
+                    return new AndroidGpsInfo(this);
+                }
+
+                /// <summary>Field number for the "time_to_fix" field.</summary>
+                public const int TimeToFixFieldNumber = 1;
+                private ulong timeToFix_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong TimeToFix
+                {
+                    get { return timeToFix_; }
+                    set
+                    {
+                        timeToFix_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "satellites_prn" field.</summary>
+                public const int SatellitesPrnFieldNumber = 2;
+                private static readonly pb::FieldCodec<int> _repeated_satellitesPrn_codec
+                    = pb::FieldCodec.ForInt32(18);
+                private readonly pbc::RepeatedField<int> satellitesPrn_ = new pbc::RepeatedField<int>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<int> SatellitesPrn
+                {
+                    get { return satellitesPrn_; }
+                }
+
+                /// <summary>Field number for the "snr" field.</summary>
+                public const int SnrFieldNumber = 3;
+                private static readonly pb::FieldCodec<float> _repeated_snr_codec
+                    = pb::FieldCodec.ForFloat(26);
+                private readonly pbc::RepeatedField<float> snr_ = new pbc::RepeatedField<float>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<float> Snr
+                {
+                    get { return snr_; }
+                }
+
+                /// <summary>Field number for the "azimuth" field.</summary>
+                public const int AzimuthFieldNumber = 4;
+                private static readonly pb::FieldCodec<float> _repeated_azimuth_codec
+                    = pb::FieldCodec.ForFloat(34);
+                private readonly pbc::RepeatedField<float> azimuth_ = new pbc::RepeatedField<float>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<float> Azimuth
+                {
+                    get { return azimuth_; }
+                }
+
+                /// <summary>Field number for the "elevation" field.</summary>
+                public const int ElevationFieldNumber = 5;
+                private static readonly pb::FieldCodec<float> _repeated_elevation_codec
+                    = pb::FieldCodec.ForFloat(42);
+                private readonly pbc::RepeatedField<float> elevation_ = new pbc::RepeatedField<float>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<float> Elevation
+                {
+                    get { return elevation_; }
+                }
+
+                /// <summary>Field number for the "has_almanac" field.</summary>
+                public const int HasAlmanacFieldNumber = 6;
+                private static readonly pb::FieldCodec<bool> _repeated_hasAlmanac_codec
+                    = pb::FieldCodec.ForBool(50);
+                private readonly pbc::RepeatedField<bool> hasAlmanac_ = new pbc::RepeatedField<bool>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<bool> HasAlmanac
+                {
+                    get { return hasAlmanac_; }
+                }
+
+                /// <summary>Field number for the "has_ephemeris" field.</summary>
+                public const int HasEphemerisFieldNumber = 7;
+                private static readonly pb::FieldCodec<bool> _repeated_hasEphemeris_codec
+                    = pb::FieldCodec.ForBool(58);
+                private readonly pbc::RepeatedField<bool> hasEphemeris_ = new pbc::RepeatedField<bool>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<bool> HasEphemeris
+                {
+                    get { return hasEphemeris_; }
+                }
+
+                /// <summary>Field number for the "used_in_fix" field.</summary>
+                public const int UsedInFixFieldNumber = 8;
+                private static readonly pb::FieldCodec<bool> _repeated_usedInFix_codec
+                    = pb::FieldCodec.ForBool(66);
+                private readonly pbc::RepeatedField<bool> usedInFix_ = new pbc::RepeatedField<bool>();
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pbc::RepeatedField<bool> UsedInFix
+                {
+                    get { return usedInFix_; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other)
+                {
+                    return Equals(other as AndroidGpsInfo);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(AndroidGpsInfo other)
+                {
+                    if (ReferenceEquals(other, null))
+                    {
+                        return false;
+                    }
+                    if (ReferenceEquals(other, this))
+                    {
+                        return true;
+                    }
+                    if (TimeToFix != other.TimeToFix) return false;
+                    if (!satellitesPrn_.Equals(other.satellitesPrn_)) return false;
+                    if (!snr_.Equals(other.snr_)) return false;
+                    if (!azimuth_.Equals(other.azimuth_)) return false;
+                    if (!elevation_.Equals(other.elevation_)) return false;
+                    if (!hasAlmanac_.Equals(other.hasAlmanac_)) return false;
+                    if (!hasEphemeris_.Equals(other.hasEphemeris_)) return false;
+                    if (!usedInFix_.Equals(other.usedInFix_)) return false;
+                    return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode()
+                {
+                    int hash = 1;
+                    if (TimeToFix != 0UL) hash ^= TimeToFix.GetHashCode();
+                    hash ^= satellitesPrn_.GetHashCode();
+                    hash ^= snr_.GetHashCode();
+                    hash ^= azimuth_.GetHashCode();
+                    hash ^= elevation_.GetHashCode();
+                    hash ^= hasAlmanac_.GetHashCode();
+                    hash ^= hasEphemeris_.GetHashCode();
+                    hash ^= usedInFix_.GetHashCode();
+                    return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString()
+                {
+                    return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output)
+                {
+                    if (TimeToFix != 0UL)
+                    {
+                        output.WriteRawTag(8);
+                        output.WriteUInt64(TimeToFix);
+                    }
+                    satellitesPrn_.WriteTo(output, _repeated_satellitesPrn_codec);
+                    snr_.WriteTo(output, _repeated_snr_codec);
+                    azimuth_.WriteTo(output, _repeated_azimuth_codec);
+                    elevation_.WriteTo(output, _repeated_elevation_codec);
+                    hasAlmanac_.WriteTo(output, _repeated_hasAlmanac_codec);
+                    hasEphemeris_.WriteTo(output, _repeated_hasEphemeris_codec);
+                    usedInFix_.WriteTo(output, _repeated_usedInFix_codec);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize()
+                {
+                    int size = 0;
+                    if (TimeToFix != 0UL)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimeToFix);
+                    }
+                    size += satellitesPrn_.CalculateSize(_repeated_satellitesPrn_codec);
+                    size += snr_.CalculateSize(_repeated_snr_codec);
+                    size += azimuth_.CalculateSize(_repeated_azimuth_codec);
+                    size += elevation_.CalculateSize(_repeated_elevation_codec);
+                    size += hasAlmanac_.CalculateSize(_repeated_hasAlmanac_codec);
+                    size += hasEphemeris_.CalculateSize(_repeated_hasEphemeris_codec);
+                    size += usedInFix_.CalculateSize(_repeated_usedInFix_codec);
+                    return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(AndroidGpsInfo other)
+                {
+                    if (other == null)
+                    {
+                        return;
+                    }
+                    if (other.TimeToFix != 0UL)
+                    {
+                        TimeToFix = other.TimeToFix;
+                    }
+                    satellitesPrn_.Add(other.satellitesPrn_);
+                    snr_.Add(other.snr_);
+                    azimuth_.Add(other.azimuth_);
+                    elevation_.Add(other.elevation_);
+                    hasAlmanac_.Add(other.hasAlmanac_);
+                    hasEphemeris_.Add(other.hasEphemeris_);
+                    usedInFix_.Add(other.usedInFix_);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input)
+                {
+                    uint tag;
+                    while ((tag = input.ReadTag()) != 0)
+                    {
+                        switch (tag)
+                        {
+                            default:
+                                input.SkipLastField();
+                                break;
+                            case 8:
+                                {
+                                    TimeToFix = input.ReadUInt64();
+                                    break;
+                                }
+                            case 18:
+                            case 16:
+                                {
+                                    satellitesPrn_.AddEntriesFrom(input, _repeated_satellitesPrn_codec);
+                                    break;
+                                }
+                            case 26:
+                            case 29:
+                                {
+                                    snr_.AddEntriesFrom(input, _repeated_snr_codec);
+                                    break;
+                                }
+                            case 34:
+                            case 37:
+                                {
+                                    azimuth_.AddEntriesFrom(input, _repeated_azimuth_codec);
+                                    break;
+                                }
+                            case 42:
+                            case 45:
+                                {
+                                    elevation_.AddEntriesFrom(input, _repeated_elevation_codec);
+                                    break;
+                                }
+                            case 50:
+                            case 48:
+                                {
+                                    hasAlmanac_.AddEntriesFrom(input, _repeated_hasAlmanac_codec);
+                                    break;
+                                }
+                            case 58:
+                            case 56:
+                                {
+                                    hasEphemeris_.AddEntriesFrom(input, _repeated_hasEphemeris_codec);
+                                    break;
+                                }
+                            case 66:
+                            case 64:
+                                {
+                                    usedInFix_.AddEntriesFrom(input, _repeated_usedInFix_codec);
+                                    break;
+                                }
+                        }
+                    }
+                }
+
+            }
+
+            public sealed partial class SensorInfo : pb::IMessage<SensorInfo>
+            {
+                private static readonly pb::MessageParser<SensorInfo> _parser = new pb::MessageParser<SensorInfo>(() => new SensorInfo());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<SensorInfo> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor
+                {
+                    get { return global::POGOProtos.Networking.Signature.Descriptor.NestedTypes[2]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor
+                {
+                    get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public SensorInfo()
+                {
+                    OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public SensorInfo(SensorInfo other) : this()
+                {
+                    timestampSnapshot_ = other.timestampSnapshot_;
+                    magnetometerX_ = other.magnetometerX_;
+                    magnetometerY_ = other.magnetometerY_;
+                    magnetometerZ_ = other.magnetometerZ_;
+                    angleNormalizedX_ = other.angleNormalizedX_;
+                    angleNormalizedY_ = other.angleNormalizedY_;
+                    angleNormalizedZ_ = other.angleNormalizedZ_;
+                    accelRawX_ = other.accelRawX_;
+                    accelRawY_ = other.accelRawY_;
+                    accelRawZ_ = other.accelRawZ_;
+                    gyroscopeRawX_ = other.gyroscopeRawX_;
+                    gyroscopeRawY_ = other.gyroscopeRawY_;
+                    gyroscopeRawZ_ = other.gyroscopeRawZ_;
+                    accelNormalizedX_ = other.accelNormalizedX_;
+                    accelNormalizedY_ = other.accelNormalizedY_;
+                    accelNormalizedZ_ = other.accelNormalizedZ_;
+                    accelerometerAxes_ = other.accelerometerAxes_;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public SensorInfo Clone()
+                {
+                    return new SensorInfo(this);
+                }
+
+                /// <summary>Field number for the "timestamp_snapshot" field.</summary>
+                public const int TimestampSnapshotFieldNumber = 1;
+                private ulong timestampSnapshot_;
+                /// <summary>
+                ///  in ms
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong TimestampSnapshot
+                {
+                    get { return timestampSnapshot_; }
+                    set
+                    {
+                        timestampSnapshot_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "magnetometer_x" field.</summary>
+                public const int MagnetometerXFieldNumber = 3;
+                private double magnetometerX_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double MagnetometerX
+                {
+                    get { return magnetometerX_; }
+                    set
+                    {
+                        magnetometerX_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "magnetometer_y" field.</summary>
+                public const int MagnetometerYFieldNumber = 4;
+                private double magnetometerY_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double MagnetometerY
+                {
+                    get { return magnetometerY_; }
+                    set
+                    {
+                        magnetometerY_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "magnetometer_z" field.</summary>
+                public const int MagnetometerZFieldNumber = 5;
+                private double magnetometerZ_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double MagnetometerZ
+                {
+                    get { return magnetometerZ_; }
+                    set
+                    {
+                        magnetometerZ_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "angle_normalized_x" field.</summary>
+                public const int AngleNormalizedXFieldNumber = 6;
+                private double angleNormalizedX_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AngleNormalizedX
+                {
+                    get { return angleNormalizedX_; }
+                    set
+                    {
+                        angleNormalizedX_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "angle_normalized_y" field.</summary>
+                public const int AngleNormalizedYFieldNumber = 7;
+                private double angleNormalizedY_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AngleNormalizedY
+                {
+                    get { return angleNormalizedY_; }
+                    set
+                    {
+                        angleNormalizedY_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "angle_normalized_z" field.</summary>
+                public const int AngleNormalizedZFieldNumber = 8;
+                private double angleNormalizedZ_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AngleNormalizedZ
+                {
+                    get { return angleNormalizedZ_; }
+                    set
+                    {
+                        angleNormalizedZ_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accel_raw_x" field.</summary>
+                public const int AccelRawXFieldNumber = 10;
+                private double accelRawX_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AccelRawX
+                {
+                    get { return accelRawX_; }
+                    set
+                    {
+                        accelRawX_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accel_raw_y" field.</summary>
+                public const int AccelRawYFieldNumber = 11;
+                private double accelRawY_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AccelRawY
+                {
+                    get { return accelRawY_; }
+                    set
+                    {
+                        accelRawY_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accel_raw_z" field.</summary>
+                public const int AccelRawZFieldNumber = 12;
+                private double accelRawZ_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AccelRawZ
+                {
+                    get { return accelRawZ_; }
+                    set
+                    {
+                        accelRawZ_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "gyroscope_raw_x" field.</summary>
+                public const int GyroscopeRawXFieldNumber = 13;
+                private double gyroscopeRawX_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double GyroscopeRawX
+                {
+                    get { return gyroscopeRawX_; }
+                    set
+                    {
+                        gyroscopeRawX_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "gyroscope_raw_y" field.</summary>
+                public const int GyroscopeRawYFieldNumber = 14;
+                private double gyroscopeRawY_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double GyroscopeRawY
+                {
+                    get { return gyroscopeRawY_; }
+                    set
+                    {
+                        gyroscopeRawY_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "gyroscope_raw_z" field.</summary>
+                public const int GyroscopeRawZFieldNumber = 15;
+                private double gyroscopeRawZ_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double GyroscopeRawZ
+                {
+                    get { return gyroscopeRawZ_; }
+                    set
+                    {
+                        gyroscopeRawZ_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accel_normalized_x" field.</summary>
+                public const int AccelNormalizedXFieldNumber = 16;
+                private double accelNormalizedX_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AccelNormalizedX
+                {
+                    get { return accelNormalizedX_; }
+                    set
+                    {
+                        accelNormalizedX_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accel_normalized_y" field.</summary>
+                public const int AccelNormalizedYFieldNumber = 17;
+                private double accelNormalizedY_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AccelNormalizedY
+                {
+                    get { return accelNormalizedY_; }
+                    set
+                    {
+                        accelNormalizedY_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accel_normalized_z" field.</summary>
+                public const int AccelNormalizedZFieldNumber = 18;
+                private double accelNormalizedZ_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public double AccelNormalizedZ
+                {
+                    get { return accelNormalizedZ_; }
+                    set
+                    {
+                        accelNormalizedZ_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "accelerometer_axes" field.</summary>
+                public const int AccelerometerAxesFieldNumber = 19;
+                private ulong accelerometerAxes_;
+                /// <summary>
+                ///  Always 3
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong AccelerometerAxes
+                {
+                    get { return accelerometerAxes_; }
+                    set
+                    {
+                        accelerometerAxes_ = value;
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other)
+                {
+                    return Equals(other as SensorInfo);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(SensorInfo other)
+                {
+                    if (ReferenceEquals(other, null))
+                    {
+                        return false;
+                    }
+                    if (ReferenceEquals(other, this))
+                    {
+                        return true;
+                    }
+                    if (TimestampSnapshot != other.TimestampSnapshot) return false;
+                    if (MagnetometerX != other.MagnetometerX) return false;
+                    if (MagnetometerY != other.MagnetometerY) return false;
+                    if (MagnetometerZ != other.MagnetometerZ) return false;
+                    if (AngleNormalizedX != other.AngleNormalizedX) return false;
+                    if (AngleNormalizedY != other.AngleNormalizedY) return false;
+                    if (AngleNormalizedZ != other.AngleNormalizedZ) return false;
+                    if (AccelRawX != other.AccelRawX) return false;
+                    if (AccelRawY != other.AccelRawY) return false;
+                    if (AccelRawZ != other.AccelRawZ) return false;
+                    if (GyroscopeRawX != other.GyroscopeRawX) return false;
+                    if (GyroscopeRawY != other.GyroscopeRawY) return false;
+                    if (GyroscopeRawZ != other.GyroscopeRawZ) return false;
+                    if (AccelNormalizedX != other.AccelNormalizedX) return false;
+                    if (AccelNormalizedY != other.AccelNormalizedY) return false;
+                    if (AccelNormalizedZ != other.AccelNormalizedZ) return false;
+                    if (AccelerometerAxes != other.AccelerometerAxes) return false;
+                    return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode()
+                {
+                    int hash = 1;
+                    if (TimestampSnapshot != 0UL) hash ^= TimestampSnapshot.GetHashCode();
+                    if (MagnetometerX != 0D) hash ^= MagnetometerX.GetHashCode();
+                    if (MagnetometerY != 0D) hash ^= MagnetometerY.GetHashCode();
+                    if (MagnetometerZ != 0D) hash ^= MagnetometerZ.GetHashCode();
+                    if (AngleNormalizedX != 0D) hash ^= AngleNormalizedX.GetHashCode();
+                    if (AngleNormalizedY != 0D) hash ^= AngleNormalizedY.GetHashCode();
+                    if (AngleNormalizedZ != 0D) hash ^= AngleNormalizedZ.GetHashCode();
+                    if (AccelRawX != 0D) hash ^= AccelRawX.GetHashCode();
+                    if (AccelRawY != 0D) hash ^= AccelRawY.GetHashCode();
+                    if (AccelRawZ != 0D) hash ^= AccelRawZ.GetHashCode();
+                    if (GyroscopeRawX != 0D) hash ^= GyroscopeRawX.GetHashCode();
+                    if (GyroscopeRawY != 0D) hash ^= GyroscopeRawY.GetHashCode();
+                    if (GyroscopeRawZ != 0D) hash ^= GyroscopeRawZ.GetHashCode();
+                    if (AccelNormalizedX != 0D) hash ^= AccelNormalizedX.GetHashCode();
+                    if (AccelNormalizedY != 0D) hash ^= AccelNormalizedY.GetHashCode();
+                    if (AccelNormalizedZ != 0D) hash ^= AccelNormalizedZ.GetHashCode();
+                    if (AccelerometerAxes != 0UL) hash ^= AccelerometerAxes.GetHashCode();
+                    return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString()
+                {
+                    return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output)
+                {
+                    if (TimestampSnapshot != 0UL)
+                    {
+                        output.WriteRawTag(8);
+                        output.WriteUInt64(TimestampSnapshot);
+                    }
+                    if (MagnetometerX != 0D)
+                    {
+                        output.WriteRawTag(25);
+                        output.WriteDouble(MagnetometerX);
+                    }
+                    if (MagnetometerY != 0D)
+                    {
+                        output.WriteRawTag(33);
+                        output.WriteDouble(MagnetometerY);
+                    }
+                    if (MagnetometerZ != 0D)
+                    {
+                        output.WriteRawTag(41);
+                        output.WriteDouble(MagnetometerZ);
+                    }
+                    if (AngleNormalizedX != 0D)
+                    {
+                        output.WriteRawTag(49);
+                        output.WriteDouble(AngleNormalizedX);
+                    }
+                    if (AngleNormalizedY != 0D)
+                    {
+                        output.WriteRawTag(57);
+                        output.WriteDouble(AngleNormalizedY);
+                    }
+                    if (AngleNormalizedZ != 0D)
+                    {
+                        output.WriteRawTag(65);
+                        output.WriteDouble(AngleNormalizedZ);
+                    }
+                    if (AccelRawX != 0D)
+                    {
+                        output.WriteRawTag(81);
+                        output.WriteDouble(AccelRawX);
+                    }
+                    if (AccelRawY != 0D)
+                    {
+                        output.WriteRawTag(89);
+                        output.WriteDouble(AccelRawY);
+                    }
+                    if (AccelRawZ != 0D)
+                    {
+                        output.WriteRawTag(97);
+                        output.WriteDouble(AccelRawZ);
+                    }
+                    if (GyroscopeRawX != 0D)
+                    {
+                        output.WriteRawTag(105);
+                        output.WriteDouble(GyroscopeRawX);
+                    }
+                    if (GyroscopeRawY != 0D)
+                    {
+                        output.WriteRawTag(113);
+                        output.WriteDouble(GyroscopeRawY);
+                    }
+                    if (GyroscopeRawZ != 0D)
+                    {
+                        output.WriteRawTag(121);
+                        output.WriteDouble(GyroscopeRawZ);
+                    }
+                    if (AccelNormalizedX != 0D)
+                    {
+                        output.WriteRawTag(129, 1);
+                        output.WriteDouble(AccelNormalizedX);
+                    }
+                    if (AccelNormalizedY != 0D)
+                    {
+                        output.WriteRawTag(137, 1);
+                        output.WriteDouble(AccelNormalizedY);
+                    }
+                    if (AccelNormalizedZ != 0D)
+                    {
+                        output.WriteRawTag(145, 1);
+                        output.WriteDouble(AccelNormalizedZ);
+                    }
+                    if (AccelerometerAxes != 0UL)
+                    {
+                        output.WriteRawTag(152, 1);
+                        output.WriteUInt64(AccelerometerAxes);
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize()
+                {
+                    int size = 0;
+                    if (TimestampSnapshot != 0UL)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampSnapshot);
+                    }
+                    if (MagnetometerX != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (MagnetometerY != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (MagnetometerZ != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AngleNormalizedX != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AngleNormalizedY != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AngleNormalizedZ != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AccelRawX != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AccelRawY != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AccelRawZ != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (GyroscopeRawX != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (GyroscopeRawY != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (GyroscopeRawZ != 0D)
+                    {
+                        size += 1 + 8;
+                    }
+                    if (AccelNormalizedX != 0D)
+                    {
+                        size += 2 + 8;
+                    }
+                    if (AccelNormalizedY != 0D)
+                    {
+                        size += 2 + 8;
+                    }
+                    if (AccelNormalizedZ != 0D)
+                    {
+                        size += 2 + 8;
+                    }
+                    if (AccelerometerAxes != 0UL)
+                    {
+                        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(AccelerometerAxes);
+                    }
+                    return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(SensorInfo other)
+                {
+                    if (other == null)
+                    {
+                        return;
+                    }
+                    if (other.TimestampSnapshot != 0UL)
+                    {
+                        TimestampSnapshot = other.TimestampSnapshot;
+                    }
+                    if (other.MagnetometerX != 0D)
+                    {
+                        MagnetometerX = other.MagnetometerX;
+                    }
+                    if (other.MagnetometerY != 0D)
+                    {
+                        MagnetometerY = other.MagnetometerY;
+                    }
+                    if (other.MagnetometerZ != 0D)
+                    {
+                        MagnetometerZ = other.MagnetometerZ;
+                    }
+                    if (other.AngleNormalizedX != 0D)
+                    {
+                        AngleNormalizedX = other.AngleNormalizedX;
+                    }
+                    if (other.AngleNormalizedY != 0D)
+                    {
+                        AngleNormalizedY = other.AngleNormalizedY;
+                    }
+                    if (other.AngleNormalizedZ != 0D)
+                    {
+                        AngleNormalizedZ = other.AngleNormalizedZ;
+                    }
+                    if (other.AccelRawX != 0D)
+                    {
+                        AccelRawX = other.AccelRawX;
+                    }
+                    if (other.AccelRawY != 0D)
+                    {
+                        AccelRawY = other.AccelRawY;
+                    }
+                    if (other.AccelRawZ != 0D)
+                    {
+                        AccelRawZ = other.AccelRawZ;
+                    }
+                    if (other.GyroscopeRawX != 0D)
+                    {
+                        GyroscopeRawX = other.GyroscopeRawX;
+                    }
+                    if (other.GyroscopeRawY != 0D)
+                    {
+                        GyroscopeRawY = other.GyroscopeRawY;
+                    }
+                    if (other.GyroscopeRawZ != 0D)
+                    {
+                        GyroscopeRawZ = other.GyroscopeRawZ;
+                    }
+                    if (other.AccelNormalizedX != 0D)
+                    {
+                        AccelNormalizedX = other.AccelNormalizedX;
+                    }
+                    if (other.AccelNormalizedY != 0D)
+                    {
+                        AccelNormalizedY = other.AccelNormalizedY;
+                    }
+                    if (other.AccelNormalizedZ != 0D)
+                    {
+                        AccelNormalizedZ = other.AccelNormalizedZ;
+                    }
+                    if (other.AccelerometerAxes != 0UL)
+                    {
+                        AccelerometerAxes = other.AccelerometerAxes;
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input)
+                {
+                    uint tag;
+                    while ((tag = input.ReadTag()) != 0)
+                    {
+                        switch (tag)
+                        {
+                            default:
+                                input.SkipLastField();
+                                break;
+                            case 8:
+                                {
+                                    TimestampSnapshot = input.ReadUInt64();
+                                    break;
+                                }
+                            case 25:
+                                {
+                                    MagnetometerX = input.ReadDouble();
+                                    break;
+                                }
+                            case 33:
+                                {
+                                    MagnetometerY = input.ReadDouble();
+                                    break;
+                                }
+                            case 41:
+                                {
+                                    MagnetometerZ = input.ReadDouble();
+                                    break;
+                                }
+                            case 49:
+                                {
+                                    AngleNormalizedX = input.ReadDouble();
+                                    break;
+                                }
+                            case 57:
+                                {
+                                    AngleNormalizedY = input.ReadDouble();
+                                    break;
+                                }
+                            case 65:
+                                {
+                                    AngleNormalizedZ = input.ReadDouble();
+                                    break;
+                                }
+                            case 81:
+                                {
+                                    AccelRawX = input.ReadDouble();
+                                    break;
+                                }
+                            case 89:
+                                {
+                                    AccelRawY = input.ReadDouble();
+                                    break;
+                                }
+                            case 97:
+                                {
+                                    AccelRawZ = input.ReadDouble();
+                                    break;
+                                }
+                            case 105:
+                                {
+                                    GyroscopeRawX = input.ReadDouble();
+                                    break;
+                                }
+                            case 113:
+                                {
+                                    GyroscopeRawY = input.ReadDouble();
+                                    break;
+                                }
+                            case 121:
+                                {
+                                    GyroscopeRawZ = input.ReadDouble();
+                                    break;
+                                }
+                            case 129:
+                                {
+                                    AccelNormalizedX = input.ReadDouble();
+                                    break;
+                                }
+                            case 137:
+                                {
+                                    AccelNormalizedY = input.ReadDouble();
+                                    break;
+                                }
+                            case 145:
+                                {
+                                    AccelNormalizedZ = input.ReadDouble();
+                                    break;
+                                }
+                            case 152:
+                                {
+                                    AccelerometerAxes = input.ReadUInt64();
+                                    break;
+                                }
+                        }
+                    }
+                }
+
+            }
+
+            public sealed partial class DeviceInfo : pb::IMessage<DeviceInfo>
+            {
+                private static readonly pb::MessageParser<DeviceInfo> _parser = new pb::MessageParser<DeviceInfo>(() => new DeviceInfo());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<DeviceInfo> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor
+                {
+                    get { return global::POGOProtos.Networking.Signature.Descriptor.NestedTypes[3]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor
+                {
+                    get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public DeviceInfo()
+                {
+                    OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public DeviceInfo(DeviceInfo other) : this()
+                {
+                    deviceId_ = other.deviceId_;
+                    androidBoardName_ = other.androidBoardName_;
+                    androidBootloader_ = other.androidBootloader_;
+                    deviceBrand_ = other.deviceBrand_;
+                    deviceModel_ = other.deviceModel_;
+                    deviceModelIdentifier_ = other.deviceModelIdentifier_;
+                    deviceModelBoot_ = other.deviceModelBoot_;
+                    hardwareManufacturer_ = other.hardwareManufacturer_;
+                    hardwareModel_ = other.hardwareModel_;
+                    firmwareBrand_ = other.firmwareBrand_;
+                    firmwareTags_ = other.firmwareTags_;
+                    firmwareType_ = other.firmwareType_;
+                    firmwareFingerprint_ = other.firmwareFingerprint_;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public DeviceInfo Clone()
+                {
+                    return new DeviceInfo(this);
+                }
+
+                /// <summary>Field number for the "device_id" field.</summary>
+                public const int DeviceIdFieldNumber = 1;
+                private string deviceId_ = "";
+                /// <summary>
+                ///  Hex string
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string DeviceId
+                {
+                    get { return deviceId_; }
+                    set
+                    {
+                        deviceId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "android_board_name" field.</summary>
+                public const int AndroidBoardNameFieldNumber = 2;
+                private string androidBoardName_ = "";
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string AndroidBoardName
+                {
+                    get { return androidBoardName_; }
+                    set
+                    {
+                        androidBoardName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "android_bootloader" field.</summary>
+                public const int AndroidBootloaderFieldNumber = 3;
+                private string androidBootloader_ = "";
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string AndroidBootloader
+                {
+                    get { return androidBootloader_; }
+                    set
+                    {
+                        androidBootloader_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "device_brand" field.</summary>
+                public const int DeviceBrandFieldNumber = 4;
+                private string deviceBrand_ = "";
+                /// <summary>
+                ///  On Android: product.brand
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string DeviceBrand
+                {
+                    get { return deviceBrand_; }
+                    set
+                    {
+                        deviceBrand_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "device_model" field.</summary>
+                public const int DeviceModelFieldNumber = 5;
+                private string deviceModel_ = "";
+                /// <summary>
+                ///  On Android: product.device
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string DeviceModel
+                {
+                    get { return deviceModel_; }
+                    set
+                    {
+                        deviceModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "device_model_identifier" field.</summary>
+                public const int DeviceModelIdentifierFieldNumber = 6;
+                private string deviceModelIdentifier_ = "";
+                /// <summary>
+                ///  Android only, build.display.id
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string DeviceModelIdentifier
+                {
+                    get { return deviceModelIdentifier_; }
+                    set
+                    {
+                        deviceModelIdentifier_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "device_model_boot" field.</summary>
+                public const int DeviceModelBootFieldNumber = 7;
+                private string deviceModelBoot_ = "";
+                /// <summary>
+                ///  On Android: boot.hardware
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string DeviceModelBoot
+                {
+                    get { return deviceModelBoot_; }
+                    set
+                    {
+                        deviceModelBoot_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "hardware_manufacturer" field.</summary>
+                public const int HardwareManufacturerFieldNumber = 8;
+                private string hardwareManufacturer_ = "";
+                /// <summary>
+                ///  On Android: product.manufacturer
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string HardwareManufacturer
+                {
+                    get { return hardwareManufacturer_; }
+                    set
+                    {
+                        hardwareManufacturer_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "hardware_model" field.</summary>
+                public const int HardwareModelFieldNumber = 9;
+                private string hardwareModel_ = "";
+                /// <summary>
+                ///  On Android: product.model
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string HardwareModel
+                {
+                    get { return hardwareModel_; }
+                    set
+                    {
+                        hardwareModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "firmware_brand" field.</summary>
+                public const int FirmwareBrandFieldNumber = 10;
+                private string firmwareBrand_ = "";
+                /// <summary>
+                ///  On Android: product.name, on iOS: "iPhone OS"
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string FirmwareBrand
+                {
+                    get { return firmwareBrand_; }
+                    set
+                    {
+                        firmwareBrand_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "firmware_tags" field.</summary>
+                public const int FirmwareTagsFieldNumber = 12;
+                private string firmwareTags_ = "";
+                /// <summary>
+                ///  Android only, build.tags
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string FirmwareTags
+                {
+                    get { return firmwareTags_; }
+                    set
+                    {
+                        firmwareTags_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "firmware_type" field.</summary>
+                public const int FirmwareTypeFieldNumber = 13;
+                private string firmwareType_ = "";
+                /// <summary>
+                ///  On Android: build.type, on iOS instead: iOS version
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string FirmwareType
+                {
+                    get { return firmwareType_; }
+                    set
+                    {
+                        firmwareType_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                /// <summary>Field number for the "firmware_fingerprint" field.</summary>
+                public const int FirmwareFingerprintFieldNumber = 14;
+                private string firmwareFingerprint_ = "";
+                /// <summary>
+                ///  Android only, build.fingerprint
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public string FirmwareFingerprint
+                {
+                    get { return firmwareFingerprint_; }
+                    set
+                    {
+                        firmwareFingerprint_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other)
+                {
+                    return Equals(other as DeviceInfo);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(DeviceInfo other)
+                {
+                    if (ReferenceEquals(other, null))
+                    {
+                        return false;
+                    }
+                    if (ReferenceEquals(other, this))
+                    {
+                        return true;
+                    }
+                    if (DeviceId != other.DeviceId) return false;
+                    if (AndroidBoardName != other.AndroidBoardName) return false;
+                    if (AndroidBootloader != other.AndroidBootloader) return false;
+                    if (DeviceBrand != other.DeviceBrand) return false;
+                    if (DeviceModel != other.DeviceModel) return false;
+                    if (DeviceModelIdentifier != other.DeviceModelIdentifier) return false;
+                    if (DeviceModelBoot != other.DeviceModelBoot) return false;
+                    if (HardwareManufacturer != other.HardwareManufacturer) return false;
+                    if (HardwareModel != other.HardwareModel) return false;
+                    if (FirmwareBrand != other.FirmwareBrand) return false;
+                    if (FirmwareTags != other.FirmwareTags) return false;
+                    if (FirmwareType != other.FirmwareType) return false;
+                    if (FirmwareFingerprint != other.FirmwareFingerprint) return false;
+                    return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode()
+                {
+                    int hash = 1;
+                    if (DeviceId.Length != 0) hash ^= DeviceId.GetHashCode();
+                    if (AndroidBoardName.Length != 0) hash ^= AndroidBoardName.GetHashCode();
+                    if (AndroidBootloader.Length != 0) hash ^= AndroidBootloader.GetHashCode();
+                    if (DeviceBrand.Length != 0) hash ^= DeviceBrand.GetHashCode();
+                    if (DeviceModel.Length != 0) hash ^= DeviceModel.GetHashCode();
+                    if (DeviceModelIdentifier.Length != 0) hash ^= DeviceModelIdentifier.GetHashCode();
+                    if (DeviceModelBoot.Length != 0) hash ^= DeviceModelBoot.GetHashCode();
+                    if (HardwareManufacturer.Length != 0) hash ^= HardwareManufacturer.GetHashCode();
+                    if (HardwareModel.Length != 0) hash ^= HardwareModel.GetHashCode();
+                    if (FirmwareBrand.Length != 0) hash ^= FirmwareBrand.GetHashCode();
+                    if (FirmwareTags.Length != 0) hash ^= FirmwareTags.GetHashCode();
+                    if (FirmwareType.Length != 0) hash ^= FirmwareType.GetHashCode();
+                    if (FirmwareFingerprint.Length != 0) hash ^= FirmwareFingerprint.GetHashCode();
+                    return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString()
+                {
+                    return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output)
+                {
+                    if (DeviceId.Length != 0)
+                    {
+                        output.WriteRawTag(10);
+                        output.WriteString(DeviceId);
+                    }
+                    if (AndroidBoardName.Length != 0)
+                    {
+                        output.WriteRawTag(18);
+                        output.WriteString(AndroidBoardName);
+                    }
+                    if (AndroidBootloader.Length != 0)
+                    {
+                        output.WriteRawTag(26);
+                        output.WriteString(AndroidBootloader);
+                    }
+                    if (DeviceBrand.Length != 0)
+                    {
+                        output.WriteRawTag(34);
+                        output.WriteString(DeviceBrand);
+                    }
+                    if (DeviceModel.Length != 0)
+                    {
+                        output.WriteRawTag(42);
+                        output.WriteString(DeviceModel);
+                    }
+                    if (DeviceModelIdentifier.Length != 0)
+                    {
+                        output.WriteRawTag(50);
+                        output.WriteString(DeviceModelIdentifier);
+                    }
+                    if (DeviceModelBoot.Length != 0)
+                    {
+                        output.WriteRawTag(58);
+                        output.WriteString(DeviceModelBoot);
+                    }
+                    if (HardwareManufacturer.Length != 0)
+                    {
+                        output.WriteRawTag(66);
+                        output.WriteString(HardwareManufacturer);
+                    }
+                    if (HardwareModel.Length != 0)
+                    {
+                        output.WriteRawTag(74);
+                        output.WriteString(HardwareModel);
+                    }
+                    if (FirmwareBrand.Length != 0)
+                    {
+                        output.WriteRawTag(82);
+                        output.WriteString(FirmwareBrand);
+                    }
+                    if (FirmwareTags.Length != 0)
+                    {
+                        output.WriteRawTag(98);
+                        output.WriteString(FirmwareTags);
+                    }
+                    if (FirmwareType.Length != 0)
+                    {
+                        output.WriteRawTag(106);
+                        output.WriteString(FirmwareType);
+                    }
+                    if (FirmwareFingerprint.Length != 0)
+                    {
+                        output.WriteRawTag(114);
+                        output.WriteString(FirmwareFingerprint);
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize()
+                {
+                    int size = 0;
+                    if (DeviceId.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceId);
+                    }
+                    if (AndroidBoardName.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(AndroidBoardName);
+                    }
+                    if (AndroidBootloader.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(AndroidBootloader);
+                    }
+                    if (DeviceBrand.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceBrand);
+                    }
+                    if (DeviceModel.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModel);
+                    }
+                    if (DeviceModelIdentifier.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModelIdentifier);
+                    }
+                    if (DeviceModelBoot.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModelBoot);
+                    }
+                    if (HardwareManufacturer.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(HardwareManufacturer);
+                    }
+                    if (HardwareModel.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(HardwareModel);
+                    }
+                    if (FirmwareBrand.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareBrand);
+                    }
+                    if (FirmwareTags.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareTags);
+                    }
+                    if (FirmwareType.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareType);
+                    }
+                    if (FirmwareFingerprint.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareFingerprint);
+                    }
+                    return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(DeviceInfo other)
+                {
+                    if (other == null)
+                    {
+                        return;
+                    }
+                    if (other.DeviceId.Length != 0)
+                    {
+                        DeviceId = other.DeviceId;
+                    }
+                    if (other.AndroidBoardName.Length != 0)
+                    {
+                        AndroidBoardName = other.AndroidBoardName;
+                    }
+                    if (other.AndroidBootloader.Length != 0)
+                    {
+                        AndroidBootloader = other.AndroidBootloader;
+                    }
+                    if (other.DeviceBrand.Length != 0)
+                    {
+                        DeviceBrand = other.DeviceBrand;
+                    }
+                    if (other.DeviceModel.Length != 0)
+                    {
+                        DeviceModel = other.DeviceModel;
+                    }
+                    if (other.DeviceModelIdentifier.Length != 0)
+                    {
+                        DeviceModelIdentifier = other.DeviceModelIdentifier;
+                    }
+                    if (other.DeviceModelBoot.Length != 0)
+                    {
+                        DeviceModelBoot = other.DeviceModelBoot;
+                    }
+                    if (other.HardwareManufacturer.Length != 0)
+                    {
+                        HardwareManufacturer = other.HardwareManufacturer;
+                    }
+                    if (other.HardwareModel.Length != 0)
+                    {
+                        HardwareModel = other.HardwareModel;
+                    }
+                    if (other.FirmwareBrand.Length != 0)
+                    {
+                        FirmwareBrand = other.FirmwareBrand;
+                    }
+                    if (other.FirmwareTags.Length != 0)
+                    {
+                        FirmwareTags = other.FirmwareTags;
+                    }
+                    if (other.FirmwareType.Length != 0)
+                    {
+                        FirmwareType = other.FirmwareType;
+                    }
+                    if (other.FirmwareFingerprint.Length != 0)
+                    {
+                        FirmwareFingerprint = other.FirmwareFingerprint;
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input)
+                {
+                    uint tag;
+                    while ((tag = input.ReadTag()) != 0)
+                    {
+                        switch (tag)
+                        {
+                            default:
+                                input.SkipLastField();
+                                break;
+                            case 10:
+                                {
+                                    DeviceId = input.ReadString();
+                                    break;
+                                }
+                            case 18:
+                                {
+                                    AndroidBoardName = input.ReadString();
+                                    break;
+                                }
+                            case 26:
+                                {
+                                    AndroidBootloader = input.ReadString();
+                                    break;
+                                }
+                            case 34:
+                                {
+                                    DeviceBrand = input.ReadString();
+                                    break;
+                                }
+                            case 42:
+                                {
+                                    DeviceModel = input.ReadString();
+                                    break;
+                                }
+                            case 50:
+                                {
+                                    DeviceModelIdentifier = input.ReadString();
+                                    break;
+                                }
+                            case 58:
+                                {
+                                    DeviceModelBoot = input.ReadString();
+                                    break;
+                                }
+                            case 66:
+                                {
+                                    HardwareManufacturer = input.ReadString();
+                                    break;
+                                }
+                            case 74:
+                                {
+                                    HardwareModel = input.ReadString();
+                                    break;
+                                }
+                            case 82:
+                                {
+                                    FirmwareBrand = input.ReadString();
+                                    break;
+                                }
+                            case 98:
+                                {
+                                    FirmwareTags = input.ReadString();
+                                    break;
+                                }
+                            case 106:
+                                {
+                                    FirmwareType = input.ReadString();
+                                    break;
+                                }
+                            case 114:
+                                {
+                                    FirmwareFingerprint = input.ReadString();
+                                    break;
+                                }
+                        }
+                    }
+                }
+
+            }
+
+            public sealed partial class ActivityStatus : pb::IMessage<ActivityStatus>
+            {
+                private static readonly pb::MessageParser<ActivityStatus> _parser = new pb::MessageParser<ActivityStatus>(() => new ActivityStatus());
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pb::MessageParser<ActivityStatus> Parser { get { return _parser; } }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public static pbr::MessageDescriptor Descriptor
+                {
+                    get { return global::POGOProtos.Networking.Signature.Descriptor.NestedTypes[4]; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                pbr::MessageDescriptor pb::IMessage.Descriptor
+                {
+                    get { return Descriptor; }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ActivityStatus()
+                {
+                    OnConstruction();
+                }
+
+                partial void OnConstruction();
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ActivityStatus(ActivityStatus other) : this()
+                {
+                    startTimeMs_ = other.startTimeMs_;
+                    unknownStatus_ = other.unknownStatus_;
+                    walking_ = other.walking_;
+                    running_ = other.running_;
+                    stationary_ = other.stationary_;
+                    automotive_ = other.automotive_;
+                    tilting_ = other.tilting_;
+                    cycling_ = other.cycling_;
+                    status_ = other.status_;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ActivityStatus Clone()
+                {
+                    return new ActivityStatus(this);
+                }
+
+                /// <summary>Field number for the "start_time_ms" field.</summary>
+                public const int StartTimeMsFieldNumber = 1;
+                private ulong startTimeMs_;
+                /// <summary>
+                ///  all of these had 1 as their value
+                /// </summary>
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public ulong StartTimeMs
+                {
+                    get { return startTimeMs_; }
+                    set
+                    {
+                        startTimeMs_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "unknown_status" field.</summary>
+                public const int UnknownStatusFieldNumber = 2;
+                private bool unknownStatus_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool UnknownStatus
+                {
+                    get { return unknownStatus_; }
+                    set
+                    {
+                        unknownStatus_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "walking" field.</summary>
+                public const int WalkingFieldNumber = 3;
+                private bool walking_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Walking
+                {
+                    get { return walking_; }
+                    set
+                    {
+                        walking_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "running" field.</summary>
+                public const int RunningFieldNumber = 4;
+                private bool running_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Running
+                {
+                    get { return running_; }
+                    set
+                    {
+                        running_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "stationary" field.</summary>
+                public const int StationaryFieldNumber = 5;
+                private bool stationary_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Stationary
+                {
+                    get { return stationary_; }
+                    set
+                    {
+                        stationary_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "automotive" field.</summary>
+                public const int AutomotiveFieldNumber = 6;
+                private bool automotive_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Automotive
+                {
+                    get { return automotive_; }
+                    set
+                    {
+                        automotive_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "tilting" field.</summary>
+                public const int TiltingFieldNumber = 7;
+                private bool tilting_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Tilting
+                {
+                    get { return tilting_; }
+                    set
+                    {
+                        tilting_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "cycling" field.</summary>
+                public const int CyclingFieldNumber = 8;
+                private bool cycling_;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Cycling
+                {
+                    get { return cycling_; }
+                    set
+                    {
+                        cycling_ = value;
+                    }
+                }
+
+                /// <summary>Field number for the "status" field.</summary>
+                public const int StatusFieldNumber = 9;
+                private pb::ByteString status_ = pb::ByteString.Empty;
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public pb::ByteString Status
+                {
+                    get { return status_; }
+                    set
+                    {
+                        status_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override bool Equals(object other)
+                {
+                    return Equals(other as ActivityStatus);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public bool Equals(ActivityStatus other)
+                {
+                    if (ReferenceEquals(other, null))
+                    {
+                        return false;
+                    }
+                    if (ReferenceEquals(other, this))
+                    {
+                        return true;
+                    }
+                    if (StartTimeMs != other.StartTimeMs) return false;
+                    if (UnknownStatus != other.UnknownStatus) return false;
+                    if (Walking != other.Walking) return false;
+                    if (Running != other.Running) return false;
+                    if (Stationary != other.Stationary) return false;
+                    if (Automotive != other.Automotive) return false;
+                    if (Tilting != other.Tilting) return false;
+                    if (Cycling != other.Cycling) return false;
+                    if (Status != other.Status) return false;
+                    return true;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override int GetHashCode()
+                {
+                    int hash = 1;
+                    if (StartTimeMs != 0UL) hash ^= StartTimeMs.GetHashCode();
+                    if (UnknownStatus != false) hash ^= UnknownStatus.GetHashCode();
+                    if (Walking != false) hash ^= Walking.GetHashCode();
+                    if (Running != false) hash ^= Running.GetHashCode();
+                    if (Stationary != false) hash ^= Stationary.GetHashCode();
+                    if (Automotive != false) hash ^= Automotive.GetHashCode();
+                    if (Tilting != false) hash ^= Tilting.GetHashCode();
+                    if (Cycling != false) hash ^= Cycling.GetHashCode();
+                    if (Status.Length != 0) hash ^= Status.GetHashCode();
+                    return hash;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public override string ToString()
+                {
+                    return pb::JsonFormatter.ToDiagnosticString(this);
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void WriteTo(pb::CodedOutputStream output)
+                {
+                    if (StartTimeMs != 0UL)
+                    {
+                        output.WriteRawTag(8);
+                        output.WriteUInt64(StartTimeMs);
+                    }
+                    if (UnknownStatus != false)
+                    {
+                        output.WriteRawTag(16);
+                        output.WriteBool(UnknownStatus);
+                    }
+                    if (Walking != false)
+                    {
+                        output.WriteRawTag(24);
+                        output.WriteBool(Walking);
+                    }
+                    if (Running != false)
+                    {
+                        output.WriteRawTag(32);
+                        output.WriteBool(Running);
+                    }
+                    if (Stationary != false)
+                    {
+                        output.WriteRawTag(40);
+                        output.WriteBool(Stationary);
+                    }
+                    if (Automotive != false)
+                    {
+                        output.WriteRawTag(48);
+                        output.WriteBool(Automotive);
+                    }
+                    if (Tilting != false)
+                    {
+                        output.WriteRawTag(56);
+                        output.WriteBool(Tilting);
+                    }
+                    if (Cycling != false)
+                    {
+                        output.WriteRawTag(64);
+                        output.WriteBool(Cycling);
+                    }
+                    if (Status.Length != 0)
+                    {
+                        output.WriteRawTag(74);
+                        output.WriteBytes(Status);
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public int CalculateSize()
+                {
+                    int size = 0;
+                    if (StartTimeMs != 0UL)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(StartTimeMs);
+                    }
+                    if (UnknownStatus != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Walking != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Running != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Stationary != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Automotive != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Tilting != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Cycling != false)
+                    {
+                        size += 1 + 1;
+                    }
+                    if (Status.Length != 0)
+                    {
+                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Status);
+                    }
+                    return size;
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(ActivityStatus other)
+                {
+                    if (other == null)
+                    {
+                        return;
+                    }
+                    if (other.StartTimeMs != 0UL)
+                    {
+                        StartTimeMs = other.StartTimeMs;
+                    }
+                    if (other.UnknownStatus != false)
+                    {
+                        UnknownStatus = other.UnknownStatus;
+                    }
+                    if (other.Walking != false)
+                    {
+                        Walking = other.Walking;
+                    }
+                    if (other.Running != false)
+                    {
+                        Running = other.Running;
+                    }
+                    if (other.Stationary != false)
+                    {
+                        Stationary = other.Stationary;
+                    }
+                    if (other.Automotive != false)
+                    {
+                        Automotive = other.Automotive;
+                    }
+                    if (other.Tilting != false)
+                    {
+                        Tilting = other.Tilting;
+                    }
+                    if (other.Cycling != false)
+                    {
+                        Cycling = other.Cycling;
+                    }
+                    if (other.Status.Length != 0)
+                    {
+                        Status = other.Status;
+                    }
+                }
+
+                [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+                public void MergeFrom(pb::CodedInputStream input)
+                {
+                    uint tag;
+                    while ((tag = input.ReadTag()) != 0)
+                    {
+                        switch (tag)
+                        {
+                            default:
+                                input.SkipLastField();
+                                break;
+                            case 8:
+                                {
+                                    StartTimeMs = input.ReadUInt64();
+                                    break;
+                                }
+                            case 16:
+                                {
+                                    UnknownStatus = input.ReadBool();
+                                    break;
+                                }
+                            case 24:
+                                {
+                                    Walking = input.ReadBool();
+                                    break;
+                                }
+                            case 32:
+                                {
+                                    Running = input.ReadBool();
+                                    break;
+                                }
+                            case 40:
+                                {
+                                    Stationary = input.ReadBool();
+                                    break;
+                                }
+                            case 48:
+                                {
+                                    Automotive = input.ReadBool();
+                                    break;
+                                }
+                            case 56:
+                                {
+                                    Tilting = input.ReadBool();
+                                    break;
+                                }
+                            case 64:
+                                {
+                                    Cycling = input.ReadBool();
+                                    break;
+                                }
+                            case 74:
+                                {
+                                    Status = input.ReadBytes();
+                                    break;
+                                }
+                        }
+                    }
+                }
+
+            }
+
+        }
+        #endregion
+
+    }
+
+    #endregion
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Networking/Signature/POGOProtosNetworkingSignature.cs b/PokemonGo/POGOProtos/Networking/Signature/POGOProtosNetworkingSignature.cs
new file mode 100644
index 0000000..fee737d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Networking/Signature/POGOProtosNetworkingSignature.cs
@@ -0,0 +1,2195 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Networking.Signature.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Networking.Signature {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Networking.Signature.proto</summary>
+  public static partial class POGOProtosNetworkingSignatureReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Networking.Signature.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosNetworkingSignatureReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zLk5ldHdvcmtpbmcuU2lnbmF0dXJlLnByb3RvEh9QT0dP",
+            "UHJvdG9zLk5ldHdvcmtpbmcuU2lnbmF0dXJlIvYKCglTaWduYXR1cmUSTAoM",
+            "bG9jYXRpb25fZml4GAQgAygLMjYuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlNp",
+            "Z25hdHVyZS5TaWduYXR1cmUuTG9jYXRpb25GaXgSSgoLc2Vuc29yX2luZm8Y",
+            "ByABKAsyNS5QT0dPUHJvdG9zLk5ldHdvcmtpbmcuU2lnbmF0dXJlLlNpZ25h",
+            "dHVyZS5TZW5zb3JJbmZvEkoKC2RldmljZV9pbmZvGAggASgLMjUuUE9HT1By",
+            "b3Rvcy5OZXR3b3JraW5nLlNpZ25hdHVyZS5TaWduYXR1cmUuRGV2aWNlSW5m",
+            "bxJBCgR1bms5GAkgASgLMjMuUE9HT1Byb3Rvcy5OZXR3b3JraW5nLlNpZ25h",
+            "dHVyZS5TaWduYXR1cmUuVW5rbm93bjkSEQoJdGltZXN0YW1wGBcgASgEEhQK",
+            "DHJlcXVlc3RfaGFzaBgYIAMoDRqxAQoLTG9jYXRpb25GaXgSEAoIcHJvdmlk",
+            "ZXIYASABKAkSHQoVdGltZXN0YW1wX3NpbmNlX3N0YXJ0GAIgASgEEhAKCGxh",
+            "dGl0dWRlGA0gASgCEhEKCWxvbmdpdHVkZRgOIAEoAhINCgV1bmsyMBgUIAEo",
+            "BBIQCghhbHRpdHVkZRgVIAEoAhINCgV1bmsyMhgWIAEoBBINCgV1bmsyNhga",
+            "IAEoBBINCgV1bmsyOBgcIAEoBBp6CghVbmtub3duNRIMCgR1bmsxGAEgASgE",
+            "EgwKBHVuazIYAiABKAwSDAoEdW5rMxgDIAMoBxIMCgR1bms0GAQgAygHEgwK",
+            "BHVuazUYBSADKAcSDAoEdW5rNhgGIAEoDBIMCgR1bms3GAcgASgMEgwKBHVu",
+            "azgYCCABKAwa0gIKClNlbnNvckluZm8SGgoSdGltZXN0YW1wX3NuYXBzaG90",
+            "GAEgASgEEgwKBHVuazMYAyABKAQSDAoEdW5rNBgEIAEoBBIMCgR1bms1GAUg",
+            "ASgEEhgKEGd5cm9zY29wZV9hbmdsZTYYBiABKAESGAoQZ3lyb3Njb3BlX2Fu",
+            "Z2xlNxgHIAEoARIYChBneXJvc2NvcGVfYW5nbGU4GAggASgBEg0KBXVuazEw",
+            "GAogASgEEg0KBXVuazExGAsgASgEEg0KBXVuazEyGAwgASgEEg0KBXVuazEz",
+            "GA0gASgEEg0KBXVuazE0GA4gASgEEhcKD2FjY2VsZXJvbWV0ZXJfeBgQIAEo",
+            "ARIXCg9hY2NlbGVyb21ldGVyX3kYESABKAESFwoPYWNjZWxlcm9tZXRlcl96",
+            "GBIgASgBEhoKEmFjY2VsZXJvbWV0ZXJfYXhlcxgTIAEoBBrbAgoKRGV2aWNl",
+            "SW5mbxIRCglkZXZpY2VfaWQYASABKAkSGgoSYW5kcm9pZF9ib2FyZF9uYW1l",
+            "GAIgASgJEhoKEmFuZHJvaWRfYm9vdGxvYWRlchgDIAEoCRIUCgxkZXZpY2Vf",
+            "YnJhbmQYBCABKAkSFAoMZGV2aWNlX21vZGVsGAUgASgJEh8KF2RldmljZV9t",
+            "b2RlbF9pZGVudGlmaWVyGAYgASgJEhoKEmRldmljZV9jb21tc19tb2RlbBgH",
+            "IAEoCRIdChVoYXJkd2FyZV9tYW51ZmFjdHVyZXIYCCABKAkSFgoOaGFyZHdh",
+            "cmVfbW9kZWwYCSABKAkSFgoOZmlybXdhcmVfYnJhbmQYCiABKAkSFQoNZmly",
+            "bXdhcmVfdGFncxgMIAEoCRIVCg1maXJtd2FyZV90eXBlGA0gASgJEhwKFGZp",
+            "cm13YXJlX2ZpbmdlcnByaW50GA4gASgJGjQKCFVua25vd245EgwKBHVuazMY",
+            "AyABKAQSDAoEdW5rNRgFIAEoBBIMCgR1bms2GAYgASgEYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Signature), global::POGOProtos.Networking.Signature.Signature.Parser, new[]{ "LocationFix", "SensorInfo", "DeviceInfo", "Unk9", "Timestamp", "RequestHash" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Signature.Types.LocationFix), global::POGOProtos.Networking.Signature.Signature.Types.LocationFix.Parser, new[]{ "Provider", "TimestampSinceStart", "Latitude", "Longitude", "Unk20", "Altitude", "Unk22", "Unk26", "Unk28" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Signature.Types.Unknown5), global::POGOProtos.Networking.Signature.Signature.Types.Unknown5.Parser, new[]{ "Unk1", "Unk2", "Unk3", "Unk4", "Unk5", "Unk6", "Unk7", "Unk8" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Signature.Types.SensorInfo), global::POGOProtos.Networking.Signature.Signature.Types.SensorInfo.Parser, new[]{ "TimestampSnapshot", "Unk3", "Unk4", "Unk5", "GyroscopeAngle6", "GyroscopeAngle7", "GyroscopeAngle8", "Unk10", "Unk11", "Unk12", "Unk13", "Unk14", "AccelerometerX", "AccelerometerY", "AccelerometerZ", "AccelerometerAxes" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Signature.Types.DeviceInfo), global::POGOProtos.Networking.Signature.Signature.Types.DeviceInfo.Parser, new[]{ "DeviceId", "AndroidBoardName", "AndroidBootloader", "DeviceBrand", "DeviceModel", "DeviceModelIdentifier", "DeviceCommsModel", "HardwareManufacturer", "HardwareModel", "FirmwareBrand", "FirmwareTags", "FirmwareType", "FirmwareFingerprint" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Networking.Signature.Signature.Types.Unknown9), global::POGOProtos.Networking.Signature.Signature.Types.Unknown9.Parser, new[]{ "Unk3", "Unk5", "Unk6" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class Signature : pb::IMessage<Signature> {
+    private static readonly pb::MessageParser<Signature> _parser = new pb::MessageParser<Signature>(() => new Signature());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<Signature> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Networking.Signature.POGOProtosNetworkingSignatureReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Signature() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Signature(Signature other) : this() {
+      locationFix_ = other.locationFix_.Clone();
+      SensorInfo = other.sensorInfo_ != null ? other.SensorInfo.Clone() : null;
+      DeviceInfo = other.deviceInfo_ != null ? other.DeviceInfo.Clone() : null;
+      Unk9 = other.unk9_ != null ? other.Unk9.Clone() : null;
+      timestamp_ = other.timestamp_;
+      requestHash_ = other.requestHash_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public Signature Clone() {
+      return new Signature(this);
+    }
+
+    /// <summary>Field number for the "location_fix" field.</summary>
+    public const int LocationFixFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Networking.Signature.Signature.Types.LocationFix> _repeated_locationFix_codec
+        = pb::FieldCodec.ForMessage(34, global::POGOProtos.Networking.Signature.Signature.Types.LocationFix.Parser);
+    private readonly pbc::RepeatedField<global::POGOProtos.Networking.Signature.Signature.Types.LocationFix> locationFix_ = new pbc::RepeatedField<global::POGOProtos.Networking.Signature.Signature.Types.LocationFix>();
+    /// <summary>
+    /// uint64 timestamp_since_start = 2;
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Networking.Signature.Signature.Types.LocationFix> LocationFix {
+      get { return locationFix_; }
+    }
+
+    /// <summary>Field number for the "sensor_info" field.</summary>
+    public const int SensorInfoFieldNumber = 7;
+    private global::POGOProtos.Networking.Signature.Signature.Types.SensorInfo sensorInfo_;
+    /// <summary>
+    /// Unknown5 unk5 = 5;
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Signature.Signature.Types.SensorInfo SensorInfo {
+      get { return sensorInfo_; }
+      set {
+        sensorInfo_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "device_info" field.</summary>
+    public const int DeviceInfoFieldNumber = 8;
+    private global::POGOProtos.Networking.Signature.Signature.Types.DeviceInfo deviceInfo_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Signature.Signature.Types.DeviceInfo DeviceInfo {
+      get { return deviceInfo_; }
+      set {
+        deviceInfo_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unk9" field.</summary>
+    public const int Unk9FieldNumber = 9;
+    private global::POGOProtos.Networking.Signature.Signature.Types.Unknown9 unk9_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Networking.Signature.Signature.Types.Unknown9 Unk9 {
+      get { return unk9_; }
+      set {
+        unk9_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "timestamp" field.</summary>
+    public const int TimestampFieldNumber = 23;
+    private ulong timestamp_;
+    /// <summary>
+    /// uint64 unk10 = 10; //actually looks like a negative double
+    /// uint64 unk20 = 20;
+    /// bytes unk22 = 22; // same in all dumps
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ulong Timestamp {
+      get { return timestamp_; }
+      set {
+        timestamp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "request_hash" field.</summary>
+    public const int RequestHashFieldNumber = 24;
+    private static readonly pb::FieldCodec<uint> _repeated_requestHash_codec
+        = pb::FieldCodec.ForUInt32(194);
+    private readonly pbc::RepeatedField<uint> requestHash_ = new pbc::RepeatedField<uint>();
+    /// <summary>
+    ///  hashes of each request message
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<uint> RequestHash {
+      get { return requestHash_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as Signature);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(Signature other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!locationFix_.Equals(other.locationFix_)) return false;
+      if (!object.Equals(SensorInfo, other.SensorInfo)) return false;
+      if (!object.Equals(DeviceInfo, other.DeviceInfo)) return false;
+      if (!object.Equals(Unk9, other.Unk9)) return false;
+      if (Timestamp != other.Timestamp) return false;
+      if(!requestHash_.Equals(other.requestHash_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= locationFix_.GetHashCode();
+      if (sensorInfo_ != null) hash ^= SensorInfo.GetHashCode();
+      if (deviceInfo_ != null) hash ^= DeviceInfo.GetHashCode();
+      if (unk9_ != null) hash ^= Unk9.GetHashCode();
+      if (Timestamp != 0UL) hash ^= Timestamp.GetHashCode();
+      hash ^= requestHash_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      locationFix_.WriteTo(output, _repeated_locationFix_codec);
+      if (sensorInfo_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(SensorInfo);
+      }
+      if (deviceInfo_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(DeviceInfo);
+      }
+      if (unk9_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(Unk9);
+      }
+      if (Timestamp != 0UL) {
+        output.WriteRawTag(184, 1);
+        output.WriteUInt64(Timestamp);
+      }
+      requestHash_.WriteTo(output, _repeated_requestHash_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += locationFix_.CalculateSize(_repeated_locationFix_codec);
+      if (sensorInfo_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(SensorInfo);
+      }
+      if (deviceInfo_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DeviceInfo);
+      }
+      if (unk9_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unk9);
+      }
+      if (Timestamp != 0UL) {
+        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Timestamp);
+      }
+      size += requestHash_.CalculateSize(_repeated_requestHash_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(Signature other) {
+      if (other == null) {
+        return;
+      }
+      locationFix_.Add(other.locationFix_);
+      if (other.sensorInfo_ != null) {
+        if (sensorInfo_ == null) {
+          sensorInfo_ = new global::POGOProtos.Networking.Signature.Signature.Types.SensorInfo();
+        }
+        SensorInfo.MergeFrom(other.SensorInfo);
+      }
+      if (other.deviceInfo_ != null) {
+        if (deviceInfo_ == null) {
+          deviceInfo_ = new global::POGOProtos.Networking.Signature.Signature.Types.DeviceInfo();
+        }
+        DeviceInfo.MergeFrom(other.DeviceInfo);
+      }
+      if (other.unk9_ != null) {
+        if (unk9_ == null) {
+          unk9_ = new global::POGOProtos.Networking.Signature.Signature.Types.Unknown9();
+        }
+        Unk9.MergeFrom(other.Unk9);
+      }
+      if (other.Timestamp != 0UL) {
+        Timestamp = other.Timestamp;
+      }
+      requestHash_.Add(other.requestHash_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 34: {
+            locationFix_.AddEntriesFrom(input, _repeated_locationFix_codec);
+            break;
+          }
+          case 58: {
+            if (sensorInfo_ == null) {
+              sensorInfo_ = new global::POGOProtos.Networking.Signature.Signature.Types.SensorInfo();
+            }
+            input.ReadMessage(sensorInfo_);
+            break;
+          }
+          case 66: {
+            if (deviceInfo_ == null) {
+              deviceInfo_ = new global::POGOProtos.Networking.Signature.Signature.Types.DeviceInfo();
+            }
+            input.ReadMessage(deviceInfo_);
+            break;
+          }
+          case 74: {
+            if (unk9_ == null) {
+              unk9_ = new global::POGOProtos.Networking.Signature.Signature.Types.Unknown9();
+            }
+            input.ReadMessage(unk9_);
+            break;
+          }
+          case 184: {
+            Timestamp = input.ReadUInt64();
+            break;
+          }
+          case 194:
+          case 192: {
+            requestHash_.AddEntriesFrom(input, _repeated_requestHash_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the Signature message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static partial class Types {
+      public sealed partial class LocationFix : pb::IMessage<LocationFix> {
+        private static readonly pb::MessageParser<LocationFix> _parser = new pb::MessageParser<LocationFix>(() => new LocationFix());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<LocationFix> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Signature.Signature.Descriptor.NestedTypes[0]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public LocationFix() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public LocationFix(LocationFix other) : this() {
+          provider_ = other.provider_;
+          timestampSinceStart_ = other.timestampSinceStart_;
+          latitude_ = other.latitude_;
+          longitude_ = other.longitude_;
+          unk20_ = other.unk20_;
+          altitude_ = other.altitude_;
+          unk22_ = other.unk22_;
+          unk26_ = other.unk26_;
+          unk28_ = other.unk28_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public LocationFix Clone() {
+          return new LocationFix(this);
+        }
+
+        /// <summary>Field number for the "provider" field.</summary>
+        public const int ProviderFieldNumber = 1;
+        private string provider_ = "";
+        /// <summary>
+        ///  On iOS there are some LocationFixes with unk26=1 and everything else empty
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string Provider {
+          get { return provider_; }
+          set {
+            provider_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "timestamp_since_start" field.</summary>
+        public const int TimestampSinceStartFieldNumber = 2;
+        private ulong timestampSinceStart_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong TimestampSinceStart {
+          get { return timestampSinceStart_; }
+          set {
+            timestampSinceStart_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "latitude" field.</summary>
+        public const int LatitudeFieldNumber = 13;
+        private float latitude_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public float Latitude {
+          get { return latitude_; }
+          set {
+            latitude_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "longitude" field.</summary>
+        public const int LongitudeFieldNumber = 14;
+        private float longitude_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public float Longitude {
+          get { return longitude_; }
+          set {
+            longitude_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk20" field.</summary>
+        public const int Unk20FieldNumber = 20;
+        private ulong unk20_;
+        /// <summary>
+        ///  sample 0xbf800000 (iOS only, possibly horizontal accuracy)
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk20 {
+          get { return unk20_; }
+          set {
+            unk20_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "altitude" field.</summary>
+        public const int AltitudeFieldNumber = 21;
+        private float altitude_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public float Altitude {
+          get { return altitude_; }
+          set {
+            altitude_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk22" field.</summary>
+        public const int Unk22FieldNumber = 22;
+        private ulong unk22_;
+        /// <summary>
+        ///  sample 0x40800000 (iOS only, possibly vertical accuracy)
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk22 {
+          get { return unk22_; }
+          set {
+            unk22_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk26" field.</summary>
+        public const int Unk26FieldNumber = 26;
+        private ulong unk26_;
+        /// <summary>
+        ///  Always 3 (possibly GPS status or number of satellites)
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk26 {
+          get { return unk26_; }
+          set {
+            unk26_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk28" field.</summary>
+        public const int Unk28FieldNumber = 28;
+        private ulong unk28_;
+        /// <summary>
+        ///  Always 1
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk28 {
+          get { return unk28_; }
+          set {
+            unk28_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as LocationFix);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(LocationFix other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Provider != other.Provider) return false;
+          if (TimestampSinceStart != other.TimestampSinceStart) return false;
+          if (Latitude != other.Latitude) return false;
+          if (Longitude != other.Longitude) return false;
+          if (Unk20 != other.Unk20) return false;
+          if (Altitude != other.Altitude) return false;
+          if (Unk22 != other.Unk22) return false;
+          if (Unk26 != other.Unk26) return false;
+          if (Unk28 != other.Unk28) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Provider.Length != 0) hash ^= Provider.GetHashCode();
+          if (TimestampSinceStart != 0UL) hash ^= TimestampSinceStart.GetHashCode();
+          if (Latitude != 0F) hash ^= Latitude.GetHashCode();
+          if (Longitude != 0F) hash ^= Longitude.GetHashCode();
+          if (Unk20 != 0UL) hash ^= Unk20.GetHashCode();
+          if (Altitude != 0F) hash ^= Altitude.GetHashCode();
+          if (Unk22 != 0UL) hash ^= Unk22.GetHashCode();
+          if (Unk26 != 0UL) hash ^= Unk26.GetHashCode();
+          if (Unk28 != 0UL) hash ^= Unk28.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Provider.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(Provider);
+          }
+          if (TimestampSinceStart != 0UL) {
+            output.WriteRawTag(16);
+            output.WriteUInt64(TimestampSinceStart);
+          }
+          if (Latitude != 0F) {
+            output.WriteRawTag(109);
+            output.WriteFloat(Latitude);
+          }
+          if (Longitude != 0F) {
+            output.WriteRawTag(117);
+            output.WriteFloat(Longitude);
+          }
+          if (Unk20 != 0UL) {
+            output.WriteRawTag(160, 1);
+            output.WriteUInt64(Unk20);
+          }
+          if (Altitude != 0F) {
+            output.WriteRawTag(173, 1);
+            output.WriteFloat(Altitude);
+          }
+          if (Unk22 != 0UL) {
+            output.WriteRawTag(176, 1);
+            output.WriteUInt64(Unk22);
+          }
+          if (Unk26 != 0UL) {
+            output.WriteRawTag(208, 1);
+            output.WriteUInt64(Unk26);
+          }
+          if (Unk28 != 0UL) {
+            output.WriteRawTag(224, 1);
+            output.WriteUInt64(Unk28);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Provider.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Provider);
+          }
+          if (TimestampSinceStart != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampSinceStart);
+          }
+          if (Latitude != 0F) {
+            size += 1 + 4;
+          }
+          if (Longitude != 0F) {
+            size += 1 + 4;
+          }
+          if (Unk20 != 0UL) {
+            size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Unk20);
+          }
+          if (Altitude != 0F) {
+            size += 2 + 4;
+          }
+          if (Unk22 != 0UL) {
+            size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Unk22);
+          }
+          if (Unk26 != 0UL) {
+            size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Unk26);
+          }
+          if (Unk28 != 0UL) {
+            size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Unk28);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(LocationFix other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Provider.Length != 0) {
+            Provider = other.Provider;
+          }
+          if (other.TimestampSinceStart != 0UL) {
+            TimestampSinceStart = other.TimestampSinceStart;
+          }
+          if (other.Latitude != 0F) {
+            Latitude = other.Latitude;
+          }
+          if (other.Longitude != 0F) {
+            Longitude = other.Longitude;
+          }
+          if (other.Unk20 != 0UL) {
+            Unk20 = other.Unk20;
+          }
+          if (other.Altitude != 0F) {
+            Altitude = other.Altitude;
+          }
+          if (other.Unk22 != 0UL) {
+            Unk22 = other.Unk22;
+          }
+          if (other.Unk26 != 0UL) {
+            Unk26 = other.Unk26;
+          }
+          if (other.Unk28 != 0UL) {
+            Unk28 = other.Unk28;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Provider = input.ReadString();
+                break;
+              }
+              case 16: {
+                TimestampSinceStart = input.ReadUInt64();
+                break;
+              }
+              case 109: {
+                Latitude = input.ReadFloat();
+                break;
+              }
+              case 117: {
+                Longitude = input.ReadFloat();
+                break;
+              }
+              case 160: {
+                Unk20 = input.ReadUInt64();
+                break;
+              }
+              case 173: {
+                Altitude = input.ReadFloat();
+                break;
+              }
+              case 176: {
+                Unk22 = input.ReadUInt64();
+                break;
+              }
+              case 208: {
+                Unk26 = input.ReadUInt64();
+                break;
+              }
+              case 224: {
+                Unk28 = input.ReadUInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      public sealed partial class Unknown5 : pb::IMessage<Unknown5> {
+        private static readonly pb::MessageParser<Unknown5> _parser = new pb::MessageParser<Unknown5>(() => new Unknown5());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown5> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Signature.Signature.Descriptor.NestedTypes[1]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown5() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown5(Unknown5 other) : this() {
+          unk1_ = other.unk1_;
+          unk2_ = other.unk2_;
+          unk3_ = other.unk3_.Clone();
+          unk4_ = other.unk4_.Clone();
+          unk5_ = other.unk5_.Clone();
+          unk6_ = other.unk6_;
+          unk7_ = other.unk7_;
+          unk8_ = other.unk8_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown5 Clone() {
+          return new Unknown5(this);
+        }
+
+        /// <summary>Field number for the "unk1" field.</summary>
+        public const int Unk1FieldNumber = 1;
+        private ulong unk1_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk1 {
+          get { return unk1_; }
+          set {
+            unk1_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk2" field.</summary>
+        public const int Unk2FieldNumber = 2;
+        private pb::ByteString unk2_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unk2 {
+          get { return unk2_; }
+          set {
+            unk2_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unk3" field.</summary>
+        public const int Unk3FieldNumber = 3;
+        private static readonly pb::FieldCodec<uint> _repeated_unk3_codec
+            = pb::FieldCodec.ForFixed32(26);
+        private readonly pbc::RepeatedField<uint> unk3_ = new pbc::RepeatedField<uint>();
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<uint> Unk3 {
+          get { return unk3_; }
+        }
+
+        /// <summary>Field number for the "unk4" field.</summary>
+        public const int Unk4FieldNumber = 4;
+        private static readonly pb::FieldCodec<uint> _repeated_unk4_codec
+            = pb::FieldCodec.ForFixed32(34);
+        private readonly pbc::RepeatedField<uint> unk4_ = new pbc::RepeatedField<uint>();
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<uint> Unk4 {
+          get { return unk4_; }
+        }
+
+        /// <summary>Field number for the "unk5" field.</summary>
+        public const int Unk5FieldNumber = 5;
+        private static readonly pb::FieldCodec<uint> _repeated_unk5_codec
+            = pb::FieldCodec.ForFixed32(42);
+        private readonly pbc::RepeatedField<uint> unk5_ = new pbc::RepeatedField<uint>();
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pbc::RepeatedField<uint> Unk5 {
+          get { return unk5_; }
+        }
+
+        /// <summary>Field number for the "unk6" field.</summary>
+        public const int Unk6FieldNumber = 6;
+        private pb::ByteString unk6_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unk6 {
+          get { return unk6_; }
+          set {
+            unk6_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unk7" field.</summary>
+        public const int Unk7FieldNumber = 7;
+        private pb::ByteString unk7_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unk7 {
+          get { return unk7_; }
+          set {
+            unk7_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unk8" field.</summary>
+        public const int Unk8FieldNumber = 8;
+        private pb::ByteString unk8_ = pb::ByteString.Empty;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public pb::ByteString Unk8 {
+          get { return unk8_; }
+          set {
+            unk8_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown5);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown5 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unk1 != other.Unk1) return false;
+          if (Unk2 != other.Unk2) return false;
+          if(!unk3_.Equals(other.unk3_)) return false;
+          if(!unk4_.Equals(other.unk4_)) return false;
+          if(!unk5_.Equals(other.unk5_)) return false;
+          if (Unk6 != other.Unk6) return false;
+          if (Unk7 != other.Unk7) return false;
+          if (Unk8 != other.Unk8) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unk1 != 0UL) hash ^= Unk1.GetHashCode();
+          if (Unk2.Length != 0) hash ^= Unk2.GetHashCode();
+          hash ^= unk3_.GetHashCode();
+          hash ^= unk4_.GetHashCode();
+          hash ^= unk5_.GetHashCode();
+          if (Unk6.Length != 0) hash ^= Unk6.GetHashCode();
+          if (Unk7.Length != 0) hash ^= Unk7.GetHashCode();
+          if (Unk8.Length != 0) hash ^= Unk8.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unk1 != 0UL) {
+            output.WriteRawTag(8);
+            output.WriteUInt64(Unk1);
+          }
+          if (Unk2.Length != 0) {
+            output.WriteRawTag(18);
+            output.WriteBytes(Unk2);
+          }
+          unk3_.WriteTo(output, _repeated_unk3_codec);
+          unk4_.WriteTo(output, _repeated_unk4_codec);
+          unk5_.WriteTo(output, _repeated_unk5_codec);
+          if (Unk6.Length != 0) {
+            output.WriteRawTag(50);
+            output.WriteBytes(Unk6);
+          }
+          if (Unk7.Length != 0) {
+            output.WriteRawTag(58);
+            output.WriteBytes(Unk7);
+          }
+          if (Unk8.Length != 0) {
+            output.WriteRawTag(66);
+            output.WriteBytes(Unk8);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unk1 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk1);
+          }
+          if (Unk2.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unk2);
+          }
+          size += unk3_.CalculateSize(_repeated_unk3_codec);
+          size += unk4_.CalculateSize(_repeated_unk4_codec);
+          size += unk5_.CalculateSize(_repeated_unk5_codec);
+          if (Unk6.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unk6);
+          }
+          if (Unk7.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unk7);
+          }
+          if (Unk8.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unk8);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown5 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unk1 != 0UL) {
+            Unk1 = other.Unk1;
+          }
+          if (other.Unk2.Length != 0) {
+            Unk2 = other.Unk2;
+          }
+          unk3_.Add(other.unk3_);
+          unk4_.Add(other.unk4_);
+          unk5_.Add(other.unk5_);
+          if (other.Unk6.Length != 0) {
+            Unk6 = other.Unk6;
+          }
+          if (other.Unk7.Length != 0) {
+            Unk7 = other.Unk7;
+          }
+          if (other.Unk8.Length != 0) {
+            Unk8 = other.Unk8;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Unk1 = input.ReadUInt64();
+                break;
+              }
+              case 18: {
+                Unk2 = input.ReadBytes();
+                break;
+              }
+              case 26:
+              case 29: {
+                unk3_.AddEntriesFrom(input, _repeated_unk3_codec);
+                break;
+              }
+              case 34:
+              case 37: {
+                unk4_.AddEntriesFrom(input, _repeated_unk4_codec);
+                break;
+              }
+              case 42:
+              case 45: {
+                unk5_.AddEntriesFrom(input, _repeated_unk5_codec);
+                break;
+              }
+              case 50: {
+                Unk6 = input.ReadBytes();
+                break;
+              }
+              case 58: {
+                Unk7 = input.ReadBytes();
+                break;
+              }
+              case 66: {
+                Unk8 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      public sealed partial class SensorInfo : pb::IMessage<SensorInfo> {
+        private static readonly pb::MessageParser<SensorInfo> _parser = new pb::MessageParser<SensorInfo>(() => new SensorInfo());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<SensorInfo> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Signature.Signature.Descriptor.NestedTypes[2]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public SensorInfo() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public SensorInfo(SensorInfo other) : this() {
+          timestampSnapshot_ = other.timestampSnapshot_;
+          unk3_ = other.unk3_;
+          unk4_ = other.unk4_;
+          unk5_ = other.unk5_;
+          gyroscopeAngle6_ = other.gyroscopeAngle6_;
+          gyroscopeAngle7_ = other.gyroscopeAngle7_;
+          gyroscopeAngle8_ = other.gyroscopeAngle8_;
+          unk10_ = other.unk10_;
+          unk11_ = other.unk11_;
+          unk12_ = other.unk12_;
+          unk13_ = other.unk13_;
+          unk14_ = other.unk14_;
+          accelerometerX_ = other.accelerometerX_;
+          accelerometerY_ = other.accelerometerY_;
+          accelerometerZ_ = other.accelerometerZ_;
+          accelerometerAxes_ = other.accelerometerAxes_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public SensorInfo Clone() {
+          return new SensorInfo(this);
+        }
+
+        /// <summary>Field number for the "timestamp_snapshot" field.</summary>
+        public const int TimestampSnapshotFieldNumber = 1;
+        private ulong timestampSnapshot_;
+        /// <summary>
+        ///  in ms
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong TimestampSnapshot {
+          get { return timestampSnapshot_; }
+          set {
+            timestampSnapshot_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk3" field.</summary>
+        public const int Unk3FieldNumber = 3;
+        private ulong unk3_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk3 {
+          get { return unk3_; }
+          set {
+            unk3_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk4" field.</summary>
+        public const int Unk4FieldNumber = 4;
+        private ulong unk4_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk4 {
+          get { return unk4_; }
+          set {
+            unk4_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk5" field.</summary>
+        public const int Unk5FieldNumber = 5;
+        private ulong unk5_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk5 {
+          get { return unk5_; }
+          set {
+            unk5_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "gyroscope_angle6" field.</summary>
+        public const int GyroscopeAngle6FieldNumber = 6;
+        private double gyroscopeAngle6_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public double GyroscopeAngle6 {
+          get { return gyroscopeAngle6_; }
+          set {
+            gyroscopeAngle6_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "gyroscope_angle7" field.</summary>
+        public const int GyroscopeAngle7FieldNumber = 7;
+        private double gyroscopeAngle7_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public double GyroscopeAngle7 {
+          get { return gyroscopeAngle7_; }
+          set {
+            gyroscopeAngle7_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "gyroscope_angle8" field.</summary>
+        public const int GyroscopeAngle8FieldNumber = 8;
+        private double gyroscopeAngle8_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public double GyroscopeAngle8 {
+          get { return gyroscopeAngle8_; }
+          set {
+            gyroscopeAngle8_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk10" field.</summary>
+        public const int Unk10FieldNumber = 10;
+        private ulong unk10_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk10 {
+          get { return unk10_; }
+          set {
+            unk10_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk11" field.</summary>
+        public const int Unk11FieldNumber = 11;
+        private ulong unk11_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk11 {
+          get { return unk11_; }
+          set {
+            unk11_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk12" field.</summary>
+        public const int Unk12FieldNumber = 12;
+        private ulong unk12_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk12 {
+          get { return unk12_; }
+          set {
+            unk12_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk13" field.</summary>
+        public const int Unk13FieldNumber = 13;
+        private ulong unk13_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk13 {
+          get { return unk13_; }
+          set {
+            unk13_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk14" field.</summary>
+        public const int Unk14FieldNumber = 14;
+        private ulong unk14_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk14 {
+          get { return unk14_; }
+          set {
+            unk14_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "accelerometer_x" field.</summary>
+        public const int AccelerometerXFieldNumber = 16;
+        private double accelerometerX_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public double AccelerometerX {
+          get { return accelerometerX_; }
+          set {
+            accelerometerX_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "accelerometer_y" field.</summary>
+        public const int AccelerometerYFieldNumber = 17;
+        private double accelerometerY_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public double AccelerometerY {
+          get { return accelerometerY_; }
+          set {
+            accelerometerY_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "accelerometer_z" field.</summary>
+        public const int AccelerometerZFieldNumber = 18;
+        private double accelerometerZ_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public double AccelerometerZ {
+          get { return accelerometerZ_; }
+          set {
+            accelerometerZ_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "accelerometer_axes" field.</summary>
+        public const int AccelerometerAxesFieldNumber = 19;
+        private ulong accelerometerAxes_;
+        /// <summary>
+        ///  Always 3
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong AccelerometerAxes {
+          get { return accelerometerAxes_; }
+          set {
+            accelerometerAxes_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as SensorInfo);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(SensorInfo other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (TimestampSnapshot != other.TimestampSnapshot) return false;
+          if (Unk3 != other.Unk3) return false;
+          if (Unk4 != other.Unk4) return false;
+          if (Unk5 != other.Unk5) return false;
+          if (GyroscopeAngle6 != other.GyroscopeAngle6) return false;
+          if (GyroscopeAngle7 != other.GyroscopeAngle7) return false;
+          if (GyroscopeAngle8 != other.GyroscopeAngle8) return false;
+          if (Unk10 != other.Unk10) return false;
+          if (Unk11 != other.Unk11) return false;
+          if (Unk12 != other.Unk12) return false;
+          if (Unk13 != other.Unk13) return false;
+          if (Unk14 != other.Unk14) return false;
+          if (AccelerometerX != other.AccelerometerX) return false;
+          if (AccelerometerY != other.AccelerometerY) return false;
+          if (AccelerometerZ != other.AccelerometerZ) return false;
+          if (AccelerometerAxes != other.AccelerometerAxes) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (TimestampSnapshot != 0UL) hash ^= TimestampSnapshot.GetHashCode();
+          if (Unk3 != 0UL) hash ^= Unk3.GetHashCode();
+          if (Unk4 != 0UL) hash ^= Unk4.GetHashCode();
+          if (Unk5 != 0UL) hash ^= Unk5.GetHashCode();
+          if (GyroscopeAngle6 != 0D) hash ^= GyroscopeAngle6.GetHashCode();
+          if (GyroscopeAngle7 != 0D) hash ^= GyroscopeAngle7.GetHashCode();
+          if (GyroscopeAngle8 != 0D) hash ^= GyroscopeAngle8.GetHashCode();
+          if (Unk10 != 0UL) hash ^= Unk10.GetHashCode();
+          if (Unk11 != 0UL) hash ^= Unk11.GetHashCode();
+          if (Unk12 != 0UL) hash ^= Unk12.GetHashCode();
+          if (Unk13 != 0UL) hash ^= Unk13.GetHashCode();
+          if (Unk14 != 0UL) hash ^= Unk14.GetHashCode();
+          if (AccelerometerX != 0D) hash ^= AccelerometerX.GetHashCode();
+          if (AccelerometerY != 0D) hash ^= AccelerometerY.GetHashCode();
+          if (AccelerometerZ != 0D) hash ^= AccelerometerZ.GetHashCode();
+          if (AccelerometerAxes != 0UL) hash ^= AccelerometerAxes.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (TimestampSnapshot != 0UL) {
+            output.WriteRawTag(8);
+            output.WriteUInt64(TimestampSnapshot);
+          }
+          if (Unk3 != 0UL) {
+            output.WriteRawTag(24);
+            output.WriteUInt64(Unk3);
+          }
+          if (Unk4 != 0UL) {
+            output.WriteRawTag(32);
+            output.WriteUInt64(Unk4);
+          }
+          if (Unk5 != 0UL) {
+            output.WriteRawTag(40);
+            output.WriteUInt64(Unk5);
+          }
+          if (GyroscopeAngle6 != 0D) {
+            output.WriteRawTag(49);
+            output.WriteDouble(GyroscopeAngle6);
+          }
+          if (GyroscopeAngle7 != 0D) {
+            output.WriteRawTag(57);
+            output.WriteDouble(GyroscopeAngle7);
+          }
+          if (GyroscopeAngle8 != 0D) {
+            output.WriteRawTag(65);
+            output.WriteDouble(GyroscopeAngle8);
+          }
+          if (Unk10 != 0UL) {
+            output.WriteRawTag(80);
+            output.WriteUInt64(Unk10);
+          }
+          if (Unk11 != 0UL) {
+            output.WriteRawTag(88);
+            output.WriteUInt64(Unk11);
+          }
+          if (Unk12 != 0UL) {
+            output.WriteRawTag(96);
+            output.WriteUInt64(Unk12);
+          }
+          if (Unk13 != 0UL) {
+            output.WriteRawTag(104);
+            output.WriteUInt64(Unk13);
+          }
+          if (Unk14 != 0UL) {
+            output.WriteRawTag(112);
+            output.WriteUInt64(Unk14);
+          }
+          if (AccelerometerX != 0D) {
+            output.WriteRawTag(129, 1);
+            output.WriteDouble(AccelerometerX);
+          }
+          if (AccelerometerY != 0D) {
+            output.WriteRawTag(137, 1);
+            output.WriteDouble(AccelerometerY);
+          }
+          if (AccelerometerZ != 0D) {
+            output.WriteRawTag(145, 1);
+            output.WriteDouble(AccelerometerZ);
+          }
+          if (AccelerometerAxes != 0UL) {
+            output.WriteRawTag(152, 1);
+            output.WriteUInt64(AccelerometerAxes);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (TimestampSnapshot != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampSnapshot);
+          }
+          if (Unk3 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk3);
+          }
+          if (Unk4 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk4);
+          }
+          if (Unk5 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk5);
+          }
+          if (GyroscopeAngle6 != 0D) {
+            size += 1 + 8;
+          }
+          if (GyroscopeAngle7 != 0D) {
+            size += 1 + 8;
+          }
+          if (GyroscopeAngle8 != 0D) {
+            size += 1 + 8;
+          }
+          if (Unk10 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk10);
+          }
+          if (Unk11 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk11);
+          }
+          if (Unk12 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk12);
+          }
+          if (Unk13 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk13);
+          }
+          if (Unk14 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk14);
+          }
+          if (AccelerometerX != 0D) {
+            size += 2 + 8;
+          }
+          if (AccelerometerY != 0D) {
+            size += 2 + 8;
+          }
+          if (AccelerometerZ != 0D) {
+            size += 2 + 8;
+          }
+          if (AccelerometerAxes != 0UL) {
+            size += 2 + pb::CodedOutputStream.ComputeUInt64Size(AccelerometerAxes);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(SensorInfo other) {
+          if (other == null) {
+            return;
+          }
+          if (other.TimestampSnapshot != 0UL) {
+            TimestampSnapshot = other.TimestampSnapshot;
+          }
+          if (other.Unk3 != 0UL) {
+            Unk3 = other.Unk3;
+          }
+          if (other.Unk4 != 0UL) {
+            Unk4 = other.Unk4;
+          }
+          if (other.Unk5 != 0UL) {
+            Unk5 = other.Unk5;
+          }
+          if (other.GyroscopeAngle6 != 0D) {
+            GyroscopeAngle6 = other.GyroscopeAngle6;
+          }
+          if (other.GyroscopeAngle7 != 0D) {
+            GyroscopeAngle7 = other.GyroscopeAngle7;
+          }
+          if (other.GyroscopeAngle8 != 0D) {
+            GyroscopeAngle8 = other.GyroscopeAngle8;
+          }
+          if (other.Unk10 != 0UL) {
+            Unk10 = other.Unk10;
+          }
+          if (other.Unk11 != 0UL) {
+            Unk11 = other.Unk11;
+          }
+          if (other.Unk12 != 0UL) {
+            Unk12 = other.Unk12;
+          }
+          if (other.Unk13 != 0UL) {
+            Unk13 = other.Unk13;
+          }
+          if (other.Unk14 != 0UL) {
+            Unk14 = other.Unk14;
+          }
+          if (other.AccelerometerX != 0D) {
+            AccelerometerX = other.AccelerometerX;
+          }
+          if (other.AccelerometerY != 0D) {
+            AccelerometerY = other.AccelerometerY;
+          }
+          if (other.AccelerometerZ != 0D) {
+            AccelerometerZ = other.AccelerometerZ;
+          }
+          if (other.AccelerometerAxes != 0UL) {
+            AccelerometerAxes = other.AccelerometerAxes;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                TimestampSnapshot = input.ReadUInt64();
+                break;
+              }
+              case 24: {
+                Unk3 = input.ReadUInt64();
+                break;
+              }
+              case 32: {
+                Unk4 = input.ReadUInt64();
+                break;
+              }
+              case 40: {
+                Unk5 = input.ReadUInt64();
+                break;
+              }
+              case 49: {
+                GyroscopeAngle6 = input.ReadDouble();
+                break;
+              }
+              case 57: {
+                GyroscopeAngle7 = input.ReadDouble();
+                break;
+              }
+              case 65: {
+                GyroscopeAngle8 = input.ReadDouble();
+                break;
+              }
+              case 80: {
+                Unk10 = input.ReadUInt64();
+                break;
+              }
+              case 88: {
+                Unk11 = input.ReadUInt64();
+                break;
+              }
+              case 96: {
+                Unk12 = input.ReadUInt64();
+                break;
+              }
+              case 104: {
+                Unk13 = input.ReadUInt64();
+                break;
+              }
+              case 112: {
+                Unk14 = input.ReadUInt64();
+                break;
+              }
+              case 129: {
+                AccelerometerX = input.ReadDouble();
+                break;
+              }
+              case 137: {
+                AccelerometerY = input.ReadDouble();
+                break;
+              }
+              case 145: {
+                AccelerometerZ = input.ReadDouble();
+                break;
+              }
+              case 152: {
+                AccelerometerAxes = input.ReadUInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      public sealed partial class DeviceInfo : pb::IMessage<DeviceInfo> {
+        private static readonly pb::MessageParser<DeviceInfo> _parser = new pb::MessageParser<DeviceInfo>(() => new DeviceInfo());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<DeviceInfo> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Signature.Signature.Descriptor.NestedTypes[3]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public DeviceInfo() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public DeviceInfo(DeviceInfo other) : this() {
+          deviceId_ = other.deviceId_;
+          androidBoardName_ = other.androidBoardName_;
+          androidBootloader_ = other.androidBootloader_;
+          deviceBrand_ = other.deviceBrand_;
+          deviceModel_ = other.deviceModel_;
+          deviceModelIdentifier_ = other.deviceModelIdentifier_;
+          deviceCommsModel_ = other.deviceCommsModel_;
+          hardwareManufacturer_ = other.hardwareManufacturer_;
+          hardwareModel_ = other.hardwareModel_;
+          firmwareBrand_ = other.firmwareBrand_;
+          firmwareTags_ = other.firmwareTags_;
+          firmwareType_ = other.firmwareType_;
+          firmwareFingerprint_ = other.firmwareFingerprint_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public DeviceInfo Clone() {
+          return new DeviceInfo(this);
+        }
+
+        /// <summary>Field number for the "device_id" field.</summary>
+        public const int DeviceIdFieldNumber = 1;
+        private string deviceId_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string DeviceId {
+          get { return deviceId_; }
+          set {
+            deviceId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "android_board_name" field.</summary>
+        public const int AndroidBoardNameFieldNumber = 2;
+        private string androidBoardName_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string AndroidBoardName {
+          get { return androidBoardName_; }
+          set {
+            androidBoardName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "android_bootloader" field.</summary>
+        public const int AndroidBootloaderFieldNumber = 3;
+        private string androidBootloader_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string AndroidBootloader {
+          get { return androidBootloader_; }
+          set {
+            androidBootloader_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "device_brand" field.</summary>
+        public const int DeviceBrandFieldNumber = 4;
+        private string deviceBrand_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string DeviceBrand {
+          get { return deviceBrand_; }
+          set {
+            deviceBrand_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "device_model" field.</summary>
+        public const int DeviceModelFieldNumber = 5;
+        private string deviceModel_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string DeviceModel {
+          get { return deviceModel_; }
+          set {
+            deviceModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "device_model_identifier" field.</summary>
+        public const int DeviceModelIdentifierFieldNumber = 6;
+        private string deviceModelIdentifier_ = "";
+        /// <summary>
+        ///  Android only
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string DeviceModelIdentifier {
+          get { return deviceModelIdentifier_; }
+          set {
+            deviceModelIdentifier_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "device_comms_model" field.</summary>
+        public const int DeviceCommsModelFieldNumber = 7;
+        private string deviceCommsModel_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string DeviceCommsModel {
+          get { return deviceCommsModel_; }
+          set {
+            deviceCommsModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "hardware_manufacturer" field.</summary>
+        public const int HardwareManufacturerFieldNumber = 8;
+        private string hardwareManufacturer_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string HardwareManufacturer {
+          get { return hardwareManufacturer_; }
+          set {
+            hardwareManufacturer_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "hardware_model" field.</summary>
+        public const int HardwareModelFieldNumber = 9;
+        private string hardwareModel_ = "";
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string HardwareModel {
+          get { return hardwareModel_; }
+          set {
+            hardwareModel_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "firmware_brand" field.</summary>
+        public const int FirmwareBrandFieldNumber = 10;
+        private string firmwareBrand_ = "";
+        /// <summary>
+        ///  On iOS: "iPhone OS"
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string FirmwareBrand {
+          get { return firmwareBrand_; }
+          set {
+            firmwareBrand_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "firmware_tags" field.</summary>
+        public const int FirmwareTagsFieldNumber = 12;
+        private string firmwareTags_ = "";
+        /// <summary>
+        ///  Android only
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string FirmwareTags {
+          get { return firmwareTags_; }
+          set {
+            firmwareTags_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "firmware_type" field.</summary>
+        public const int FirmwareTypeFieldNumber = 13;
+        private string firmwareType_ = "";
+        /// <summary>
+        ///  On iOS instead: iOS version
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string FirmwareType {
+          get { return firmwareType_; }
+          set {
+            firmwareType_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "firmware_fingerprint" field.</summary>
+        public const int FirmwareFingerprintFieldNumber = 14;
+        private string firmwareFingerprint_ = "";
+        /// <summary>
+        ///  Android only
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public string FirmwareFingerprint {
+          get { return firmwareFingerprint_; }
+          set {
+            firmwareFingerprint_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as DeviceInfo);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(DeviceInfo other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (DeviceId != other.DeviceId) return false;
+          if (AndroidBoardName != other.AndroidBoardName) return false;
+          if (AndroidBootloader != other.AndroidBootloader) return false;
+          if (DeviceBrand != other.DeviceBrand) return false;
+          if (DeviceModel != other.DeviceModel) return false;
+          if (DeviceModelIdentifier != other.DeviceModelIdentifier) return false;
+          if (DeviceCommsModel != other.DeviceCommsModel) return false;
+          if (HardwareManufacturer != other.HardwareManufacturer) return false;
+          if (HardwareModel != other.HardwareModel) return false;
+          if (FirmwareBrand != other.FirmwareBrand) return false;
+          if (FirmwareTags != other.FirmwareTags) return false;
+          if (FirmwareType != other.FirmwareType) return false;
+          if (FirmwareFingerprint != other.FirmwareFingerprint) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (DeviceId.Length != 0) hash ^= DeviceId.GetHashCode();
+          if (AndroidBoardName.Length != 0) hash ^= AndroidBoardName.GetHashCode();
+          if (AndroidBootloader.Length != 0) hash ^= AndroidBootloader.GetHashCode();
+          if (DeviceBrand.Length != 0) hash ^= DeviceBrand.GetHashCode();
+          if (DeviceModel.Length != 0) hash ^= DeviceModel.GetHashCode();
+          if (DeviceModelIdentifier.Length != 0) hash ^= DeviceModelIdentifier.GetHashCode();
+          if (DeviceCommsModel.Length != 0) hash ^= DeviceCommsModel.GetHashCode();
+          if (HardwareManufacturer.Length != 0) hash ^= HardwareManufacturer.GetHashCode();
+          if (HardwareModel.Length != 0) hash ^= HardwareModel.GetHashCode();
+          if (FirmwareBrand.Length != 0) hash ^= FirmwareBrand.GetHashCode();
+          if (FirmwareTags.Length != 0) hash ^= FirmwareTags.GetHashCode();
+          if (FirmwareType.Length != 0) hash ^= FirmwareType.GetHashCode();
+          if (FirmwareFingerprint.Length != 0) hash ^= FirmwareFingerprint.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (DeviceId.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(DeviceId);
+          }
+          if (AndroidBoardName.Length != 0) {
+            output.WriteRawTag(18);
+            output.WriteString(AndroidBoardName);
+          }
+          if (AndroidBootloader.Length != 0) {
+            output.WriteRawTag(26);
+            output.WriteString(AndroidBootloader);
+          }
+          if (DeviceBrand.Length != 0) {
+            output.WriteRawTag(34);
+            output.WriteString(DeviceBrand);
+          }
+          if (DeviceModel.Length != 0) {
+            output.WriteRawTag(42);
+            output.WriteString(DeviceModel);
+          }
+          if (DeviceModelIdentifier.Length != 0) {
+            output.WriteRawTag(50);
+            output.WriteString(DeviceModelIdentifier);
+          }
+          if (DeviceCommsModel.Length != 0) {
+            output.WriteRawTag(58);
+            output.WriteString(DeviceCommsModel);
+          }
+          if (HardwareManufacturer.Length != 0) {
+            output.WriteRawTag(66);
+            output.WriteString(HardwareManufacturer);
+          }
+          if (HardwareModel.Length != 0) {
+            output.WriteRawTag(74);
+            output.WriteString(HardwareModel);
+          }
+          if (FirmwareBrand.Length != 0) {
+            output.WriteRawTag(82);
+            output.WriteString(FirmwareBrand);
+          }
+          if (FirmwareTags.Length != 0) {
+            output.WriteRawTag(98);
+            output.WriteString(FirmwareTags);
+          }
+          if (FirmwareType.Length != 0) {
+            output.WriteRawTag(106);
+            output.WriteString(FirmwareType);
+          }
+          if (FirmwareFingerprint.Length != 0) {
+            output.WriteRawTag(114);
+            output.WriteString(FirmwareFingerprint);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (DeviceId.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceId);
+          }
+          if (AndroidBoardName.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(AndroidBoardName);
+          }
+          if (AndroidBootloader.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(AndroidBootloader);
+          }
+          if (DeviceBrand.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceBrand);
+          }
+          if (DeviceModel.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModel);
+          }
+          if (DeviceModelIdentifier.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceModelIdentifier);
+          }
+          if (DeviceCommsModel.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(DeviceCommsModel);
+          }
+          if (HardwareManufacturer.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(HardwareManufacturer);
+          }
+          if (HardwareModel.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(HardwareModel);
+          }
+          if (FirmwareBrand.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareBrand);
+          }
+          if (FirmwareTags.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareTags);
+          }
+          if (FirmwareType.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareType);
+          }
+          if (FirmwareFingerprint.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(FirmwareFingerprint);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(DeviceInfo other) {
+          if (other == null) {
+            return;
+          }
+          if (other.DeviceId.Length != 0) {
+            DeviceId = other.DeviceId;
+          }
+          if (other.AndroidBoardName.Length != 0) {
+            AndroidBoardName = other.AndroidBoardName;
+          }
+          if (other.AndroidBootloader.Length != 0) {
+            AndroidBootloader = other.AndroidBootloader;
+          }
+          if (other.DeviceBrand.Length != 0) {
+            DeviceBrand = other.DeviceBrand;
+          }
+          if (other.DeviceModel.Length != 0) {
+            DeviceModel = other.DeviceModel;
+          }
+          if (other.DeviceModelIdentifier.Length != 0) {
+            DeviceModelIdentifier = other.DeviceModelIdentifier;
+          }
+          if (other.DeviceCommsModel.Length != 0) {
+            DeviceCommsModel = other.DeviceCommsModel;
+          }
+          if (other.HardwareManufacturer.Length != 0) {
+            HardwareManufacturer = other.HardwareManufacturer;
+          }
+          if (other.HardwareModel.Length != 0) {
+            HardwareModel = other.HardwareModel;
+          }
+          if (other.FirmwareBrand.Length != 0) {
+            FirmwareBrand = other.FirmwareBrand;
+          }
+          if (other.FirmwareTags.Length != 0) {
+            FirmwareTags = other.FirmwareTags;
+          }
+          if (other.FirmwareType.Length != 0) {
+            FirmwareType = other.FirmwareType;
+          }
+          if (other.FirmwareFingerprint.Length != 0) {
+            FirmwareFingerprint = other.FirmwareFingerprint;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                DeviceId = input.ReadString();
+                break;
+              }
+              case 18: {
+                AndroidBoardName = input.ReadString();
+                break;
+              }
+              case 26: {
+                AndroidBootloader = input.ReadString();
+                break;
+              }
+              case 34: {
+                DeviceBrand = input.ReadString();
+                break;
+              }
+              case 42: {
+                DeviceModel = input.ReadString();
+                break;
+              }
+              case 50: {
+                DeviceModelIdentifier = input.ReadString();
+                break;
+              }
+              case 58: {
+                DeviceCommsModel = input.ReadString();
+                break;
+              }
+              case 66: {
+                HardwareManufacturer = input.ReadString();
+                break;
+              }
+              case 74: {
+                HardwareModel = input.ReadString();
+                break;
+              }
+              case 82: {
+                FirmwareBrand = input.ReadString();
+                break;
+              }
+              case 98: {
+                FirmwareTags = input.ReadString();
+                break;
+              }
+              case 106: {
+                FirmwareType = input.ReadString();
+                break;
+              }
+              case 114: {
+                FirmwareFingerprint = input.ReadString();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      /// <summary>
+      ///  Only appears rarely
+      /// </summary>
+      public sealed partial class Unknown9 : pb::IMessage<Unknown9> {
+        private static readonly pb::MessageParser<Unknown9> _parser = new pb::MessageParser<Unknown9>(() => new Unknown9());
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pb::MessageParser<Unknown9> Parser { get { return _parser; } }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::POGOProtos.Networking.Signature.Signature.Descriptor.NestedTypes[4]; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown9() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown9(Unknown9 other) : this() {
+          unk3_ = other.unk3_;
+          unk5_ = other.unk5_;
+          unk6_ = other.unk6_;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public Unknown9 Clone() {
+          return new Unknown9(this);
+        }
+
+        /// <summary>Field number for the "unk3" field.</summary>
+        public const int Unk3FieldNumber = 3;
+        private ulong unk3_;
+        /// <summary>
+        ///  all of these had 1 as their value
+        /// </summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk3 {
+          get { return unk3_; }
+          set {
+            unk3_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk5" field.</summary>
+        public const int Unk5FieldNumber = 5;
+        private ulong unk5_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk5 {
+          get { return unk5_; }
+          set {
+            unk5_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unk6" field.</summary>
+        public const int Unk6FieldNumber = 6;
+        private ulong unk6_;
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public ulong Unk6 {
+          get { return unk6_; }
+          set {
+            unk6_ = value;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override bool Equals(object other) {
+          return Equals(other as Unknown9);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public bool Equals(Unknown9 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unk3 != other.Unk3) return false;
+          if (Unk5 != other.Unk5) return false;
+          if (Unk6 != other.Unk6) return false;
+          return true;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unk3 != 0UL) hash ^= Unk3.GetHashCode();
+          if (Unk5 != 0UL) hash ^= Unk5.GetHashCode();
+          if (Unk6 != 0UL) hash ^= Unk6.GetHashCode();
+          return hash;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unk3 != 0UL) {
+            output.WriteRawTag(24);
+            output.WriteUInt64(Unk3);
+          }
+          if (Unk5 != 0UL) {
+            output.WriteRawTag(40);
+            output.WriteUInt64(Unk5);
+          }
+          if (Unk6 != 0UL) {
+            output.WriteRawTag(48);
+            output.WriteUInt64(Unk6);
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public int CalculateSize() {
+          int size = 0;
+          if (Unk3 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk3);
+          }
+          if (Unk5 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk5);
+          }
+          if (Unk6 != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Unk6);
+          }
+          return size;
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(Unknown9 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unk3 != 0UL) {
+            Unk3 = other.Unk3;
+          }
+          if (other.Unk5 != 0UL) {
+            Unk5 = other.Unk5;
+          }
+          if (other.Unk6 != 0UL) {
+            Unk6 = other.Unk6;
+          }
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 24: {
+                Unk3 = input.ReadUInt64();
+                break;
+              }
+              case 40: {
+                Unk5 = input.ReadUInt64();
+                break;
+              }
+              case 48: {
+                Unk6 = input.ReadUInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/POGOProtos.csproj b/PokemonGo/POGOProtos/POGOProtos.csproj
new file mode 100644
index 0000000..4cdf215
--- /dev/null
+++ b/PokemonGo/POGOProtos/POGOProtos.csproj
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>POGOProtos</RootNamespace>
+    <AssemblyName>POGOProtos</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.Protobuf, Version=3.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
+      <HintPath>$(SolutionDir)\packages\Google.Protobuf.3.0.0-beta4\lib\net45\Google.Protobuf.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Data\AssetDigestEntry.cs" />
+    <Compile Include="Data\Battle\BattleAction.cs" />
+    <Compile Include="Data\Battle\BattleActionType.cs" />
+    <Compile Include="Data\Battle\BattleLog.cs" />
+    <Compile Include="Data\Battle\BattleParticipant.cs" />
+    <Compile Include="Data\Battle\BattlePokemonInfo.cs" />
+    <Compile Include="Data\Battle\BattleResults.cs" />
+    <Compile Include="Data\Battle\BattleState.cs" />
+    <Compile Include="Data\Battle\BattleType.cs" />
+    <Compile Include="Data\Capture\CaptureAward.cs" />
+    <Compile Include="Data\Capture\CaptureProbability.cs" />
+    <Compile Include="Data\DownloadUrlEntry.cs" />
+    <Compile Include="Data\Gym\GymMembership.cs" />
+    <Compile Include="Data\Gym\GymState.cs" />
+    <Compile Include="Data\Logs\ActionLogEntry.cs" />
+    <Compile Include="Data\Logs\CatchPokemonLogEntry.cs" />
+    <Compile Include="Data\Logs\FortSearchLogEntry.cs" />
+    <Compile Include="Data\PlayerBadge.cs" />
+    <Compile Include="Data\PlayerData.cs" />
+    <Compile Include="Data\Player\ContactSettings.cs" />
+    <Compile Include="Data\Player\Currency.cs" />
+    <Compile Include="Data\Player\DailyBonus.cs" />
+    <Compile Include="Data\Player\EquippedBadge.cs" />
+    <Compile Include="Data\Player\PlayerAvatar.cs" />
+    <Compile Include="Data\Player\PlayerCamera.cs" />
+    <Compile Include="Data\Player\PlayerCurrency.cs" />
+    <Compile Include="Data\Player\PlayerPublicProfile.cs" />
+    <Compile Include="Data\Player\PlayerStats.cs" />
+    <Compile Include="Data\PokedexEntry.cs" />
+    <Compile Include="Data\PokemonData.cs" />
+    <Compile Include="Enums\ActivityType.cs" />
+    <Compile Include="Enums\BadgeType.cs" />
+    <Compile Include="Enums\CameraInterpolation.cs" />
+    <Compile Include="Enums\CameraTarget.cs" />
+    <Compile Include="Enums\Gender.cs" />
+    <Compile Include="Enums\IapItemCategory.cs" />
+    <Compile Include="Enums\ItemCategory.cs" />
+    <Compile Include="Enums\ItemEffect.cs" />
+    <Compile Include="Enums\Platform.cs" />
+    <Compile Include="Enums\PokemonFamilyId.cs" />
+    <Compile Include="Enums\PokemonId.cs" />
+    <Compile Include="Enums\PokemonMove.cs" />
+    <Compile Include="Enums\PokemonMovementType.cs" />
+    <Compile Include="Enums\PokemonRarity.cs" />
+    <Compile Include="Enums\PokemonType.cs" />
+    <Compile Include="Enums\TeamColor.cs" />
+    <Compile Include="Enums\TutorialState.cs" />
+    <Compile Include="Inventory\AppliedItem.cs" />
+    <Compile Include="Inventory\AppliedItems.cs" />
+    <Compile Include="Inventory\Candy.cs" />
+    <Compile Include="Inventory\EggIncubator.cs" />
+    <Compile Include="Inventory\EggIncubators.cs" />
+    <Compile Include="Inventory\EggIncubatorType.cs" />
+    <Compile Include="Inventory\InventoryDelta.cs" />
+    <Compile Include="Inventory\InventoryItem.cs" />
+    <Compile Include="Inventory\InventoryItemData.cs" />
+    <Compile Include="Inventory\InventoryUpgrade.cs" />
+    <Compile Include="Inventory\InventoryUpgrades.cs" />
+    <Compile Include="Inventory\InventoryUpgradeType.cs" />
+    <Compile Include="Inventory\Item\ItemAward.cs" />
+    <Compile Include="Inventory\Item\ItemData.cs" />
+    <Compile Include="Inventory\Item\ItemId.cs" />
+    <Compile Include="Inventory\Item\ItemType.cs" />
+    <Compile Include="Map\Fort\FortData.cs" />
+    <Compile Include="Map\Fort\FortLureInfo.cs" />
+    <Compile Include="Map\Fort\FortModifier.cs" />
+    <Compile Include="Map\Fort\FortRenderingType.cs" />
+    <Compile Include="Map\Fort\FortSponsor.cs" />
+    <Compile Include="Map\Fort\FortSummary.cs" />
+    <Compile Include="Map\Fort\FortType.cs" />
+    <Compile Include="Map\MapCell.cs" />
+    <Compile Include="Map\MapObjectsStatus.cs" />
+    <Compile Include="Map\Pokemon\MapPokemon.cs" />
+    <Compile Include="Map\Pokemon\NearbyPokemon.cs" />
+    <Compile Include="Map\Pokemon\WildPokemon.cs" />
+    <Compile Include="Map\SpawnPoint.cs" />
+    <Compile Include="Networking\Envelopes\AuthTicket.cs" />
+    <Compile Include="Networking\Envelopes\RequestEnvelope.cs" />
+    <Compile Include="Networking\Envelopes\ResponseEnvelope.cs" />
+    <Compile Include="Networking\Envelopes\Unknown6.cs" />
+    <Compile Include="Networking\Envelopes\Unknown6Response.cs" />
+    <Compile Include="Networking\Requests\Messages\AddFortModifierMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\AttackGymMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\CatchPokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\CheckAwardedBadgesMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\CheckCodenameAvailableMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\ClaimCodenameMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\CollectDailyBonusMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\CollectDailyDefenderBonusMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\DiskEncounterMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\DownloadItemTemplatesMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\DownloadRemoteConfigVersionMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\DownloadSettingsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\EchoMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\EncounterMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\EncounterTutorialCompleteMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\EquipBadgeMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\EvolvePokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\FortDeployPokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\FortDetailsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\FortRecallPokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\FortSearchMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetAssetDigestMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetDownloadUrlsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetGymDetailsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetHatchedEggsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetIncensePokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetInventoryMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetMapObjectsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetPlayerMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetPlayerProfileMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\GetSuggestedCodenamesMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\IncenseEncounterMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\LevelUpRewardsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\MarkTutorialCompleteMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\NicknamePokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\PlayerUpdateMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\RecycleInventoryItemMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\ReleasePokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\SetAvatarMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\SetContactSettingsMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\SetFavoritePokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\SetPlayerTeamMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\SfidaActionLogMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\StartGymBattleMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UpgradePokemonMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseIncenseMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseItemCaptureMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseItemEggIncubatorMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseItemGymMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseItemPotionMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseItemReviveMessage.cs" />
+    <Compile Include="Networking\Requests\Messages\UseItemXpBoostMessage.cs" />
+    <Compile Include="Networking\Requests\Request.cs" />
+    <Compile Include="Networking\Requests\RequestType.cs" />
+    <Compile Include="Networking\Responses\AddFortModifierResponse.cs" />
+    <Compile Include="Networking\Responses\AttackGymResponse.cs" />
+    <Compile Include="Networking\Responses\CatchPokemonResponse.cs" />
+    <Compile Include="Networking\Responses\CheckAwardedBadgesResponse.cs" />
+    <Compile Include="Networking\Responses\CheckCodenameAvailableResponse.cs" />
+    <Compile Include="Networking\Responses\ClaimCodenameResponse.cs" />
+    <Compile Include="Networking\Responses\CollectDailyBonusResponse.cs" />
+    <Compile Include="Networking\Responses\CollectDailyDefenderBonusResponse.cs" />
+    <Compile Include="Networking\Responses\DiskEncounterResponse.cs" />
+    <Compile Include="Networking\Responses\DownloadItemTemplatesResponse.cs" />
+    <Compile Include="Networking\Responses\DownloadRemoteConfigVersionResponse.cs" />
+    <Compile Include="Networking\Responses\DownloadSettingsResponse.cs" />
+    <Compile Include="Networking\Responses\EchoResponse.cs" />
+    <Compile Include="Networking\Responses\EncounterResponse.cs" />
+    <Compile Include="Networking\Responses\EncounterTutorialCompleteResponse.cs" />
+    <Compile Include="Networking\Responses\EquipBadgeResponse.cs" />
+    <Compile Include="Networking\Responses\EvolvePokemonResponse.cs" />
+    <Compile Include="Networking\Responses\FortDeployPokemonResponse.cs" />
+    <Compile Include="Networking\Responses\FortDetailsResponse.cs" />
+    <Compile Include="Networking\Responses\FortRecallPokemonResponse.cs" />
+    <Compile Include="Networking\Responses\FortSearchResponse.cs" />
+    <Compile Include="Networking\Responses\GetAssetDigestResponse.cs" />
+    <Compile Include="Networking\Responses\GetDownloadUrlsResponse.cs" />
+    <Compile Include="Networking\Responses\GetGymDetailsResponse.cs" />
+    <Compile Include="Networking\Responses\GetHatchedEggsResponse.cs" />
+    <Compile Include="Networking\Responses\GetIncensePokemonResponse.cs" />
+    <Compile Include="Networking\Responses\GetInventoryResponse.cs" />
+    <Compile Include="Networking\Responses\GetMapObjectsResponse.cs" />
+    <Compile Include="Networking\Responses\GetPlayerProfileResponse.cs" />
+    <Compile Include="Networking\Responses\GetPlayerResponse.cs" />
+    <Compile Include="Networking\Responses\GetSuggestedCodenamesResponse.cs" />
+    <Compile Include="Networking\Responses\IncenseEncounterResponse.cs" />
+    <Compile Include="Networking\Responses\LevelUpRewardsResponse.cs" />
+    <Compile Include="Networking\Responses\MarkTutorialCompleteResponse.cs" />
+    <Compile Include="Networking\Responses\NicknamePokemonResponse.cs" />
+    <Compile Include="Networking\Responses\PlayerUpdateResponse.cs" />
+    <Compile Include="Networking\Responses\RecycleInventoryItemResponse.cs" />
+    <Compile Include="Networking\Responses\ReleasePokemonResponse.cs" />
+    <Compile Include="Networking\Responses\SetAvatarResponse.cs" />
+    <Compile Include="Networking\Responses\SetContactSettingsResponse.cs" />
+    <Compile Include="Networking\Responses\SetFavoritePokemonResponse.cs" />
+    <Compile Include="Networking\Responses\SetPlayerTeamResponse.cs" />
+    <Compile Include="Networking\Responses\SfidaActionLogResponse.cs" />
+    <Compile Include="Networking\Responses\StartGymBattleResponse.cs" />
+    <Compile Include="Networking\Responses\UpgradePokemonResponse.cs" />
+    <Compile Include="Networking\Responses\UseIncenseResponse.cs" />
+    <Compile Include="Networking\Responses\UseItemCaptureResponse.cs" />
+    <Compile Include="Networking\Responses\UseItemEggIncubatorResponse.cs" />
+    <Compile Include="Networking\Responses\UseItemGymResponse.cs" />
+    <Compile Include="Networking\Responses\UseItemPotionResponse.cs" />
+    <Compile Include="Networking\Responses\UseItemReviveResponse.cs" />
+    <Compile Include="Networking\Responses\UseItemXpBoostResponse.cs" />
+    <Compile Include="Networking\Signature.cs" />
+    <Compile Include="Settings\DownloadSettingsAction.cs" />
+    <Compile Include="Settings\FortSettings.cs" />
+    <Compile Include="Settings\GlobalSettings.cs" />
+    <Compile Include="Settings\InventorySettings.cs" />
+    <Compile Include="Settings\LevelSettings.cs" />
+    <Compile Include="Settings\MapSettings.cs" />
+    <Compile Include="Settings\Master\BadgeSettings.cs" />
+    <Compile Include="Settings\Master\CameraSettings.cs" />
+    <Compile Include="Settings\Master\EncounterSettings.cs" />
+    <Compile Include="Settings\Master\EquippedBadgeSettings.cs" />
+    <Compile Include="Settings\Master\GymBattleSettings.cs" />
+    <Compile Include="Settings\Master\GymLevelSettings.cs" />
+    <Compile Include="Settings\Master\IapItemDisplay.cs" />
+    <Compile Include="Settings\Master\IapSettings.cs" />
+    <Compile Include="Settings\Master\ItemSettings.cs" />
+    <Compile Include="Settings\Master\Item\BattleAttributes.cs" />
+    <Compile Include="Settings\Master\Item\EggIncubatorAttributes.cs" />
+    <Compile Include="Settings\Master\Item\ExperienceBoostAttributes.cs" />
+    <Compile Include="Settings\Master\Item\FoodAttributes.cs" />
+    <Compile Include="Settings\Master\Item\FortModifierAttributes.cs" />
+    <Compile Include="Settings\Master\Item\IncenseAttributes.cs" />
+    <Compile Include="Settings\Master\Item\InventoryUpgradeAttributes.cs" />
+    <Compile Include="Settings\Master\Item\PokeballAttributes.cs" />
+    <Compile Include="Settings\Master\Item\PotionAttributes.cs" />
+    <Compile Include="Settings\Master\Item\ReviveAttributes.cs" />
+    <Compile Include="Settings\Master\MoveSequenceSettings.cs" />
+    <Compile Include="Settings\Master\MoveSettings.cs" />
+    <Compile Include="Settings\Master\PlayerLevelSettings.cs" />
+    <Compile Include="Settings\Master\PokemonSettings.cs" />
+    <Compile Include="Settings\Master\PokemonUpgradeSettings.cs" />
+    <Compile Include="Settings\Master\Pokemon\CameraAttributes.cs" />
+    <Compile Include="Settings\Master\Pokemon\EncounterAttributes.cs" />
+    <Compile Include="Settings\Master\Pokemon\StatsAttributes.cs" />
+    <Compile Include="Settings\Master\TypeEffectiveSettings.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/PokemonGo/POGOProtos/Properties/AssemblyInfo.cs b/PokemonGo/POGOProtos/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1a7bf99
--- /dev/null
+++ b/PokemonGo/POGOProtos/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die einer Assembly zugeordnet sind.
+[assembly: AssemblyTitle("POGOProtos")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("POGOProtos")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
+// für COM-Komponenten.  Wenn Sie auf einen Typ in dieser Assembly von
+// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
+[assembly: ComVisible(false)]
+
+// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+[assembly: Guid("a03a7bb2-4f0b-467b-84b2-9a76e6aae6fb")]
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+//      Hauptversion
+//      Nebenversion
+//      Buildnummer
+//      Revision
+//
+// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
+// übernehmen, indem Sie "*" eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/PokemonGo/POGOProtos/Settings/DownloadSettingsAction.cs b/PokemonGo/POGOProtos/Settings/DownloadSettingsAction.cs
new file mode 100644
index 0000000..e19af5a
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/DownloadSettingsAction.cs
@@ -0,0 +1,159 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/DownloadSettingsAction.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/DownloadSettingsAction.proto</summary>
+  public static partial class DownloadSettingsActionReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/DownloadSettingsAction.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static DownloadSettingsActionReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjBQT0dPUHJvdG9zL1NldHRpbmdzL0Rvd25sb2FkU2V0dGluZ3NBY3Rpb24u",
+            "cHJvdG8SE1BPR09Qcm90b3MuU2V0dGluZ3MiJgoWRG93bmxvYWRTZXR0aW5n",
+            "c0FjdGlvbhIMCgRoYXNoGAEgASgJYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.DownloadSettingsAction), global::POGOProtos.Settings.DownloadSettingsAction.Parser, new[]{ "Hash" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class DownloadSettingsAction : pb::IMessage<DownloadSettingsAction> {
+    private static readonly pb::MessageParser<DownloadSettingsAction> _parser = new pb::MessageParser<DownloadSettingsAction>(() => new DownloadSettingsAction());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadSettingsAction> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.DownloadSettingsActionReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsAction() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsAction(DownloadSettingsAction other) : this() {
+      hash_ = other.hash_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsAction Clone() {
+      return new DownloadSettingsAction(this);
+    }
+
+    /// <summary>Field number for the "hash" field.</summary>
+    public const int HashFieldNumber = 1;
+    private string hash_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Hash {
+      get { return hash_; }
+      set {
+        hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadSettingsAction);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadSettingsAction other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Hash != other.Hash) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Hash.Length != 0) hash ^= Hash.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Hash.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Hash);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Hash.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadSettingsAction other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Hash.Length != 0) {
+        Hash = other.Hash;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Hash = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/FortSettings.cs b/PokemonGo/POGOProtos/Settings/FortSettings.cs
new file mode 100644
index 0000000..fb6a91b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/FortSettings.cs
@@ -0,0 +1,303 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/FortSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/FortSettings.proto</summary>
+  public static partial class FortSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/FortSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiZQT0dPUHJvdG9zL1NldHRpbmdzL0ZvcnRTZXR0aW5ncy5wcm90bxITUE9H",
+            "T1Byb3Rvcy5TZXR0aW5ncyLkAQoMRm9ydFNldHRpbmdzEiAKGGludGVyYWN0",
+            "aW9uX3JhbmdlX21ldGVycxgBIAEoARIiChptYXhfdG90YWxfZGVwbG95ZWRf",
+            "cG9rZW1vbhgCIAEoBRIjChttYXhfcGxheWVyX2RlcGxveWVkX3Bva2Vtb24Y",
+            "AyABKAUSIQoZZGVwbG95X3N0YW1pbmFfbXVsdGlwbGllchgEIAEoARIgChhk",
+            "ZXBsb3lfYXR0YWNrX211bHRpcGxpZXIYBSABKAESJAocZmFyX2ludGVyYWN0",
+            "aW9uX3JhbmdlX21ldGVycxgGIAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.FortSettings), global::POGOProtos.Settings.FortSettings.Parser, new[]{ "InteractionRangeMeters", "MaxTotalDeployedPokemon", "MaxPlayerDeployedPokemon", "DeployStaminaMultiplier", "DeployAttackMultiplier", "FarInteractionRangeMeters" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortSettings : pb::IMessage<FortSettings> {
+    private static readonly pb::MessageParser<FortSettings> _parser = new pb::MessageParser<FortSettings>(() => new FortSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.FortSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSettings(FortSettings other) : this() {
+      interactionRangeMeters_ = other.interactionRangeMeters_;
+      maxTotalDeployedPokemon_ = other.maxTotalDeployedPokemon_;
+      maxPlayerDeployedPokemon_ = other.maxPlayerDeployedPokemon_;
+      deployStaminaMultiplier_ = other.deployStaminaMultiplier_;
+      deployAttackMultiplier_ = other.deployAttackMultiplier_;
+      farInteractionRangeMeters_ = other.farInteractionRangeMeters_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSettings Clone() {
+      return new FortSettings(this);
+    }
+
+    /// <summary>Field number for the "interaction_range_meters" field.</summary>
+    public const int InteractionRangeMetersFieldNumber = 1;
+    private double interactionRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double InteractionRangeMeters {
+      get { return interactionRangeMeters_; }
+      set {
+        interactionRangeMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_total_deployed_pokemon" field.</summary>
+    public const int MaxTotalDeployedPokemonFieldNumber = 2;
+    private int maxTotalDeployedPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxTotalDeployedPokemon {
+      get { return maxTotalDeployedPokemon_; }
+      set {
+        maxTotalDeployedPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_player_deployed_pokemon" field.</summary>
+    public const int MaxPlayerDeployedPokemonFieldNumber = 3;
+    private int maxPlayerDeployedPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxPlayerDeployedPokemon {
+      get { return maxPlayerDeployedPokemon_; }
+      set {
+        maxPlayerDeployedPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deploy_stamina_multiplier" field.</summary>
+    public const int DeployStaminaMultiplierFieldNumber = 4;
+    private double deployStaminaMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double DeployStaminaMultiplier {
+      get { return deployStaminaMultiplier_; }
+      set {
+        deployStaminaMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deploy_attack_multiplier" field.</summary>
+    public const int DeployAttackMultiplierFieldNumber = 5;
+    private double deployAttackMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double DeployAttackMultiplier {
+      get { return deployAttackMultiplier_; }
+      set {
+        deployAttackMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "far_interaction_range_meters" field.</summary>
+    public const int FarInteractionRangeMetersFieldNumber = 6;
+    private double farInteractionRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double FarInteractionRangeMeters {
+      get { return farInteractionRangeMeters_; }
+      set {
+        farInteractionRangeMeters_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (InteractionRangeMeters != other.InteractionRangeMeters) return false;
+      if (MaxTotalDeployedPokemon != other.MaxTotalDeployedPokemon) return false;
+      if (MaxPlayerDeployedPokemon != other.MaxPlayerDeployedPokemon) return false;
+      if (DeployStaminaMultiplier != other.DeployStaminaMultiplier) return false;
+      if (DeployAttackMultiplier != other.DeployAttackMultiplier) return false;
+      if (FarInteractionRangeMeters != other.FarInteractionRangeMeters) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (InteractionRangeMeters != 0D) hash ^= InteractionRangeMeters.GetHashCode();
+      if (MaxTotalDeployedPokemon != 0) hash ^= MaxTotalDeployedPokemon.GetHashCode();
+      if (MaxPlayerDeployedPokemon != 0) hash ^= MaxPlayerDeployedPokemon.GetHashCode();
+      if (DeployStaminaMultiplier != 0D) hash ^= DeployStaminaMultiplier.GetHashCode();
+      if (DeployAttackMultiplier != 0D) hash ^= DeployAttackMultiplier.GetHashCode();
+      if (FarInteractionRangeMeters != 0D) hash ^= FarInteractionRangeMeters.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (InteractionRangeMeters != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(InteractionRangeMeters);
+      }
+      if (MaxTotalDeployedPokemon != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(MaxTotalDeployedPokemon);
+      }
+      if (MaxPlayerDeployedPokemon != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(MaxPlayerDeployedPokemon);
+      }
+      if (DeployStaminaMultiplier != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(DeployStaminaMultiplier);
+      }
+      if (DeployAttackMultiplier != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(DeployAttackMultiplier);
+      }
+      if (FarInteractionRangeMeters != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(FarInteractionRangeMeters);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (InteractionRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      if (MaxTotalDeployedPokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxTotalDeployedPokemon);
+      }
+      if (MaxPlayerDeployedPokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPlayerDeployedPokemon);
+      }
+      if (DeployStaminaMultiplier != 0D) {
+        size += 1 + 8;
+      }
+      if (DeployAttackMultiplier != 0D) {
+        size += 1 + 8;
+      }
+      if (FarInteractionRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.InteractionRangeMeters != 0D) {
+        InteractionRangeMeters = other.InteractionRangeMeters;
+      }
+      if (other.MaxTotalDeployedPokemon != 0) {
+        MaxTotalDeployedPokemon = other.MaxTotalDeployedPokemon;
+      }
+      if (other.MaxPlayerDeployedPokemon != 0) {
+        MaxPlayerDeployedPokemon = other.MaxPlayerDeployedPokemon;
+      }
+      if (other.DeployStaminaMultiplier != 0D) {
+        DeployStaminaMultiplier = other.DeployStaminaMultiplier;
+      }
+      if (other.DeployAttackMultiplier != 0D) {
+        DeployAttackMultiplier = other.DeployAttackMultiplier;
+      }
+      if (other.FarInteractionRangeMeters != 0D) {
+        FarInteractionRangeMeters = other.FarInteractionRangeMeters;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            InteractionRangeMeters = input.ReadDouble();
+            break;
+          }
+          case 16: {
+            MaxTotalDeployedPokemon = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            MaxPlayerDeployedPokemon = input.ReadInt32();
+            break;
+          }
+          case 33: {
+            DeployStaminaMultiplier = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            DeployAttackMultiplier = input.ReadDouble();
+            break;
+          }
+          case 49: {
+            FarInteractionRangeMeters = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/GlobalSettings.cs b/PokemonGo/POGOProtos/Settings/GlobalSettings.cs
new file mode 100644
index 0000000..5fe6283
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/GlobalSettings.cs
@@ -0,0 +1,304 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/GlobalSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/GlobalSettings.proto</summary>
+  public static partial class GlobalSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/GlobalSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GlobalSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zL1NldHRpbmdzL0dsb2JhbFNldHRpbmdzLnByb3RvEhNQ",
+            "T0dPUHJvdG9zLlNldHRpbmdzGiZQT0dPUHJvdG9zL1NldHRpbmdzL0ZvcnRT",
+            "ZXR0aW5ncy5wcm90bxolUE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXBTZXR0aW5n",
+            "cy5wcm90bxonUE9HT1Byb3Rvcy9TZXR0aW5ncy9MZXZlbFNldHRpbmdzLnBy",
+            "b3RvGitQT0dPUHJvdG9zL1NldHRpbmdzL0ludmVudG9yeVNldHRpbmdzLnBy",
+            "b3RvIqICCg5HbG9iYWxTZXR0aW5ncxI4Cg1mb3J0X3NldHRpbmdzGAIgASgL",
+            "MiEuUE9HT1Byb3Rvcy5TZXR0aW5ncy5Gb3J0U2V0dGluZ3MSNgoMbWFwX3Nl",
+            "dHRpbmdzGAMgASgLMiAuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXBTZXR0aW5n",
+            "cxI6Cg5sZXZlbF9zZXR0aW5ncxgEIAEoCzIiLlBPR09Qcm90b3MuU2V0dGlu",
+            "Z3MuTGV2ZWxTZXR0aW5ncxJCChJpbnZlbnRvcnlfc2V0dGluZ3MYBSABKAsy",
+            "Ji5QT0dPUHJvdG9zLlNldHRpbmdzLkludmVudG9yeVNldHRpbmdzEh4KFm1p",
+            "bmltdW1fY2xpZW50X3ZlcnNpb24YBiABKAliBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Settings.FortSettingsReflection.Descriptor, global::POGOProtos.Settings.MapSettingsReflection.Descriptor, global::POGOProtos.Settings.LevelSettingsReflection.Descriptor, global::POGOProtos.Settings.InventorySettingsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.GlobalSettings), global::POGOProtos.Settings.GlobalSettings.Parser, new[]{ "FortSettings", "MapSettings", "LevelSettings", "InventorySettings", "MinimumClientVersion" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GlobalSettings : pb::IMessage<GlobalSettings> {
+    private static readonly pb::MessageParser<GlobalSettings> _parser = new pb::MessageParser<GlobalSettings>(() => new GlobalSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GlobalSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.GlobalSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GlobalSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GlobalSettings(GlobalSettings other) : this() {
+      FortSettings = other.fortSettings_ != null ? other.FortSettings.Clone() : null;
+      MapSettings = other.mapSettings_ != null ? other.MapSettings.Clone() : null;
+      LevelSettings = other.levelSettings_ != null ? other.LevelSettings.Clone() : null;
+      InventorySettings = other.inventorySettings_ != null ? other.InventorySettings.Clone() : null;
+      minimumClientVersion_ = other.minimumClientVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GlobalSettings Clone() {
+      return new GlobalSettings(this);
+    }
+
+    /// <summary>Field number for the "fort_settings" field.</summary>
+    public const int FortSettingsFieldNumber = 2;
+    private global::POGOProtos.Settings.FortSettings fortSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.FortSettings FortSettings {
+      get { return fortSettings_; }
+      set {
+        fortSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "map_settings" field.</summary>
+    public const int MapSettingsFieldNumber = 3;
+    private global::POGOProtos.Settings.MapSettings mapSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.MapSettings MapSettings {
+      get { return mapSettings_; }
+      set {
+        mapSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "level_settings" field.</summary>
+    public const int LevelSettingsFieldNumber = 4;
+    private global::POGOProtos.Settings.LevelSettings levelSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.LevelSettings LevelSettings {
+      get { return levelSettings_; }
+      set {
+        levelSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_settings" field.</summary>
+    public const int InventorySettingsFieldNumber = 5;
+    private global::POGOProtos.Settings.InventorySettings inventorySettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.InventorySettings InventorySettings {
+      get { return inventorySettings_; }
+      set {
+        inventorySettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "minimum_client_version" field.</summary>
+    public const int MinimumClientVersionFieldNumber = 6;
+    private string minimumClientVersion_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string MinimumClientVersion {
+      get { return minimumClientVersion_; }
+      set {
+        minimumClientVersion_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GlobalSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GlobalSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(FortSettings, other.FortSettings)) return false;
+      if (!object.Equals(MapSettings, other.MapSettings)) return false;
+      if (!object.Equals(LevelSettings, other.LevelSettings)) return false;
+      if (!object.Equals(InventorySettings, other.InventorySettings)) return false;
+      if (MinimumClientVersion != other.MinimumClientVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (fortSettings_ != null) hash ^= FortSettings.GetHashCode();
+      if (mapSettings_ != null) hash ^= MapSettings.GetHashCode();
+      if (levelSettings_ != null) hash ^= LevelSettings.GetHashCode();
+      if (inventorySettings_ != null) hash ^= InventorySettings.GetHashCode();
+      if (MinimumClientVersion.Length != 0) hash ^= MinimumClientVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (fortSettings_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(FortSettings);
+      }
+      if (mapSettings_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(MapSettings);
+      }
+      if (levelSettings_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(LevelSettings);
+      }
+      if (inventorySettings_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(InventorySettings);
+      }
+      if (MinimumClientVersion.Length != 0) {
+        output.WriteRawTag(50);
+        output.WriteString(MinimumClientVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (fortSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortSettings);
+      }
+      if (mapSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(MapSettings);
+      }
+      if (levelSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelSettings);
+      }
+      if (inventorySettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventorySettings);
+      }
+      if (MinimumClientVersion.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(MinimumClientVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GlobalSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.fortSettings_ != null) {
+        if (fortSettings_ == null) {
+          fortSettings_ = new global::POGOProtos.Settings.FortSettings();
+        }
+        FortSettings.MergeFrom(other.FortSettings);
+      }
+      if (other.mapSettings_ != null) {
+        if (mapSettings_ == null) {
+          mapSettings_ = new global::POGOProtos.Settings.MapSettings();
+        }
+        MapSettings.MergeFrom(other.MapSettings);
+      }
+      if (other.levelSettings_ != null) {
+        if (levelSettings_ == null) {
+          levelSettings_ = new global::POGOProtos.Settings.LevelSettings();
+        }
+        LevelSettings.MergeFrom(other.LevelSettings);
+      }
+      if (other.inventorySettings_ != null) {
+        if (inventorySettings_ == null) {
+          inventorySettings_ = new global::POGOProtos.Settings.InventorySettings();
+        }
+        InventorySettings.MergeFrom(other.InventorySettings);
+      }
+      if (other.MinimumClientVersion.Length != 0) {
+        MinimumClientVersion = other.MinimumClientVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 18: {
+            if (fortSettings_ == null) {
+              fortSettings_ = new global::POGOProtos.Settings.FortSettings();
+            }
+            input.ReadMessage(fortSettings_);
+            break;
+          }
+          case 26: {
+            if (mapSettings_ == null) {
+              mapSettings_ = new global::POGOProtos.Settings.MapSettings();
+            }
+            input.ReadMessage(mapSettings_);
+            break;
+          }
+          case 34: {
+            if (levelSettings_ == null) {
+              levelSettings_ = new global::POGOProtos.Settings.LevelSettings();
+            }
+            input.ReadMessage(levelSettings_);
+            break;
+          }
+          case 42: {
+            if (inventorySettings_ == null) {
+              inventorySettings_ = new global::POGOProtos.Settings.InventorySettings();
+            }
+            input.ReadMessage(inventorySettings_);
+            break;
+          }
+          case 50: {
+            MinimumClientVersion = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/InventorySettings.cs b/PokemonGo/POGOProtos/Settings/InventorySettings.cs
new file mode 100644
index 0000000..d96ed6d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/InventorySettings.cs
@@ -0,0 +1,273 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/InventorySettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/InventorySettings.proto</summary>
+  public static partial class InventorySettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/InventorySettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventorySettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CitQT0dPUHJvdG9zL1NldHRpbmdzL0ludmVudG9yeVNldHRpbmdzLnByb3Rv",
+            "EhNQT0dPUHJvdG9zLlNldHRpbmdzIoABChFJbnZlbnRvcnlTZXR0aW5ncxIT",
+            "CgttYXhfcG9rZW1vbhgBIAEoBRIVCg1tYXhfYmFnX2l0ZW1zGAIgASgFEhQK",
+            "DGJhc2VfcG9rZW1vbhgDIAEoBRIWCg5iYXNlX2JhZ19pdGVtcxgEIAEoBRIR",
+            "CgliYXNlX2VnZ3MYBSABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.InventorySettings), global::POGOProtos.Settings.InventorySettings.Parser, new[]{ "MaxPokemon", "MaxBagItems", "BasePokemon", "BaseBagItems", "BaseEggs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventorySettings : pb::IMessage<InventorySettings> {
+    private static readonly pb::MessageParser<InventorySettings> _parser = new pb::MessageParser<InventorySettings>(() => new InventorySettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventorySettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.InventorySettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventorySettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventorySettings(InventorySettings other) : this() {
+      maxPokemon_ = other.maxPokemon_;
+      maxBagItems_ = other.maxBagItems_;
+      basePokemon_ = other.basePokemon_;
+      baseBagItems_ = other.baseBagItems_;
+      baseEggs_ = other.baseEggs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventorySettings Clone() {
+      return new InventorySettings(this);
+    }
+
+    /// <summary>Field number for the "max_pokemon" field.</summary>
+    public const int MaxPokemonFieldNumber = 1;
+    private int maxPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxPokemon {
+      get { return maxPokemon_; }
+      set {
+        maxPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_bag_items" field.</summary>
+    public const int MaxBagItemsFieldNumber = 2;
+    private int maxBagItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxBagItems {
+      get { return maxBagItems_; }
+      set {
+        maxBagItems_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_pokemon" field.</summary>
+    public const int BasePokemonFieldNumber = 3;
+    private int basePokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BasePokemon {
+      get { return basePokemon_; }
+      set {
+        basePokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_bag_items" field.</summary>
+    public const int BaseBagItemsFieldNumber = 4;
+    private int baseBagItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseBagItems {
+      get { return baseBagItems_; }
+      set {
+        baseBagItems_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_eggs" field.</summary>
+    public const int BaseEggsFieldNumber = 5;
+    private int baseEggs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseEggs {
+      get { return baseEggs_; }
+      set {
+        baseEggs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventorySettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventorySettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (MaxPokemon != other.MaxPokemon) return false;
+      if (MaxBagItems != other.MaxBagItems) return false;
+      if (BasePokemon != other.BasePokemon) return false;
+      if (BaseBagItems != other.BaseBagItems) return false;
+      if (BaseEggs != other.BaseEggs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (MaxPokemon != 0) hash ^= MaxPokemon.GetHashCode();
+      if (MaxBagItems != 0) hash ^= MaxBagItems.GetHashCode();
+      if (BasePokemon != 0) hash ^= BasePokemon.GetHashCode();
+      if (BaseBagItems != 0) hash ^= BaseBagItems.GetHashCode();
+      if (BaseEggs != 0) hash ^= BaseEggs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (MaxPokemon != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(MaxPokemon);
+      }
+      if (MaxBagItems != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(MaxBagItems);
+      }
+      if (BasePokemon != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(BasePokemon);
+      }
+      if (BaseBagItems != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(BaseBagItems);
+      }
+      if (BaseEggs != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(BaseEggs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (MaxPokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPokemon);
+      }
+      if (MaxBagItems != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxBagItems);
+      }
+      if (BasePokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BasePokemon);
+      }
+      if (BaseBagItems != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseBagItems);
+      }
+      if (BaseEggs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseEggs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventorySettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.MaxPokemon != 0) {
+        MaxPokemon = other.MaxPokemon;
+      }
+      if (other.MaxBagItems != 0) {
+        MaxBagItems = other.MaxBagItems;
+      }
+      if (other.BasePokemon != 0) {
+        BasePokemon = other.BasePokemon;
+      }
+      if (other.BaseBagItems != 0) {
+        BaseBagItems = other.BaseBagItems;
+      }
+      if (other.BaseEggs != 0) {
+        BaseEggs = other.BaseEggs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            MaxPokemon = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            MaxBagItems = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            BasePokemon = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            BaseBagItems = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            BaseEggs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/LevelSettings.cs b/PokemonGo/POGOProtos/Settings/LevelSettings.cs
new file mode 100644
index 0000000..2fe1158
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/LevelSettings.cs
@@ -0,0 +1,188 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/LevelSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/LevelSettings.proto</summary>
+  public static partial class LevelSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/LevelSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static LevelSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CidQT0dPUHJvdG9zL1NldHRpbmdzL0xldmVsU2V0dGluZ3MucHJvdG8SE1BP",
+            "R09Qcm90b3MuU2V0dGluZ3MiUQoNTGV2ZWxTZXR0aW5ncxIbChN0cmFpbmVy",
+            "X2NwX21vZGlmaWVyGAIgASgBEiMKG3RyYWluZXJfZGlmZmljdWx0eV9tb2Rp",
+            "ZmllchgDIAEoAWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.LevelSettings), global::POGOProtos.Settings.LevelSettings.Parser, new[]{ "TrainerCpModifier", "TrainerDifficultyModifier" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class LevelSettings : pb::IMessage<LevelSettings> {
+    private static readonly pb::MessageParser<LevelSettings> _parser = new pb::MessageParser<LevelSettings>(() => new LevelSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<LevelSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.LevelSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelSettings(LevelSettings other) : this() {
+      trainerCpModifier_ = other.trainerCpModifier_;
+      trainerDifficultyModifier_ = other.trainerDifficultyModifier_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelSettings Clone() {
+      return new LevelSettings(this);
+    }
+
+    /// <summary>Field number for the "trainer_cp_modifier" field.</summary>
+    public const int TrainerCpModifierFieldNumber = 2;
+    private double trainerCpModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double TrainerCpModifier {
+      get { return trainerCpModifier_; }
+      set {
+        trainerCpModifier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_difficulty_modifier" field.</summary>
+    public const int TrainerDifficultyModifierFieldNumber = 3;
+    private double trainerDifficultyModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double TrainerDifficultyModifier {
+      get { return trainerDifficultyModifier_; }
+      set {
+        trainerDifficultyModifier_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as LevelSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(LevelSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (TrainerCpModifier != other.TrainerCpModifier) return false;
+      if (TrainerDifficultyModifier != other.TrainerDifficultyModifier) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (TrainerCpModifier != 0D) hash ^= TrainerCpModifier.GetHashCode();
+      if (TrainerDifficultyModifier != 0D) hash ^= TrainerDifficultyModifier.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (TrainerCpModifier != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(TrainerCpModifier);
+      }
+      if (TrainerDifficultyModifier != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(TrainerDifficultyModifier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (TrainerCpModifier != 0D) {
+        size += 1 + 8;
+      }
+      if (TrainerDifficultyModifier != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(LevelSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.TrainerCpModifier != 0D) {
+        TrainerCpModifier = other.TrainerCpModifier;
+      }
+      if (other.TrainerDifficultyModifier != 0D) {
+        TrainerDifficultyModifier = other.TrainerDifficultyModifier;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 17: {
+            TrainerCpModifier = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            TrainerDifficultyModifier = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/MapSettings.cs b/PokemonGo/POGOProtos/Settings/MapSettings.cs
new file mode 100644
index 0000000..ec41b0f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/MapSettings.cs
@@ -0,0 +1,332 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/MapSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/MapSettings.proto</summary>
+  public static partial class MapSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/MapSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MapSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zL1NldHRpbmdzL01hcFNldHRpbmdzLnByb3RvEhNQT0dP",
+            "UHJvdG9zLlNldHRpbmdzIo8CCgtNYXBTZXR0aW5ncxIdChVwb2tlbW9uX3Zp",
+            "c2libGVfcmFuZ2UYASABKAESHQoVcG9rZV9uYXZfcmFuZ2VfbWV0ZXJzGAIg",
+            "ASgBEh4KFmVuY291bnRlcl9yYW5nZV9tZXRlcnMYAyABKAESKwojZ2V0X21h",
+            "cF9vYmplY3RzX21pbl9yZWZyZXNoX3NlY29uZHMYBCABKAISKwojZ2V0X21h",
+            "cF9vYmplY3RzX21heF9yZWZyZXNoX3NlY29uZHMYBSABKAISKwojZ2V0X21h",
+            "cF9vYmplY3RzX21pbl9kaXN0YW5jZV9tZXRlcnMYBiABKAISGwoTZ29vZ2xl",
+            "X21hcHNfYXBpX2tleRgHIAEoCWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.MapSettings), global::POGOProtos.Settings.MapSettings.Parser, new[]{ "PokemonVisibleRange", "PokeNavRangeMeters", "EncounterRangeMeters", "GetMapObjectsMinRefreshSeconds", "GetMapObjectsMaxRefreshSeconds", "GetMapObjectsMinDistanceMeters", "GoogleMapsApiKey" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MapSettings : pb::IMessage<MapSettings> {
+    private static readonly pb::MessageParser<MapSettings> _parser = new pb::MessageParser<MapSettings>(() => new MapSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MapSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.MapSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapSettings(MapSettings other) : this() {
+      pokemonVisibleRange_ = other.pokemonVisibleRange_;
+      pokeNavRangeMeters_ = other.pokeNavRangeMeters_;
+      encounterRangeMeters_ = other.encounterRangeMeters_;
+      getMapObjectsMinRefreshSeconds_ = other.getMapObjectsMinRefreshSeconds_;
+      getMapObjectsMaxRefreshSeconds_ = other.getMapObjectsMaxRefreshSeconds_;
+      getMapObjectsMinDistanceMeters_ = other.getMapObjectsMinDistanceMeters_;
+      googleMapsApiKey_ = other.googleMapsApiKey_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapSettings Clone() {
+      return new MapSettings(this);
+    }
+
+    /// <summary>Field number for the "pokemon_visible_range" field.</summary>
+    public const int PokemonVisibleRangeFieldNumber = 1;
+    private double pokemonVisibleRange_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PokemonVisibleRange {
+      get { return pokemonVisibleRange_; }
+      set {
+        pokemonVisibleRange_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "poke_nav_range_meters" field.</summary>
+    public const int PokeNavRangeMetersFieldNumber = 2;
+    private double pokeNavRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PokeNavRangeMeters {
+      get { return pokeNavRangeMeters_; }
+      set {
+        pokeNavRangeMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_range_meters" field.</summary>
+    public const int EncounterRangeMetersFieldNumber = 3;
+    private double encounterRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double EncounterRangeMeters {
+      get { return encounterRangeMeters_; }
+      set {
+        encounterRangeMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "get_map_objects_min_refresh_seconds" field.</summary>
+    public const int GetMapObjectsMinRefreshSecondsFieldNumber = 4;
+    private float getMapObjectsMinRefreshSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GetMapObjectsMinRefreshSeconds {
+      get { return getMapObjectsMinRefreshSeconds_; }
+      set {
+        getMapObjectsMinRefreshSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "get_map_objects_max_refresh_seconds" field.</summary>
+    public const int GetMapObjectsMaxRefreshSecondsFieldNumber = 5;
+    private float getMapObjectsMaxRefreshSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GetMapObjectsMaxRefreshSeconds {
+      get { return getMapObjectsMaxRefreshSeconds_; }
+      set {
+        getMapObjectsMaxRefreshSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "get_map_objects_min_distance_meters" field.</summary>
+    public const int GetMapObjectsMinDistanceMetersFieldNumber = 6;
+    private float getMapObjectsMinDistanceMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GetMapObjectsMinDistanceMeters {
+      get { return getMapObjectsMinDistanceMeters_; }
+      set {
+        getMapObjectsMinDistanceMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "google_maps_api_key" field.</summary>
+    public const int GoogleMapsApiKeyFieldNumber = 7;
+    private string googleMapsApiKey_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GoogleMapsApiKey {
+      get { return googleMapsApiKey_; }
+      set {
+        googleMapsApiKey_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MapSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MapSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonVisibleRange != other.PokemonVisibleRange) return false;
+      if (PokeNavRangeMeters != other.PokeNavRangeMeters) return false;
+      if (EncounterRangeMeters != other.EncounterRangeMeters) return false;
+      if (GetMapObjectsMinRefreshSeconds != other.GetMapObjectsMinRefreshSeconds) return false;
+      if (GetMapObjectsMaxRefreshSeconds != other.GetMapObjectsMaxRefreshSeconds) return false;
+      if (GetMapObjectsMinDistanceMeters != other.GetMapObjectsMinDistanceMeters) return false;
+      if (GoogleMapsApiKey != other.GoogleMapsApiKey) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonVisibleRange != 0D) hash ^= PokemonVisibleRange.GetHashCode();
+      if (PokeNavRangeMeters != 0D) hash ^= PokeNavRangeMeters.GetHashCode();
+      if (EncounterRangeMeters != 0D) hash ^= EncounterRangeMeters.GetHashCode();
+      if (GetMapObjectsMinRefreshSeconds != 0F) hash ^= GetMapObjectsMinRefreshSeconds.GetHashCode();
+      if (GetMapObjectsMaxRefreshSeconds != 0F) hash ^= GetMapObjectsMaxRefreshSeconds.GetHashCode();
+      if (GetMapObjectsMinDistanceMeters != 0F) hash ^= GetMapObjectsMinDistanceMeters.GetHashCode();
+      if (GoogleMapsApiKey.Length != 0) hash ^= GoogleMapsApiKey.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonVisibleRange != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(PokemonVisibleRange);
+      }
+      if (PokeNavRangeMeters != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PokeNavRangeMeters);
+      }
+      if (EncounterRangeMeters != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(EncounterRangeMeters);
+      }
+      if (GetMapObjectsMinRefreshSeconds != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(GetMapObjectsMinRefreshSeconds);
+      }
+      if (GetMapObjectsMaxRefreshSeconds != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(GetMapObjectsMaxRefreshSeconds);
+      }
+      if (GetMapObjectsMinDistanceMeters != 0F) {
+        output.WriteRawTag(53);
+        output.WriteFloat(GetMapObjectsMinDistanceMeters);
+      }
+      if (GoogleMapsApiKey.Length != 0) {
+        output.WriteRawTag(58);
+        output.WriteString(GoogleMapsApiKey);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonVisibleRange != 0D) {
+        size += 1 + 8;
+      }
+      if (PokeNavRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      if (EncounterRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      if (GetMapObjectsMinRefreshSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (GetMapObjectsMaxRefreshSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (GetMapObjectsMinDistanceMeters != 0F) {
+        size += 1 + 4;
+      }
+      if (GoogleMapsApiKey.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GoogleMapsApiKey);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MapSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonVisibleRange != 0D) {
+        PokemonVisibleRange = other.PokemonVisibleRange;
+      }
+      if (other.PokeNavRangeMeters != 0D) {
+        PokeNavRangeMeters = other.PokeNavRangeMeters;
+      }
+      if (other.EncounterRangeMeters != 0D) {
+        EncounterRangeMeters = other.EncounterRangeMeters;
+      }
+      if (other.GetMapObjectsMinRefreshSeconds != 0F) {
+        GetMapObjectsMinRefreshSeconds = other.GetMapObjectsMinRefreshSeconds;
+      }
+      if (other.GetMapObjectsMaxRefreshSeconds != 0F) {
+        GetMapObjectsMaxRefreshSeconds = other.GetMapObjectsMaxRefreshSeconds;
+      }
+      if (other.GetMapObjectsMinDistanceMeters != 0F) {
+        GetMapObjectsMinDistanceMeters = other.GetMapObjectsMinDistanceMeters;
+      }
+      if (other.GoogleMapsApiKey.Length != 0) {
+        GoogleMapsApiKey = other.GoogleMapsApiKey;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonVisibleRange = input.ReadDouble();
+            break;
+          }
+          case 17: {
+            PokeNavRangeMeters = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            EncounterRangeMeters = input.ReadDouble();
+            break;
+          }
+          case 37: {
+            GetMapObjectsMinRefreshSeconds = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            GetMapObjectsMaxRefreshSeconds = input.ReadFloat();
+            break;
+          }
+          case 53: {
+            GetMapObjectsMinDistanceMeters = input.ReadFloat();
+            break;
+          }
+          case 58: {
+            GoogleMapsApiKey = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/BadgeSettings.cs b/PokemonGo/POGOProtos/Settings/Master/BadgeSettings.cs
new file mode 100644
index 0000000..ad19898
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/BadgeSettings.cs
@@ -0,0 +1,210 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/BadgeSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/BadgeSettings.proto</summary>
+  public static partial class BadgeSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/BadgeSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BadgeSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci5QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9CYWRnZVNldHRpbmdzLnBy",
+            "b3RvEhpQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3RlchogUE9HT1Byb3Rvcy9F",
+            "bnVtcy9CYWRnZVR5cGUucHJvdG8iZQoNQmFkZ2VTZXR0aW5ncxIvCgpiYWRn",
+            "ZV90eXBlGAEgASgOMhsuUE9HT1Byb3Rvcy5FbnVtcy5CYWRnZVR5cGUSEgoK",
+            "YmFkZ2VfcmFuaxgCIAEoBRIPCgd0YXJnZXRzGAMgAygFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.BadgeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.BadgeSettings), global::POGOProtos.Settings.Master.BadgeSettings.Parser, new[]{ "BadgeType", "BadgeRank", "Targets" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BadgeSettings : pb::IMessage<BadgeSettings> {
+    private static readonly pb::MessageParser<BadgeSettings> _parser = new pb::MessageParser<BadgeSettings>(() => new BadgeSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BadgeSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.BadgeSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BadgeSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BadgeSettings(BadgeSettings other) : this() {
+      badgeType_ = other.badgeType_;
+      badgeRank_ = other.badgeRank_;
+      targets_ = other.targets_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BadgeSettings Clone() {
+      return new BadgeSettings(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "badge_rank" field.</summary>
+    public const int BadgeRankFieldNumber = 2;
+    private int badgeRank_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BadgeRank {
+      get { return badgeRank_; }
+      set {
+        badgeRank_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "targets" field.</summary>
+    public const int TargetsFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_targets_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> targets_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Targets {
+      get { return targets_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BadgeSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BadgeSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      if (BadgeRank != other.BadgeRank) return false;
+      if(!targets_.Equals(other.targets_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      if (BadgeRank != 0) hash ^= BadgeRank.GetHashCode();
+      hash ^= targets_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+      if (BadgeRank != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(BadgeRank);
+      }
+      targets_.WriteTo(output, _repeated_targets_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      if (BadgeRank != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BadgeRank);
+      }
+      size += targets_.CalculateSize(_repeated_targets_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BadgeSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+      if (other.BadgeRank != 0) {
+        BadgeRank = other.BadgeRank;
+      }
+      targets_.Add(other.targets_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            BadgeRank = input.ReadInt32();
+            break;
+          }
+          case 26:
+          case 24: {
+            targets_.AddEntriesFrom(input, _repeated_targets_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/CameraSettings.cs b/PokemonGo/POGOProtos/Settings/Master/CameraSettings.cs
new file mode 100644
index 0000000..e8b21f0
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/CameraSettings.cs
@@ -0,0 +1,486 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/CameraSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/CameraSettings.proto</summary>
+  public static partial class CameraSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/CameraSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CameraSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci9QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9DYW1lcmFTZXR0aW5ncy5w",
+            "cm90bxIaUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIaI1BPR09Qcm90b3Mv",
+            "RW51bXMvQ2FtZXJhVGFyZ2V0LnByb3RvGipQT0dPUHJvdG9zL0VudW1zL0Nh",
+            "bWVyYUludGVycG9sYXRpb24ucHJvdG8i1wMKDkNhbWVyYVNldHRpbmdzEhMK",
+            "C25leHRfY2FtZXJhGAEgASgJEjwKDWludGVycG9sYXRpb24YAiADKA4yJS5Q",
+            "T0dPUHJvdG9zLkVudW1zLkNhbWVyYUludGVycG9sYXRpb24SMwoLdGFyZ2V0",
+            "X3R5cGUYAyADKA4yHi5QT0dPUHJvdG9zLkVudW1zLkNhbWVyYVRhcmdldBIV",
+            "Cg1lYXNlX2luX3NwZWVkGAQgAygCEhYKDmVhc3Rfb3V0X3NwZWVkGAUgAygC",
+            "EhgKEGR1cmF0aW9uX3NlY29uZHMYBiADKAISFAoMd2FpdF9zZWNvbmRzGAcg",
+            "AygCEhoKEnRyYW5zaXRpb25fc2Vjb25kcxgIIAMoAhIUCgxhbmdsZV9kZWdy",
+            "ZWUYCSADKAISGwoTYW5nbGVfb2Zmc2V0X2RlZ3JlZRgKIAMoAhIUCgxwaXRj",
+            "aF9kZWdyZWUYCyADKAISGwoTcGl0Y2hfb2Zmc2V0X2RlZ3JlZRgMIAMoAhIT",
+            "Cgtyb2xsX2RlZ3JlZRgNIAMoAhIXCg9kaXN0YW5jZV9tZXRlcnMYDiADKAIS",
+            "FgoOaGVpZ2h0X3BlcmNlbnQYDyADKAISFgoOdmVydF9jdHJfcmF0aW8YECAD",
+            "KAJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.CameraTargetReflection.Descriptor, global::POGOProtos.Enums.CameraInterpolationReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.CameraSettings), global::POGOProtos.Settings.Master.CameraSettings.Parser, new[]{ "NextCamera", "Interpolation", "TargetType", "EaseInSpeed", "EastOutSpeed", "DurationSeconds", "WaitSeconds", "TransitionSeconds", "AngleDegree", "AngleOffsetDegree", "PitchDegree", "PitchOffsetDegree", "RollDegree", "DistanceMeters", "HeightPercent", "VertCtrRatio" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CameraSettings : pb::IMessage<CameraSettings> {
+    private static readonly pb::MessageParser<CameraSettings> _parser = new pb::MessageParser<CameraSettings>(() => new CameraSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CameraSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.CameraSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraSettings(CameraSettings other) : this() {
+      nextCamera_ = other.nextCamera_;
+      interpolation_ = other.interpolation_.Clone();
+      targetType_ = other.targetType_.Clone();
+      easeInSpeed_ = other.easeInSpeed_.Clone();
+      eastOutSpeed_ = other.eastOutSpeed_.Clone();
+      durationSeconds_ = other.durationSeconds_.Clone();
+      waitSeconds_ = other.waitSeconds_.Clone();
+      transitionSeconds_ = other.transitionSeconds_.Clone();
+      angleDegree_ = other.angleDegree_.Clone();
+      angleOffsetDegree_ = other.angleOffsetDegree_.Clone();
+      pitchDegree_ = other.pitchDegree_.Clone();
+      pitchOffsetDegree_ = other.pitchOffsetDegree_.Clone();
+      rollDegree_ = other.rollDegree_.Clone();
+      distanceMeters_ = other.distanceMeters_.Clone();
+      heightPercent_ = other.heightPercent_.Clone();
+      vertCtrRatio_ = other.vertCtrRatio_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraSettings Clone() {
+      return new CameraSettings(this);
+    }
+
+    /// <summary>Field number for the "next_camera" field.</summary>
+    public const int NextCameraFieldNumber = 1;
+    private string nextCamera_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string NextCamera {
+      get { return nextCamera_; }
+      set {
+        nextCamera_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "interpolation" field.</summary>
+    public const int InterpolationFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.CameraInterpolation> _repeated_interpolation_codec
+        = pb::FieldCodec.ForEnum(18, x => (int) x, x => (global::POGOProtos.Enums.CameraInterpolation) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.CameraInterpolation> interpolation_ = new pbc::RepeatedField<global::POGOProtos.Enums.CameraInterpolation>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.CameraInterpolation> Interpolation {
+      get { return interpolation_; }
+    }
+
+    /// <summary>Field number for the "target_type" field.</summary>
+    public const int TargetTypeFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.CameraTarget> _repeated_targetType_codec
+        = pb::FieldCodec.ForEnum(26, x => (int) x, x => (global::POGOProtos.Enums.CameraTarget) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.CameraTarget> targetType_ = new pbc::RepeatedField<global::POGOProtos.Enums.CameraTarget>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.CameraTarget> TargetType {
+      get { return targetType_; }
+    }
+
+    /// <summary>Field number for the "ease_in_speed" field.</summary>
+    public const int EaseInSpeedFieldNumber = 4;
+    private static readonly pb::FieldCodec<float> _repeated_easeInSpeed_codec
+        = pb::FieldCodec.ForFloat(34);
+    private readonly pbc::RepeatedField<float> easeInSpeed_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> EaseInSpeed {
+      get { return easeInSpeed_; }
+    }
+
+    /// <summary>Field number for the "east_out_speed" field.</summary>
+    public const int EastOutSpeedFieldNumber = 5;
+    private static readonly pb::FieldCodec<float> _repeated_eastOutSpeed_codec
+        = pb::FieldCodec.ForFloat(42);
+    private readonly pbc::RepeatedField<float> eastOutSpeed_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> EastOutSpeed {
+      get { return eastOutSpeed_; }
+    }
+
+    /// <summary>Field number for the "duration_seconds" field.</summary>
+    public const int DurationSecondsFieldNumber = 6;
+    private static readonly pb::FieldCodec<float> _repeated_durationSeconds_codec
+        = pb::FieldCodec.ForFloat(50);
+    private readonly pbc::RepeatedField<float> durationSeconds_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> DurationSeconds {
+      get { return durationSeconds_; }
+    }
+
+    /// <summary>Field number for the "wait_seconds" field.</summary>
+    public const int WaitSecondsFieldNumber = 7;
+    private static readonly pb::FieldCodec<float> _repeated_waitSeconds_codec
+        = pb::FieldCodec.ForFloat(58);
+    private readonly pbc::RepeatedField<float> waitSeconds_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> WaitSeconds {
+      get { return waitSeconds_; }
+    }
+
+    /// <summary>Field number for the "transition_seconds" field.</summary>
+    public const int TransitionSecondsFieldNumber = 8;
+    private static readonly pb::FieldCodec<float> _repeated_transitionSeconds_codec
+        = pb::FieldCodec.ForFloat(66);
+    private readonly pbc::RepeatedField<float> transitionSeconds_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> TransitionSeconds {
+      get { return transitionSeconds_; }
+    }
+
+    /// <summary>Field number for the "angle_degree" field.</summary>
+    public const int AngleDegreeFieldNumber = 9;
+    private static readonly pb::FieldCodec<float> _repeated_angleDegree_codec
+        = pb::FieldCodec.ForFloat(74);
+    private readonly pbc::RepeatedField<float> angleDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AngleDegree {
+      get { return angleDegree_; }
+    }
+
+    /// <summary>Field number for the "angle_offset_degree" field.</summary>
+    public const int AngleOffsetDegreeFieldNumber = 10;
+    private static readonly pb::FieldCodec<float> _repeated_angleOffsetDegree_codec
+        = pb::FieldCodec.ForFloat(82);
+    private readonly pbc::RepeatedField<float> angleOffsetDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AngleOffsetDegree {
+      get { return angleOffsetDegree_; }
+    }
+
+    /// <summary>Field number for the "pitch_degree" field.</summary>
+    public const int PitchDegreeFieldNumber = 11;
+    private static readonly pb::FieldCodec<float> _repeated_pitchDegree_codec
+        = pb::FieldCodec.ForFloat(90);
+    private readonly pbc::RepeatedField<float> pitchDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> PitchDegree {
+      get { return pitchDegree_; }
+    }
+
+    /// <summary>Field number for the "pitch_offset_degree" field.</summary>
+    public const int PitchOffsetDegreeFieldNumber = 12;
+    private static readonly pb::FieldCodec<float> _repeated_pitchOffsetDegree_codec
+        = pb::FieldCodec.ForFloat(98);
+    private readonly pbc::RepeatedField<float> pitchOffsetDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> PitchOffsetDegree {
+      get { return pitchOffsetDegree_; }
+    }
+
+    /// <summary>Field number for the "roll_degree" field.</summary>
+    public const int RollDegreeFieldNumber = 13;
+    private static readonly pb::FieldCodec<float> _repeated_rollDegree_codec
+        = pb::FieldCodec.ForFloat(106);
+    private readonly pbc::RepeatedField<float> rollDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> RollDegree {
+      get { return rollDegree_; }
+    }
+
+    /// <summary>Field number for the "distance_meters" field.</summary>
+    public const int DistanceMetersFieldNumber = 14;
+    private static readonly pb::FieldCodec<float> _repeated_distanceMeters_codec
+        = pb::FieldCodec.ForFloat(114);
+    private readonly pbc::RepeatedField<float> distanceMeters_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> DistanceMeters {
+      get { return distanceMeters_; }
+    }
+
+    /// <summary>Field number for the "height_percent" field.</summary>
+    public const int HeightPercentFieldNumber = 15;
+    private static readonly pb::FieldCodec<float> _repeated_heightPercent_codec
+        = pb::FieldCodec.ForFloat(122);
+    private readonly pbc::RepeatedField<float> heightPercent_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> HeightPercent {
+      get { return heightPercent_; }
+    }
+
+    /// <summary>Field number for the "vert_ctr_ratio" field.</summary>
+    public const int VertCtrRatioFieldNumber = 16;
+    private static readonly pb::FieldCodec<float> _repeated_vertCtrRatio_codec
+        = pb::FieldCodec.ForFloat(130);
+    private readonly pbc::RepeatedField<float> vertCtrRatio_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> VertCtrRatio {
+      get { return vertCtrRatio_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CameraSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CameraSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (NextCamera != other.NextCamera) return false;
+      if(!interpolation_.Equals(other.interpolation_)) return false;
+      if(!targetType_.Equals(other.targetType_)) return false;
+      if(!easeInSpeed_.Equals(other.easeInSpeed_)) return false;
+      if(!eastOutSpeed_.Equals(other.eastOutSpeed_)) return false;
+      if(!durationSeconds_.Equals(other.durationSeconds_)) return false;
+      if(!waitSeconds_.Equals(other.waitSeconds_)) return false;
+      if(!transitionSeconds_.Equals(other.transitionSeconds_)) return false;
+      if(!angleDegree_.Equals(other.angleDegree_)) return false;
+      if(!angleOffsetDegree_.Equals(other.angleOffsetDegree_)) return false;
+      if(!pitchDegree_.Equals(other.pitchDegree_)) return false;
+      if(!pitchOffsetDegree_.Equals(other.pitchOffsetDegree_)) return false;
+      if(!rollDegree_.Equals(other.rollDegree_)) return false;
+      if(!distanceMeters_.Equals(other.distanceMeters_)) return false;
+      if(!heightPercent_.Equals(other.heightPercent_)) return false;
+      if(!vertCtrRatio_.Equals(other.vertCtrRatio_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (NextCamera.Length != 0) hash ^= NextCamera.GetHashCode();
+      hash ^= interpolation_.GetHashCode();
+      hash ^= targetType_.GetHashCode();
+      hash ^= easeInSpeed_.GetHashCode();
+      hash ^= eastOutSpeed_.GetHashCode();
+      hash ^= durationSeconds_.GetHashCode();
+      hash ^= waitSeconds_.GetHashCode();
+      hash ^= transitionSeconds_.GetHashCode();
+      hash ^= angleDegree_.GetHashCode();
+      hash ^= angleOffsetDegree_.GetHashCode();
+      hash ^= pitchDegree_.GetHashCode();
+      hash ^= pitchOffsetDegree_.GetHashCode();
+      hash ^= rollDegree_.GetHashCode();
+      hash ^= distanceMeters_.GetHashCode();
+      hash ^= heightPercent_.GetHashCode();
+      hash ^= vertCtrRatio_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (NextCamera.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(NextCamera);
+      }
+      interpolation_.WriteTo(output, _repeated_interpolation_codec);
+      targetType_.WriteTo(output, _repeated_targetType_codec);
+      easeInSpeed_.WriteTo(output, _repeated_easeInSpeed_codec);
+      eastOutSpeed_.WriteTo(output, _repeated_eastOutSpeed_codec);
+      durationSeconds_.WriteTo(output, _repeated_durationSeconds_codec);
+      waitSeconds_.WriteTo(output, _repeated_waitSeconds_codec);
+      transitionSeconds_.WriteTo(output, _repeated_transitionSeconds_codec);
+      angleDegree_.WriteTo(output, _repeated_angleDegree_codec);
+      angleOffsetDegree_.WriteTo(output, _repeated_angleOffsetDegree_codec);
+      pitchDegree_.WriteTo(output, _repeated_pitchDegree_codec);
+      pitchOffsetDegree_.WriteTo(output, _repeated_pitchOffsetDegree_codec);
+      rollDegree_.WriteTo(output, _repeated_rollDegree_codec);
+      distanceMeters_.WriteTo(output, _repeated_distanceMeters_codec);
+      heightPercent_.WriteTo(output, _repeated_heightPercent_codec);
+      vertCtrRatio_.WriteTo(output, _repeated_vertCtrRatio_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (NextCamera.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(NextCamera);
+      }
+      size += interpolation_.CalculateSize(_repeated_interpolation_codec);
+      size += targetType_.CalculateSize(_repeated_targetType_codec);
+      size += easeInSpeed_.CalculateSize(_repeated_easeInSpeed_codec);
+      size += eastOutSpeed_.CalculateSize(_repeated_eastOutSpeed_codec);
+      size += durationSeconds_.CalculateSize(_repeated_durationSeconds_codec);
+      size += waitSeconds_.CalculateSize(_repeated_waitSeconds_codec);
+      size += transitionSeconds_.CalculateSize(_repeated_transitionSeconds_codec);
+      size += angleDegree_.CalculateSize(_repeated_angleDegree_codec);
+      size += angleOffsetDegree_.CalculateSize(_repeated_angleOffsetDegree_codec);
+      size += pitchDegree_.CalculateSize(_repeated_pitchDegree_codec);
+      size += pitchOffsetDegree_.CalculateSize(_repeated_pitchOffsetDegree_codec);
+      size += rollDegree_.CalculateSize(_repeated_rollDegree_codec);
+      size += distanceMeters_.CalculateSize(_repeated_distanceMeters_codec);
+      size += heightPercent_.CalculateSize(_repeated_heightPercent_codec);
+      size += vertCtrRatio_.CalculateSize(_repeated_vertCtrRatio_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CameraSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.NextCamera.Length != 0) {
+        NextCamera = other.NextCamera;
+      }
+      interpolation_.Add(other.interpolation_);
+      targetType_.Add(other.targetType_);
+      easeInSpeed_.Add(other.easeInSpeed_);
+      eastOutSpeed_.Add(other.eastOutSpeed_);
+      durationSeconds_.Add(other.durationSeconds_);
+      waitSeconds_.Add(other.waitSeconds_);
+      transitionSeconds_.Add(other.transitionSeconds_);
+      angleDegree_.Add(other.angleDegree_);
+      angleOffsetDegree_.Add(other.angleOffsetDegree_);
+      pitchDegree_.Add(other.pitchDegree_);
+      pitchOffsetDegree_.Add(other.pitchOffsetDegree_);
+      rollDegree_.Add(other.rollDegree_);
+      distanceMeters_.Add(other.distanceMeters_);
+      heightPercent_.Add(other.heightPercent_);
+      vertCtrRatio_.Add(other.vertCtrRatio_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            NextCamera = input.ReadString();
+            break;
+          }
+          case 18:
+          case 16: {
+            interpolation_.AddEntriesFrom(input, _repeated_interpolation_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            targetType_.AddEntriesFrom(input, _repeated_targetType_codec);
+            break;
+          }
+          case 34:
+          case 37: {
+            easeInSpeed_.AddEntriesFrom(input, _repeated_easeInSpeed_codec);
+            break;
+          }
+          case 42:
+          case 45: {
+            eastOutSpeed_.AddEntriesFrom(input, _repeated_eastOutSpeed_codec);
+            break;
+          }
+          case 50:
+          case 53: {
+            durationSeconds_.AddEntriesFrom(input, _repeated_durationSeconds_codec);
+            break;
+          }
+          case 58:
+          case 61: {
+            waitSeconds_.AddEntriesFrom(input, _repeated_waitSeconds_codec);
+            break;
+          }
+          case 66:
+          case 69: {
+            transitionSeconds_.AddEntriesFrom(input, _repeated_transitionSeconds_codec);
+            break;
+          }
+          case 74:
+          case 77: {
+            angleDegree_.AddEntriesFrom(input, _repeated_angleDegree_codec);
+            break;
+          }
+          case 82:
+          case 85: {
+            angleOffsetDegree_.AddEntriesFrom(input, _repeated_angleOffsetDegree_codec);
+            break;
+          }
+          case 90:
+          case 93: {
+            pitchDegree_.AddEntriesFrom(input, _repeated_pitchDegree_codec);
+            break;
+          }
+          case 98:
+          case 101: {
+            pitchOffsetDegree_.AddEntriesFrom(input, _repeated_pitchOffsetDegree_codec);
+            break;
+          }
+          case 106:
+          case 109: {
+            rollDegree_.AddEntriesFrom(input, _repeated_rollDegree_codec);
+            break;
+          }
+          case 114:
+          case 117: {
+            distanceMeters_.AddEntriesFrom(input, _repeated_distanceMeters_codec);
+            break;
+          }
+          case 122:
+          case 125: {
+            heightPercent_.AddEntriesFrom(input, _repeated_heightPercent_codec);
+            break;
+          }
+          case 130:
+          case 133: {
+            vertCtrRatio_.AddEntriesFrom(input, _repeated_vertCtrRatio_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/EncounterSettings.cs b/PokemonGo/POGOProtos/Settings/Master/EncounterSettings.cs
new file mode 100644
index 0000000..bb43dca
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/EncounterSettings.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/EncounterSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/EncounterSettings.proto</summary>
+  public static partial class EncounterSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/EncounterSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjJQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9FbmNvdW50ZXJTZXR0aW5n",
+            "cy5wcm90bxIaUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIirgEKEUVuY291",
+            "bnRlclNldHRpbmdzEhwKFHNwaW5fYm9udXNfdGhyZXNob2xkGAEgASgCEiEK",
+            "GWV4Y2VsbGVudF90aHJvd190aHJlc2hvbGQYAiABKAISHQoVZ3JlYXRfdGhy",
+            "b3dfdGhyZXNob2xkGAMgASgCEhwKFG5pY2VfdGhyb3dfdGhyZXNob2xkGAQg",
+            "ASgCEhsKE21pbGVzdG9uZV90aHJlc2hvbGQYBSABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.EncounterSettings), global::POGOProtos.Settings.Master.EncounterSettings.Parser, new[]{ "SpinBonusThreshold", "ExcellentThrowThreshold", "GreatThrowThreshold", "NiceThrowThreshold", "MilestoneThreshold" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EncounterSettings : pb::IMessage<EncounterSettings> {
+    private static readonly pb::MessageParser<EncounterSettings> _parser = new pb::MessageParser<EncounterSettings>(() => new EncounterSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.EncounterSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterSettings(EncounterSettings other) : this() {
+      spinBonusThreshold_ = other.spinBonusThreshold_;
+      excellentThrowThreshold_ = other.excellentThrowThreshold_;
+      greatThrowThreshold_ = other.greatThrowThreshold_;
+      niceThrowThreshold_ = other.niceThrowThreshold_;
+      milestoneThreshold_ = other.milestoneThreshold_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterSettings Clone() {
+      return new EncounterSettings(this);
+    }
+
+    /// <summary>Field number for the "spin_bonus_threshold" field.</summary>
+    public const int SpinBonusThresholdFieldNumber = 1;
+    private float spinBonusThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float SpinBonusThreshold {
+      get { return spinBonusThreshold_; }
+      set {
+        spinBonusThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "excellent_throw_threshold" field.</summary>
+    public const int ExcellentThrowThresholdFieldNumber = 2;
+    private float excellentThrowThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ExcellentThrowThreshold {
+      get { return excellentThrowThreshold_; }
+      set {
+        excellentThrowThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "great_throw_threshold" field.</summary>
+    public const int GreatThrowThresholdFieldNumber = 3;
+    private float greatThrowThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GreatThrowThreshold {
+      get { return greatThrowThreshold_; }
+      set {
+        greatThrowThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "nice_throw_threshold" field.</summary>
+    public const int NiceThrowThresholdFieldNumber = 4;
+    private float niceThrowThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float NiceThrowThreshold {
+      get { return niceThrowThreshold_; }
+      set {
+        niceThrowThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "milestone_threshold" field.</summary>
+    public const int MilestoneThresholdFieldNumber = 5;
+    private int milestoneThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MilestoneThreshold {
+      get { return milestoneThreshold_; }
+      set {
+        milestoneThreshold_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (SpinBonusThreshold != other.SpinBonusThreshold) return false;
+      if (ExcellentThrowThreshold != other.ExcellentThrowThreshold) return false;
+      if (GreatThrowThreshold != other.GreatThrowThreshold) return false;
+      if (NiceThrowThreshold != other.NiceThrowThreshold) return false;
+      if (MilestoneThreshold != other.MilestoneThreshold) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (SpinBonusThreshold != 0F) hash ^= SpinBonusThreshold.GetHashCode();
+      if (ExcellentThrowThreshold != 0F) hash ^= ExcellentThrowThreshold.GetHashCode();
+      if (GreatThrowThreshold != 0F) hash ^= GreatThrowThreshold.GetHashCode();
+      if (NiceThrowThreshold != 0F) hash ^= NiceThrowThreshold.GetHashCode();
+      if (MilestoneThreshold != 0) hash ^= MilestoneThreshold.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (SpinBonusThreshold != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(SpinBonusThreshold);
+      }
+      if (ExcellentThrowThreshold != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(ExcellentThrowThreshold);
+      }
+      if (GreatThrowThreshold != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(GreatThrowThreshold);
+      }
+      if (NiceThrowThreshold != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(NiceThrowThreshold);
+      }
+      if (MilestoneThreshold != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(MilestoneThreshold);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (SpinBonusThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (ExcellentThrowThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (GreatThrowThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (NiceThrowThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (MilestoneThreshold != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MilestoneThreshold);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.SpinBonusThreshold != 0F) {
+        SpinBonusThreshold = other.SpinBonusThreshold;
+      }
+      if (other.ExcellentThrowThreshold != 0F) {
+        ExcellentThrowThreshold = other.ExcellentThrowThreshold;
+      }
+      if (other.GreatThrowThreshold != 0F) {
+        GreatThrowThreshold = other.GreatThrowThreshold;
+      }
+      if (other.NiceThrowThreshold != 0F) {
+        NiceThrowThreshold = other.NiceThrowThreshold;
+      }
+      if (other.MilestoneThreshold != 0) {
+        MilestoneThreshold = other.MilestoneThreshold;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            SpinBonusThreshold = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            ExcellentThrowThreshold = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            GreatThrowThreshold = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            NiceThrowThreshold = input.ReadFloat();
+            break;
+          }
+          case 40: {
+            MilestoneThreshold = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/EquippedBadgeSettings.cs b/PokemonGo/POGOProtos/Settings/Master/EquippedBadgeSettings.cs
new file mode 100644
index 0000000..dfe263f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/EquippedBadgeSettings.cs
@@ -0,0 +1,203 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/EquippedBadgeSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/EquippedBadgeSettings.proto</summary>
+  public static partial class EquippedBadgeSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/EquippedBadgeSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EquippedBadgeSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9FcXVpcHBlZEJhZGdlU2V0",
+            "dGluZ3MucHJvdG8SGlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyInkKFUVx",
+            "dWlwcGVkQmFkZ2VTZXR0aW5ncxIfChdlcXVpcF9iYWRnZV9jb29sZG93bl9t",
+            "cxgBIAEoAxIfChdjYXRjaF9wcm9iYWJpbGl0eV9ib251cxgCIAMoAhIeChZm",
+            "bGVlX3Byb2JhYmlsaXR5X2JvbnVzGAMgAygCYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.EquippedBadgeSettings), global::POGOProtos.Settings.Master.EquippedBadgeSettings.Parser, new[]{ "EquipBadgeCooldownMs", "CatchProbabilityBonus", "FleeProbabilityBonus" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EquippedBadgeSettings : pb::IMessage<EquippedBadgeSettings> {
+    private static readonly pb::MessageParser<EquippedBadgeSettings> _parser = new pb::MessageParser<EquippedBadgeSettings>(() => new EquippedBadgeSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquippedBadgeSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.EquippedBadgeSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadgeSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadgeSettings(EquippedBadgeSettings other) : this() {
+      equipBadgeCooldownMs_ = other.equipBadgeCooldownMs_;
+      catchProbabilityBonus_ = other.catchProbabilityBonus_.Clone();
+      fleeProbabilityBonus_ = other.fleeProbabilityBonus_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadgeSettings Clone() {
+      return new EquippedBadgeSettings(this);
+    }
+
+    /// <summary>Field number for the "equip_badge_cooldown_ms" field.</summary>
+    public const int EquipBadgeCooldownMsFieldNumber = 1;
+    private long equipBadgeCooldownMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long EquipBadgeCooldownMs {
+      get { return equipBadgeCooldownMs_; }
+      set {
+        equipBadgeCooldownMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "catch_probability_bonus" field.</summary>
+    public const int CatchProbabilityBonusFieldNumber = 2;
+    private static readonly pb::FieldCodec<float> _repeated_catchProbabilityBonus_codec
+        = pb::FieldCodec.ForFloat(18);
+    private readonly pbc::RepeatedField<float> catchProbabilityBonus_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> CatchProbabilityBonus {
+      get { return catchProbabilityBonus_; }
+    }
+
+    /// <summary>Field number for the "flee_probability_bonus" field.</summary>
+    public const int FleeProbabilityBonusFieldNumber = 3;
+    private static readonly pb::FieldCodec<float> _repeated_fleeProbabilityBonus_codec
+        = pb::FieldCodec.ForFloat(26);
+    private readonly pbc::RepeatedField<float> fleeProbabilityBonus_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> FleeProbabilityBonus {
+      get { return fleeProbabilityBonus_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquippedBadgeSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquippedBadgeSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EquipBadgeCooldownMs != other.EquipBadgeCooldownMs) return false;
+      if(!catchProbabilityBonus_.Equals(other.catchProbabilityBonus_)) return false;
+      if(!fleeProbabilityBonus_.Equals(other.fleeProbabilityBonus_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EquipBadgeCooldownMs != 0L) hash ^= EquipBadgeCooldownMs.GetHashCode();
+      hash ^= catchProbabilityBonus_.GetHashCode();
+      hash ^= fleeProbabilityBonus_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EquipBadgeCooldownMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(EquipBadgeCooldownMs);
+      }
+      catchProbabilityBonus_.WriteTo(output, _repeated_catchProbabilityBonus_codec);
+      fleeProbabilityBonus_.WriteTo(output, _repeated_fleeProbabilityBonus_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EquipBadgeCooldownMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(EquipBadgeCooldownMs);
+      }
+      size += catchProbabilityBonus_.CalculateSize(_repeated_catchProbabilityBonus_codec);
+      size += fleeProbabilityBonus_.CalculateSize(_repeated_fleeProbabilityBonus_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquippedBadgeSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EquipBadgeCooldownMs != 0L) {
+        EquipBadgeCooldownMs = other.EquipBadgeCooldownMs;
+      }
+      catchProbabilityBonus_.Add(other.catchProbabilityBonus_);
+      fleeProbabilityBonus_.Add(other.fleeProbabilityBonus_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            EquipBadgeCooldownMs = input.ReadInt64();
+            break;
+          }
+          case 18:
+          case 21: {
+            catchProbabilityBonus_.AddEntriesFrom(input, _repeated_catchProbabilityBonus_codec);
+            break;
+          }
+          case 26:
+          case 29: {
+            fleeProbabilityBonus_.AddEntriesFrom(input, _repeated_fleeProbabilityBonus_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/GymBattleSettings.cs b/PokemonGo/POGOProtos/Settings/Master/GymBattleSettings.cs
new file mode 100644
index 0000000..363e53f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/GymBattleSettings.cs
@@ -0,0 +1,533 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/GymBattleSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/GymBattleSettings.proto</summary>
+  public static partial class GymBattleSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/GymBattleSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GymBattleSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjJQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9HeW1CYXR0bGVTZXR0aW5n",
+            "cy5wcm90bxIaUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIixgMKEUd5bUJh",
+            "dHRsZVNldHRpbmdzEhYKDmVuZXJneV9wZXJfc2VjGAEgASgCEhkKEWRvZGdl",
+            "X2VuZXJneV9jb3N0GAIgASgCEhgKEHJldGFyZ2V0X3NlY29uZHMYAyABKAIS",
+            "HQoVZW5lbXlfYXR0YWNrX2ludGVydmFsGAQgASgCEh4KFmF0dGFja19zZXJ2",
+            "ZXJfaW50ZXJ2YWwYBSABKAISHgoWcm91bmRfZHVyYXRpb25fc2Vjb25kcxgG",
+            "IAEoAhIjChtib251c190aW1lX3Blcl9hbGx5X3NlY29uZHMYByABKAISJAoc",
+            "bWF4aW11bV9hdHRhY2tlcnNfcGVyX2JhdHRsZRgIIAEoBRIpCiFzYW1lX3R5",
+            "cGVfYXR0YWNrX2JvbnVzX211bHRpcGxpZXIYCSABKAISFgoObWF4aW11bV9l",
+            "bmVyZ3kYCiABKAUSJAocZW5lcmd5X2RlbHRhX3Blcl9oZWFsdGhfbG9zdBgL",
+            "IAEoAhIZChFkb2RnZV9kdXJhdGlvbl9tcxgMIAEoBRIcChRtaW5pbXVtX3Bs",
+            "YXllcl9sZXZlbBgNIAEoBRIYChBzd2FwX2R1cmF0aW9uX21zGA4gASgFYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.GymBattleSettings), global::POGOProtos.Settings.Master.GymBattleSettings.Parser, new[]{ "EnergyPerSec", "DodgeEnergyCost", "RetargetSeconds", "EnemyAttackInterval", "AttackServerInterval", "RoundDurationSeconds", "BonusTimePerAllySeconds", "MaximumAttackersPerBattle", "SameTypeAttackBonusMultiplier", "MaximumEnergy", "EnergyDeltaPerHealthLost", "DodgeDurationMs", "MinimumPlayerLevel", "SwapDurationMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GymBattleSettings : pb::IMessage<GymBattleSettings> {
+    private static readonly pb::MessageParser<GymBattleSettings> _parser = new pb::MessageParser<GymBattleSettings>(() => new GymBattleSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymBattleSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.GymBattleSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymBattleSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymBattleSettings(GymBattleSettings other) : this() {
+      energyPerSec_ = other.energyPerSec_;
+      dodgeEnergyCost_ = other.dodgeEnergyCost_;
+      retargetSeconds_ = other.retargetSeconds_;
+      enemyAttackInterval_ = other.enemyAttackInterval_;
+      attackServerInterval_ = other.attackServerInterval_;
+      roundDurationSeconds_ = other.roundDurationSeconds_;
+      bonusTimePerAllySeconds_ = other.bonusTimePerAllySeconds_;
+      maximumAttackersPerBattle_ = other.maximumAttackersPerBattle_;
+      sameTypeAttackBonusMultiplier_ = other.sameTypeAttackBonusMultiplier_;
+      maximumEnergy_ = other.maximumEnergy_;
+      energyDeltaPerHealthLost_ = other.energyDeltaPerHealthLost_;
+      dodgeDurationMs_ = other.dodgeDurationMs_;
+      minimumPlayerLevel_ = other.minimumPlayerLevel_;
+      swapDurationMs_ = other.swapDurationMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymBattleSettings Clone() {
+      return new GymBattleSettings(this);
+    }
+
+    /// <summary>Field number for the "energy_per_sec" field.</summary>
+    public const int EnergyPerSecFieldNumber = 1;
+    private float energyPerSec_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float EnergyPerSec {
+      get { return energyPerSec_; }
+      set {
+        energyPerSec_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "dodge_energy_cost" field.</summary>
+    public const int DodgeEnergyCostFieldNumber = 2;
+    private float dodgeEnergyCost_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DodgeEnergyCost {
+      get { return dodgeEnergyCost_; }
+      set {
+        dodgeEnergyCost_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "retarget_seconds" field.</summary>
+    public const int RetargetSecondsFieldNumber = 3;
+    private float retargetSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float RetargetSeconds {
+      get { return retargetSeconds_; }
+      set {
+        retargetSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "enemy_attack_interval" field.</summary>
+    public const int EnemyAttackIntervalFieldNumber = 4;
+    private float enemyAttackInterval_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float EnemyAttackInterval {
+      get { return enemyAttackInterval_; }
+      set {
+        enemyAttackInterval_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attack_server_interval" field.</summary>
+    public const int AttackServerIntervalFieldNumber = 5;
+    private float attackServerInterval_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AttackServerInterval {
+      get { return attackServerInterval_; }
+      set {
+        attackServerInterval_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "round_duration_seconds" field.</summary>
+    public const int RoundDurationSecondsFieldNumber = 6;
+    private float roundDurationSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float RoundDurationSeconds {
+      get { return roundDurationSeconds_; }
+      set {
+        roundDurationSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "bonus_time_per_ally_seconds" field.</summary>
+    public const int BonusTimePerAllySecondsFieldNumber = 7;
+    private float bonusTimePerAllySeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float BonusTimePerAllySeconds {
+      get { return bonusTimePerAllySeconds_; }
+      set {
+        bonusTimePerAllySeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "maximum_attackers_per_battle" field.</summary>
+    public const int MaximumAttackersPerBattleFieldNumber = 8;
+    private int maximumAttackersPerBattle_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaximumAttackersPerBattle {
+      get { return maximumAttackersPerBattle_; }
+      set {
+        maximumAttackersPerBattle_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "same_type_attack_bonus_multiplier" field.</summary>
+    public const int SameTypeAttackBonusMultiplierFieldNumber = 9;
+    private float sameTypeAttackBonusMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float SameTypeAttackBonusMultiplier {
+      get { return sameTypeAttackBonusMultiplier_; }
+      set {
+        sameTypeAttackBonusMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "maximum_energy" field.</summary>
+    public const int MaximumEnergyFieldNumber = 10;
+    private int maximumEnergy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaximumEnergy {
+      get { return maximumEnergy_; }
+      set {
+        maximumEnergy_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "energy_delta_per_health_lost" field.</summary>
+    public const int EnergyDeltaPerHealthLostFieldNumber = 11;
+    private float energyDeltaPerHealthLost_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float EnergyDeltaPerHealthLost {
+      get { return energyDeltaPerHealthLost_; }
+      set {
+        energyDeltaPerHealthLost_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "dodge_duration_ms" field.</summary>
+    public const int DodgeDurationMsFieldNumber = 12;
+    private int dodgeDurationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DodgeDurationMs {
+      get { return dodgeDurationMs_; }
+      set {
+        dodgeDurationMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "minimum_player_level" field.</summary>
+    public const int MinimumPlayerLevelFieldNumber = 13;
+    private int minimumPlayerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MinimumPlayerLevel {
+      get { return minimumPlayerLevel_; }
+      set {
+        minimumPlayerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "swap_duration_ms" field.</summary>
+    public const int SwapDurationMsFieldNumber = 14;
+    private int swapDurationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int SwapDurationMs {
+      get { return swapDurationMs_; }
+      set {
+        swapDurationMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymBattleSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymBattleSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EnergyPerSec != other.EnergyPerSec) return false;
+      if (DodgeEnergyCost != other.DodgeEnergyCost) return false;
+      if (RetargetSeconds != other.RetargetSeconds) return false;
+      if (EnemyAttackInterval != other.EnemyAttackInterval) return false;
+      if (AttackServerInterval != other.AttackServerInterval) return false;
+      if (RoundDurationSeconds != other.RoundDurationSeconds) return false;
+      if (BonusTimePerAllySeconds != other.BonusTimePerAllySeconds) return false;
+      if (MaximumAttackersPerBattle != other.MaximumAttackersPerBattle) return false;
+      if (SameTypeAttackBonusMultiplier != other.SameTypeAttackBonusMultiplier) return false;
+      if (MaximumEnergy != other.MaximumEnergy) return false;
+      if (EnergyDeltaPerHealthLost != other.EnergyDeltaPerHealthLost) return false;
+      if (DodgeDurationMs != other.DodgeDurationMs) return false;
+      if (MinimumPlayerLevel != other.MinimumPlayerLevel) return false;
+      if (SwapDurationMs != other.SwapDurationMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EnergyPerSec != 0F) hash ^= EnergyPerSec.GetHashCode();
+      if (DodgeEnergyCost != 0F) hash ^= DodgeEnergyCost.GetHashCode();
+      if (RetargetSeconds != 0F) hash ^= RetargetSeconds.GetHashCode();
+      if (EnemyAttackInterval != 0F) hash ^= EnemyAttackInterval.GetHashCode();
+      if (AttackServerInterval != 0F) hash ^= AttackServerInterval.GetHashCode();
+      if (RoundDurationSeconds != 0F) hash ^= RoundDurationSeconds.GetHashCode();
+      if (BonusTimePerAllySeconds != 0F) hash ^= BonusTimePerAllySeconds.GetHashCode();
+      if (MaximumAttackersPerBattle != 0) hash ^= MaximumAttackersPerBattle.GetHashCode();
+      if (SameTypeAttackBonusMultiplier != 0F) hash ^= SameTypeAttackBonusMultiplier.GetHashCode();
+      if (MaximumEnergy != 0) hash ^= MaximumEnergy.GetHashCode();
+      if (EnergyDeltaPerHealthLost != 0F) hash ^= EnergyDeltaPerHealthLost.GetHashCode();
+      if (DodgeDurationMs != 0) hash ^= DodgeDurationMs.GetHashCode();
+      if (MinimumPlayerLevel != 0) hash ^= MinimumPlayerLevel.GetHashCode();
+      if (SwapDurationMs != 0) hash ^= SwapDurationMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EnergyPerSec != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(EnergyPerSec);
+      }
+      if (DodgeEnergyCost != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(DodgeEnergyCost);
+      }
+      if (RetargetSeconds != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(RetargetSeconds);
+      }
+      if (EnemyAttackInterval != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(EnemyAttackInterval);
+      }
+      if (AttackServerInterval != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(AttackServerInterval);
+      }
+      if (RoundDurationSeconds != 0F) {
+        output.WriteRawTag(53);
+        output.WriteFloat(RoundDurationSeconds);
+      }
+      if (BonusTimePerAllySeconds != 0F) {
+        output.WriteRawTag(61);
+        output.WriteFloat(BonusTimePerAllySeconds);
+      }
+      if (MaximumAttackersPerBattle != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(MaximumAttackersPerBattle);
+      }
+      if (SameTypeAttackBonusMultiplier != 0F) {
+        output.WriteRawTag(77);
+        output.WriteFloat(SameTypeAttackBonusMultiplier);
+      }
+      if (MaximumEnergy != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(MaximumEnergy);
+      }
+      if (EnergyDeltaPerHealthLost != 0F) {
+        output.WriteRawTag(93);
+        output.WriteFloat(EnergyDeltaPerHealthLost);
+      }
+      if (DodgeDurationMs != 0) {
+        output.WriteRawTag(96);
+        output.WriteInt32(DodgeDurationMs);
+      }
+      if (MinimumPlayerLevel != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(MinimumPlayerLevel);
+      }
+      if (SwapDurationMs != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(SwapDurationMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EnergyPerSec != 0F) {
+        size += 1 + 4;
+      }
+      if (DodgeEnergyCost != 0F) {
+        size += 1 + 4;
+      }
+      if (RetargetSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (EnemyAttackInterval != 0F) {
+        size += 1 + 4;
+      }
+      if (AttackServerInterval != 0F) {
+        size += 1 + 4;
+      }
+      if (RoundDurationSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (BonusTimePerAllySeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (MaximumAttackersPerBattle != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaximumAttackersPerBattle);
+      }
+      if (SameTypeAttackBonusMultiplier != 0F) {
+        size += 1 + 4;
+      }
+      if (MaximumEnergy != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaximumEnergy);
+      }
+      if (EnergyDeltaPerHealthLost != 0F) {
+        size += 1 + 4;
+      }
+      if (DodgeDurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DodgeDurationMs);
+      }
+      if (MinimumPlayerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MinimumPlayerLevel);
+      }
+      if (SwapDurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(SwapDurationMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymBattleSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EnergyPerSec != 0F) {
+        EnergyPerSec = other.EnergyPerSec;
+      }
+      if (other.DodgeEnergyCost != 0F) {
+        DodgeEnergyCost = other.DodgeEnergyCost;
+      }
+      if (other.RetargetSeconds != 0F) {
+        RetargetSeconds = other.RetargetSeconds;
+      }
+      if (other.EnemyAttackInterval != 0F) {
+        EnemyAttackInterval = other.EnemyAttackInterval;
+      }
+      if (other.AttackServerInterval != 0F) {
+        AttackServerInterval = other.AttackServerInterval;
+      }
+      if (other.RoundDurationSeconds != 0F) {
+        RoundDurationSeconds = other.RoundDurationSeconds;
+      }
+      if (other.BonusTimePerAllySeconds != 0F) {
+        BonusTimePerAllySeconds = other.BonusTimePerAllySeconds;
+      }
+      if (other.MaximumAttackersPerBattle != 0) {
+        MaximumAttackersPerBattle = other.MaximumAttackersPerBattle;
+      }
+      if (other.SameTypeAttackBonusMultiplier != 0F) {
+        SameTypeAttackBonusMultiplier = other.SameTypeAttackBonusMultiplier;
+      }
+      if (other.MaximumEnergy != 0) {
+        MaximumEnergy = other.MaximumEnergy;
+      }
+      if (other.EnergyDeltaPerHealthLost != 0F) {
+        EnergyDeltaPerHealthLost = other.EnergyDeltaPerHealthLost;
+      }
+      if (other.DodgeDurationMs != 0) {
+        DodgeDurationMs = other.DodgeDurationMs;
+      }
+      if (other.MinimumPlayerLevel != 0) {
+        MinimumPlayerLevel = other.MinimumPlayerLevel;
+      }
+      if (other.SwapDurationMs != 0) {
+        SwapDurationMs = other.SwapDurationMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            EnergyPerSec = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            DodgeEnergyCost = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            RetargetSeconds = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            EnemyAttackInterval = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            AttackServerInterval = input.ReadFloat();
+            break;
+          }
+          case 53: {
+            RoundDurationSeconds = input.ReadFloat();
+            break;
+          }
+          case 61: {
+            BonusTimePerAllySeconds = input.ReadFloat();
+            break;
+          }
+          case 64: {
+            MaximumAttackersPerBattle = input.ReadInt32();
+            break;
+          }
+          case 77: {
+            SameTypeAttackBonusMultiplier = input.ReadFloat();
+            break;
+          }
+          case 80: {
+            MaximumEnergy = input.ReadInt32();
+            break;
+          }
+          case 93: {
+            EnergyDeltaPerHealthLost = input.ReadFloat();
+            break;
+          }
+          case 96: {
+            DodgeDurationMs = input.ReadInt32();
+            break;
+          }
+          case 104: {
+            MinimumPlayerLevel = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            SwapDurationMs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/GymLevelSettings.cs b/PokemonGo/POGOProtos/Settings/Master/GymLevelSettings.cs
new file mode 100644
index 0000000..eedea1d
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/GymLevelSettings.cs
@@ -0,0 +1,217 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/GymLevelSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/GymLevelSettings.proto</summary>
+  public static partial class GymLevelSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/GymLevelSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static GymLevelSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjFQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9HeW1MZXZlbFNldHRpbmdz",
+            "LnByb3RvEhpQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3RlciJ3ChBHeW1MZXZl",
+            "bFNldHRpbmdzEhsKE3JlcXVpcmVkX2V4cGVyaWVuY2UYASADKAUSFAoMbGVh",
+            "ZGVyX3Nsb3RzGAIgAygFEhUKDXRyYWluZXJfc2xvdHMYAyADKAUSGQoRc2Vh",
+            "cmNoX3JvbGxfYm9udXMYBCADKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.GymLevelSettings), global::POGOProtos.Settings.Master.GymLevelSettings.Parser, new[]{ "RequiredExperience", "LeaderSlots", "TrainerSlots", "SearchRollBonus" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class GymLevelSettings : pb::IMessage<GymLevelSettings> {
+    private static readonly pb::MessageParser<GymLevelSettings> _parser = new pb::MessageParser<GymLevelSettings>(() => new GymLevelSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymLevelSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.GymLevelSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymLevelSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymLevelSettings(GymLevelSettings other) : this() {
+      requiredExperience_ = other.requiredExperience_.Clone();
+      leaderSlots_ = other.leaderSlots_.Clone();
+      trainerSlots_ = other.trainerSlots_.Clone();
+      searchRollBonus_ = other.searchRollBonus_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymLevelSettings Clone() {
+      return new GymLevelSettings(this);
+    }
+
+    /// <summary>Field number for the "required_experience" field.</summary>
+    public const int RequiredExperienceFieldNumber = 1;
+    private static readonly pb::FieldCodec<int> _repeated_requiredExperience_codec
+        = pb::FieldCodec.ForInt32(10);
+    private readonly pbc::RepeatedField<int> requiredExperience_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> RequiredExperience {
+      get { return requiredExperience_; }
+    }
+
+    /// <summary>Field number for the "leader_slots" field.</summary>
+    public const int LeaderSlotsFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_leaderSlots_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> leaderSlots_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> LeaderSlots {
+      get { return leaderSlots_; }
+    }
+
+    /// <summary>Field number for the "trainer_slots" field.</summary>
+    public const int TrainerSlotsFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_trainerSlots_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> trainerSlots_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> TrainerSlots {
+      get { return trainerSlots_; }
+    }
+
+    /// <summary>Field number for the "search_roll_bonus" field.</summary>
+    public const int SearchRollBonusFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_searchRollBonus_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> searchRollBonus_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> SearchRollBonus {
+      get { return searchRollBonus_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymLevelSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymLevelSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!requiredExperience_.Equals(other.requiredExperience_)) return false;
+      if(!leaderSlots_.Equals(other.leaderSlots_)) return false;
+      if(!trainerSlots_.Equals(other.trainerSlots_)) return false;
+      if(!searchRollBonus_.Equals(other.searchRollBonus_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= requiredExperience_.GetHashCode();
+      hash ^= leaderSlots_.GetHashCode();
+      hash ^= trainerSlots_.GetHashCode();
+      hash ^= searchRollBonus_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      requiredExperience_.WriteTo(output, _repeated_requiredExperience_codec);
+      leaderSlots_.WriteTo(output, _repeated_leaderSlots_codec);
+      trainerSlots_.WriteTo(output, _repeated_trainerSlots_codec);
+      searchRollBonus_.WriteTo(output, _repeated_searchRollBonus_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += requiredExperience_.CalculateSize(_repeated_requiredExperience_codec);
+      size += leaderSlots_.CalculateSize(_repeated_leaderSlots_codec);
+      size += trainerSlots_.CalculateSize(_repeated_trainerSlots_codec);
+      size += searchRollBonus_.CalculateSize(_repeated_searchRollBonus_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymLevelSettings other) {
+      if (other == null) {
+        return;
+      }
+      requiredExperience_.Add(other.requiredExperience_);
+      leaderSlots_.Add(other.leaderSlots_);
+      trainerSlots_.Add(other.trainerSlots_);
+      searchRollBonus_.Add(other.searchRollBonus_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            requiredExperience_.AddEntriesFrom(input, _repeated_requiredExperience_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            leaderSlots_.AddEntriesFrom(input, _repeated_leaderSlots_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            trainerSlots_.AddEntriesFrom(input, _repeated_trainerSlots_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            searchRollBonus_.AddEntriesFrom(input, _repeated_searchRollBonus_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/IapItemDisplay.cs b/PokemonGo/POGOProtos/Settings/Master/IapItemDisplay.cs
new file mode 100644
index 0000000..1e87527
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/IapItemDisplay.cs
@@ -0,0 +1,262 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/IapItemDisplay.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/IapItemDisplay.proto</summary>
+  public static partial class IapItemDisplayReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/IapItemDisplay.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static IapItemDisplayReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci9QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JYXBJdGVtRGlzcGxheS5w",
+            "cm90bxIaUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIaJlBPR09Qcm90b3Mv",
+            "RW51bXMvSWFwSXRlbUNhdGVnb3J5LnByb3RvGiZQT0dPUHJvdG9zL0ludmVu",
+            "dG9yeS9JdGVtL0l0ZW1JZC5wcm90byKvAQoOSWFwSXRlbURpc3BsYXkSCwoD",
+            "c2t1GAEgASgJEjcKCGNhdGVnb3J5GAIgASgOMiUuUE9HT1Byb3Rvcy5FbnVt",
+            "cy5Ib2xvSWFwSXRlbUNhdGVnb3J5EhIKCnNvcnRfb3JkZXIYAyABKAUSMwoI",
+            "aXRlbV9pZHMYBCADKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0",
+            "ZW1JZBIOCgZjb3VudHMYBSADKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.IapItemCategoryReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.IapItemDisplay), global::POGOProtos.Settings.Master.IapItemDisplay.Parser, new[]{ "Sku", "Category", "SortOrder", "ItemIds", "Counts" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class IapItemDisplay : pb::IMessage<IapItemDisplay> {
+    private static readonly pb::MessageParser<IapItemDisplay> _parser = new pb::MessageParser<IapItemDisplay>(() => new IapItemDisplay());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IapItemDisplay> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.IapItemDisplayReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapItemDisplay() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapItemDisplay(IapItemDisplay other) : this() {
+      sku_ = other.sku_;
+      category_ = other.category_;
+      sortOrder_ = other.sortOrder_;
+      itemIds_ = other.itemIds_.Clone();
+      counts_ = other.counts_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapItemDisplay Clone() {
+      return new IapItemDisplay(this);
+    }
+
+    /// <summary>Field number for the "sku" field.</summary>
+    public const int SkuFieldNumber = 1;
+    private string sku_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Sku {
+      get { return sku_; }
+      set {
+        sku_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "category" field.</summary>
+    public const int CategoryFieldNumber = 2;
+    private global::POGOProtos.Enums.HoloIapItemCategory category_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.HoloIapItemCategory Category {
+      get { return category_; }
+      set {
+        category_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sort_order" field.</summary>
+    public const int SortOrderFieldNumber = 3;
+    private int sortOrder_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int SortOrder {
+      get { return sortOrder_; }
+      set {
+        sortOrder_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_ids" field.</summary>
+    public const int ItemIdsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemId> _repeated_itemIds_codec
+        = pb::FieldCodec.ForEnum(34, x => (int) x, x => (global::POGOProtos.Inventory.Item.ItemId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> itemIds_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> ItemIds {
+      get { return itemIds_; }
+    }
+
+    /// <summary>Field number for the "counts" field.</summary>
+    public const int CountsFieldNumber = 5;
+    private static readonly pb::FieldCodec<int> _repeated_counts_codec
+        = pb::FieldCodec.ForInt32(42);
+    private readonly pbc::RepeatedField<int> counts_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Counts {
+      get { return counts_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IapItemDisplay);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IapItemDisplay other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Sku != other.Sku) return false;
+      if (Category != other.Category) return false;
+      if (SortOrder != other.SortOrder) return false;
+      if(!itemIds_.Equals(other.itemIds_)) return false;
+      if(!counts_.Equals(other.counts_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Sku.Length != 0) hash ^= Sku.GetHashCode();
+      if (Category != 0) hash ^= Category.GetHashCode();
+      if (SortOrder != 0) hash ^= SortOrder.GetHashCode();
+      hash ^= itemIds_.GetHashCode();
+      hash ^= counts_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Sku.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Sku);
+      }
+      if (Category != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Category);
+      }
+      if (SortOrder != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(SortOrder);
+      }
+      itemIds_.WriteTo(output, _repeated_itemIds_codec);
+      counts_.WriteTo(output, _repeated_counts_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Sku.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Sku);
+      }
+      if (Category != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Category);
+      }
+      if (SortOrder != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(SortOrder);
+      }
+      size += itemIds_.CalculateSize(_repeated_itemIds_codec);
+      size += counts_.CalculateSize(_repeated_counts_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IapItemDisplay other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Sku.Length != 0) {
+        Sku = other.Sku;
+      }
+      if (other.Category != 0) {
+        Category = other.Category;
+      }
+      if (other.SortOrder != 0) {
+        SortOrder = other.SortOrder;
+      }
+      itemIds_.Add(other.itemIds_);
+      counts_.Add(other.counts_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Sku = input.ReadString();
+            break;
+          }
+          case 16: {
+            category_ = (global::POGOProtos.Enums.HoloIapItemCategory) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            SortOrder = input.ReadInt32();
+            break;
+          }
+          case 34:
+          case 32: {
+            itemIds_.AddEntriesFrom(input, _repeated_itemIds_codec);
+            break;
+          }
+          case 42:
+          case 40: {
+            counts_.AddEntriesFrom(input, _repeated_counts_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/IapSettings.cs b/PokemonGo/POGOProtos/Settings/Master/IapSettings.cs
new file mode 100644
index 0000000..2b82e38
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/IapSettings.cs
@@ -0,0 +1,317 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/IapSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/IapSettings.proto</summary>
+  public static partial class IapSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/IapSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static IapSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CixQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JYXBTZXR0aW5ncy5wcm90",
+            "bxIaUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIijAIKC0lhcFNldHRpbmdz",
+            "EhkKEWRhaWx5X2JvbnVzX2NvaW5zGAEgASgFEigKIGRhaWx5X2RlZmVuZGVy",
+            "X2JvbnVzX3Blcl9wb2tlbW9uGAIgAygFEioKImRhaWx5X2RlZmVuZGVyX2Jv",
+            "bnVzX21heF9kZWZlbmRlcnMYAyABKAUSJQodZGFpbHlfZGVmZW5kZXJfYm9u",
+            "dXNfY3VycmVuY3kYBCADKAkSIgoabWluX3RpbWVfYmV0d2Vlbl9jbGFpbXNf",
+            "bXMYBSABKAMSGwoTZGFpbHlfYm9udXNfZW5hYmxlZBgGIAEoCBIkChxkYWls",
+            "eV9kZWZlbmRlcl9ib251c19lbmFibGVkGAcgASgIYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.IapSettings), global::POGOProtos.Settings.Master.IapSettings.Parser, new[]{ "DailyBonusCoins", "DailyDefenderBonusPerPokemon", "DailyDefenderBonusMaxDefenders", "DailyDefenderBonusCurrency", "MinTimeBetweenClaimsMs", "DailyBonusEnabled", "DailyDefenderBonusEnabled" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class IapSettings : pb::IMessage<IapSettings> {
+    private static readonly pb::MessageParser<IapSettings> _parser = new pb::MessageParser<IapSettings>(() => new IapSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IapSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.IapSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapSettings(IapSettings other) : this() {
+      dailyBonusCoins_ = other.dailyBonusCoins_;
+      dailyDefenderBonusPerPokemon_ = other.dailyDefenderBonusPerPokemon_.Clone();
+      dailyDefenderBonusMaxDefenders_ = other.dailyDefenderBonusMaxDefenders_;
+      dailyDefenderBonusCurrency_ = other.dailyDefenderBonusCurrency_.Clone();
+      minTimeBetweenClaimsMs_ = other.minTimeBetweenClaimsMs_;
+      dailyBonusEnabled_ = other.dailyBonusEnabled_;
+      dailyDefenderBonusEnabled_ = other.dailyDefenderBonusEnabled_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapSettings Clone() {
+      return new IapSettings(this);
+    }
+
+    /// <summary>Field number for the "daily_bonus_coins" field.</summary>
+    public const int DailyBonusCoinsFieldNumber = 1;
+    private int dailyBonusCoins_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DailyBonusCoins {
+      get { return dailyBonusCoins_; }
+      set {
+        dailyBonusCoins_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_per_pokemon" field.</summary>
+    public const int DailyDefenderBonusPerPokemonFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_dailyDefenderBonusPerPokemon_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> dailyDefenderBonusPerPokemon_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> DailyDefenderBonusPerPokemon {
+      get { return dailyDefenderBonusPerPokemon_; }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_max_defenders" field.</summary>
+    public const int DailyDefenderBonusMaxDefendersFieldNumber = 3;
+    private int dailyDefenderBonusMaxDefenders_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DailyDefenderBonusMaxDefenders {
+      get { return dailyDefenderBonusMaxDefenders_; }
+      set {
+        dailyDefenderBonusMaxDefenders_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_currency" field.</summary>
+    public const int DailyDefenderBonusCurrencyFieldNumber = 4;
+    private static readonly pb::FieldCodec<string> _repeated_dailyDefenderBonusCurrency_codec
+        = pb::FieldCodec.ForString(34);
+    private readonly pbc::RepeatedField<string> dailyDefenderBonusCurrency_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> DailyDefenderBonusCurrency {
+      get { return dailyDefenderBonusCurrency_; }
+    }
+
+    /// <summary>Field number for the "min_time_between_claims_ms" field.</summary>
+    public const int MinTimeBetweenClaimsMsFieldNumber = 5;
+    private long minTimeBetweenClaimsMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long MinTimeBetweenClaimsMs {
+      get { return minTimeBetweenClaimsMs_; }
+      set {
+        minTimeBetweenClaimsMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_bonus_enabled" field.</summary>
+    public const int DailyBonusEnabledFieldNumber = 6;
+    private bool dailyBonusEnabled_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool DailyBonusEnabled {
+      get { return dailyBonusEnabled_; }
+      set {
+        dailyBonusEnabled_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_enabled" field.</summary>
+    public const int DailyDefenderBonusEnabledFieldNumber = 7;
+    private bool dailyDefenderBonusEnabled_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool DailyDefenderBonusEnabled {
+      get { return dailyDefenderBonusEnabled_; }
+      set {
+        dailyDefenderBonusEnabled_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IapSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IapSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (DailyBonusCoins != other.DailyBonusCoins) return false;
+      if(!dailyDefenderBonusPerPokemon_.Equals(other.dailyDefenderBonusPerPokemon_)) return false;
+      if (DailyDefenderBonusMaxDefenders != other.DailyDefenderBonusMaxDefenders) return false;
+      if(!dailyDefenderBonusCurrency_.Equals(other.dailyDefenderBonusCurrency_)) return false;
+      if (MinTimeBetweenClaimsMs != other.MinTimeBetweenClaimsMs) return false;
+      if (DailyBonusEnabled != other.DailyBonusEnabled) return false;
+      if (DailyDefenderBonusEnabled != other.DailyDefenderBonusEnabled) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (DailyBonusCoins != 0) hash ^= DailyBonusCoins.GetHashCode();
+      hash ^= dailyDefenderBonusPerPokemon_.GetHashCode();
+      if (DailyDefenderBonusMaxDefenders != 0) hash ^= DailyDefenderBonusMaxDefenders.GetHashCode();
+      hash ^= dailyDefenderBonusCurrency_.GetHashCode();
+      if (MinTimeBetweenClaimsMs != 0L) hash ^= MinTimeBetweenClaimsMs.GetHashCode();
+      if (DailyBonusEnabled != false) hash ^= DailyBonusEnabled.GetHashCode();
+      if (DailyDefenderBonusEnabled != false) hash ^= DailyDefenderBonusEnabled.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (DailyBonusCoins != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(DailyBonusCoins);
+      }
+      dailyDefenderBonusPerPokemon_.WriteTo(output, _repeated_dailyDefenderBonusPerPokemon_codec);
+      if (DailyDefenderBonusMaxDefenders != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(DailyDefenderBonusMaxDefenders);
+      }
+      dailyDefenderBonusCurrency_.WriteTo(output, _repeated_dailyDefenderBonusCurrency_codec);
+      if (MinTimeBetweenClaimsMs != 0L) {
+        output.WriteRawTag(40);
+        output.WriteInt64(MinTimeBetweenClaimsMs);
+      }
+      if (DailyBonusEnabled != false) {
+        output.WriteRawTag(48);
+        output.WriteBool(DailyBonusEnabled);
+      }
+      if (DailyDefenderBonusEnabled != false) {
+        output.WriteRawTag(56);
+        output.WriteBool(DailyDefenderBonusEnabled);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (DailyBonusCoins != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DailyBonusCoins);
+      }
+      size += dailyDefenderBonusPerPokemon_.CalculateSize(_repeated_dailyDefenderBonusPerPokemon_codec);
+      if (DailyDefenderBonusMaxDefenders != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DailyDefenderBonusMaxDefenders);
+      }
+      size += dailyDefenderBonusCurrency_.CalculateSize(_repeated_dailyDefenderBonusCurrency_codec);
+      if (MinTimeBetweenClaimsMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(MinTimeBetweenClaimsMs);
+      }
+      if (DailyBonusEnabled != false) {
+        size += 1 + 1;
+      }
+      if (DailyDefenderBonusEnabled != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IapSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.DailyBonusCoins != 0) {
+        DailyBonusCoins = other.DailyBonusCoins;
+      }
+      dailyDefenderBonusPerPokemon_.Add(other.dailyDefenderBonusPerPokemon_);
+      if (other.DailyDefenderBonusMaxDefenders != 0) {
+        DailyDefenderBonusMaxDefenders = other.DailyDefenderBonusMaxDefenders;
+      }
+      dailyDefenderBonusCurrency_.Add(other.dailyDefenderBonusCurrency_);
+      if (other.MinTimeBetweenClaimsMs != 0L) {
+        MinTimeBetweenClaimsMs = other.MinTimeBetweenClaimsMs;
+      }
+      if (other.DailyBonusEnabled != false) {
+        DailyBonusEnabled = other.DailyBonusEnabled;
+      }
+      if (other.DailyDefenderBonusEnabled != false) {
+        DailyDefenderBonusEnabled = other.DailyDefenderBonusEnabled;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            DailyBonusCoins = input.ReadInt32();
+            break;
+          }
+          case 18:
+          case 16: {
+            dailyDefenderBonusPerPokemon_.AddEntriesFrom(input, _repeated_dailyDefenderBonusPerPokemon_codec);
+            break;
+          }
+          case 24: {
+            DailyDefenderBonusMaxDefenders = input.ReadInt32();
+            break;
+          }
+          case 34: {
+            dailyDefenderBonusCurrency_.AddEntriesFrom(input, _repeated_dailyDefenderBonusCurrency_codec);
+            break;
+          }
+          case 40: {
+            MinTimeBetweenClaimsMs = input.ReadInt64();
+            break;
+          }
+          case 48: {
+            DailyBonusEnabled = input.ReadBool();
+            break;
+          }
+          case 56: {
+            DailyDefenderBonusEnabled = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/BattleAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/BattleAttributes.cs
new file mode 100644
index 0000000..3b23b8b
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/BattleAttributes.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/BattleAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/BattleAttributes.proto</summary>
+  public static partial class BattleAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/BattleAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static BattleAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0JhdHRsZUF0dHJp",
+            "YnV0ZXMucHJvdG8SH1BPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0i",
+            "JwoQQmF0dGxlQXR0cmlidXRlcxITCgtzdGFfcGVyY2VudBgBIAEoAmIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.BattleAttributes), global::POGOProtos.Settings.Master.Item.BattleAttributes.Parser, new[]{ "StaPercent" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class BattleAttributes : pb::IMessage<BattleAttributes> {
+    private static readonly pb::MessageParser<BattleAttributes> _parser = new pb::MessageParser<BattleAttributes>(() => new BattleAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.BattleAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAttributes(BattleAttributes other) : this() {
+      staPercent_ = other.staPercent_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAttributes Clone() {
+      return new BattleAttributes(this);
+    }
+
+    /// <summary>Field number for the "sta_percent" field.</summary>
+    public const int StaPercentFieldNumber = 1;
+    private float staPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaPercent {
+      get { return staPercent_; }
+      set {
+        staPercent_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StaPercent != other.StaPercent) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StaPercent != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(StaPercent);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StaPercent != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StaPercent != 0F) {
+        StaPercent = other.StaPercent;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            StaPercent = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/EggIncubatorAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/EggIncubatorAttributes.cs
new file mode 100644
index 0000000..d525cc8
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/EggIncubatorAttributes.cs
@@ -0,0 +1,219 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/EggIncubatorAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/EggIncubatorAttributes.proto</summary>
+  public static partial class EggIncubatorAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/EggIncubatorAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EggIncubatorAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0VnZ0luY3ViYXRv",
+            "ckF0dHJpYnV0ZXMucHJvdG8SH1BPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVy",
+            "Lkl0ZW0aK1BPR09Qcm90b3MvSW52ZW50b3J5L0VnZ0luY3ViYXRvclR5cGUu",
+            "cHJvdG8igwEKFkVnZ0luY3ViYXRvckF0dHJpYnV0ZXMSPgoOaW5jdWJhdG9y",
+            "X3R5cGUYASABKA4yJi5QT0dPUHJvdG9zLkludmVudG9yeS5FZ2dJbmN1YmF0",
+            "b3JUeXBlEgwKBHVzZXMYAiABKAUSGwoTZGlzdGFuY2VfbXVsdGlwbGllchgD",
+            "IAEoAmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.EggIncubatorTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes), global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes.Parser, new[]{ "IncubatorType", "Uses", "DistanceMultiplier" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EggIncubatorAttributes : pb::IMessage<EggIncubatorAttributes> {
+    private static readonly pb::MessageParser<EggIncubatorAttributes> _parser = new pb::MessageParser<EggIncubatorAttributes>(() => new EggIncubatorAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EggIncubatorAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.EggIncubatorAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubatorAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubatorAttributes(EggIncubatorAttributes other) : this() {
+      incubatorType_ = other.incubatorType_;
+      uses_ = other.uses_;
+      distanceMultiplier_ = other.distanceMultiplier_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubatorAttributes Clone() {
+      return new EggIncubatorAttributes(this);
+    }
+
+    /// <summary>Field number for the "incubator_type" field.</summary>
+    public const int IncubatorTypeFieldNumber = 1;
+    private global::POGOProtos.Inventory.EggIncubatorType incubatorType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubatorType IncubatorType {
+      get { return incubatorType_; }
+      set {
+        incubatorType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "uses" field.</summary>
+    public const int UsesFieldNumber = 2;
+    private int uses_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Uses {
+      get { return uses_; }
+      set {
+        uses_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "distance_multiplier" field.</summary>
+    public const int DistanceMultiplierFieldNumber = 3;
+    private float distanceMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DistanceMultiplier {
+      get { return distanceMultiplier_; }
+      set {
+        distanceMultiplier_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EggIncubatorAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EggIncubatorAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IncubatorType != other.IncubatorType) return false;
+      if (Uses != other.Uses) return false;
+      if (DistanceMultiplier != other.DistanceMultiplier) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IncubatorType != 0) hash ^= IncubatorType.GetHashCode();
+      if (Uses != 0) hash ^= Uses.GetHashCode();
+      if (DistanceMultiplier != 0F) hash ^= DistanceMultiplier.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IncubatorType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) IncubatorType);
+      }
+      if (Uses != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Uses);
+      }
+      if (DistanceMultiplier != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(DistanceMultiplier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IncubatorType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) IncubatorType);
+      }
+      if (Uses != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Uses);
+      }
+      if (DistanceMultiplier != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EggIncubatorAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IncubatorType != 0) {
+        IncubatorType = other.IncubatorType;
+      }
+      if (other.Uses != 0) {
+        Uses = other.Uses;
+      }
+      if (other.DistanceMultiplier != 0F) {
+        DistanceMultiplier = other.DistanceMultiplier;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            incubatorType_ = (global::POGOProtos.Inventory.EggIncubatorType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Uses = input.ReadInt32();
+            break;
+          }
+          case 29: {
+            DistanceMultiplier = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.cs
new file mode 100644
index 0000000..b199cd6
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.proto</summary>
+  public static partial class ExperienceBoostAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/ExperienceBoostAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ExperienceBoostAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cj9QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0V4cGVyaWVuY2VC",
+            "b29zdEF0dHJpYnV0ZXMucHJvdG8SH1BPR09Qcm90b3MuU2V0dGluZ3MuTWFz",
+            "dGVyLkl0ZW0iTQoZRXhwZXJpZW5jZUJvb3N0QXR0cmlidXRlcxIVCg14cF9t",
+            "dWx0aXBsaWVyGAEgASgCEhkKEWJvb3N0X2R1cmF0aW9uX21zGAIgASgFYgZw",
+            "cm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes), global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes.Parser, new[]{ "XpMultiplier", "BoostDurationMs" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ExperienceBoostAttributes : pb::IMessage<ExperienceBoostAttributes> {
+    private static readonly pb::MessageParser<ExperienceBoostAttributes> _parser = new pb::MessageParser<ExperienceBoostAttributes>(() => new ExperienceBoostAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ExperienceBoostAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ExperienceBoostAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ExperienceBoostAttributes(ExperienceBoostAttributes other) : this() {
+      xpMultiplier_ = other.xpMultiplier_;
+      boostDurationMs_ = other.boostDurationMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ExperienceBoostAttributes Clone() {
+      return new ExperienceBoostAttributes(this);
+    }
+
+    /// <summary>Field number for the "xp_multiplier" field.</summary>
+    public const int XpMultiplierFieldNumber = 1;
+    private float xpMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float XpMultiplier {
+      get { return xpMultiplier_; }
+      set {
+        xpMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "boost_duration_ms" field.</summary>
+    public const int BoostDurationMsFieldNumber = 2;
+    private int boostDurationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BoostDurationMs {
+      get { return boostDurationMs_; }
+      set {
+        boostDurationMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ExperienceBoostAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ExperienceBoostAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (XpMultiplier != other.XpMultiplier) return false;
+      if (BoostDurationMs != other.BoostDurationMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (XpMultiplier != 0F) hash ^= XpMultiplier.GetHashCode();
+      if (BoostDurationMs != 0) hash ^= BoostDurationMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (XpMultiplier != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(XpMultiplier);
+      }
+      if (BoostDurationMs != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(BoostDurationMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (XpMultiplier != 0F) {
+        size += 1 + 4;
+      }
+      if (BoostDurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BoostDurationMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ExperienceBoostAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.XpMultiplier != 0F) {
+        XpMultiplier = other.XpMultiplier;
+      }
+      if (other.BoostDurationMs != 0) {
+        BoostDurationMs = other.BoostDurationMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            XpMultiplier = input.ReadFloat();
+            break;
+          }
+          case 16: {
+            BoostDurationMs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/FoodAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/FoodAttributes.cs
new file mode 100644
index 0000000..101b328
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/FoodAttributes.cs
@@ -0,0 +1,204 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/FoodAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/FoodAttributes.proto</summary>
+  public static partial class FoodAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/FoodAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FoodAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjRQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0Zvb2RBdHRyaWJ1",
+            "dGVzLnByb3RvEh9QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVtGiFQ",
+            "T0dPUHJvdG9zL0VudW1zL0l0ZW1FZmZlY3QucHJvdG8ieAoORm9vZEF0dHJp",
+            "YnV0ZXMSMQoLaXRlbV9lZmZlY3QYASADKA4yHC5QT0dPUHJvdG9zLkVudW1z",
+            "Lkl0ZW1FZmZlY3QSGwoTaXRlbV9lZmZlY3RfcGVyY2VudBgCIAMoAhIWCg5n",
+            "cm93dGhfcGVyY2VudBgDIAEoAmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.ItemEffectReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.FoodAttributes), global::POGOProtos.Settings.Master.Item.FoodAttributes.Parser, new[]{ "ItemEffect", "ItemEffectPercent", "GrowthPercent" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FoodAttributes : pb::IMessage<FoodAttributes> {
+    private static readonly pb::MessageParser<FoodAttributes> _parser = new pb::MessageParser<FoodAttributes>(() => new FoodAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FoodAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.FoodAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FoodAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FoodAttributes(FoodAttributes other) : this() {
+      itemEffect_ = other.itemEffect_.Clone();
+      itemEffectPercent_ = other.itemEffectPercent_.Clone();
+      growthPercent_ = other.growthPercent_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FoodAttributes Clone() {
+      return new FoodAttributes(this);
+    }
+
+    /// <summary>Field number for the "item_effect" field.</summary>
+    public const int ItemEffectFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.ItemEffect> _repeated_itemEffect_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Enums.ItemEffect) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.ItemEffect> itemEffect_ = new pbc::RepeatedField<global::POGOProtos.Enums.ItemEffect>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.ItemEffect> ItemEffect {
+      get { return itemEffect_; }
+    }
+
+    /// <summary>Field number for the "item_effect_percent" field.</summary>
+    public const int ItemEffectPercentFieldNumber = 2;
+    private static readonly pb::FieldCodec<float> _repeated_itemEffectPercent_codec
+        = pb::FieldCodec.ForFloat(18);
+    private readonly pbc::RepeatedField<float> itemEffectPercent_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> ItemEffectPercent {
+      get { return itemEffectPercent_; }
+    }
+
+    /// <summary>Field number for the "growth_percent" field.</summary>
+    public const int GrowthPercentFieldNumber = 3;
+    private float growthPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GrowthPercent {
+      get { return growthPercent_; }
+      set {
+        growthPercent_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FoodAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FoodAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!itemEffect_.Equals(other.itemEffect_)) return false;
+      if(!itemEffectPercent_.Equals(other.itemEffectPercent_)) return false;
+      if (GrowthPercent != other.GrowthPercent) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= itemEffect_.GetHashCode();
+      hash ^= itemEffectPercent_.GetHashCode();
+      if (GrowthPercent != 0F) hash ^= GrowthPercent.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      itemEffect_.WriteTo(output, _repeated_itemEffect_codec);
+      itemEffectPercent_.WriteTo(output, _repeated_itemEffectPercent_codec);
+      if (GrowthPercent != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(GrowthPercent);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += itemEffect_.CalculateSize(_repeated_itemEffect_codec);
+      size += itemEffectPercent_.CalculateSize(_repeated_itemEffectPercent_codec);
+      if (GrowthPercent != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FoodAttributes other) {
+      if (other == null) {
+        return;
+      }
+      itemEffect_.Add(other.itemEffect_);
+      itemEffectPercent_.Add(other.itemEffectPercent_);
+      if (other.GrowthPercent != 0F) {
+        GrowthPercent = other.GrowthPercent;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            itemEffect_.AddEntriesFrom(input, _repeated_itemEffect_codec);
+            break;
+          }
+          case 18:
+          case 21: {
+            itemEffectPercent_.AddEntriesFrom(input, _repeated_itemEffectPercent_codec);
+            break;
+          }
+          case 29: {
+            GrowthPercent = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/FortModifierAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/FortModifierAttributes.cs
new file mode 100644
index 0000000..b5616d7
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/FortModifierAttributes.cs
@@ -0,0 +1,189 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/FortModifierAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/FortModifierAttributes.proto</summary>
+  public static partial class FortModifierAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/FortModifierAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static FortModifierAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0ZvcnRNb2RpZmll",
+            "ckF0dHJpYnV0ZXMucHJvdG8SH1BPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVy",
+            "Lkl0ZW0iYgoWRm9ydE1vZGlmaWVyQXR0cmlidXRlcxIhChltb2RpZmllcl9s",
+            "aWZldGltZV9zZWNvbmRzGAEgASgFEiUKHXRyb3lfZGlza19udW1fcG9rZW1v",
+            "bl9zcGF3bmVkGAIgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.FortModifierAttributes), global::POGOProtos.Settings.Master.Item.FortModifierAttributes.Parser, new[]{ "ModifierLifetimeSeconds", "TroyDiskNumPokemonSpawned" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortModifierAttributes : pb::IMessage<FortModifierAttributes> {
+    private static readonly pb::MessageParser<FortModifierAttributes> _parser = new pb::MessageParser<FortModifierAttributes>(() => new FortModifierAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortModifierAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.FortModifierAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifierAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifierAttributes(FortModifierAttributes other) : this() {
+      modifierLifetimeSeconds_ = other.modifierLifetimeSeconds_;
+      troyDiskNumPokemonSpawned_ = other.troyDiskNumPokemonSpawned_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifierAttributes Clone() {
+      return new FortModifierAttributes(this);
+    }
+
+    /// <summary>Field number for the "modifier_lifetime_seconds" field.</summary>
+    public const int ModifierLifetimeSecondsFieldNumber = 1;
+    private int modifierLifetimeSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ModifierLifetimeSeconds {
+      get { return modifierLifetimeSeconds_; }
+      set {
+        modifierLifetimeSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "troy_disk_num_pokemon_spawned" field.</summary>
+    public const int TroyDiskNumPokemonSpawnedFieldNumber = 2;
+    private int troyDiskNumPokemonSpawned_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TroyDiskNumPokemonSpawned {
+      get { return troyDiskNumPokemonSpawned_; }
+      set {
+        troyDiskNumPokemonSpawned_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortModifierAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortModifierAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ModifierLifetimeSeconds != other.ModifierLifetimeSeconds) return false;
+      if (TroyDiskNumPokemonSpawned != other.TroyDiskNumPokemonSpawned) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ModifierLifetimeSeconds != 0) hash ^= ModifierLifetimeSeconds.GetHashCode();
+      if (TroyDiskNumPokemonSpawned != 0) hash ^= TroyDiskNumPokemonSpawned.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ModifierLifetimeSeconds != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(ModifierLifetimeSeconds);
+      }
+      if (TroyDiskNumPokemonSpawned != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(TroyDiskNumPokemonSpawned);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ModifierLifetimeSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ModifierLifetimeSeconds);
+      }
+      if (TroyDiskNumPokemonSpawned != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TroyDiskNumPokemonSpawned);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortModifierAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ModifierLifetimeSeconds != 0) {
+        ModifierLifetimeSeconds = other.ModifierLifetimeSeconds;
+      }
+      if (other.TroyDiskNumPokemonSpawned != 0) {
+        TroyDiskNumPokemonSpawned = other.TroyDiskNumPokemonSpawned;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            ModifierLifetimeSeconds = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            TroyDiskNumPokemonSpawned = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/IncenseAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/IncenseAttributes.cs
new file mode 100644
index 0000000..5c360d4
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/IncenseAttributes.cs
@@ -0,0 +1,328 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/IncenseAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/IncenseAttributes.proto</summary>
+  public static partial class IncenseAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/IncenseAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static IncenseAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjdQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0luY2Vuc2VBdHRy",
+            "aWJ1dGVzLnByb3RvEh9QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVt",
+            "GiJQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25UeXBlLnByb3RvItICChFJbmNl",
+            "bnNlQXR0cmlidXRlcxIgChhpbmNlbnNlX2xpZmV0aW1lX3NlY29uZHMYASAB",
+            "KAUSMwoMcG9rZW1vbl90eXBlGAIgAygOMh0uUE9HT1Byb3Rvcy5FbnVtcy5Q",
+            "b2tlbW9uVHlwZRIoCiBwb2tlbW9uX2luY2Vuc2VfdHlwZV9wcm9iYWJpbGl0",
+            "eRgDIAEoAhIwCihzdGFuZGluZ190aW1lX2JldHdlZW5fZW5jb3VudGVyc19z",
+            "ZWNvbmRzGAQgASgFEi0KJW1vdmluZ190aW1lX2JldHdlZW5fZW5jb3VudGVy",
+            "X3NlY29uZHMYBSABKAUSNQotZGlzdGFuY2VfcmVxdWlyZWRfZm9yX3Nob3J0",
+            "ZXJfaW50ZXJ2YWxfbWV0ZXJzGAYgASgFEiQKHHBva2Vtb25fYXR0cmFjdGVk",
+            "X2xlbmd0aF9zZWMYByABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.IncenseAttributes), global::POGOProtos.Settings.Master.Item.IncenseAttributes.Parser, new[]{ "IncenseLifetimeSeconds", "PokemonType", "PokemonIncenseTypeProbability", "StandingTimeBetweenEncountersSeconds", "MovingTimeBetweenEncounterSeconds", "DistanceRequiredForShorterIntervalMeters", "PokemonAttractedLengthSec" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class IncenseAttributes : pb::IMessage<IncenseAttributes> {
+    private static readonly pb::MessageParser<IncenseAttributes> _parser = new pb::MessageParser<IncenseAttributes>(() => new IncenseAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IncenseAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.IncenseAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseAttributes(IncenseAttributes other) : this() {
+      incenseLifetimeSeconds_ = other.incenseLifetimeSeconds_;
+      pokemonType_ = other.pokemonType_.Clone();
+      pokemonIncenseTypeProbability_ = other.pokemonIncenseTypeProbability_;
+      standingTimeBetweenEncountersSeconds_ = other.standingTimeBetweenEncountersSeconds_;
+      movingTimeBetweenEncounterSeconds_ = other.movingTimeBetweenEncounterSeconds_;
+      distanceRequiredForShorterIntervalMeters_ = other.distanceRequiredForShorterIntervalMeters_;
+      pokemonAttractedLengthSec_ = other.pokemonAttractedLengthSec_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseAttributes Clone() {
+      return new IncenseAttributes(this);
+    }
+
+    /// <summary>Field number for the "incense_lifetime_seconds" field.</summary>
+    public const int IncenseLifetimeSecondsFieldNumber = 1;
+    private int incenseLifetimeSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IncenseLifetimeSeconds {
+      get { return incenseLifetimeSeconds_; }
+      set {
+        incenseLifetimeSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_type" field.</summary>
+    public const int PokemonTypeFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonType> _repeated_pokemonType_codec
+        = pb::FieldCodec.ForEnum(18, x => (int) x, x => (global::POGOProtos.Enums.PokemonType) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonType> pokemonType_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonType>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonType> PokemonType {
+      get { return pokemonType_; }
+    }
+
+    /// <summary>Field number for the "pokemon_incense_type_probability" field.</summary>
+    public const int PokemonIncenseTypeProbabilityFieldNumber = 3;
+    private float pokemonIncenseTypeProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float PokemonIncenseTypeProbability {
+      get { return pokemonIncenseTypeProbability_; }
+      set {
+        pokemonIncenseTypeProbability_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "standing_time_between_encounters_seconds" field.</summary>
+    public const int StandingTimeBetweenEncountersSecondsFieldNumber = 4;
+    private int standingTimeBetweenEncountersSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StandingTimeBetweenEncountersSeconds {
+      get { return standingTimeBetweenEncountersSeconds_; }
+      set {
+        standingTimeBetweenEncountersSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "moving_time_between_encounter_seconds" field.</summary>
+    public const int MovingTimeBetweenEncounterSecondsFieldNumber = 5;
+    private int movingTimeBetweenEncounterSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MovingTimeBetweenEncounterSeconds {
+      get { return movingTimeBetweenEncounterSeconds_; }
+      set {
+        movingTimeBetweenEncounterSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "distance_required_for_shorter_interval_meters" field.</summary>
+    public const int DistanceRequiredForShorterIntervalMetersFieldNumber = 6;
+    private int distanceRequiredForShorterIntervalMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DistanceRequiredForShorterIntervalMeters {
+      get { return distanceRequiredForShorterIntervalMeters_; }
+      set {
+        distanceRequiredForShorterIntervalMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_attracted_length_sec" field.</summary>
+    public const int PokemonAttractedLengthSecFieldNumber = 7;
+    private int pokemonAttractedLengthSec_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonAttractedLengthSec {
+      get { return pokemonAttractedLengthSec_; }
+      set {
+        pokemonAttractedLengthSec_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IncenseAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IncenseAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IncenseLifetimeSeconds != other.IncenseLifetimeSeconds) return false;
+      if(!pokemonType_.Equals(other.pokemonType_)) return false;
+      if (PokemonIncenseTypeProbability != other.PokemonIncenseTypeProbability) return false;
+      if (StandingTimeBetweenEncountersSeconds != other.StandingTimeBetweenEncountersSeconds) return false;
+      if (MovingTimeBetweenEncounterSeconds != other.MovingTimeBetweenEncounterSeconds) return false;
+      if (DistanceRequiredForShorterIntervalMeters != other.DistanceRequiredForShorterIntervalMeters) return false;
+      if (PokemonAttractedLengthSec != other.PokemonAttractedLengthSec) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IncenseLifetimeSeconds != 0) hash ^= IncenseLifetimeSeconds.GetHashCode();
+      hash ^= pokemonType_.GetHashCode();
+      if (PokemonIncenseTypeProbability != 0F) hash ^= PokemonIncenseTypeProbability.GetHashCode();
+      if (StandingTimeBetweenEncountersSeconds != 0) hash ^= StandingTimeBetweenEncountersSeconds.GetHashCode();
+      if (MovingTimeBetweenEncounterSeconds != 0) hash ^= MovingTimeBetweenEncounterSeconds.GetHashCode();
+      if (DistanceRequiredForShorterIntervalMeters != 0) hash ^= DistanceRequiredForShorterIntervalMeters.GetHashCode();
+      if (PokemonAttractedLengthSec != 0) hash ^= PokemonAttractedLengthSec.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IncenseLifetimeSeconds != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(IncenseLifetimeSeconds);
+      }
+      pokemonType_.WriteTo(output, _repeated_pokemonType_codec);
+      if (PokemonIncenseTypeProbability != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(PokemonIncenseTypeProbability);
+      }
+      if (StandingTimeBetweenEncountersSeconds != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(StandingTimeBetweenEncountersSeconds);
+      }
+      if (MovingTimeBetweenEncounterSeconds != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(MovingTimeBetweenEncounterSeconds);
+      }
+      if (DistanceRequiredForShorterIntervalMeters != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(DistanceRequiredForShorterIntervalMeters);
+      }
+      if (PokemonAttractedLengthSec != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(PokemonAttractedLengthSec);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IncenseLifetimeSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(IncenseLifetimeSeconds);
+      }
+      size += pokemonType_.CalculateSize(_repeated_pokemonType_codec);
+      if (PokemonIncenseTypeProbability != 0F) {
+        size += 1 + 4;
+      }
+      if (StandingTimeBetweenEncountersSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StandingTimeBetweenEncountersSeconds);
+      }
+      if (MovingTimeBetweenEncounterSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MovingTimeBetweenEncounterSeconds);
+      }
+      if (DistanceRequiredForShorterIntervalMeters != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DistanceRequiredForShorterIntervalMeters);
+      }
+      if (PokemonAttractedLengthSec != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonAttractedLengthSec);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IncenseAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IncenseLifetimeSeconds != 0) {
+        IncenseLifetimeSeconds = other.IncenseLifetimeSeconds;
+      }
+      pokemonType_.Add(other.pokemonType_);
+      if (other.PokemonIncenseTypeProbability != 0F) {
+        PokemonIncenseTypeProbability = other.PokemonIncenseTypeProbability;
+      }
+      if (other.StandingTimeBetweenEncountersSeconds != 0) {
+        StandingTimeBetweenEncountersSeconds = other.StandingTimeBetweenEncountersSeconds;
+      }
+      if (other.MovingTimeBetweenEncounterSeconds != 0) {
+        MovingTimeBetweenEncounterSeconds = other.MovingTimeBetweenEncounterSeconds;
+      }
+      if (other.DistanceRequiredForShorterIntervalMeters != 0) {
+        DistanceRequiredForShorterIntervalMeters = other.DistanceRequiredForShorterIntervalMeters;
+      }
+      if (other.PokemonAttractedLengthSec != 0) {
+        PokemonAttractedLengthSec = other.PokemonAttractedLengthSec;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            IncenseLifetimeSeconds = input.ReadInt32();
+            break;
+          }
+          case 18:
+          case 16: {
+            pokemonType_.AddEntriesFrom(input, _repeated_pokemonType_codec);
+            break;
+          }
+          case 29: {
+            PokemonIncenseTypeProbability = input.ReadFloat();
+            break;
+          }
+          case 32: {
+            StandingTimeBetweenEncountersSeconds = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            MovingTimeBetweenEncounterSeconds = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            DistanceRequiredForShorterIntervalMeters = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            PokemonAttractedLengthSec = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.cs
new file mode 100644
index 0000000..39112d3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.cs
@@ -0,0 +1,191 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.proto</summary>
+  public static partial class InventoryUpgradeAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/InventoryUpgradeAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static InventoryUpgradeAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CkBQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0ludmVudG9yeVVw",
+            "Z3JhZGVBdHRyaWJ1dGVzLnByb3RvEh9QT0dPUHJvdG9zLlNldHRpbmdzLk1h",
+            "c3Rlci5JdGVtGi9QT0dPUHJvdG9zL0ludmVudG9yeS9JbnZlbnRvcnlVcGdy",
+            "YWRlVHlwZS5wcm90byJ6ChpJbnZlbnRvcnlVcGdyYWRlQXR0cmlidXRlcxIa",
+            "ChJhZGRpdGlvbmFsX3N0b3JhZ2UYASABKAUSQAoMdXBncmFkZV90eXBlGAIg",
+            "ASgOMiouUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSW52ZW50b3J5VXBncmFkZVR5",
+            "cGViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Inventory.InventoryUpgradeTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes), global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes.Parser, new[]{ "AdditionalStorage", "UpgradeType" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class InventoryUpgradeAttributes : pb::IMessage<InventoryUpgradeAttributes> {
+    private static readonly pb::MessageParser<InventoryUpgradeAttributes> _parser = new pb::MessageParser<InventoryUpgradeAttributes>(() => new InventoryUpgradeAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryUpgradeAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgradeAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgradeAttributes(InventoryUpgradeAttributes other) : this() {
+      additionalStorage_ = other.additionalStorage_;
+      upgradeType_ = other.upgradeType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgradeAttributes Clone() {
+      return new InventoryUpgradeAttributes(this);
+    }
+
+    /// <summary>Field number for the "additional_storage" field.</summary>
+    public const int AdditionalStorageFieldNumber = 1;
+    private int additionalStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AdditionalStorage {
+      get { return additionalStorage_; }
+      set {
+        additionalStorage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "upgrade_type" field.</summary>
+    public const int UpgradeTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryUpgradeType upgradeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryUpgradeType UpgradeType {
+      get { return upgradeType_; }
+      set {
+        upgradeType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryUpgradeAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryUpgradeAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AdditionalStorage != other.AdditionalStorage) return false;
+      if (UpgradeType != other.UpgradeType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AdditionalStorage != 0) hash ^= AdditionalStorage.GetHashCode();
+      if (UpgradeType != 0) hash ^= UpgradeType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AdditionalStorage != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(AdditionalStorage);
+      }
+      if (UpgradeType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) UpgradeType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AdditionalStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AdditionalStorage);
+      }
+      if (UpgradeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) UpgradeType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryUpgradeAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AdditionalStorage != 0) {
+        AdditionalStorage = other.AdditionalStorage;
+      }
+      if (other.UpgradeType != 0) {
+        UpgradeType = other.UpgradeType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            AdditionalStorage = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            upgradeType_ = (global::POGOProtos.Inventory.InventoryUpgradeType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/POGOProtosSettingsMasterItem.cs b/PokemonGo/POGOProtos/Settings/Master/Item/POGOProtosSettingsMasterItem.cs
new file mode 100644
index 0000000..d270fc2
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/POGOProtosSettingsMasterItem.cs
@@ -0,0 +1,1703 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Settings.Master.Item.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Settings.Master.Item.proto</summary>
+  public static partial class POGOProtosSettingsMasterItemReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Settings.Master.Item.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosSettingsMasterItemReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVtLnByb3RvEh9QT0dP",
+            "UHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVtGhZQT0dPUHJvdG9zLkVudW1z",
+            "LnByb3RvGhpQT0dPUHJvdG9zLkludmVudG9yeS5wcm90byJiChZGb3J0TW9k",
+            "aWZpZXJBdHRyaWJ1dGVzEiEKGW1vZGlmaWVyX2xpZmV0aW1lX3NlY29uZHMY",
+            "ASABKAUSJQoddHJveV9kaXNrX251bV9wb2tlbW9uX3NwYXduZWQYAiABKAUi",
+            "TQoZRXhwZXJpZW5jZUJvb3N0QXR0cmlidXRlcxIVCg14cF9tdWx0aXBsaWVy",
+            "GAEgASgCEhkKEWJvb3N0X2R1cmF0aW9uX21zGAIgASgFIngKDkZvb2RBdHRy",
+            "aWJ1dGVzEjEKC2l0ZW1fZWZmZWN0GAEgAygOMhwuUE9HT1Byb3Rvcy5FbnVt",
+            "cy5JdGVtRWZmZWN0EhsKE2l0ZW1fZWZmZWN0X3BlcmNlbnQYAiADKAISFgoO",
+            "Z3Jvd3RoX3BlcmNlbnQYAyABKAIiOwoQUG90aW9uQXR0cmlidXRlcxITCgtz",
+            "dGFfcGVyY2VudBgBIAEoAhISCgpzdGFfYW1vdW50GAIgASgFIpUBChJQb2tl",
+            "YmFsbEF0dHJpYnV0ZXMSMQoLaXRlbV9lZmZlY3QYASABKA4yHC5QT0dPUHJv",
+            "dG9zLkVudW1zLkl0ZW1FZmZlY3QSFQoNY2FwdHVyZV9tdWx0aRgCIAEoAhIc",
+            "ChRjYXB0dXJlX211bHRpX2VmZmVjdBgDIAEoAhIXCg9pdGVtX2VmZmVjdF9t",
+            "b2QYBCABKAIiegoaSW52ZW50b3J5VXBncmFkZUF0dHJpYnV0ZXMSGgoSYWRk",
+            "aXRpb25hbF9zdG9yYWdlGAEgASgFEkAKDHVwZ3JhZGVfdHlwZRgCIAEoDjIq",
+            "LlBPR09Qcm90b3MuSW52ZW50b3J5LkludmVudG9yeVVwZ3JhZGVUeXBlIicK",
+            "EEJhdHRsZUF0dHJpYnV0ZXMSEwoLc3RhX3BlcmNlbnQYASABKAIigwEKFkVn",
+            "Z0luY3ViYXRvckF0dHJpYnV0ZXMSPgoOaW5jdWJhdG9yX3R5cGUYASABKA4y",
+            "Ji5QT0dPUHJvdG9zLkludmVudG9yeS5FZ2dJbmN1YmF0b3JUeXBlEgwKBHVz",
+            "ZXMYAiABKAUSGwoTZGlzdGFuY2VfbXVsdGlwbGllchgDIAEoAiLSAgoRSW5j",
+            "ZW5zZUF0dHJpYnV0ZXMSIAoYaW5jZW5zZV9saWZldGltZV9zZWNvbmRzGAEg",
+            "ASgFEjMKDHBva2Vtb25fdHlwZRgCIAMoDjIdLlBPR09Qcm90b3MuRW51bXMu",
+            "UG9rZW1vblR5cGUSKAogcG9rZW1vbl9pbmNlbnNlX3R5cGVfcHJvYmFiaWxp",
+            "dHkYAyABKAISMAooc3RhbmRpbmdfdGltZV9iZXR3ZWVuX2VuY291bnRlcnNf",
+            "c2Vjb25kcxgEIAEoBRItCiVtb3ZpbmdfdGltZV9iZXR3ZWVuX2VuY291bnRl",
+            "cl9zZWNvbmRzGAUgASgFEjUKLWRpc3RhbmNlX3JlcXVpcmVkX2Zvcl9zaG9y",
+            "dGVyX2ludGVydmFsX21ldGVycxgGIAEoBRIkChxwb2tlbW9uX2F0dHJhY3Rl",
+            "ZF9sZW5ndGhfc2VjGAcgASgFIicKEFJldml2ZUF0dHJpYnV0ZXMSEwoLc3Rh",
+            "X3BlcmNlbnQYASABKAJQAFABYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Inventory.POGOProtosInventoryReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.FortModifierAttributes), global::POGOProtos.Settings.Master.Item.FortModifierAttributes.Parser, new[]{ "ModifierLifetimeSeconds", "TroyDiskNumPokemonSpawned" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes), global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes.Parser, new[]{ "XpMultiplier", "BoostDurationMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.FoodAttributes), global::POGOProtos.Settings.Master.Item.FoodAttributes.Parser, new[]{ "ItemEffect", "ItemEffectPercent", "GrowthPercent" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.PotionAttributes), global::POGOProtos.Settings.Master.Item.PotionAttributes.Parser, new[]{ "StaPercent", "StaAmount" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.PokeballAttributes), global::POGOProtos.Settings.Master.Item.PokeballAttributes.Parser, new[]{ "ItemEffect", "CaptureMulti", "CaptureMultiEffect", "ItemEffectMod" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes), global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes.Parser, new[]{ "AdditionalStorage", "UpgradeType" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.BattleAttributes), global::POGOProtos.Settings.Master.Item.BattleAttributes.Parser, new[]{ "StaPercent" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes), global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes.Parser, new[]{ "IncubatorType", "Uses", "DistanceMultiplier" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.IncenseAttributes), global::POGOProtos.Settings.Master.Item.IncenseAttributes.Parser, new[]{ "IncenseLifetimeSeconds", "PokemonType", "PokemonIncenseTypeProbability", "StandingTimeBetweenEncountersSeconds", "MovingTimeBetweenEncounterSeconds", "DistanceRequiredForShorterIntervalMeters", "PokemonAttractedLengthSec" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.ReviveAttributes), global::POGOProtos.Settings.Master.Item.ReviveAttributes.Parser, new[]{ "StaPercent" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class FortModifierAttributes : pb::IMessage<FortModifierAttributes> {
+    private static readonly pb::MessageParser<FortModifierAttributes> _parser = new pb::MessageParser<FortModifierAttributes>(() => new FortModifierAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortModifierAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifierAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifierAttributes(FortModifierAttributes other) : this() {
+      modifierLifetimeSeconds_ = other.modifierLifetimeSeconds_;
+      troyDiskNumPokemonSpawned_ = other.troyDiskNumPokemonSpawned_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortModifierAttributes Clone() {
+      return new FortModifierAttributes(this);
+    }
+
+    /// <summary>Field number for the "modifier_lifetime_seconds" field.</summary>
+    public const int ModifierLifetimeSecondsFieldNumber = 1;
+    private int modifierLifetimeSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int ModifierLifetimeSeconds {
+      get { return modifierLifetimeSeconds_; }
+      set {
+        modifierLifetimeSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "troy_disk_num_pokemon_spawned" field.</summary>
+    public const int TroyDiskNumPokemonSpawnedFieldNumber = 2;
+    private int troyDiskNumPokemonSpawned_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TroyDiskNumPokemonSpawned {
+      get { return troyDiskNumPokemonSpawned_; }
+      set {
+        troyDiskNumPokemonSpawned_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortModifierAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortModifierAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ModifierLifetimeSeconds != other.ModifierLifetimeSeconds) return false;
+      if (TroyDiskNumPokemonSpawned != other.TroyDiskNumPokemonSpawned) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ModifierLifetimeSeconds != 0) hash ^= ModifierLifetimeSeconds.GetHashCode();
+      if (TroyDiskNumPokemonSpawned != 0) hash ^= TroyDiskNumPokemonSpawned.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ModifierLifetimeSeconds != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(ModifierLifetimeSeconds);
+      }
+      if (TroyDiskNumPokemonSpawned != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(TroyDiskNumPokemonSpawned);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ModifierLifetimeSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ModifierLifetimeSeconds);
+      }
+      if (TroyDiskNumPokemonSpawned != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TroyDiskNumPokemonSpawned);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortModifierAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ModifierLifetimeSeconds != 0) {
+        ModifierLifetimeSeconds = other.ModifierLifetimeSeconds;
+      }
+      if (other.TroyDiskNumPokemonSpawned != 0) {
+        TroyDiskNumPokemonSpawned = other.TroyDiskNumPokemonSpawned;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            ModifierLifetimeSeconds = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            TroyDiskNumPokemonSpawned = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ExperienceBoostAttributes : pb::IMessage<ExperienceBoostAttributes> {
+    private static readonly pb::MessageParser<ExperienceBoostAttributes> _parser = new pb::MessageParser<ExperienceBoostAttributes>(() => new ExperienceBoostAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ExperienceBoostAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ExperienceBoostAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ExperienceBoostAttributes(ExperienceBoostAttributes other) : this() {
+      xpMultiplier_ = other.xpMultiplier_;
+      boostDurationMs_ = other.boostDurationMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ExperienceBoostAttributes Clone() {
+      return new ExperienceBoostAttributes(this);
+    }
+
+    /// <summary>Field number for the "xp_multiplier" field.</summary>
+    public const int XpMultiplierFieldNumber = 1;
+    private float xpMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float XpMultiplier {
+      get { return xpMultiplier_; }
+      set {
+        xpMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "boost_duration_ms" field.</summary>
+    public const int BoostDurationMsFieldNumber = 2;
+    private int boostDurationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BoostDurationMs {
+      get { return boostDurationMs_; }
+      set {
+        boostDurationMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ExperienceBoostAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ExperienceBoostAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (XpMultiplier != other.XpMultiplier) return false;
+      if (BoostDurationMs != other.BoostDurationMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (XpMultiplier != 0F) hash ^= XpMultiplier.GetHashCode();
+      if (BoostDurationMs != 0) hash ^= BoostDurationMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (XpMultiplier != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(XpMultiplier);
+      }
+      if (BoostDurationMs != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(BoostDurationMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (XpMultiplier != 0F) {
+        size += 1 + 4;
+      }
+      if (BoostDurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BoostDurationMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ExperienceBoostAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.XpMultiplier != 0F) {
+        XpMultiplier = other.XpMultiplier;
+      }
+      if (other.BoostDurationMs != 0) {
+        BoostDurationMs = other.BoostDurationMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            XpMultiplier = input.ReadFloat();
+            break;
+          }
+          case 16: {
+            BoostDurationMs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FoodAttributes : pb::IMessage<FoodAttributes> {
+    private static readonly pb::MessageParser<FoodAttributes> _parser = new pb::MessageParser<FoodAttributes>(() => new FoodAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FoodAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FoodAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FoodAttributes(FoodAttributes other) : this() {
+      itemEffect_ = other.itemEffect_.Clone();
+      itemEffectPercent_ = other.itemEffectPercent_.Clone();
+      growthPercent_ = other.growthPercent_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FoodAttributes Clone() {
+      return new FoodAttributes(this);
+    }
+
+    /// <summary>Field number for the "item_effect" field.</summary>
+    public const int ItemEffectFieldNumber = 1;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.ItemEffect> _repeated_itemEffect_codec
+        = pb::FieldCodec.ForEnum(10, x => (int) x, x => (global::POGOProtos.Enums.ItemEffect) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.ItemEffect> itemEffect_ = new pbc::RepeatedField<global::POGOProtos.Enums.ItemEffect>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.ItemEffect> ItemEffect {
+      get { return itemEffect_; }
+    }
+
+    /// <summary>Field number for the "item_effect_percent" field.</summary>
+    public const int ItemEffectPercentFieldNumber = 2;
+    private static readonly pb::FieldCodec<float> _repeated_itemEffectPercent_codec
+        = pb::FieldCodec.ForFloat(18);
+    private readonly pbc::RepeatedField<float> itemEffectPercent_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> ItemEffectPercent {
+      get { return itemEffectPercent_; }
+    }
+
+    /// <summary>Field number for the "growth_percent" field.</summary>
+    public const int GrowthPercentFieldNumber = 3;
+    private float growthPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GrowthPercent {
+      get { return growthPercent_; }
+      set {
+        growthPercent_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FoodAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FoodAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!itemEffect_.Equals(other.itemEffect_)) return false;
+      if(!itemEffectPercent_.Equals(other.itemEffectPercent_)) return false;
+      if (GrowthPercent != other.GrowthPercent) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= itemEffect_.GetHashCode();
+      hash ^= itemEffectPercent_.GetHashCode();
+      if (GrowthPercent != 0F) hash ^= GrowthPercent.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      itemEffect_.WriteTo(output, _repeated_itemEffect_codec);
+      itemEffectPercent_.WriteTo(output, _repeated_itemEffectPercent_codec);
+      if (GrowthPercent != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(GrowthPercent);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += itemEffect_.CalculateSize(_repeated_itemEffect_codec);
+      size += itemEffectPercent_.CalculateSize(_repeated_itemEffectPercent_codec);
+      if (GrowthPercent != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FoodAttributes other) {
+      if (other == null) {
+        return;
+      }
+      itemEffect_.Add(other.itemEffect_);
+      itemEffectPercent_.Add(other.itemEffectPercent_);
+      if (other.GrowthPercent != 0F) {
+        GrowthPercent = other.GrowthPercent;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            itemEffect_.AddEntriesFrom(input, _repeated_itemEffect_codec);
+            break;
+          }
+          case 18:
+          case 21: {
+            itemEffectPercent_.AddEntriesFrom(input, _repeated_itemEffectPercent_codec);
+            break;
+          }
+          case 29: {
+            GrowthPercent = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PotionAttributes : pb::IMessage<PotionAttributes> {
+    private static readonly pb::MessageParser<PotionAttributes> _parser = new pb::MessageParser<PotionAttributes>(() => new PotionAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PotionAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PotionAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PotionAttributes(PotionAttributes other) : this() {
+      staPercent_ = other.staPercent_;
+      staAmount_ = other.staAmount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PotionAttributes Clone() {
+      return new PotionAttributes(this);
+    }
+
+    /// <summary>Field number for the "sta_percent" field.</summary>
+    public const int StaPercentFieldNumber = 1;
+    private float staPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaPercent {
+      get { return staPercent_; }
+      set {
+        staPercent_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sta_amount" field.</summary>
+    public const int StaAmountFieldNumber = 2;
+    private int staAmount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StaAmount {
+      get { return staAmount_; }
+      set {
+        staAmount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PotionAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PotionAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StaPercent != other.StaPercent) return false;
+      if (StaAmount != other.StaAmount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
+      if (StaAmount != 0) hash ^= StaAmount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StaPercent != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(StaPercent);
+      }
+      if (StaAmount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(StaAmount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StaPercent != 0F) {
+        size += 1 + 4;
+      }
+      if (StaAmount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaAmount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PotionAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StaPercent != 0F) {
+        StaPercent = other.StaPercent;
+      }
+      if (other.StaAmount != 0) {
+        StaAmount = other.StaAmount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            StaPercent = input.ReadFloat();
+            break;
+          }
+          case 16: {
+            StaAmount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PokeballAttributes : pb::IMessage<PokeballAttributes> {
+    private static readonly pb::MessageParser<PokeballAttributes> _parser = new pb::MessageParser<PokeballAttributes>(() => new PokeballAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokeballAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokeballAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokeballAttributes(PokeballAttributes other) : this() {
+      itemEffect_ = other.itemEffect_;
+      captureMulti_ = other.captureMulti_;
+      captureMultiEffect_ = other.captureMultiEffect_;
+      itemEffectMod_ = other.itemEffectMod_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokeballAttributes Clone() {
+      return new PokeballAttributes(this);
+    }
+
+    /// <summary>Field number for the "item_effect" field.</summary>
+    public const int ItemEffectFieldNumber = 1;
+    private global::POGOProtos.Enums.ItemEffect itemEffect_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.ItemEffect ItemEffect {
+      get { return itemEffect_; }
+      set {
+        itemEffect_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_multi" field.</summary>
+    public const int CaptureMultiFieldNumber = 2;
+    private float captureMulti_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CaptureMulti {
+      get { return captureMulti_; }
+      set {
+        captureMulti_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_multi_effect" field.</summary>
+    public const int CaptureMultiEffectFieldNumber = 3;
+    private float captureMultiEffect_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CaptureMultiEffect {
+      get { return captureMultiEffect_; }
+      set {
+        captureMultiEffect_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_effect_mod" field.</summary>
+    public const int ItemEffectModFieldNumber = 4;
+    private float itemEffectMod_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ItemEffectMod {
+      get { return itemEffectMod_; }
+      set {
+        itemEffectMod_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokeballAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokeballAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemEffect != other.ItemEffect) return false;
+      if (CaptureMulti != other.CaptureMulti) return false;
+      if (CaptureMultiEffect != other.CaptureMultiEffect) return false;
+      if (ItemEffectMod != other.ItemEffectMod) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemEffect != 0) hash ^= ItemEffect.GetHashCode();
+      if (CaptureMulti != 0F) hash ^= CaptureMulti.GetHashCode();
+      if (CaptureMultiEffect != 0F) hash ^= CaptureMultiEffect.GetHashCode();
+      if (ItemEffectMod != 0F) hash ^= ItemEffectMod.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemEffect != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemEffect);
+      }
+      if (CaptureMulti != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(CaptureMulti);
+      }
+      if (CaptureMultiEffect != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(CaptureMultiEffect);
+      }
+      if (ItemEffectMod != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(ItemEffectMod);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemEffect != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemEffect);
+      }
+      if (CaptureMulti != 0F) {
+        size += 1 + 4;
+      }
+      if (CaptureMultiEffect != 0F) {
+        size += 1 + 4;
+      }
+      if (ItemEffectMod != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokeballAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemEffect != 0) {
+        ItemEffect = other.ItemEffect;
+      }
+      if (other.CaptureMulti != 0F) {
+        CaptureMulti = other.CaptureMulti;
+      }
+      if (other.CaptureMultiEffect != 0F) {
+        CaptureMultiEffect = other.CaptureMultiEffect;
+      }
+      if (other.ItemEffectMod != 0F) {
+        ItemEffectMod = other.ItemEffectMod;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemEffect_ = (global::POGOProtos.Enums.ItemEffect) input.ReadEnum();
+            break;
+          }
+          case 21: {
+            CaptureMulti = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            CaptureMultiEffect = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            ItemEffectMod = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventoryUpgradeAttributes : pb::IMessage<InventoryUpgradeAttributes> {
+    private static readonly pb::MessageParser<InventoryUpgradeAttributes> _parser = new pb::MessageParser<InventoryUpgradeAttributes>(() => new InventoryUpgradeAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventoryUpgradeAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgradeAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgradeAttributes(InventoryUpgradeAttributes other) : this() {
+      additionalStorage_ = other.additionalStorage_;
+      upgradeType_ = other.upgradeType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventoryUpgradeAttributes Clone() {
+      return new InventoryUpgradeAttributes(this);
+    }
+
+    /// <summary>Field number for the "additional_storage" field.</summary>
+    public const int AdditionalStorageFieldNumber = 1;
+    private int additionalStorage_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AdditionalStorage {
+      get { return additionalStorage_; }
+      set {
+        additionalStorage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "upgrade_type" field.</summary>
+    public const int UpgradeTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.InventoryUpgradeType upgradeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.InventoryUpgradeType UpgradeType {
+      get { return upgradeType_; }
+      set {
+        upgradeType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventoryUpgradeAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventoryUpgradeAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (AdditionalStorage != other.AdditionalStorage) return false;
+      if (UpgradeType != other.UpgradeType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (AdditionalStorage != 0) hash ^= AdditionalStorage.GetHashCode();
+      if (UpgradeType != 0) hash ^= UpgradeType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (AdditionalStorage != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(AdditionalStorage);
+      }
+      if (UpgradeType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) UpgradeType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (AdditionalStorage != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AdditionalStorage);
+      }
+      if (UpgradeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) UpgradeType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventoryUpgradeAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.AdditionalStorage != 0) {
+        AdditionalStorage = other.AdditionalStorage;
+      }
+      if (other.UpgradeType != 0) {
+        UpgradeType = other.UpgradeType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            AdditionalStorage = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            upgradeType_ = (global::POGOProtos.Inventory.InventoryUpgradeType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class BattleAttributes : pb::IMessage<BattleAttributes> {
+    private static readonly pb::MessageParser<BattleAttributes> _parser = new pb::MessageParser<BattleAttributes>(() => new BattleAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BattleAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAttributes(BattleAttributes other) : this() {
+      staPercent_ = other.staPercent_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BattleAttributes Clone() {
+      return new BattleAttributes(this);
+    }
+
+    /// <summary>Field number for the "sta_percent" field.</summary>
+    public const int StaPercentFieldNumber = 1;
+    private float staPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaPercent {
+      get { return staPercent_; }
+      set {
+        staPercent_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BattleAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BattleAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StaPercent != other.StaPercent) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StaPercent != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(StaPercent);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StaPercent != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BattleAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StaPercent != 0F) {
+        StaPercent = other.StaPercent;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            StaPercent = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EggIncubatorAttributes : pb::IMessage<EggIncubatorAttributes> {
+    private static readonly pb::MessageParser<EggIncubatorAttributes> _parser = new pb::MessageParser<EggIncubatorAttributes>(() => new EggIncubatorAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EggIncubatorAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubatorAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubatorAttributes(EggIncubatorAttributes other) : this() {
+      incubatorType_ = other.incubatorType_;
+      uses_ = other.uses_;
+      distanceMultiplier_ = other.distanceMultiplier_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EggIncubatorAttributes Clone() {
+      return new EggIncubatorAttributes(this);
+    }
+
+    /// <summary>Field number for the "incubator_type" field.</summary>
+    public const int IncubatorTypeFieldNumber = 1;
+    private global::POGOProtos.Inventory.EggIncubatorType incubatorType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.EggIncubatorType IncubatorType {
+      get { return incubatorType_; }
+      set {
+        incubatorType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "uses" field.</summary>
+    public const int UsesFieldNumber = 2;
+    private int uses_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Uses {
+      get { return uses_; }
+      set {
+        uses_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "distance_multiplier" field.</summary>
+    public const int DistanceMultiplierFieldNumber = 3;
+    private float distanceMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DistanceMultiplier {
+      get { return distanceMultiplier_; }
+      set {
+        distanceMultiplier_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EggIncubatorAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EggIncubatorAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IncubatorType != other.IncubatorType) return false;
+      if (Uses != other.Uses) return false;
+      if (DistanceMultiplier != other.DistanceMultiplier) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IncubatorType != 0) hash ^= IncubatorType.GetHashCode();
+      if (Uses != 0) hash ^= Uses.GetHashCode();
+      if (DistanceMultiplier != 0F) hash ^= DistanceMultiplier.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IncubatorType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) IncubatorType);
+      }
+      if (Uses != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Uses);
+      }
+      if (DistanceMultiplier != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(DistanceMultiplier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IncubatorType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) IncubatorType);
+      }
+      if (Uses != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Uses);
+      }
+      if (DistanceMultiplier != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EggIncubatorAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IncubatorType != 0) {
+        IncubatorType = other.IncubatorType;
+      }
+      if (other.Uses != 0) {
+        Uses = other.Uses;
+      }
+      if (other.DistanceMultiplier != 0F) {
+        DistanceMultiplier = other.DistanceMultiplier;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            incubatorType_ = (global::POGOProtos.Inventory.EggIncubatorType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            Uses = input.ReadInt32();
+            break;
+          }
+          case 29: {
+            DistanceMultiplier = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class IncenseAttributes : pb::IMessage<IncenseAttributes> {
+    private static readonly pb::MessageParser<IncenseAttributes> _parser = new pb::MessageParser<IncenseAttributes>(() => new IncenseAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IncenseAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseAttributes(IncenseAttributes other) : this() {
+      incenseLifetimeSeconds_ = other.incenseLifetimeSeconds_;
+      pokemonType_ = other.pokemonType_.Clone();
+      pokemonIncenseTypeProbability_ = other.pokemonIncenseTypeProbability_;
+      standingTimeBetweenEncountersSeconds_ = other.standingTimeBetweenEncountersSeconds_;
+      movingTimeBetweenEncounterSeconds_ = other.movingTimeBetweenEncounterSeconds_;
+      distanceRequiredForShorterIntervalMeters_ = other.distanceRequiredForShorterIntervalMeters_;
+      pokemonAttractedLengthSec_ = other.pokemonAttractedLengthSec_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IncenseAttributes Clone() {
+      return new IncenseAttributes(this);
+    }
+
+    /// <summary>Field number for the "incense_lifetime_seconds" field.</summary>
+    public const int IncenseLifetimeSecondsFieldNumber = 1;
+    private int incenseLifetimeSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int IncenseLifetimeSeconds {
+      get { return incenseLifetimeSeconds_; }
+      set {
+        incenseLifetimeSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_type" field.</summary>
+    public const int PokemonTypeFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonType> _repeated_pokemonType_codec
+        = pb::FieldCodec.ForEnum(18, x => (int) x, x => (global::POGOProtos.Enums.PokemonType) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonType> pokemonType_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonType>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonType> PokemonType {
+      get { return pokemonType_; }
+    }
+
+    /// <summary>Field number for the "pokemon_incense_type_probability" field.</summary>
+    public const int PokemonIncenseTypeProbabilityFieldNumber = 3;
+    private float pokemonIncenseTypeProbability_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float PokemonIncenseTypeProbability {
+      get { return pokemonIncenseTypeProbability_; }
+      set {
+        pokemonIncenseTypeProbability_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "standing_time_between_encounters_seconds" field.</summary>
+    public const int StandingTimeBetweenEncountersSecondsFieldNumber = 4;
+    private int standingTimeBetweenEncountersSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StandingTimeBetweenEncountersSeconds {
+      get { return standingTimeBetweenEncountersSeconds_; }
+      set {
+        standingTimeBetweenEncountersSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "moving_time_between_encounter_seconds" field.</summary>
+    public const int MovingTimeBetweenEncounterSecondsFieldNumber = 5;
+    private int movingTimeBetweenEncounterSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MovingTimeBetweenEncounterSeconds {
+      get { return movingTimeBetweenEncounterSeconds_; }
+      set {
+        movingTimeBetweenEncounterSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "distance_required_for_shorter_interval_meters" field.</summary>
+    public const int DistanceRequiredForShorterIntervalMetersFieldNumber = 6;
+    private int distanceRequiredForShorterIntervalMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DistanceRequiredForShorterIntervalMeters {
+      get { return distanceRequiredForShorterIntervalMeters_; }
+      set {
+        distanceRequiredForShorterIntervalMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_attracted_length_sec" field.</summary>
+    public const int PokemonAttractedLengthSecFieldNumber = 7;
+    private int pokemonAttractedLengthSec_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int PokemonAttractedLengthSec {
+      get { return pokemonAttractedLengthSec_; }
+      set {
+        pokemonAttractedLengthSec_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IncenseAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IncenseAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (IncenseLifetimeSeconds != other.IncenseLifetimeSeconds) return false;
+      if(!pokemonType_.Equals(other.pokemonType_)) return false;
+      if (PokemonIncenseTypeProbability != other.PokemonIncenseTypeProbability) return false;
+      if (StandingTimeBetweenEncountersSeconds != other.StandingTimeBetweenEncountersSeconds) return false;
+      if (MovingTimeBetweenEncounterSeconds != other.MovingTimeBetweenEncounterSeconds) return false;
+      if (DistanceRequiredForShorterIntervalMeters != other.DistanceRequiredForShorterIntervalMeters) return false;
+      if (PokemonAttractedLengthSec != other.PokemonAttractedLengthSec) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (IncenseLifetimeSeconds != 0) hash ^= IncenseLifetimeSeconds.GetHashCode();
+      hash ^= pokemonType_.GetHashCode();
+      if (PokemonIncenseTypeProbability != 0F) hash ^= PokemonIncenseTypeProbability.GetHashCode();
+      if (StandingTimeBetweenEncountersSeconds != 0) hash ^= StandingTimeBetweenEncountersSeconds.GetHashCode();
+      if (MovingTimeBetweenEncounterSeconds != 0) hash ^= MovingTimeBetweenEncounterSeconds.GetHashCode();
+      if (DistanceRequiredForShorterIntervalMeters != 0) hash ^= DistanceRequiredForShorterIntervalMeters.GetHashCode();
+      if (PokemonAttractedLengthSec != 0) hash ^= PokemonAttractedLengthSec.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (IncenseLifetimeSeconds != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(IncenseLifetimeSeconds);
+      }
+      pokemonType_.WriteTo(output, _repeated_pokemonType_codec);
+      if (PokemonIncenseTypeProbability != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(PokemonIncenseTypeProbability);
+      }
+      if (StandingTimeBetweenEncountersSeconds != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(StandingTimeBetweenEncountersSeconds);
+      }
+      if (MovingTimeBetweenEncounterSeconds != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(MovingTimeBetweenEncounterSeconds);
+      }
+      if (DistanceRequiredForShorterIntervalMeters != 0) {
+        output.WriteRawTag(48);
+        output.WriteInt32(DistanceRequiredForShorterIntervalMeters);
+      }
+      if (PokemonAttractedLengthSec != 0) {
+        output.WriteRawTag(56);
+        output.WriteInt32(PokemonAttractedLengthSec);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (IncenseLifetimeSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(IncenseLifetimeSeconds);
+      }
+      size += pokemonType_.CalculateSize(_repeated_pokemonType_codec);
+      if (PokemonIncenseTypeProbability != 0F) {
+        size += 1 + 4;
+      }
+      if (StandingTimeBetweenEncountersSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StandingTimeBetweenEncountersSeconds);
+      }
+      if (MovingTimeBetweenEncounterSeconds != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MovingTimeBetweenEncounterSeconds);
+      }
+      if (DistanceRequiredForShorterIntervalMeters != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DistanceRequiredForShorterIntervalMeters);
+      }
+      if (PokemonAttractedLengthSec != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonAttractedLengthSec);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IncenseAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.IncenseLifetimeSeconds != 0) {
+        IncenseLifetimeSeconds = other.IncenseLifetimeSeconds;
+      }
+      pokemonType_.Add(other.pokemonType_);
+      if (other.PokemonIncenseTypeProbability != 0F) {
+        PokemonIncenseTypeProbability = other.PokemonIncenseTypeProbability;
+      }
+      if (other.StandingTimeBetweenEncountersSeconds != 0) {
+        StandingTimeBetweenEncountersSeconds = other.StandingTimeBetweenEncountersSeconds;
+      }
+      if (other.MovingTimeBetweenEncounterSeconds != 0) {
+        MovingTimeBetweenEncounterSeconds = other.MovingTimeBetweenEncounterSeconds;
+      }
+      if (other.DistanceRequiredForShorterIntervalMeters != 0) {
+        DistanceRequiredForShorterIntervalMeters = other.DistanceRequiredForShorterIntervalMeters;
+      }
+      if (other.PokemonAttractedLengthSec != 0) {
+        PokemonAttractedLengthSec = other.PokemonAttractedLengthSec;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            IncenseLifetimeSeconds = input.ReadInt32();
+            break;
+          }
+          case 18:
+          case 16: {
+            pokemonType_.AddEntriesFrom(input, _repeated_pokemonType_codec);
+            break;
+          }
+          case 29: {
+            PokemonIncenseTypeProbability = input.ReadFloat();
+            break;
+          }
+          case 32: {
+            StandingTimeBetweenEncountersSeconds = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            MovingTimeBetweenEncounterSeconds = input.ReadInt32();
+            break;
+          }
+          case 48: {
+            DistanceRequiredForShorterIntervalMeters = input.ReadInt32();
+            break;
+          }
+          case 56: {
+            PokemonAttractedLengthSec = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ReviveAttributes : pb::IMessage<ReviveAttributes> {
+    private static readonly pb::MessageParser<ReviveAttributes> _parser = new pb::MessageParser<ReviveAttributes>(() => new ReviveAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ReviveAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor.MessageTypes[9]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReviveAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReviveAttributes(ReviveAttributes other) : this() {
+      staPercent_ = other.staPercent_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReviveAttributes Clone() {
+      return new ReviveAttributes(this);
+    }
+
+    /// <summary>Field number for the "sta_percent" field.</summary>
+    public const int StaPercentFieldNumber = 1;
+    private float staPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaPercent {
+      get { return staPercent_; }
+      set {
+        staPercent_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ReviveAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ReviveAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StaPercent != other.StaPercent) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StaPercent != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(StaPercent);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StaPercent != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ReviveAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StaPercent != 0F) {
+        StaPercent = other.StaPercent;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            StaPercent = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/PokeballAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/PokeballAttributes.cs
new file mode 100644
index 0000000..a7a1810
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/PokeballAttributes.cs
@@ -0,0 +1,247 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/PokeballAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/PokeballAttributes.proto</summary>
+  public static partial class PokeballAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/PokeballAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokeballAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjhQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL1Bva2ViYWxsQXR0",
+            "cmlidXRlcy5wcm90bxIfUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuSXRl",
+            "bRohUE9HT1Byb3Rvcy9FbnVtcy9JdGVtRWZmZWN0LnByb3RvIpUBChJQb2tl",
+            "YmFsbEF0dHJpYnV0ZXMSMQoLaXRlbV9lZmZlY3QYASABKA4yHC5QT0dPUHJv",
+            "dG9zLkVudW1zLkl0ZW1FZmZlY3QSFQoNY2FwdHVyZV9tdWx0aRgCIAEoAhIc",
+            "ChRjYXB0dXJlX211bHRpX2VmZmVjdBgDIAEoAhIXCg9pdGVtX2VmZmVjdF9t",
+            "b2QYBCABKAJiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.ItemEffectReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.PokeballAttributes), global::POGOProtos.Settings.Master.Item.PokeballAttributes.Parser, new[]{ "ItemEffect", "CaptureMulti", "CaptureMultiEffect", "ItemEffectMod" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PokeballAttributes : pb::IMessage<PokeballAttributes> {
+    private static readonly pb::MessageParser<PokeballAttributes> _parser = new pb::MessageParser<PokeballAttributes>(() => new PokeballAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokeballAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.PokeballAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokeballAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokeballAttributes(PokeballAttributes other) : this() {
+      itemEffect_ = other.itemEffect_;
+      captureMulti_ = other.captureMulti_;
+      captureMultiEffect_ = other.captureMultiEffect_;
+      itemEffectMod_ = other.itemEffectMod_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokeballAttributes Clone() {
+      return new PokeballAttributes(this);
+    }
+
+    /// <summary>Field number for the "item_effect" field.</summary>
+    public const int ItemEffectFieldNumber = 1;
+    private global::POGOProtos.Enums.ItemEffect itemEffect_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.ItemEffect ItemEffect {
+      get { return itemEffect_; }
+      set {
+        itemEffect_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_multi" field.</summary>
+    public const int CaptureMultiFieldNumber = 2;
+    private float captureMulti_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CaptureMulti {
+      get { return captureMulti_; }
+      set {
+        captureMulti_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "capture_multi_effect" field.</summary>
+    public const int CaptureMultiEffectFieldNumber = 3;
+    private float captureMultiEffect_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CaptureMultiEffect {
+      get { return captureMultiEffect_; }
+      set {
+        captureMultiEffect_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_effect_mod" field.</summary>
+    public const int ItemEffectModFieldNumber = 4;
+    private float itemEffectMod_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ItemEffectMod {
+      get { return itemEffectMod_; }
+      set {
+        itemEffectMod_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokeballAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokeballAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemEffect != other.ItemEffect) return false;
+      if (CaptureMulti != other.CaptureMulti) return false;
+      if (CaptureMultiEffect != other.CaptureMultiEffect) return false;
+      if (ItemEffectMod != other.ItemEffectMod) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemEffect != 0) hash ^= ItemEffect.GetHashCode();
+      if (CaptureMulti != 0F) hash ^= CaptureMulti.GetHashCode();
+      if (CaptureMultiEffect != 0F) hash ^= CaptureMultiEffect.GetHashCode();
+      if (ItemEffectMod != 0F) hash ^= ItemEffectMod.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemEffect != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemEffect);
+      }
+      if (CaptureMulti != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(CaptureMulti);
+      }
+      if (CaptureMultiEffect != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(CaptureMultiEffect);
+      }
+      if (ItemEffectMod != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(ItemEffectMod);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemEffect != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemEffect);
+      }
+      if (CaptureMulti != 0F) {
+        size += 1 + 4;
+      }
+      if (CaptureMultiEffect != 0F) {
+        size += 1 + 4;
+      }
+      if (ItemEffectMod != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokeballAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemEffect != 0) {
+        ItemEffect = other.ItemEffect;
+      }
+      if (other.CaptureMulti != 0F) {
+        CaptureMulti = other.CaptureMulti;
+      }
+      if (other.CaptureMultiEffect != 0F) {
+        CaptureMultiEffect = other.CaptureMultiEffect;
+      }
+      if (other.ItemEffectMod != 0F) {
+        ItemEffectMod = other.ItemEffectMod;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemEffect_ = (global::POGOProtos.Enums.ItemEffect) input.ReadEnum();
+            break;
+          }
+          case 21: {
+            CaptureMulti = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            CaptureMultiEffect = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            ItemEffectMod = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/PotionAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/PotionAttributes.cs
new file mode 100644
index 0000000..9a7c921
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/PotionAttributes.cs
@@ -0,0 +1,188 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/PotionAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/PotionAttributes.proto</summary>
+  public static partial class PotionAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/PotionAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PotionAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL1BvdGlvbkF0dHJp",
+            "YnV0ZXMucHJvdG8SH1BPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0i",
+            "OwoQUG90aW9uQXR0cmlidXRlcxITCgtzdGFfcGVyY2VudBgBIAEoAhISCgpz",
+            "dGFfYW1vdW50GAIgASgFYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.PotionAttributes), global::POGOProtos.Settings.Master.Item.PotionAttributes.Parser, new[]{ "StaPercent", "StaAmount" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PotionAttributes : pb::IMessage<PotionAttributes> {
+    private static readonly pb::MessageParser<PotionAttributes> _parser = new pb::MessageParser<PotionAttributes>(() => new PotionAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PotionAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.PotionAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PotionAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PotionAttributes(PotionAttributes other) : this() {
+      staPercent_ = other.staPercent_;
+      staAmount_ = other.staAmount_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PotionAttributes Clone() {
+      return new PotionAttributes(this);
+    }
+
+    /// <summary>Field number for the "sta_percent" field.</summary>
+    public const int StaPercentFieldNumber = 1;
+    private float staPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaPercent {
+      get { return staPercent_; }
+      set {
+        staPercent_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sta_amount" field.</summary>
+    public const int StaAmountFieldNumber = 2;
+    private int staAmount_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int StaAmount {
+      get { return staAmount_; }
+      set {
+        staAmount_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PotionAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PotionAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StaPercent != other.StaPercent) return false;
+      if (StaAmount != other.StaAmount) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
+      if (StaAmount != 0) hash ^= StaAmount.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StaPercent != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(StaPercent);
+      }
+      if (StaAmount != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(StaAmount);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StaPercent != 0F) {
+        size += 1 + 4;
+      }
+      if (StaAmount != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaAmount);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PotionAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StaPercent != 0F) {
+        StaPercent = other.StaPercent;
+      }
+      if (other.StaAmount != 0) {
+        StaAmount = other.StaAmount;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            StaPercent = input.ReadFloat();
+            break;
+          }
+          case 16: {
+            StaAmount = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Item/ReviveAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Item/ReviveAttributes.cs
new file mode 100644
index 0000000..ff4e757
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Item/ReviveAttributes.cs
@@ -0,0 +1,160 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Item/ReviveAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Item {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Item/ReviveAttributes.proto</summary>
+  public static partial class ReviveAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Item/ReviveAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ReviveAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL1Jldml2ZUF0dHJp",
+            "YnV0ZXMucHJvdG8SH1BPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0i",
+            "JwoQUmV2aXZlQXR0cmlidXRlcxITCgtzdGFfcGVyY2VudBgBIAEoAmIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Item.ReviveAttributes), global::POGOProtos.Settings.Master.Item.ReviveAttributes.Parser, new[]{ "StaPercent" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ReviveAttributes : pb::IMessage<ReviveAttributes> {
+    private static readonly pb::MessageParser<ReviveAttributes> _parser = new pb::MessageParser<ReviveAttributes>(() => new ReviveAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ReviveAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Item.ReviveAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReviveAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReviveAttributes(ReviveAttributes other) : this() {
+      staPercent_ = other.staPercent_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ReviveAttributes Clone() {
+      return new ReviveAttributes(this);
+    }
+
+    /// <summary>Field number for the "sta_percent" field.</summary>
+    public const int StaPercentFieldNumber = 1;
+    private float staPercent_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaPercent {
+      get { return staPercent_; }
+      set {
+        staPercent_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ReviveAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ReviveAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (StaPercent != other.StaPercent) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (StaPercent != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(StaPercent);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (StaPercent != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ReviveAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.StaPercent != 0F) {
+        StaPercent = other.StaPercent;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            StaPercent = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/ItemSettings.cs b/PokemonGo/POGOProtos/Settings/Master/ItemSettings.cs
new file mode 100644
index 0000000..df621fe
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/ItemSettings.cs
@@ -0,0 +1,647 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/ItemSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/ItemSettings.proto</summary>
+  public static partial class ItemSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/ItemSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static ItemSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci1QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtU2V0dGluZ3MucHJv",
+            "dG8SGlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyGiNQT0dPUHJvdG9zL0Vu",
+            "dW1zL0l0ZW1DYXRlZ29yeS5wcm90bxomUE9HT1Byb3Rvcy9JbnZlbnRvcnkv",
+            "SXRlbS9JdGVtSWQucHJvdG8aKFBPR09Qcm90b3MvSW52ZW50b3J5L0l0ZW0v",
+            "SXRlbVR5cGUucHJvdG8aNFBPR09Qcm90b3MvU2V0dGluZ3MvTWFzdGVyL0l0",
+            "ZW0vRm9vZEF0dHJpYnV0ZXMucHJvdG8aNlBPR09Qcm90b3MvU2V0dGluZ3Mv",
+            "TWFzdGVyL0l0ZW0vUG90aW9uQXR0cmlidXRlcy5wcm90bxo2UE9HT1Byb3Rv",
+            "cy9TZXR0aW5ncy9NYXN0ZXIvSXRlbS9SZXZpdmVBdHRyaWJ1dGVzLnByb3Rv",
+            "GjZQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0JhdHRsZUF0dHJp",
+            "YnV0ZXMucHJvdG8aN1BPR09Qcm90b3MvU2V0dGluZ3MvTWFzdGVyL0l0ZW0v",
+            "SW5jZW5zZUF0dHJpYnV0ZXMucHJvdG8aOFBPR09Qcm90b3MvU2V0dGluZ3Mv",
+            "TWFzdGVyL0l0ZW0vUG9rZWJhbGxBdHRyaWJ1dGVzLnByb3RvGjxQT0dPUHJv",
+            "dG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0ZvcnRNb2RpZmllckF0dHJpYnV0",
+            "ZXMucHJvdG8aPFBPR09Qcm90b3MvU2V0dGluZ3MvTWFzdGVyL0l0ZW0vRWdn",
+            "SW5jdWJhdG9yQXR0cmlidXRlcy5wcm90bxo/UE9HT1Byb3Rvcy9TZXR0aW5n",
+            "cy9NYXN0ZXIvSXRlbS9FeHBlcmllbmNlQm9vc3RBdHRyaWJ1dGVzLnByb3Rv",
+            "GkBQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9JdGVtL0ludmVudG9yeVVw",
+            "Z3JhZGVBdHRyaWJ1dGVzLnByb3RvIrUHCgxJdGVtU2V0dGluZ3MSMgoHaXRl",
+            "bV9pZBgBIAEoDjIhLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0uSXRlbUlk",
+            "EjYKCWl0ZW1fdHlwZRgCIAEoDjIjLlBPR09Qcm90b3MuSW52ZW50b3J5Lkl0",
+            "ZW0uSXRlbVR5cGUSMAoIY2F0ZWdvcnkYAyABKA4yHi5QT0dPUHJvdG9zLkVu",
+            "dW1zLkl0ZW1DYXRlZ29yeRIRCglkcm9wX2ZyZXEYBCABKAISGgoSZHJvcF90",
+            "cmFpbmVyX2xldmVsGAUgASgFEkUKCHBva2ViYWxsGAYgASgLMjMuUE9HT1By",
+            "b3Rvcy5TZXR0aW5ncy5NYXN0ZXIuSXRlbS5Qb2tlYmFsbEF0dHJpYnV0ZXMS",
+            "QQoGcG90aW9uGAcgASgLMjEuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIu",
+            "SXRlbS5Qb3Rpb25BdHRyaWJ1dGVzEkEKBnJldml2ZRgIIAEoCzIxLlBPR09Q",
+            "cm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0uUmV2aXZlQXR0cmlidXRlcxJB",
+            "CgZiYXR0bGUYCSABKAsyMS5QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5J",
+            "dGVtLkJhdHRsZUF0dHJpYnV0ZXMSPQoEZm9vZBgKIAEoCzIvLlBPR09Qcm90",
+            "b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0uRm9vZEF0dHJpYnV0ZXMSVgoRaW52",
+            "ZW50b3J5X3VwZ3JhZGUYCyABKAsyOy5QT0dPUHJvdG9zLlNldHRpbmdzLk1h",
+            "c3Rlci5JdGVtLkludmVudG9yeVVwZ3JhZGVBdHRyaWJ1dGVzEkwKCHhwX2Jv",
+            "b3N0GAwgASgLMjouUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuSXRlbS5F",
+            "eHBlcmllbmNlQm9vc3RBdHRyaWJ1dGVzEkMKB2luY2Vuc2UYDSABKAsyMi5Q",
+            "T0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVtLkluY2Vuc2VBdHRyaWJ1",
+            "dGVzEk4KDWVnZ19pbmN1YmF0b3IYDiABKAsyNy5QT0dPUHJvdG9zLlNldHRp",
+            "bmdzLk1hc3Rlci5JdGVtLkVnZ0luY3ViYXRvckF0dHJpYnV0ZXMSTgoNZm9y",
+            "dF9tb2RpZmllchgPIAEoCzI3LlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVy",
+            "Lkl0ZW0uRm9ydE1vZGlmaWVyQXR0cmlidXRlc2IGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.ItemCategoryReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemIdReflection.Descriptor, global::POGOProtos.Inventory.Item.ItemTypeReflection.Descriptor, global::POGOProtos.Settings.Master.Item.FoodAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.PotionAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.ReviveAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.BattleAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.IncenseAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.PokeballAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.FortModifierAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.EggIncubatorAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributesReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.ItemSettings), global::POGOProtos.Settings.Master.ItemSettings.Parser, new[]{ "ItemId", "ItemType", "Category", "DropFreq", "DropTrainerLevel", "Pokeball", "Potion", "Revive", "Battle", "Food", "InventoryUpgrade", "XpBoost", "Incense", "EggIncubator", "FortModifier" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class ItemSettings : pb::IMessage<ItemSettings> {
+    private static readonly pb::MessageParser<ItemSettings> _parser = new pb::MessageParser<ItemSettings>(() => new ItemSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ItemSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.ItemSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemSettings(ItemSettings other) : this() {
+      itemId_ = other.itemId_;
+      itemType_ = other.itemType_;
+      category_ = other.category_;
+      dropFreq_ = other.dropFreq_;
+      dropTrainerLevel_ = other.dropTrainerLevel_;
+      Pokeball = other.pokeball_ != null ? other.Pokeball.Clone() : null;
+      Potion = other.potion_ != null ? other.Potion.Clone() : null;
+      Revive = other.revive_ != null ? other.Revive.Clone() : null;
+      Battle = other.battle_ != null ? other.Battle.Clone() : null;
+      Food = other.food_ != null ? other.Food.Clone() : null;
+      InventoryUpgrade = other.inventoryUpgrade_ != null ? other.InventoryUpgrade.Clone() : null;
+      XpBoost = other.xpBoost_ != null ? other.XpBoost.Clone() : null;
+      Incense = other.incense_ != null ? other.Incense.Clone() : null;
+      EggIncubator = other.eggIncubator_ != null ? other.EggIncubator.Clone() : null;
+      FortModifier = other.fortModifier_ != null ? other.FortModifier.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemSettings Clone() {
+      return new ItemSettings(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_type" field.</summary>
+    public const int ItemTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemType itemType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemType ItemType {
+      get { return itemType_; }
+      set {
+        itemType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "category" field.</summary>
+    public const int CategoryFieldNumber = 3;
+    private global::POGOProtos.Enums.ItemCategory category_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.ItemCategory Category {
+      get { return category_; }
+      set {
+        category_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "drop_freq" field.</summary>
+    public const int DropFreqFieldNumber = 4;
+    private float dropFreq_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DropFreq {
+      get { return dropFreq_; }
+      set {
+        dropFreq_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "drop_trainer_level" field.</summary>
+    public const int DropTrainerLevelFieldNumber = 5;
+    private int dropTrainerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DropTrainerLevel {
+      get { return dropTrainerLevel_; }
+      set {
+        dropTrainerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeball" field.</summary>
+    public const int PokeballFieldNumber = 6;
+    private global::POGOProtos.Settings.Master.Item.PokeballAttributes pokeball_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.PokeballAttributes Pokeball {
+      get { return pokeball_; }
+      set {
+        pokeball_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "potion" field.</summary>
+    public const int PotionFieldNumber = 7;
+    private global::POGOProtos.Settings.Master.Item.PotionAttributes potion_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.PotionAttributes Potion {
+      get { return potion_; }
+      set {
+        potion_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "revive" field.</summary>
+    public const int ReviveFieldNumber = 8;
+    private global::POGOProtos.Settings.Master.Item.ReviveAttributes revive_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.ReviveAttributes Revive {
+      get { return revive_; }
+      set {
+        revive_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle" field.</summary>
+    public const int BattleFieldNumber = 9;
+    private global::POGOProtos.Settings.Master.Item.BattleAttributes battle_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.BattleAttributes Battle {
+      get { return battle_; }
+      set {
+        battle_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "food" field.</summary>
+    public const int FoodFieldNumber = 10;
+    private global::POGOProtos.Settings.Master.Item.FoodAttributes food_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.FoodAttributes Food {
+      get { return food_; }
+      set {
+        food_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_upgrade" field.</summary>
+    public const int InventoryUpgradeFieldNumber = 11;
+    private global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes inventoryUpgrade_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes InventoryUpgrade {
+      get { return inventoryUpgrade_; }
+      set {
+        inventoryUpgrade_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "xp_boost" field.</summary>
+    public const int XpBoostFieldNumber = 12;
+    private global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes xpBoost_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes XpBoost {
+      get { return xpBoost_; }
+      set {
+        xpBoost_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "incense" field.</summary>
+    public const int IncenseFieldNumber = 13;
+    private global::POGOProtos.Settings.Master.Item.IncenseAttributes incense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.IncenseAttributes Incense {
+      get { return incense_; }
+      set {
+        incense_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubator" field.</summary>
+    public const int EggIncubatorFieldNumber = 14;
+    private global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes eggIncubator_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes EggIncubator {
+      get { return eggIncubator_; }
+      set {
+        eggIncubator_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_modifier" field.</summary>
+    public const int FortModifierFieldNumber = 15;
+    private global::POGOProtos.Settings.Master.Item.FortModifierAttributes fortModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.FortModifierAttributes FortModifier {
+      get { return fortModifier_; }
+      set {
+        fortModifier_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ItemSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ItemSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ItemType != other.ItemType) return false;
+      if (Category != other.Category) return false;
+      if (DropFreq != other.DropFreq) return false;
+      if (DropTrainerLevel != other.DropTrainerLevel) return false;
+      if (!object.Equals(Pokeball, other.Pokeball)) return false;
+      if (!object.Equals(Potion, other.Potion)) return false;
+      if (!object.Equals(Revive, other.Revive)) return false;
+      if (!object.Equals(Battle, other.Battle)) return false;
+      if (!object.Equals(Food, other.Food)) return false;
+      if (!object.Equals(InventoryUpgrade, other.InventoryUpgrade)) return false;
+      if (!object.Equals(XpBoost, other.XpBoost)) return false;
+      if (!object.Equals(Incense, other.Incense)) return false;
+      if (!object.Equals(EggIncubator, other.EggIncubator)) return false;
+      if (!object.Equals(FortModifier, other.FortModifier)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ItemType != 0) hash ^= ItemType.GetHashCode();
+      if (Category != 0) hash ^= Category.GetHashCode();
+      if (DropFreq != 0F) hash ^= DropFreq.GetHashCode();
+      if (DropTrainerLevel != 0) hash ^= DropTrainerLevel.GetHashCode();
+      if (pokeball_ != null) hash ^= Pokeball.GetHashCode();
+      if (potion_ != null) hash ^= Potion.GetHashCode();
+      if (revive_ != null) hash ^= Revive.GetHashCode();
+      if (battle_ != null) hash ^= Battle.GetHashCode();
+      if (food_ != null) hash ^= Food.GetHashCode();
+      if (inventoryUpgrade_ != null) hash ^= InventoryUpgrade.GetHashCode();
+      if (xpBoost_ != null) hash ^= XpBoost.GetHashCode();
+      if (incense_ != null) hash ^= Incense.GetHashCode();
+      if (eggIncubator_ != null) hash ^= EggIncubator.GetHashCode();
+      if (fortModifier_ != null) hash ^= FortModifier.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ItemType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) ItemType);
+      }
+      if (Category != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) Category);
+      }
+      if (DropFreq != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(DropFreq);
+      }
+      if (DropTrainerLevel != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(DropTrainerLevel);
+      }
+      if (pokeball_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Pokeball);
+      }
+      if (potion_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Potion);
+      }
+      if (revive_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(Revive);
+      }
+      if (battle_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(Battle);
+      }
+      if (food_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(Food);
+      }
+      if (inventoryUpgrade_ != null) {
+        output.WriteRawTag(90);
+        output.WriteMessage(InventoryUpgrade);
+      }
+      if (xpBoost_ != null) {
+        output.WriteRawTag(98);
+        output.WriteMessage(XpBoost);
+      }
+      if (incense_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(Incense);
+      }
+      if (eggIncubator_ != null) {
+        output.WriteRawTag(114);
+        output.WriteMessage(EggIncubator);
+      }
+      if (fortModifier_ != null) {
+        output.WriteRawTag(122);
+        output.WriteMessage(FortModifier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ItemType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemType);
+      }
+      if (Category != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Category);
+      }
+      if (DropFreq != 0F) {
+        size += 1 + 4;
+      }
+      if (DropTrainerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DropTrainerLevel);
+      }
+      if (pokeball_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Pokeball);
+      }
+      if (potion_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Potion);
+      }
+      if (revive_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Revive);
+      }
+      if (battle_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Battle);
+      }
+      if (food_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Food);
+      }
+      if (inventoryUpgrade_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryUpgrade);
+      }
+      if (xpBoost_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(XpBoost);
+      }
+      if (incense_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Incense);
+      }
+      if (eggIncubator_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubator);
+      }
+      if (fortModifier_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortModifier);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ItemSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ItemType != 0) {
+        ItemType = other.ItemType;
+      }
+      if (other.Category != 0) {
+        Category = other.Category;
+      }
+      if (other.DropFreq != 0F) {
+        DropFreq = other.DropFreq;
+      }
+      if (other.DropTrainerLevel != 0) {
+        DropTrainerLevel = other.DropTrainerLevel;
+      }
+      if (other.pokeball_ != null) {
+        if (pokeball_ == null) {
+          pokeball_ = new global::POGOProtos.Settings.Master.Item.PokeballAttributes();
+        }
+        Pokeball.MergeFrom(other.Pokeball);
+      }
+      if (other.potion_ != null) {
+        if (potion_ == null) {
+          potion_ = new global::POGOProtos.Settings.Master.Item.PotionAttributes();
+        }
+        Potion.MergeFrom(other.Potion);
+      }
+      if (other.revive_ != null) {
+        if (revive_ == null) {
+          revive_ = new global::POGOProtos.Settings.Master.Item.ReviveAttributes();
+        }
+        Revive.MergeFrom(other.Revive);
+      }
+      if (other.battle_ != null) {
+        if (battle_ == null) {
+          battle_ = new global::POGOProtos.Settings.Master.Item.BattleAttributes();
+        }
+        Battle.MergeFrom(other.Battle);
+      }
+      if (other.food_ != null) {
+        if (food_ == null) {
+          food_ = new global::POGOProtos.Settings.Master.Item.FoodAttributes();
+        }
+        Food.MergeFrom(other.Food);
+      }
+      if (other.inventoryUpgrade_ != null) {
+        if (inventoryUpgrade_ == null) {
+          inventoryUpgrade_ = new global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes();
+        }
+        InventoryUpgrade.MergeFrom(other.InventoryUpgrade);
+      }
+      if (other.xpBoost_ != null) {
+        if (xpBoost_ == null) {
+          xpBoost_ = new global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes();
+        }
+        XpBoost.MergeFrom(other.XpBoost);
+      }
+      if (other.incense_ != null) {
+        if (incense_ == null) {
+          incense_ = new global::POGOProtos.Settings.Master.Item.IncenseAttributes();
+        }
+        Incense.MergeFrom(other.Incense);
+      }
+      if (other.eggIncubator_ != null) {
+        if (eggIncubator_ == null) {
+          eggIncubator_ = new global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes();
+        }
+        EggIncubator.MergeFrom(other.EggIncubator);
+      }
+      if (other.fortModifier_ != null) {
+        if (fortModifier_ == null) {
+          fortModifier_ = new global::POGOProtos.Settings.Master.Item.FortModifierAttributes();
+        }
+        FortModifier.MergeFrom(other.FortModifier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            itemType_ = (global::POGOProtos.Inventory.Item.ItemType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            category_ = (global::POGOProtos.Enums.ItemCategory) input.ReadEnum();
+            break;
+          }
+          case 37: {
+            DropFreq = input.ReadFloat();
+            break;
+          }
+          case 40: {
+            DropTrainerLevel = input.ReadInt32();
+            break;
+          }
+          case 50: {
+            if (pokeball_ == null) {
+              pokeball_ = new global::POGOProtos.Settings.Master.Item.PokeballAttributes();
+            }
+            input.ReadMessage(pokeball_);
+            break;
+          }
+          case 58: {
+            if (potion_ == null) {
+              potion_ = new global::POGOProtos.Settings.Master.Item.PotionAttributes();
+            }
+            input.ReadMessage(potion_);
+            break;
+          }
+          case 66: {
+            if (revive_ == null) {
+              revive_ = new global::POGOProtos.Settings.Master.Item.ReviveAttributes();
+            }
+            input.ReadMessage(revive_);
+            break;
+          }
+          case 74: {
+            if (battle_ == null) {
+              battle_ = new global::POGOProtos.Settings.Master.Item.BattleAttributes();
+            }
+            input.ReadMessage(battle_);
+            break;
+          }
+          case 82: {
+            if (food_ == null) {
+              food_ = new global::POGOProtos.Settings.Master.Item.FoodAttributes();
+            }
+            input.ReadMessage(food_);
+            break;
+          }
+          case 90: {
+            if (inventoryUpgrade_ == null) {
+              inventoryUpgrade_ = new global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes();
+            }
+            input.ReadMessage(inventoryUpgrade_);
+            break;
+          }
+          case 98: {
+            if (xpBoost_ == null) {
+              xpBoost_ = new global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes();
+            }
+            input.ReadMessage(xpBoost_);
+            break;
+          }
+          case 106: {
+            if (incense_ == null) {
+              incense_ = new global::POGOProtos.Settings.Master.Item.IncenseAttributes();
+            }
+            input.ReadMessage(incense_);
+            break;
+          }
+          case 114: {
+            if (eggIncubator_ == null) {
+              eggIncubator_ = new global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes();
+            }
+            input.ReadMessage(eggIncubator_);
+            break;
+          }
+          case 122: {
+            if (fortModifier_ == null) {
+              fortModifier_ = new global::POGOProtos.Settings.Master.Item.FortModifierAttributes();
+            }
+            input.ReadMessage(fortModifier_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/MoveSequenceSettings.cs b/PokemonGo/POGOProtos/Settings/Master/MoveSequenceSettings.cs
new file mode 100644
index 0000000..d1146be
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/MoveSequenceSettings.cs
@@ -0,0 +1,151 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/MoveSequenceSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/MoveSequenceSettings.proto</summary>
+  public static partial class MoveSequenceSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/MoveSequenceSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MoveSequenceSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjVQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Nb3ZlU2VxdWVuY2VTZXR0",
+            "aW5ncy5wcm90bxIaUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIiKAoUTW92",
+            "ZVNlcXVlbmNlU2V0dGluZ3MSEAoIc2VxdWVuY2UYASADKAliBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.MoveSequenceSettings), global::POGOProtos.Settings.Master.MoveSequenceSettings.Parser, new[]{ "Sequence" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MoveSequenceSettings : pb::IMessage<MoveSequenceSettings> {
+    private static readonly pb::MessageParser<MoveSequenceSettings> _parser = new pb::MessageParser<MoveSequenceSettings>(() => new MoveSequenceSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MoveSequenceSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.MoveSequenceSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSequenceSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSequenceSettings(MoveSequenceSettings other) : this() {
+      sequence_ = other.sequence_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSequenceSettings Clone() {
+      return new MoveSequenceSettings(this);
+    }
+
+    /// <summary>Field number for the "sequence" field.</summary>
+    public const int SequenceFieldNumber = 1;
+    private static readonly pb::FieldCodec<string> _repeated_sequence_codec
+        = pb::FieldCodec.ForString(10);
+    private readonly pbc::RepeatedField<string> sequence_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> Sequence {
+      get { return sequence_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MoveSequenceSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MoveSequenceSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!sequence_.Equals(other.sequence_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= sequence_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      sequence_.WriteTo(output, _repeated_sequence_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += sequence_.CalculateSize(_repeated_sequence_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MoveSequenceSettings other) {
+      if (other == null) {
+        return;
+      }
+      sequence_.Add(other.sequence_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            sequence_.AddEntriesFrom(input, _repeated_sequence_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/MoveSettings.cs b/PokemonGo/POGOProtos/Settings/Master/MoveSettings.cs
new file mode 100644
index 0000000..7042763
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/MoveSettings.cs
@@ -0,0 +1,562 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/MoveSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/MoveSettings.proto</summary>
+  public static partial class MoveSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/MoveSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MoveSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ci1QT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Nb3ZlU2V0dGluZ3MucHJv",
+            "dG8SGlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyGiJQT0dPUHJvdG9zL0Vu",
+            "dW1zL1Bva2Vtb25UeXBlLnByb3RvGiJQT0dPUHJvdG9zL0VudW1zL1Bva2Vt",
+            "b25Nb3ZlLnByb3RvIrEDCgxNb3ZlU2V0dGluZ3MSMgoLbW92ZW1lbnRfaWQY",
+            "ASABKA4yHS5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25Nb3ZlEhQKDGFuaW1h",
+            "dGlvbl9pZBgCIAEoBRIzCgxwb2tlbW9uX3R5cGUYAyABKA4yHS5QT0dPUHJv",
+            "dG9zLkVudW1zLlBva2Vtb25UeXBlEg0KBXBvd2VyGAQgASgCEhcKD2FjY3Vy",
+            "YWN5X2NoYW5jZRgFIAEoAhIXCg9jcml0aWNhbF9jaGFuY2UYBiABKAISEwoL",
+            "aGVhbF9zY2FsYXIYByABKAISGwoTc3RhbWluYV9sb3NzX3NjYWxhchgIIAEo",
+            "AhIZChF0cmFpbmVyX2xldmVsX21pbhgJIAEoBRIZChF0cmFpbmVyX2xldmVs",
+            "X21heBgKIAEoBRIQCgh2ZnhfbmFtZRgLIAEoCRITCgtkdXJhdGlvbl9tcxgM",
+            "IAEoBRIeChZkYW1hZ2Vfd2luZG93X3N0YXJ0X21zGA0gASgFEhwKFGRhbWFn",
+            "ZV93aW5kb3dfZW5kX21zGA4gASgFEhQKDGVuZXJneV9kZWx0YRgPIAEoBWIG",
+            "cHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonTypeReflection.Descriptor, global::POGOProtos.Enums.PokemonMoveReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.MoveSettings), global::POGOProtos.Settings.Master.MoveSettings.Parser, new[]{ "MovementId", "AnimationId", "PokemonType", "Power", "AccuracyChance", "CriticalChance", "HealScalar", "StaminaLossScalar", "TrainerLevelMin", "TrainerLevelMax", "VfxName", "DurationMs", "DamageWindowStartMs", "DamageWindowEndMs", "EnergyDelta" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MoveSettings : pb::IMessage<MoveSettings> {
+    private static readonly pb::MessageParser<MoveSettings> _parser = new pb::MessageParser<MoveSettings>(() => new MoveSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MoveSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.MoveSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSettings(MoveSettings other) : this() {
+      movementId_ = other.movementId_;
+      animationId_ = other.animationId_;
+      pokemonType_ = other.pokemonType_;
+      power_ = other.power_;
+      accuracyChance_ = other.accuracyChance_;
+      criticalChance_ = other.criticalChance_;
+      healScalar_ = other.healScalar_;
+      staminaLossScalar_ = other.staminaLossScalar_;
+      trainerLevelMin_ = other.trainerLevelMin_;
+      trainerLevelMax_ = other.trainerLevelMax_;
+      vfxName_ = other.vfxName_;
+      durationMs_ = other.durationMs_;
+      damageWindowStartMs_ = other.damageWindowStartMs_;
+      damageWindowEndMs_ = other.damageWindowEndMs_;
+      energyDelta_ = other.energyDelta_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSettings Clone() {
+      return new MoveSettings(this);
+    }
+
+    /// <summary>Field number for the "movement_id" field.</summary>
+    public const int MovementIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonMove movementId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMove MovementId {
+      get { return movementId_; }
+      set {
+        movementId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "animation_id" field.</summary>
+    public const int AnimationIdFieldNumber = 2;
+    private int animationId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AnimationId {
+      get { return animationId_; }
+      set {
+        animationId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_type" field.</summary>
+    public const int PokemonTypeFieldNumber = 3;
+    private global::POGOProtos.Enums.PokemonType pokemonType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType PokemonType {
+      get { return pokemonType_; }
+      set {
+        pokemonType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "power" field.</summary>
+    public const int PowerFieldNumber = 4;
+    private float power_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float Power {
+      get { return power_; }
+      set {
+        power_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "accuracy_chance" field.</summary>
+    public const int AccuracyChanceFieldNumber = 5;
+    private float accuracyChance_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AccuracyChance {
+      get { return accuracyChance_; }
+      set {
+        accuracyChance_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "critical_chance" field.</summary>
+    public const int CriticalChanceFieldNumber = 6;
+    private float criticalChance_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CriticalChance {
+      get { return criticalChance_; }
+      set {
+        criticalChance_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "heal_scalar" field.</summary>
+    public const int HealScalarFieldNumber = 7;
+    private float healScalar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float HealScalar {
+      get { return healScalar_; }
+      set {
+        healScalar_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina_loss_scalar" field.</summary>
+    public const int StaminaLossScalarFieldNumber = 8;
+    private float staminaLossScalar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaminaLossScalar {
+      get { return staminaLossScalar_; }
+      set {
+        staminaLossScalar_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_level_min" field.</summary>
+    public const int TrainerLevelMinFieldNumber = 9;
+    private int trainerLevelMin_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TrainerLevelMin {
+      get { return trainerLevelMin_; }
+      set {
+        trainerLevelMin_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_level_max" field.</summary>
+    public const int TrainerLevelMaxFieldNumber = 10;
+    private int trainerLevelMax_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TrainerLevelMax {
+      get { return trainerLevelMax_; }
+      set {
+        trainerLevelMax_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "vfx_name" field.</summary>
+    public const int VfxNameFieldNumber = 11;
+    private string vfxName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string VfxName {
+      get { return vfxName_; }
+      set {
+        vfxName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "duration_ms" field.</summary>
+    public const int DurationMsFieldNumber = 12;
+    private int durationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DurationMs {
+      get { return durationMs_; }
+      set {
+        durationMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_window_start_ms" field.</summary>
+    public const int DamageWindowStartMsFieldNumber = 13;
+    private int damageWindowStartMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DamageWindowStartMs {
+      get { return damageWindowStartMs_; }
+      set {
+        damageWindowStartMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_window_end_ms" field.</summary>
+    public const int DamageWindowEndMsFieldNumber = 14;
+    private int damageWindowEndMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DamageWindowEndMs {
+      get { return damageWindowEndMs_; }
+      set {
+        damageWindowEndMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "energy_delta" field.</summary>
+    public const int EnergyDeltaFieldNumber = 15;
+    private int energyDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EnergyDelta {
+      get { return energyDelta_; }
+      set {
+        energyDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MoveSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MoveSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (MovementId != other.MovementId) return false;
+      if (AnimationId != other.AnimationId) return false;
+      if (PokemonType != other.PokemonType) return false;
+      if (Power != other.Power) return false;
+      if (AccuracyChance != other.AccuracyChance) return false;
+      if (CriticalChance != other.CriticalChance) return false;
+      if (HealScalar != other.HealScalar) return false;
+      if (StaminaLossScalar != other.StaminaLossScalar) return false;
+      if (TrainerLevelMin != other.TrainerLevelMin) return false;
+      if (TrainerLevelMax != other.TrainerLevelMax) return false;
+      if (VfxName != other.VfxName) return false;
+      if (DurationMs != other.DurationMs) return false;
+      if (DamageWindowStartMs != other.DamageWindowStartMs) return false;
+      if (DamageWindowEndMs != other.DamageWindowEndMs) return false;
+      if (EnergyDelta != other.EnergyDelta) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (MovementId != 0) hash ^= MovementId.GetHashCode();
+      if (AnimationId != 0) hash ^= AnimationId.GetHashCode();
+      if (PokemonType != 0) hash ^= PokemonType.GetHashCode();
+      if (Power != 0F) hash ^= Power.GetHashCode();
+      if (AccuracyChance != 0F) hash ^= AccuracyChance.GetHashCode();
+      if (CriticalChance != 0F) hash ^= CriticalChance.GetHashCode();
+      if (HealScalar != 0F) hash ^= HealScalar.GetHashCode();
+      if (StaminaLossScalar != 0F) hash ^= StaminaLossScalar.GetHashCode();
+      if (TrainerLevelMin != 0) hash ^= TrainerLevelMin.GetHashCode();
+      if (TrainerLevelMax != 0) hash ^= TrainerLevelMax.GetHashCode();
+      if (VfxName.Length != 0) hash ^= VfxName.GetHashCode();
+      if (DurationMs != 0) hash ^= DurationMs.GetHashCode();
+      if (DamageWindowStartMs != 0) hash ^= DamageWindowStartMs.GetHashCode();
+      if (DamageWindowEndMs != 0) hash ^= DamageWindowEndMs.GetHashCode();
+      if (EnergyDelta != 0) hash ^= EnergyDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (MovementId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) MovementId);
+      }
+      if (AnimationId != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(AnimationId);
+      }
+      if (PokemonType != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) PokemonType);
+      }
+      if (Power != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(Power);
+      }
+      if (AccuracyChance != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(AccuracyChance);
+      }
+      if (CriticalChance != 0F) {
+        output.WriteRawTag(53);
+        output.WriteFloat(CriticalChance);
+      }
+      if (HealScalar != 0F) {
+        output.WriteRawTag(61);
+        output.WriteFloat(HealScalar);
+      }
+      if (StaminaLossScalar != 0F) {
+        output.WriteRawTag(69);
+        output.WriteFloat(StaminaLossScalar);
+      }
+      if (TrainerLevelMin != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(TrainerLevelMin);
+      }
+      if (TrainerLevelMax != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(TrainerLevelMax);
+      }
+      if (VfxName.Length != 0) {
+        output.WriteRawTag(90);
+        output.WriteString(VfxName);
+      }
+      if (DurationMs != 0) {
+        output.WriteRawTag(96);
+        output.WriteInt32(DurationMs);
+      }
+      if (DamageWindowStartMs != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(DamageWindowStartMs);
+      }
+      if (DamageWindowEndMs != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(DamageWindowEndMs);
+      }
+      if (EnergyDelta != 0) {
+        output.WriteRawTag(120);
+        output.WriteInt32(EnergyDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (MovementId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) MovementId);
+      }
+      if (AnimationId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AnimationId);
+      }
+      if (PokemonType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonType);
+      }
+      if (Power != 0F) {
+        size += 1 + 4;
+      }
+      if (AccuracyChance != 0F) {
+        size += 1 + 4;
+      }
+      if (CriticalChance != 0F) {
+        size += 1 + 4;
+      }
+      if (HealScalar != 0F) {
+        size += 1 + 4;
+      }
+      if (StaminaLossScalar != 0F) {
+        size += 1 + 4;
+      }
+      if (TrainerLevelMin != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TrainerLevelMin);
+      }
+      if (TrainerLevelMax != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TrainerLevelMax);
+      }
+      if (VfxName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(VfxName);
+      }
+      if (DurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DurationMs);
+      }
+      if (DamageWindowStartMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DamageWindowStartMs);
+      }
+      if (DamageWindowEndMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DamageWindowEndMs);
+      }
+      if (EnergyDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EnergyDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MoveSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.MovementId != 0) {
+        MovementId = other.MovementId;
+      }
+      if (other.AnimationId != 0) {
+        AnimationId = other.AnimationId;
+      }
+      if (other.PokemonType != 0) {
+        PokemonType = other.PokemonType;
+      }
+      if (other.Power != 0F) {
+        Power = other.Power;
+      }
+      if (other.AccuracyChance != 0F) {
+        AccuracyChance = other.AccuracyChance;
+      }
+      if (other.CriticalChance != 0F) {
+        CriticalChance = other.CriticalChance;
+      }
+      if (other.HealScalar != 0F) {
+        HealScalar = other.HealScalar;
+      }
+      if (other.StaminaLossScalar != 0F) {
+        StaminaLossScalar = other.StaminaLossScalar;
+      }
+      if (other.TrainerLevelMin != 0) {
+        TrainerLevelMin = other.TrainerLevelMin;
+      }
+      if (other.TrainerLevelMax != 0) {
+        TrainerLevelMax = other.TrainerLevelMax;
+      }
+      if (other.VfxName.Length != 0) {
+        VfxName = other.VfxName;
+      }
+      if (other.DurationMs != 0) {
+        DurationMs = other.DurationMs;
+      }
+      if (other.DamageWindowStartMs != 0) {
+        DamageWindowStartMs = other.DamageWindowStartMs;
+      }
+      if (other.DamageWindowEndMs != 0) {
+        DamageWindowEndMs = other.DamageWindowEndMs;
+      }
+      if (other.EnergyDelta != 0) {
+        EnergyDelta = other.EnergyDelta;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            movementId_ = (global::POGOProtos.Enums.PokemonMove) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            AnimationId = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            pokemonType_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+          case 37: {
+            Power = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            AccuracyChance = input.ReadFloat();
+            break;
+          }
+          case 53: {
+            CriticalChance = input.ReadFloat();
+            break;
+          }
+          case 61: {
+            HealScalar = input.ReadFloat();
+            break;
+          }
+          case 69: {
+            StaminaLossScalar = input.ReadFloat();
+            break;
+          }
+          case 72: {
+            TrainerLevelMin = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            TrainerLevelMax = input.ReadInt32();
+            break;
+          }
+          case 90: {
+            VfxName = input.ReadString();
+            break;
+          }
+          case 96: {
+            DurationMs = input.ReadInt32();
+            break;
+          }
+          case 104: {
+            DamageWindowStartMs = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            DamageWindowEndMs = input.ReadInt32();
+            break;
+          }
+          case 120: {
+            EnergyDelta = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/POGOProtosSettingsMaster.cs b/PokemonGo/POGOProtos/Settings/Master/POGOProtosSettingsMaster.cs
new file mode 100644
index 0000000..17a9349
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/POGOProtosSettingsMaster.cs
@@ -0,0 +1,4674 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Settings.Master.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Settings.Master.proto</summary>
+  public static partial class POGOProtosSettingsMasterReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Settings.Master.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosSettingsMasterReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiBQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5wcm90bxIaUE9HT1Byb3Rv",
+            "cy5TZXR0aW5ncy5NYXN0ZXIaFlBPR09Qcm90b3MuRW51bXMucHJvdG8aH1BP",
+            "R09Qcm90b3MuSW52ZW50b3J5Lkl0ZW0ucHJvdG8aKFBPR09Qcm90b3MuU2V0",
+            "dGluZ3MuTWFzdGVyLlBva2Vtb24ucHJvdG8aJVBPR09Qcm90b3MuU2V0dGlu",
+            "Z3MuTWFzdGVyLkl0ZW0ucHJvdG8ihAEKFlBva2Vtb25VcGdyYWRlU2V0dGlu",
+            "Z3MSGgoSdXBncmFkZXNfcGVyX2xldmVsGAEgASgFEiMKG2FsbG93ZWRfbGV2",
+            "ZWxzX2Fib3ZlX3BsYXllchgCIAEoBRISCgpjYW5keV9jb3N0GAMgAygFEhUK",
+            "DXN0YXJkdXN0X2Nvc3QYBCADKAUiKAoUTW92ZVNlcXVlbmNlU2V0dGluZ3MS",
+            "EAoIc2VxdWVuY2UYASADKAkisQMKDE1vdmVTZXR0aW5ncxIyCgttb3ZlbWVu",
+            "dF9pZBgBIAEoDjIdLlBPR09Qcm90b3MuRW51bXMuUG9rZW1vbk1vdmUSFAoM",
+            "YW5pbWF0aW9uX2lkGAIgASgFEjMKDHBva2Vtb25fdHlwZRgDIAEoDjIdLlBP",
+            "R09Qcm90b3MuRW51bXMuUG9rZW1vblR5cGUSDQoFcG93ZXIYBCABKAISFwoP",
+            "YWNjdXJhY3lfY2hhbmNlGAUgASgCEhcKD2NyaXRpY2FsX2NoYW5jZRgGIAEo",
+            "AhITCgtoZWFsX3NjYWxhchgHIAEoAhIbChNzdGFtaW5hX2xvc3Nfc2NhbGFy",
+            "GAggASgCEhkKEXRyYWluZXJfbGV2ZWxfbWluGAkgASgFEhkKEXRyYWluZXJf",
+            "bGV2ZWxfbWF4GAogASgFEhAKCHZmeF9uYW1lGAsgASgJEhMKC2R1cmF0aW9u",
+            "X21zGAwgASgFEh4KFmRhbWFnZV93aW5kb3dfc3RhcnRfbXMYDSABKAUSHAoU",
+            "ZGFtYWdlX3dpbmRvd19lbmRfbXMYDiABKAUSFAoMZW5lcmd5X2RlbHRhGA8g",
+            "ASgFImUKDUJhZGdlU2V0dGluZ3MSLwoKYmFkZ2VfdHlwZRgBIAEoDjIbLlBP",
+            "R09Qcm90b3MuRW51bXMuQmFkZ2VUeXBlEhIKCmJhZGdlX3JhbmsYAiABKAUS",
+            "DwoHdGFyZ2V0cxgDIAMoBSKvAQoOSWFwSXRlbURpc3BsYXkSCwoDc2t1GAEg",
+            "ASgJEjcKCGNhdGVnb3J5GAIgASgOMiUuUE9HT1Byb3Rvcy5FbnVtcy5Ib2xv",
+            "SWFwSXRlbUNhdGVnb3J5EhIKCnNvcnRfb3JkZXIYAyABKAUSMwoIaXRlbV9p",
+            "ZHMYBCADKA4yIS5QT0dPUHJvdG9zLkludmVudG9yeS5JdGVtLkl0ZW1JZBIO",
+            "CgZjb3VudHMYBSADKAUilAcKD1Bva2Vtb25TZXR0aW5ncxIvCgpwb2tlbW9u",
+            "X2lkGAEgASgOMhsuUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uSWQSEwoLbW9k",
+            "ZWxfc2NhbGUYAyABKAISKwoEdHlwZRgEIAEoDjIdLlBPR09Qcm90b3MuRW51",
+            "bXMuUG9rZW1vblR5cGUSLQoGdHlwZV8yGAUgASgOMh0uUE9HT1Byb3Rvcy5F",
+            "bnVtcy5Qb2tlbW9uVHlwZRJECgZjYW1lcmEYBiABKAsyNC5QT0dPUHJvdG9z",
+            "LlNldHRpbmdzLk1hc3Rlci5Qb2tlbW9uLkNhbWVyYUF0dHJpYnV0ZXMSSgoJ",
+            "ZW5jb3VudGVyGAcgASgLMjcuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIu",
+            "UG9rZW1vbi5FbmNvdW50ZXJBdHRyaWJ1dGVzEkIKBXN0YXRzGAggASgLMjMu",
+            "UE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuUG9rZW1vbi5TdGF0c0F0dHJp",
+            "YnV0ZXMSMgoLcXVpY2tfbW92ZXMYCSADKA4yHS5QT0dPUHJvdG9zLkVudW1z",
+            "LlBva2Vtb25Nb3ZlEjYKD2NpbmVtYXRpY19tb3ZlcxgKIAMoDjIdLlBPR09Q",
+            "cm90b3MuRW51bXMuUG9rZW1vbk1vdmUSFgoOYW5pbWF0aW9uX3RpbWUYCyAD",
+            "KAISMgoNZXZvbHV0aW9uX2lkcxgMIAMoDjIbLlBPR09Qcm90b3MuRW51bXMu",
+            "UG9rZW1vbklkEhYKDmV2b2x1dGlvbl9waXBzGA0gASgFEi8KBnJhcml0eRgO",
+            "IAEoDjIfLlBPR09Qcm90b3MuRW51bXMuUG9rZW1vblJhcml0eRIYChBwb2tl",
+            "ZGV4X2hlaWdodF9tGA8gASgCEhkKEXBva2VkZXhfd2VpZ2h0X2tnGBAgASgC",
+            "EjYKEXBhcmVudF9wb2tlbW9uX2lkGBEgASgOMhsuUE9HT1Byb3Rvcy5FbnVt",
+            "cy5Qb2tlbW9uSWQSFgoOaGVpZ2h0X3N0ZF9kZXYYEiABKAISFgoOd2VpZ2h0",
+            "X3N0ZF9kZXYYEyABKAISHAoUa21fZGlzdGFuY2VfdG9faGF0Y2gYFCABKAIS",
+            "NAoJZmFtaWx5X2lkGBUgASgOMiEuUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9u",
+            "RmFtaWx5SWQSFwoPY2FuZHlfdG9fZXZvbHZlGBYgASgFItcDCg5DYW1lcmFT",
+            "ZXR0aW5ncxITCgtuZXh0X2NhbWVyYRgBIAEoCRI8Cg1pbnRlcnBvbGF0aW9u",
+            "GAIgAygOMiUuUE9HT1Byb3Rvcy5FbnVtcy5DYW1lcmFJbnRlcnBvbGF0aW9u",
+            "EjMKC3RhcmdldF90eXBlGAMgAygOMh4uUE9HT1Byb3Rvcy5FbnVtcy5DYW1l",
+            "cmFUYXJnZXQSFQoNZWFzZV9pbl9zcGVlZBgEIAMoAhIWCg5lYXN0X291dF9z",
+            "cGVlZBgFIAMoAhIYChBkdXJhdGlvbl9zZWNvbmRzGAYgAygCEhQKDHdhaXRf",
+            "c2Vjb25kcxgHIAMoAhIaChJ0cmFuc2l0aW9uX3NlY29uZHMYCCADKAISFAoM",
+            "YW5nbGVfZGVncmVlGAkgAygCEhsKE2FuZ2xlX29mZnNldF9kZWdyZWUYCiAD",
+            "KAISFAoMcGl0Y2hfZGVncmVlGAsgAygCEhsKE3BpdGNoX29mZnNldF9kZWdy",
+            "ZWUYDCADKAISEwoLcm9sbF9kZWdyZWUYDSADKAISFwoPZGlzdGFuY2VfbWV0",
+            "ZXJzGA4gAygCEhYKDmhlaWdodF9wZXJjZW50GA8gAygCEhYKDnZlcnRfY3Ry",
+            "X3JhdGlvGBAgAygCIsYDChFHeW1CYXR0bGVTZXR0aW5ncxIWCg5lbmVyZ3lf",
+            "cGVyX3NlYxgBIAEoAhIZChFkb2RnZV9lbmVyZ3lfY29zdBgCIAEoAhIYChBy",
+            "ZXRhcmdldF9zZWNvbmRzGAMgASgCEh0KFWVuZW15X2F0dGFja19pbnRlcnZh",
+            "bBgEIAEoAhIeChZhdHRhY2tfc2VydmVyX2ludGVydmFsGAUgASgCEh4KFnJv",
+            "dW5kX2R1cmF0aW9uX3NlY29uZHMYBiABKAISIwobYm9udXNfdGltZV9wZXJf",
+            "YWxseV9zZWNvbmRzGAcgASgCEiQKHG1heGltdW1fYXR0YWNrZXJzX3Blcl9i",
+            "YXR0bGUYCCABKAUSKQohc2FtZV90eXBlX2F0dGFja19ib251c19tdWx0aXBs",
+            "aWVyGAkgASgCEhYKDm1heGltdW1fZW5lcmd5GAogASgFEiQKHGVuZXJneV9k",
+            "ZWx0YV9wZXJfaGVhbHRoX2xvc3QYCyABKAISGQoRZG9kZ2VfZHVyYXRpb25f",
+            "bXMYDCABKAUSHAoUbWluaW11bV9wbGF5ZXJfbGV2ZWwYDSABKAUSGAoQc3dh",
+            "cF9kdXJhdGlvbl9tcxgOIAEoBSJ5ChVFcXVpcHBlZEJhZGdlU2V0dGluZ3MS",
+            "HwoXZXF1aXBfYmFkZ2VfY29vbGRvd25fbXMYASABKAMSHwoXY2F0Y2hfcHJv",
+            "YmFiaWxpdHlfYm9udXMYAiADKAISHgoWZmxlZV9wcm9iYWJpbGl0eV9ib251",
+            "cxgDIAMoAiKMAgoLSWFwU2V0dGluZ3MSGQoRZGFpbHlfYm9udXNfY29pbnMY",
+            "ASABKAUSKAogZGFpbHlfZGVmZW5kZXJfYm9udXNfcGVyX3Bva2Vtb24YAiAD",
+            "KAUSKgoiZGFpbHlfZGVmZW5kZXJfYm9udXNfbWF4X2RlZmVuZGVycxgDIAEo",
+            "BRIlCh1kYWlseV9kZWZlbmRlcl9ib251c19jdXJyZW5jeRgEIAMoCRIiChpt",
+            "aW5fdGltZV9iZXR3ZWVuX2NsYWltc19tcxgFIAEoAxIbChNkYWlseV9ib251",
+            "c19lbmFibGVkGAYgASgIEiQKHGRhaWx5X2RlZmVuZGVyX2JvbnVzX2VuYWJs",
+            "ZWQYByABKAgitQcKDEl0ZW1TZXR0aW5ncxIyCgdpdGVtX2lkGAEgASgOMiEu",
+            "UE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtSWQSNgoJaXRlbV90eXBl",
+            "GAIgASgOMiMuUE9HT1Byb3Rvcy5JbnZlbnRvcnkuSXRlbS5JdGVtVHlwZRIw",
+            "CghjYXRlZ29yeRgDIAEoDjIeLlBPR09Qcm90b3MuRW51bXMuSXRlbUNhdGVn",
+            "b3J5EhEKCWRyb3BfZnJlcRgEIAEoAhIaChJkcm9wX3RyYWluZXJfbGV2ZWwY",
+            "BSABKAUSRQoIcG9rZWJhbGwYBiABKAsyMy5QT0dPUHJvdG9zLlNldHRpbmdz",
+            "Lk1hc3Rlci5JdGVtLlBva2ViYWxsQXR0cmlidXRlcxJBCgZwb3Rpb24YByAB",
+            "KAsyMS5QT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVtLlBvdGlvbkF0",
+            "dHJpYnV0ZXMSQQoGcmV2aXZlGAggASgLMjEuUE9HT1Byb3Rvcy5TZXR0aW5n",
+            "cy5NYXN0ZXIuSXRlbS5SZXZpdmVBdHRyaWJ1dGVzEkEKBmJhdHRsZRgJIAEo",
+            "CzIxLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0uQmF0dGxlQXR0",
+            "cmlidXRlcxI9CgRmb29kGAogASgLMi8uUE9HT1Byb3Rvcy5TZXR0aW5ncy5N",
+            "YXN0ZXIuSXRlbS5Gb29kQXR0cmlidXRlcxJWChFpbnZlbnRvcnlfdXBncmFk",
+            "ZRgLIAEoCzI7LlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0ZW0uSW52",
+            "ZW50b3J5VXBncmFkZUF0dHJpYnV0ZXMSTAoIeHBfYm9vc3QYDCABKAsyOi5Q",
+            "T0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5JdGVtLkV4cGVyaWVuY2VCb29z",
+            "dEF0dHJpYnV0ZXMSQwoHaW5jZW5zZRgNIAEoCzIyLlBPR09Qcm90b3MuU2V0",
+            "dGluZ3MuTWFzdGVyLkl0ZW0uSW5jZW5zZUF0dHJpYnV0ZXMSTgoNZWdnX2lu",
+            "Y3ViYXRvchgOIAEoCzI3LlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLkl0",
+            "ZW0uRWdnSW5jdWJhdG9yQXR0cmlidXRlcxJOCg1mb3J0X21vZGlmaWVyGA8g",
+            "ASgLMjcuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuSXRlbS5Gb3J0TW9k",
+            "aWZpZXJBdHRyaWJ1dGVzIp0BChNQbGF5ZXJMZXZlbFNldHRpbmdzEhAKCHJh",
+            "bmtfbnVtGAEgAygFEhsKE3JlcXVpcmVkX2V4cGVyaWVuY2UYAiADKAUSFQoN",
+            "Y3BfbXVsdGlwbGllchgDIAMoAhIcChRtYXhfZWdnX3BsYXllcl9sZXZlbBgE",
+            "IAEoBRIiChptYXhfZW5jb3VudGVyX3BsYXllcl9sZXZlbBgFIAEoBSJ3ChBH",
+            "eW1MZXZlbFNldHRpbmdzEhsKE3JlcXVpcmVkX2V4cGVyaWVuY2UYASADKAUS",
+            "FAoMbGVhZGVyX3Nsb3RzGAIgAygFEhUKDXRyYWluZXJfc2xvdHMYAyADKAUS",
+            "GQoRc2VhcmNoX3JvbGxfYm9udXMYBCADKAUiYgoVVHlwZUVmZmVjdGl2ZVNl",
+            "dHRpbmdzEhUKDWF0dGFja19zY2FsYXIYASADKAISMgoLYXR0YWNrX3R5cGUY",
+            "AiABKA4yHS5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25UeXBlIq4BChFFbmNv",
+            "dW50ZXJTZXR0aW5ncxIcChRzcGluX2JvbnVzX3RocmVzaG9sZBgBIAEoAhIh",
+            "ChlleGNlbGxlbnRfdGhyb3dfdGhyZXNob2xkGAIgASgCEh0KFWdyZWF0X3Ro",
+            "cm93X3RocmVzaG9sZBgDIAEoAhIcChRuaWNlX3Rocm93X3RocmVzaG9sZBgE",
+            "IAEoAhIbChNtaWxlc3RvbmVfdGhyZXNob2xkGAUgASgFUABQAVACUANiBnBy",
+            "b3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, global::POGOProtos.Inventory.Item.POGOProtosInventoryItemReflection.Descriptor, global::POGOProtos.Settings.Master.Pokemon.POGOProtosSettingsMasterPokemonReflection.Descriptor, global::POGOProtos.Settings.Master.Item.POGOProtosSettingsMasterItemReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.PokemonUpgradeSettings), global::POGOProtos.Settings.Master.PokemonUpgradeSettings.Parser, new[]{ "UpgradesPerLevel", "AllowedLevelsAbovePlayer", "CandyCost", "StardustCost" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.MoveSequenceSettings), global::POGOProtos.Settings.Master.MoveSequenceSettings.Parser, new[]{ "Sequence" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.MoveSettings), global::POGOProtos.Settings.Master.MoveSettings.Parser, new[]{ "MovementId", "AnimationId", "PokemonType", "Power", "AccuracyChance", "CriticalChance", "HealScalar", "StaminaLossScalar", "TrainerLevelMin", "TrainerLevelMax", "VfxName", "DurationMs", "DamageWindowStartMs", "DamageWindowEndMs", "EnergyDelta" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.BadgeSettings), global::POGOProtos.Settings.Master.BadgeSettings.Parser, new[]{ "BadgeType", "BadgeRank", "Targets" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.IapItemDisplay), global::POGOProtos.Settings.Master.IapItemDisplay.Parser, new[]{ "Sku", "Category", "SortOrder", "ItemIds", "Counts" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.PokemonSettings), global::POGOProtos.Settings.Master.PokemonSettings.Parser, new[]{ "PokemonId", "ModelScale", "Type", "Type2", "Camera", "Encounter", "Stats", "QuickMoves", "CinematicMoves", "AnimationTime", "EvolutionIds", "EvolutionPips", "Rarity", "PokedexHeightM", "PokedexWeightKg", "ParentPokemonId", "HeightStdDev", "WeightStdDev", "KmDistanceToHatch", "FamilyId", "CandyToEvolve" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.CameraSettings), global::POGOProtos.Settings.Master.CameraSettings.Parser, new[]{ "NextCamera", "Interpolation", "TargetType", "EaseInSpeed", "EastOutSpeed", "DurationSeconds", "WaitSeconds", "TransitionSeconds", "AngleDegree", "AngleOffsetDegree", "PitchDegree", "PitchOffsetDegree", "RollDegree", "DistanceMeters", "HeightPercent", "VertCtrRatio" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.GymBattleSettings), global::POGOProtos.Settings.Master.GymBattleSettings.Parser, new[]{ "EnergyPerSec", "DodgeEnergyCost", "RetargetSeconds", "EnemyAttackInterval", "AttackServerInterval", "RoundDurationSeconds", "BonusTimePerAllySeconds", "MaximumAttackersPerBattle", "SameTypeAttackBonusMultiplier", "MaximumEnergy", "EnergyDeltaPerHealthLost", "DodgeDurationMs", "MinimumPlayerLevel", "SwapDurationMs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.EquippedBadgeSettings), global::POGOProtos.Settings.Master.EquippedBadgeSettings.Parser, new[]{ "EquipBadgeCooldownMs", "CatchProbabilityBonus", "FleeProbabilityBonus" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.IapSettings), global::POGOProtos.Settings.Master.IapSettings.Parser, new[]{ "DailyBonusCoins", "DailyDefenderBonusPerPokemon", "DailyDefenderBonusMaxDefenders", "DailyDefenderBonusCurrency", "MinTimeBetweenClaimsMs", "DailyBonusEnabled", "DailyDefenderBonusEnabled" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.ItemSettings), global::POGOProtos.Settings.Master.ItemSettings.Parser, new[]{ "ItemId", "ItemType", "Category", "DropFreq", "DropTrainerLevel", "Pokeball", "Potion", "Revive", "Battle", "Food", "InventoryUpgrade", "XpBoost", "Incense", "EggIncubator", "FortModifier" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.PlayerLevelSettings), global::POGOProtos.Settings.Master.PlayerLevelSettings.Parser, new[]{ "RankNum", "RequiredExperience", "CpMultiplier", "MaxEggPlayerLevel", "MaxEncounterPlayerLevel" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.GymLevelSettings), global::POGOProtos.Settings.Master.GymLevelSettings.Parser, new[]{ "RequiredExperience", "LeaderSlots", "TrainerSlots", "SearchRollBonus" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.TypeEffectiveSettings), global::POGOProtos.Settings.Master.TypeEffectiveSettings.Parser, new[]{ "AttackScalar", "AttackType" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.EncounterSettings), global::POGOProtos.Settings.Master.EncounterSettings.Parser, new[]{ "SpinBonusThreshold", "ExcellentThrowThreshold", "GreatThrowThreshold", "NiceThrowThreshold", "MilestoneThreshold" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PokemonUpgradeSettings : pb::IMessage<PokemonUpgradeSettings> {
+    private static readonly pb::MessageParser<PokemonUpgradeSettings> _parser = new pb::MessageParser<PokemonUpgradeSettings>(() => new PokemonUpgradeSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokemonUpgradeSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonUpgradeSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonUpgradeSettings(PokemonUpgradeSettings other) : this() {
+      upgradesPerLevel_ = other.upgradesPerLevel_;
+      allowedLevelsAbovePlayer_ = other.allowedLevelsAbovePlayer_;
+      candyCost_ = other.candyCost_.Clone();
+      stardustCost_ = other.stardustCost_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonUpgradeSettings Clone() {
+      return new PokemonUpgradeSettings(this);
+    }
+
+    /// <summary>Field number for the "upgrades_per_level" field.</summary>
+    public const int UpgradesPerLevelFieldNumber = 1;
+    private int upgradesPerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int UpgradesPerLevel {
+      get { return upgradesPerLevel_; }
+      set {
+        upgradesPerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "allowed_levels_above_player" field.</summary>
+    public const int AllowedLevelsAbovePlayerFieldNumber = 2;
+    private int allowedLevelsAbovePlayer_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AllowedLevelsAbovePlayer {
+      get { return allowedLevelsAbovePlayer_; }
+      set {
+        allowedLevelsAbovePlayer_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_cost" field.</summary>
+    public const int CandyCostFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_candyCost_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> candyCost_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> CandyCost {
+      get { return candyCost_; }
+    }
+
+    /// <summary>Field number for the "stardust_cost" field.</summary>
+    public const int StardustCostFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_stardustCost_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> stardustCost_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> StardustCost {
+      get { return stardustCost_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokemonUpgradeSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokemonUpgradeSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (UpgradesPerLevel != other.UpgradesPerLevel) return false;
+      if (AllowedLevelsAbovePlayer != other.AllowedLevelsAbovePlayer) return false;
+      if(!candyCost_.Equals(other.candyCost_)) return false;
+      if(!stardustCost_.Equals(other.stardustCost_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (UpgradesPerLevel != 0) hash ^= UpgradesPerLevel.GetHashCode();
+      if (AllowedLevelsAbovePlayer != 0) hash ^= AllowedLevelsAbovePlayer.GetHashCode();
+      hash ^= candyCost_.GetHashCode();
+      hash ^= stardustCost_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (UpgradesPerLevel != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(UpgradesPerLevel);
+      }
+      if (AllowedLevelsAbovePlayer != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(AllowedLevelsAbovePlayer);
+      }
+      candyCost_.WriteTo(output, _repeated_candyCost_codec);
+      stardustCost_.WriteTo(output, _repeated_stardustCost_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (UpgradesPerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(UpgradesPerLevel);
+      }
+      if (AllowedLevelsAbovePlayer != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AllowedLevelsAbovePlayer);
+      }
+      size += candyCost_.CalculateSize(_repeated_candyCost_codec);
+      size += stardustCost_.CalculateSize(_repeated_stardustCost_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokemonUpgradeSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.UpgradesPerLevel != 0) {
+        UpgradesPerLevel = other.UpgradesPerLevel;
+      }
+      if (other.AllowedLevelsAbovePlayer != 0) {
+        AllowedLevelsAbovePlayer = other.AllowedLevelsAbovePlayer;
+      }
+      candyCost_.Add(other.candyCost_);
+      stardustCost_.Add(other.stardustCost_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            UpgradesPerLevel = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            AllowedLevelsAbovePlayer = input.ReadInt32();
+            break;
+          }
+          case 26:
+          case 24: {
+            candyCost_.AddEntriesFrom(input, _repeated_candyCost_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            stardustCost_.AddEntriesFrom(input, _repeated_stardustCost_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class MoveSequenceSettings : pb::IMessage<MoveSequenceSettings> {
+    private static readonly pb::MessageParser<MoveSequenceSettings> _parser = new pb::MessageParser<MoveSequenceSettings>(() => new MoveSequenceSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MoveSequenceSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSequenceSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSequenceSettings(MoveSequenceSettings other) : this() {
+      sequence_ = other.sequence_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSequenceSettings Clone() {
+      return new MoveSequenceSettings(this);
+    }
+
+    /// <summary>Field number for the "sequence" field.</summary>
+    public const int SequenceFieldNumber = 1;
+    private static readonly pb::FieldCodec<string> _repeated_sequence_codec
+        = pb::FieldCodec.ForString(10);
+    private readonly pbc::RepeatedField<string> sequence_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> Sequence {
+      get { return sequence_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MoveSequenceSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MoveSequenceSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!sequence_.Equals(other.sequence_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= sequence_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      sequence_.WriteTo(output, _repeated_sequence_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += sequence_.CalculateSize(_repeated_sequence_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MoveSequenceSettings other) {
+      if (other == null) {
+        return;
+      }
+      sequence_.Add(other.sequence_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            sequence_.AddEntriesFrom(input, _repeated_sequence_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class MoveSettings : pb::IMessage<MoveSettings> {
+    private static readonly pb::MessageParser<MoveSettings> _parser = new pb::MessageParser<MoveSettings>(() => new MoveSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MoveSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSettings(MoveSettings other) : this() {
+      movementId_ = other.movementId_;
+      animationId_ = other.animationId_;
+      pokemonType_ = other.pokemonType_;
+      power_ = other.power_;
+      accuracyChance_ = other.accuracyChance_;
+      criticalChance_ = other.criticalChance_;
+      healScalar_ = other.healScalar_;
+      staminaLossScalar_ = other.staminaLossScalar_;
+      trainerLevelMin_ = other.trainerLevelMin_;
+      trainerLevelMax_ = other.trainerLevelMax_;
+      vfxName_ = other.vfxName_;
+      durationMs_ = other.durationMs_;
+      damageWindowStartMs_ = other.damageWindowStartMs_;
+      damageWindowEndMs_ = other.damageWindowEndMs_;
+      energyDelta_ = other.energyDelta_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MoveSettings Clone() {
+      return new MoveSettings(this);
+    }
+
+    /// <summary>Field number for the "movement_id" field.</summary>
+    public const int MovementIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonMove movementId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMove MovementId {
+      get { return movementId_; }
+      set {
+        movementId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "animation_id" field.</summary>
+    public const int AnimationIdFieldNumber = 2;
+    private int animationId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AnimationId {
+      get { return animationId_; }
+      set {
+        animationId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokemon_type" field.</summary>
+    public const int PokemonTypeFieldNumber = 3;
+    private global::POGOProtos.Enums.PokemonType pokemonType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType PokemonType {
+      get { return pokemonType_; }
+      set {
+        pokemonType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "power" field.</summary>
+    public const int PowerFieldNumber = 4;
+    private float power_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float Power {
+      get { return power_; }
+      set {
+        power_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "accuracy_chance" field.</summary>
+    public const int AccuracyChanceFieldNumber = 5;
+    private float accuracyChance_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AccuracyChance {
+      get { return accuracyChance_; }
+      set {
+        accuracyChance_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "critical_chance" field.</summary>
+    public const int CriticalChanceFieldNumber = 6;
+    private float criticalChance_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CriticalChance {
+      get { return criticalChance_; }
+      set {
+        criticalChance_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "heal_scalar" field.</summary>
+    public const int HealScalarFieldNumber = 7;
+    private float healScalar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float HealScalar {
+      get { return healScalar_; }
+      set {
+        healScalar_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stamina_loss_scalar" field.</summary>
+    public const int StaminaLossScalarFieldNumber = 8;
+    private float staminaLossScalar_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float StaminaLossScalar {
+      get { return staminaLossScalar_; }
+      set {
+        staminaLossScalar_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_level_min" field.</summary>
+    public const int TrainerLevelMinFieldNumber = 9;
+    private int trainerLevelMin_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TrainerLevelMin {
+      get { return trainerLevelMin_; }
+      set {
+        trainerLevelMin_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_level_max" field.</summary>
+    public const int TrainerLevelMaxFieldNumber = 10;
+    private int trainerLevelMax_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int TrainerLevelMax {
+      get { return trainerLevelMax_; }
+      set {
+        trainerLevelMax_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "vfx_name" field.</summary>
+    public const int VfxNameFieldNumber = 11;
+    private string vfxName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string VfxName {
+      get { return vfxName_; }
+      set {
+        vfxName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "duration_ms" field.</summary>
+    public const int DurationMsFieldNumber = 12;
+    private int durationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DurationMs {
+      get { return durationMs_; }
+      set {
+        durationMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_window_start_ms" field.</summary>
+    public const int DamageWindowStartMsFieldNumber = 13;
+    private int damageWindowStartMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DamageWindowStartMs {
+      get { return damageWindowStartMs_; }
+      set {
+        damageWindowStartMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "damage_window_end_ms" field.</summary>
+    public const int DamageWindowEndMsFieldNumber = 14;
+    private int damageWindowEndMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DamageWindowEndMs {
+      get { return damageWindowEndMs_; }
+      set {
+        damageWindowEndMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "energy_delta" field.</summary>
+    public const int EnergyDeltaFieldNumber = 15;
+    private int energyDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EnergyDelta {
+      get { return energyDelta_; }
+      set {
+        energyDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MoveSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MoveSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (MovementId != other.MovementId) return false;
+      if (AnimationId != other.AnimationId) return false;
+      if (PokemonType != other.PokemonType) return false;
+      if (Power != other.Power) return false;
+      if (AccuracyChance != other.AccuracyChance) return false;
+      if (CriticalChance != other.CriticalChance) return false;
+      if (HealScalar != other.HealScalar) return false;
+      if (StaminaLossScalar != other.StaminaLossScalar) return false;
+      if (TrainerLevelMin != other.TrainerLevelMin) return false;
+      if (TrainerLevelMax != other.TrainerLevelMax) return false;
+      if (VfxName != other.VfxName) return false;
+      if (DurationMs != other.DurationMs) return false;
+      if (DamageWindowStartMs != other.DamageWindowStartMs) return false;
+      if (DamageWindowEndMs != other.DamageWindowEndMs) return false;
+      if (EnergyDelta != other.EnergyDelta) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (MovementId != 0) hash ^= MovementId.GetHashCode();
+      if (AnimationId != 0) hash ^= AnimationId.GetHashCode();
+      if (PokemonType != 0) hash ^= PokemonType.GetHashCode();
+      if (Power != 0F) hash ^= Power.GetHashCode();
+      if (AccuracyChance != 0F) hash ^= AccuracyChance.GetHashCode();
+      if (CriticalChance != 0F) hash ^= CriticalChance.GetHashCode();
+      if (HealScalar != 0F) hash ^= HealScalar.GetHashCode();
+      if (StaminaLossScalar != 0F) hash ^= StaminaLossScalar.GetHashCode();
+      if (TrainerLevelMin != 0) hash ^= TrainerLevelMin.GetHashCode();
+      if (TrainerLevelMax != 0) hash ^= TrainerLevelMax.GetHashCode();
+      if (VfxName.Length != 0) hash ^= VfxName.GetHashCode();
+      if (DurationMs != 0) hash ^= DurationMs.GetHashCode();
+      if (DamageWindowStartMs != 0) hash ^= DamageWindowStartMs.GetHashCode();
+      if (DamageWindowEndMs != 0) hash ^= DamageWindowEndMs.GetHashCode();
+      if (EnergyDelta != 0) hash ^= EnergyDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (MovementId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) MovementId);
+      }
+      if (AnimationId != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(AnimationId);
+      }
+      if (PokemonType != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) PokemonType);
+      }
+      if (Power != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(Power);
+      }
+      if (AccuracyChance != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(AccuracyChance);
+      }
+      if (CriticalChance != 0F) {
+        output.WriteRawTag(53);
+        output.WriteFloat(CriticalChance);
+      }
+      if (HealScalar != 0F) {
+        output.WriteRawTag(61);
+        output.WriteFloat(HealScalar);
+      }
+      if (StaminaLossScalar != 0F) {
+        output.WriteRawTag(69);
+        output.WriteFloat(StaminaLossScalar);
+      }
+      if (TrainerLevelMin != 0) {
+        output.WriteRawTag(72);
+        output.WriteInt32(TrainerLevelMin);
+      }
+      if (TrainerLevelMax != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(TrainerLevelMax);
+      }
+      if (VfxName.Length != 0) {
+        output.WriteRawTag(90);
+        output.WriteString(VfxName);
+      }
+      if (DurationMs != 0) {
+        output.WriteRawTag(96);
+        output.WriteInt32(DurationMs);
+      }
+      if (DamageWindowStartMs != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(DamageWindowStartMs);
+      }
+      if (DamageWindowEndMs != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(DamageWindowEndMs);
+      }
+      if (EnergyDelta != 0) {
+        output.WriteRawTag(120);
+        output.WriteInt32(EnergyDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (MovementId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) MovementId);
+      }
+      if (AnimationId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AnimationId);
+      }
+      if (PokemonType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonType);
+      }
+      if (Power != 0F) {
+        size += 1 + 4;
+      }
+      if (AccuracyChance != 0F) {
+        size += 1 + 4;
+      }
+      if (CriticalChance != 0F) {
+        size += 1 + 4;
+      }
+      if (HealScalar != 0F) {
+        size += 1 + 4;
+      }
+      if (StaminaLossScalar != 0F) {
+        size += 1 + 4;
+      }
+      if (TrainerLevelMin != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TrainerLevelMin);
+      }
+      if (TrainerLevelMax != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(TrainerLevelMax);
+      }
+      if (VfxName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(VfxName);
+      }
+      if (DurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DurationMs);
+      }
+      if (DamageWindowStartMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DamageWindowStartMs);
+      }
+      if (DamageWindowEndMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DamageWindowEndMs);
+      }
+      if (EnergyDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EnergyDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MoveSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.MovementId != 0) {
+        MovementId = other.MovementId;
+      }
+      if (other.AnimationId != 0) {
+        AnimationId = other.AnimationId;
+      }
+      if (other.PokemonType != 0) {
+        PokemonType = other.PokemonType;
+      }
+      if (other.Power != 0F) {
+        Power = other.Power;
+      }
+      if (other.AccuracyChance != 0F) {
+        AccuracyChance = other.AccuracyChance;
+      }
+      if (other.CriticalChance != 0F) {
+        CriticalChance = other.CriticalChance;
+      }
+      if (other.HealScalar != 0F) {
+        HealScalar = other.HealScalar;
+      }
+      if (other.StaminaLossScalar != 0F) {
+        StaminaLossScalar = other.StaminaLossScalar;
+      }
+      if (other.TrainerLevelMin != 0) {
+        TrainerLevelMin = other.TrainerLevelMin;
+      }
+      if (other.TrainerLevelMax != 0) {
+        TrainerLevelMax = other.TrainerLevelMax;
+      }
+      if (other.VfxName.Length != 0) {
+        VfxName = other.VfxName;
+      }
+      if (other.DurationMs != 0) {
+        DurationMs = other.DurationMs;
+      }
+      if (other.DamageWindowStartMs != 0) {
+        DamageWindowStartMs = other.DamageWindowStartMs;
+      }
+      if (other.DamageWindowEndMs != 0) {
+        DamageWindowEndMs = other.DamageWindowEndMs;
+      }
+      if (other.EnergyDelta != 0) {
+        EnergyDelta = other.EnergyDelta;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            movementId_ = (global::POGOProtos.Enums.PokemonMove) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            AnimationId = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            pokemonType_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+          case 37: {
+            Power = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            AccuracyChance = input.ReadFloat();
+            break;
+          }
+          case 53: {
+            CriticalChance = input.ReadFloat();
+            break;
+          }
+          case 61: {
+            HealScalar = input.ReadFloat();
+            break;
+          }
+          case 69: {
+            StaminaLossScalar = input.ReadFloat();
+            break;
+          }
+          case 72: {
+            TrainerLevelMin = input.ReadInt32();
+            break;
+          }
+          case 80: {
+            TrainerLevelMax = input.ReadInt32();
+            break;
+          }
+          case 90: {
+            VfxName = input.ReadString();
+            break;
+          }
+          case 96: {
+            DurationMs = input.ReadInt32();
+            break;
+          }
+          case 104: {
+            DamageWindowStartMs = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            DamageWindowEndMs = input.ReadInt32();
+            break;
+          }
+          case 120: {
+            EnergyDelta = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class BadgeSettings : pb::IMessage<BadgeSettings> {
+    private static readonly pb::MessageParser<BadgeSettings> _parser = new pb::MessageParser<BadgeSettings>(() => new BadgeSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<BadgeSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BadgeSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BadgeSettings(BadgeSettings other) : this() {
+      badgeType_ = other.badgeType_;
+      badgeRank_ = other.badgeRank_;
+      targets_ = other.targets_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public BadgeSettings Clone() {
+      return new BadgeSettings(this);
+    }
+
+    /// <summary>Field number for the "badge_type" field.</summary>
+    public const int BadgeTypeFieldNumber = 1;
+    private global::POGOProtos.Enums.BadgeType badgeType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.BadgeType BadgeType {
+      get { return badgeType_; }
+      set {
+        badgeType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "badge_rank" field.</summary>
+    public const int BadgeRankFieldNumber = 2;
+    private int badgeRank_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BadgeRank {
+      get { return badgeRank_; }
+      set {
+        badgeRank_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "targets" field.</summary>
+    public const int TargetsFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_targets_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> targets_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Targets {
+      get { return targets_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as BadgeSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(BadgeSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BadgeType != other.BadgeType) return false;
+      if (BadgeRank != other.BadgeRank) return false;
+      if(!targets_.Equals(other.targets_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
+      if (BadgeRank != 0) hash ^= BadgeRank.GetHashCode();
+      hash ^= targets_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BadgeType != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) BadgeType);
+      }
+      if (BadgeRank != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(BadgeRank);
+      }
+      targets_.WriteTo(output, _repeated_targets_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BadgeType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) BadgeType);
+      }
+      if (BadgeRank != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BadgeRank);
+      }
+      size += targets_.CalculateSize(_repeated_targets_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(BadgeSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BadgeType != 0) {
+        BadgeType = other.BadgeType;
+      }
+      if (other.BadgeRank != 0) {
+        BadgeRank = other.BadgeRank;
+      }
+      targets_.Add(other.targets_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            badgeType_ = (global::POGOProtos.Enums.BadgeType) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            BadgeRank = input.ReadInt32();
+            break;
+          }
+          case 26:
+          case 24: {
+            targets_.AddEntriesFrom(input, _repeated_targets_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class IapItemDisplay : pb::IMessage<IapItemDisplay> {
+    private static readonly pb::MessageParser<IapItemDisplay> _parser = new pb::MessageParser<IapItemDisplay>(() => new IapItemDisplay());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IapItemDisplay> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapItemDisplay() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapItemDisplay(IapItemDisplay other) : this() {
+      sku_ = other.sku_;
+      category_ = other.category_;
+      sortOrder_ = other.sortOrder_;
+      itemIds_ = other.itemIds_.Clone();
+      counts_ = other.counts_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapItemDisplay Clone() {
+      return new IapItemDisplay(this);
+    }
+
+    /// <summary>Field number for the "sku" field.</summary>
+    public const int SkuFieldNumber = 1;
+    private string sku_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Sku {
+      get { return sku_; }
+      set {
+        sku_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "category" field.</summary>
+    public const int CategoryFieldNumber = 2;
+    private global::POGOProtos.Enums.HoloIapItemCategory category_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.HoloIapItemCategory Category {
+      get { return category_; }
+      set {
+        category_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "sort_order" field.</summary>
+    public const int SortOrderFieldNumber = 3;
+    private int sortOrder_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int SortOrder {
+      get { return sortOrder_; }
+      set {
+        sortOrder_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_ids" field.</summary>
+    public const int ItemIdsFieldNumber = 4;
+    private static readonly pb::FieldCodec<global::POGOProtos.Inventory.Item.ItemId> _repeated_itemIds_codec
+        = pb::FieldCodec.ForEnum(34, x => (int) x, x => (global::POGOProtos.Inventory.Item.ItemId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> itemIds_ = new pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Inventory.Item.ItemId> ItemIds {
+      get { return itemIds_; }
+    }
+
+    /// <summary>Field number for the "counts" field.</summary>
+    public const int CountsFieldNumber = 5;
+    private static readonly pb::FieldCodec<int> _repeated_counts_codec
+        = pb::FieldCodec.ForInt32(42);
+    private readonly pbc::RepeatedField<int> counts_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> Counts {
+      get { return counts_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IapItemDisplay);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IapItemDisplay other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Sku != other.Sku) return false;
+      if (Category != other.Category) return false;
+      if (SortOrder != other.SortOrder) return false;
+      if(!itemIds_.Equals(other.itemIds_)) return false;
+      if(!counts_.Equals(other.counts_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Sku.Length != 0) hash ^= Sku.GetHashCode();
+      if (Category != 0) hash ^= Category.GetHashCode();
+      if (SortOrder != 0) hash ^= SortOrder.GetHashCode();
+      hash ^= itemIds_.GetHashCode();
+      hash ^= counts_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Sku.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Sku);
+      }
+      if (Category != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) Category);
+      }
+      if (SortOrder != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(SortOrder);
+      }
+      itemIds_.WriteTo(output, _repeated_itemIds_codec);
+      counts_.WriteTo(output, _repeated_counts_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Sku.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Sku);
+      }
+      if (Category != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Category);
+      }
+      if (SortOrder != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(SortOrder);
+      }
+      size += itemIds_.CalculateSize(_repeated_itemIds_codec);
+      size += counts_.CalculateSize(_repeated_counts_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IapItemDisplay other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Sku.Length != 0) {
+        Sku = other.Sku;
+      }
+      if (other.Category != 0) {
+        Category = other.Category;
+      }
+      if (other.SortOrder != 0) {
+        SortOrder = other.SortOrder;
+      }
+      itemIds_.Add(other.itemIds_);
+      counts_.Add(other.counts_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Sku = input.ReadString();
+            break;
+          }
+          case 16: {
+            category_ = (global::POGOProtos.Enums.HoloIapItemCategory) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            SortOrder = input.ReadInt32();
+            break;
+          }
+          case 34:
+          case 32: {
+            itemIds_.AddEntriesFrom(input, _repeated_itemIds_codec);
+            break;
+          }
+          case 42:
+          case 40: {
+            counts_.AddEntriesFrom(input, _repeated_counts_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PokemonSettings : pb::IMessage<PokemonSettings> {
+    private static readonly pb::MessageParser<PokemonSettings> _parser = new pb::MessageParser<PokemonSettings>(() => new PokemonSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokemonSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonSettings(PokemonSettings other) : this() {
+      pokemonId_ = other.pokemonId_;
+      modelScale_ = other.modelScale_;
+      type_ = other.type_;
+      type2_ = other.type2_;
+      Camera = other.camera_ != null ? other.Camera.Clone() : null;
+      Encounter = other.encounter_ != null ? other.Encounter.Clone() : null;
+      Stats = other.stats_ != null ? other.Stats.Clone() : null;
+      quickMoves_ = other.quickMoves_.Clone();
+      cinematicMoves_ = other.cinematicMoves_.Clone();
+      animationTime_ = other.animationTime_.Clone();
+      evolutionIds_ = other.evolutionIds_.Clone();
+      evolutionPips_ = other.evolutionPips_;
+      rarity_ = other.rarity_;
+      pokedexHeightM_ = other.pokedexHeightM_;
+      pokedexWeightKg_ = other.pokedexWeightKg_;
+      parentPokemonId_ = other.parentPokemonId_;
+      heightStdDev_ = other.heightStdDev_;
+      weightStdDev_ = other.weightStdDev_;
+      kmDistanceToHatch_ = other.kmDistanceToHatch_;
+      familyId_ = other.familyId_;
+      candyToEvolve_ = other.candyToEvolve_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonSettings Clone() {
+      return new PokemonSettings(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "model_scale" field.</summary>
+    public const int ModelScaleFieldNumber = 3;
+    private float modelScale_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ModelScale {
+      get { return modelScale_; }
+      set {
+        modelScale_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type" field.</summary>
+    public const int TypeFieldNumber = 4;
+    private global::POGOProtos.Enums.PokemonType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type_2" field.</summary>
+    public const int Type2FieldNumber = 5;
+    private global::POGOProtos.Enums.PokemonType type2_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType Type2 {
+      get { return type2_; }
+      set {
+        type2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "camera" field.</summary>
+    public const int CameraFieldNumber = 6;
+    private global::POGOProtos.Settings.Master.Pokemon.CameraAttributes camera_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Pokemon.CameraAttributes Camera {
+      get { return camera_; }
+      set {
+        camera_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter" field.</summary>
+    public const int EncounterFieldNumber = 7;
+    private global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes encounter_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes Encounter {
+      get { return encounter_; }
+      set {
+        encounter_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stats" field.</summary>
+    public const int StatsFieldNumber = 8;
+    private global::POGOProtos.Settings.Master.Pokemon.StatsAttributes stats_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Pokemon.StatsAttributes Stats {
+      get { return stats_; }
+      set {
+        stats_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "quick_moves" field.</summary>
+    public const int QuickMovesFieldNumber = 9;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonMove> _repeated_quickMoves_codec
+        = pb::FieldCodec.ForEnum(74, x => (int) x, x => (global::POGOProtos.Enums.PokemonMove) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> quickMoves_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> QuickMoves {
+      get { return quickMoves_; }
+    }
+
+    /// <summary>Field number for the "cinematic_moves" field.</summary>
+    public const int CinematicMovesFieldNumber = 10;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonMove> _repeated_cinematicMoves_codec
+        = pb::FieldCodec.ForEnum(82, x => (int) x, x => (global::POGOProtos.Enums.PokemonMove) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> cinematicMoves_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> CinematicMoves {
+      get { return cinematicMoves_; }
+    }
+
+    /// <summary>Field number for the "animation_time" field.</summary>
+    public const int AnimationTimeFieldNumber = 11;
+    private static readonly pb::FieldCodec<float> _repeated_animationTime_codec
+        = pb::FieldCodec.ForFloat(90);
+    private readonly pbc::RepeatedField<float> animationTime_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AnimationTime {
+      get { return animationTime_; }
+    }
+
+    /// <summary>Field number for the "evolution_ids" field.</summary>
+    public const int EvolutionIdsFieldNumber = 12;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonId> _repeated_evolutionIds_codec
+        = pb::FieldCodec.ForEnum(98, x => (int) x, x => (global::POGOProtos.Enums.PokemonId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonId> evolutionIds_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonId> EvolutionIds {
+      get { return evolutionIds_; }
+    }
+
+    /// <summary>Field number for the "evolution_pips" field.</summary>
+    public const int EvolutionPipsFieldNumber = 13;
+    private int evolutionPips_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EvolutionPips {
+      get { return evolutionPips_; }
+      set {
+        evolutionPips_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "rarity" field.</summary>
+    public const int RarityFieldNumber = 14;
+    private global::POGOProtos.Enums.PokemonRarity rarity_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonRarity Rarity {
+      get { return rarity_; }
+      set {
+        rarity_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokedex_height_m" field.</summary>
+    public const int PokedexHeightMFieldNumber = 15;
+    private float pokedexHeightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float PokedexHeightM {
+      get { return pokedexHeightM_; }
+      set {
+        pokedexHeightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokedex_weight_kg" field.</summary>
+    public const int PokedexWeightKgFieldNumber = 16;
+    private float pokedexWeightKg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float PokedexWeightKg {
+      get { return pokedexWeightKg_; }
+      set {
+        pokedexWeightKg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "parent_pokemon_id" field.</summary>
+    public const int ParentPokemonIdFieldNumber = 17;
+    private global::POGOProtos.Enums.PokemonId parentPokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId ParentPokemonId {
+      get { return parentPokemonId_; }
+      set {
+        parentPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "height_std_dev" field.</summary>
+    public const int HeightStdDevFieldNumber = 18;
+    private float heightStdDev_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float HeightStdDev {
+      get { return heightStdDev_; }
+      set {
+        heightStdDev_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "weight_std_dev" field.</summary>
+    public const int WeightStdDevFieldNumber = 19;
+    private float weightStdDev_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float WeightStdDev {
+      get { return weightStdDev_; }
+      set {
+        weightStdDev_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "km_distance_to_hatch" field.</summary>
+    public const int KmDistanceToHatchFieldNumber = 20;
+    private float kmDistanceToHatch_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float KmDistanceToHatch {
+      get { return kmDistanceToHatch_; }
+      set {
+        kmDistanceToHatch_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "family_id" field.</summary>
+    public const int FamilyIdFieldNumber = 21;
+    private global::POGOProtos.Enums.PokemonFamilyId familyId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonFamilyId FamilyId {
+      get { return familyId_; }
+      set {
+        familyId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_to_evolve" field.</summary>
+    public const int CandyToEvolveFieldNumber = 22;
+    private int candyToEvolve_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CandyToEvolve {
+      get { return candyToEvolve_; }
+      set {
+        candyToEvolve_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokemonSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokemonSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (ModelScale != other.ModelScale) return false;
+      if (Type != other.Type) return false;
+      if (Type2 != other.Type2) return false;
+      if (!object.Equals(Camera, other.Camera)) return false;
+      if (!object.Equals(Encounter, other.Encounter)) return false;
+      if (!object.Equals(Stats, other.Stats)) return false;
+      if(!quickMoves_.Equals(other.quickMoves_)) return false;
+      if(!cinematicMoves_.Equals(other.cinematicMoves_)) return false;
+      if(!animationTime_.Equals(other.animationTime_)) return false;
+      if(!evolutionIds_.Equals(other.evolutionIds_)) return false;
+      if (EvolutionPips != other.EvolutionPips) return false;
+      if (Rarity != other.Rarity) return false;
+      if (PokedexHeightM != other.PokedexHeightM) return false;
+      if (PokedexWeightKg != other.PokedexWeightKg) return false;
+      if (ParentPokemonId != other.ParentPokemonId) return false;
+      if (HeightStdDev != other.HeightStdDev) return false;
+      if (WeightStdDev != other.WeightStdDev) return false;
+      if (KmDistanceToHatch != other.KmDistanceToHatch) return false;
+      if (FamilyId != other.FamilyId) return false;
+      if (CandyToEvolve != other.CandyToEvolve) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (ModelScale != 0F) hash ^= ModelScale.GetHashCode();
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (Type2 != 0) hash ^= Type2.GetHashCode();
+      if (camera_ != null) hash ^= Camera.GetHashCode();
+      if (encounter_ != null) hash ^= Encounter.GetHashCode();
+      if (stats_ != null) hash ^= Stats.GetHashCode();
+      hash ^= quickMoves_.GetHashCode();
+      hash ^= cinematicMoves_.GetHashCode();
+      hash ^= animationTime_.GetHashCode();
+      hash ^= evolutionIds_.GetHashCode();
+      if (EvolutionPips != 0) hash ^= EvolutionPips.GetHashCode();
+      if (Rarity != 0) hash ^= Rarity.GetHashCode();
+      if (PokedexHeightM != 0F) hash ^= PokedexHeightM.GetHashCode();
+      if (PokedexWeightKg != 0F) hash ^= PokedexWeightKg.GetHashCode();
+      if (ParentPokemonId != 0) hash ^= ParentPokemonId.GetHashCode();
+      if (HeightStdDev != 0F) hash ^= HeightStdDev.GetHashCode();
+      if (WeightStdDev != 0F) hash ^= WeightStdDev.GetHashCode();
+      if (KmDistanceToHatch != 0F) hash ^= KmDistanceToHatch.GetHashCode();
+      if (FamilyId != 0) hash ^= FamilyId.GetHashCode();
+      if (CandyToEvolve != 0) hash ^= CandyToEvolve.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (ModelScale != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(ModelScale);
+      }
+      if (Type != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Type);
+      }
+      if (Type2 != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) Type2);
+      }
+      if (camera_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Camera);
+      }
+      if (encounter_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Encounter);
+      }
+      if (stats_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(Stats);
+      }
+      quickMoves_.WriteTo(output, _repeated_quickMoves_codec);
+      cinematicMoves_.WriteTo(output, _repeated_cinematicMoves_codec);
+      animationTime_.WriteTo(output, _repeated_animationTime_codec);
+      evolutionIds_.WriteTo(output, _repeated_evolutionIds_codec);
+      if (EvolutionPips != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(EvolutionPips);
+      }
+      if (Rarity != 0) {
+        output.WriteRawTag(112);
+        output.WriteEnum((int) Rarity);
+      }
+      if (PokedexHeightM != 0F) {
+        output.WriteRawTag(125);
+        output.WriteFloat(PokedexHeightM);
+      }
+      if (PokedexWeightKg != 0F) {
+        output.WriteRawTag(133, 1);
+        output.WriteFloat(PokedexWeightKg);
+      }
+      if (ParentPokemonId != 0) {
+        output.WriteRawTag(136, 1);
+        output.WriteEnum((int) ParentPokemonId);
+      }
+      if (HeightStdDev != 0F) {
+        output.WriteRawTag(149, 1);
+        output.WriteFloat(HeightStdDev);
+      }
+      if (WeightStdDev != 0F) {
+        output.WriteRawTag(157, 1);
+        output.WriteFloat(WeightStdDev);
+      }
+      if (KmDistanceToHatch != 0F) {
+        output.WriteRawTag(165, 1);
+        output.WriteFloat(KmDistanceToHatch);
+      }
+      if (FamilyId != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteEnum((int) FamilyId);
+      }
+      if (CandyToEvolve != 0) {
+        output.WriteRawTag(176, 1);
+        output.WriteInt32(CandyToEvolve);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (ModelScale != 0F) {
+        size += 1 + 4;
+      }
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (Type2 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type2);
+      }
+      if (camera_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Camera);
+      }
+      if (encounter_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Encounter);
+      }
+      if (stats_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stats);
+      }
+      size += quickMoves_.CalculateSize(_repeated_quickMoves_codec);
+      size += cinematicMoves_.CalculateSize(_repeated_cinematicMoves_codec);
+      size += animationTime_.CalculateSize(_repeated_animationTime_codec);
+      size += evolutionIds_.CalculateSize(_repeated_evolutionIds_codec);
+      if (EvolutionPips != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionPips);
+      }
+      if (Rarity != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Rarity);
+      }
+      if (PokedexHeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (PokedexWeightKg != 0F) {
+        size += 2 + 4;
+      }
+      if (ParentPokemonId != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) ParentPokemonId);
+      }
+      if (HeightStdDev != 0F) {
+        size += 2 + 4;
+      }
+      if (WeightStdDev != 0F) {
+        size += 2 + 4;
+      }
+      if (KmDistanceToHatch != 0F) {
+        size += 2 + 4;
+      }
+      if (FamilyId != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) FamilyId);
+      }
+      if (CandyToEvolve != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(CandyToEvolve);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokemonSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.ModelScale != 0F) {
+        ModelScale = other.ModelScale;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.Type2 != 0) {
+        Type2 = other.Type2;
+      }
+      if (other.camera_ != null) {
+        if (camera_ == null) {
+          camera_ = new global::POGOProtos.Settings.Master.Pokemon.CameraAttributes();
+        }
+        Camera.MergeFrom(other.Camera);
+      }
+      if (other.encounter_ != null) {
+        if (encounter_ == null) {
+          encounter_ = new global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes();
+        }
+        Encounter.MergeFrom(other.Encounter);
+      }
+      if (other.stats_ != null) {
+        if (stats_ == null) {
+          stats_ = new global::POGOProtos.Settings.Master.Pokemon.StatsAttributes();
+        }
+        Stats.MergeFrom(other.Stats);
+      }
+      quickMoves_.Add(other.quickMoves_);
+      cinematicMoves_.Add(other.cinematicMoves_);
+      animationTime_.Add(other.animationTime_);
+      evolutionIds_.Add(other.evolutionIds_);
+      if (other.EvolutionPips != 0) {
+        EvolutionPips = other.EvolutionPips;
+      }
+      if (other.Rarity != 0) {
+        Rarity = other.Rarity;
+      }
+      if (other.PokedexHeightM != 0F) {
+        PokedexHeightM = other.PokedexHeightM;
+      }
+      if (other.PokedexWeightKg != 0F) {
+        PokedexWeightKg = other.PokedexWeightKg;
+      }
+      if (other.ParentPokemonId != 0) {
+        ParentPokemonId = other.ParentPokemonId;
+      }
+      if (other.HeightStdDev != 0F) {
+        HeightStdDev = other.HeightStdDev;
+      }
+      if (other.WeightStdDev != 0F) {
+        WeightStdDev = other.WeightStdDev;
+      }
+      if (other.KmDistanceToHatch != 0F) {
+        KmDistanceToHatch = other.KmDistanceToHatch;
+      }
+      if (other.FamilyId != 0) {
+        FamilyId = other.FamilyId;
+      }
+      if (other.CandyToEvolve != 0) {
+        CandyToEvolve = other.CandyToEvolve;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 29: {
+            ModelScale = input.ReadFloat();
+            break;
+          }
+          case 32: {
+            type_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+          case 40: {
+            type2_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+          case 50: {
+            if (camera_ == null) {
+              camera_ = new global::POGOProtos.Settings.Master.Pokemon.CameraAttributes();
+            }
+            input.ReadMessage(camera_);
+            break;
+          }
+          case 58: {
+            if (encounter_ == null) {
+              encounter_ = new global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes();
+            }
+            input.ReadMessage(encounter_);
+            break;
+          }
+          case 66: {
+            if (stats_ == null) {
+              stats_ = new global::POGOProtos.Settings.Master.Pokemon.StatsAttributes();
+            }
+            input.ReadMessage(stats_);
+            break;
+          }
+          case 74:
+          case 72: {
+            quickMoves_.AddEntriesFrom(input, _repeated_quickMoves_codec);
+            break;
+          }
+          case 82:
+          case 80: {
+            cinematicMoves_.AddEntriesFrom(input, _repeated_cinematicMoves_codec);
+            break;
+          }
+          case 90:
+          case 93: {
+            animationTime_.AddEntriesFrom(input, _repeated_animationTime_codec);
+            break;
+          }
+          case 98:
+          case 96: {
+            evolutionIds_.AddEntriesFrom(input, _repeated_evolutionIds_codec);
+            break;
+          }
+          case 104: {
+            EvolutionPips = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            rarity_ = (global::POGOProtos.Enums.PokemonRarity) input.ReadEnum();
+            break;
+          }
+          case 125: {
+            PokedexHeightM = input.ReadFloat();
+            break;
+          }
+          case 133: {
+            PokedexWeightKg = input.ReadFloat();
+            break;
+          }
+          case 136: {
+            parentPokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 149: {
+            HeightStdDev = input.ReadFloat();
+            break;
+          }
+          case 157: {
+            WeightStdDev = input.ReadFloat();
+            break;
+          }
+          case 165: {
+            KmDistanceToHatch = input.ReadFloat();
+            break;
+          }
+          case 168: {
+            familyId_ = (global::POGOProtos.Enums.PokemonFamilyId) input.ReadEnum();
+            break;
+          }
+          case 176: {
+            CandyToEvolve = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class CameraSettings : pb::IMessage<CameraSettings> {
+    private static readonly pb::MessageParser<CameraSettings> _parser = new pb::MessageParser<CameraSettings>(() => new CameraSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CameraSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraSettings(CameraSettings other) : this() {
+      nextCamera_ = other.nextCamera_;
+      interpolation_ = other.interpolation_.Clone();
+      targetType_ = other.targetType_.Clone();
+      easeInSpeed_ = other.easeInSpeed_.Clone();
+      eastOutSpeed_ = other.eastOutSpeed_.Clone();
+      durationSeconds_ = other.durationSeconds_.Clone();
+      waitSeconds_ = other.waitSeconds_.Clone();
+      transitionSeconds_ = other.transitionSeconds_.Clone();
+      angleDegree_ = other.angleDegree_.Clone();
+      angleOffsetDegree_ = other.angleOffsetDegree_.Clone();
+      pitchDegree_ = other.pitchDegree_.Clone();
+      pitchOffsetDegree_ = other.pitchOffsetDegree_.Clone();
+      rollDegree_ = other.rollDegree_.Clone();
+      distanceMeters_ = other.distanceMeters_.Clone();
+      heightPercent_ = other.heightPercent_.Clone();
+      vertCtrRatio_ = other.vertCtrRatio_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraSettings Clone() {
+      return new CameraSettings(this);
+    }
+
+    /// <summary>Field number for the "next_camera" field.</summary>
+    public const int NextCameraFieldNumber = 1;
+    private string nextCamera_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string NextCamera {
+      get { return nextCamera_; }
+      set {
+        nextCamera_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "interpolation" field.</summary>
+    public const int InterpolationFieldNumber = 2;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.CameraInterpolation> _repeated_interpolation_codec
+        = pb::FieldCodec.ForEnum(18, x => (int) x, x => (global::POGOProtos.Enums.CameraInterpolation) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.CameraInterpolation> interpolation_ = new pbc::RepeatedField<global::POGOProtos.Enums.CameraInterpolation>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.CameraInterpolation> Interpolation {
+      get { return interpolation_; }
+    }
+
+    /// <summary>Field number for the "target_type" field.</summary>
+    public const int TargetTypeFieldNumber = 3;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.CameraTarget> _repeated_targetType_codec
+        = pb::FieldCodec.ForEnum(26, x => (int) x, x => (global::POGOProtos.Enums.CameraTarget) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.CameraTarget> targetType_ = new pbc::RepeatedField<global::POGOProtos.Enums.CameraTarget>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.CameraTarget> TargetType {
+      get { return targetType_; }
+    }
+
+    /// <summary>Field number for the "ease_in_speed" field.</summary>
+    public const int EaseInSpeedFieldNumber = 4;
+    private static readonly pb::FieldCodec<float> _repeated_easeInSpeed_codec
+        = pb::FieldCodec.ForFloat(34);
+    private readonly pbc::RepeatedField<float> easeInSpeed_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> EaseInSpeed {
+      get { return easeInSpeed_; }
+    }
+
+    /// <summary>Field number for the "east_out_speed" field.</summary>
+    public const int EastOutSpeedFieldNumber = 5;
+    private static readonly pb::FieldCodec<float> _repeated_eastOutSpeed_codec
+        = pb::FieldCodec.ForFloat(42);
+    private readonly pbc::RepeatedField<float> eastOutSpeed_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> EastOutSpeed {
+      get { return eastOutSpeed_; }
+    }
+
+    /// <summary>Field number for the "duration_seconds" field.</summary>
+    public const int DurationSecondsFieldNumber = 6;
+    private static readonly pb::FieldCodec<float> _repeated_durationSeconds_codec
+        = pb::FieldCodec.ForFloat(50);
+    private readonly pbc::RepeatedField<float> durationSeconds_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> DurationSeconds {
+      get { return durationSeconds_; }
+    }
+
+    /// <summary>Field number for the "wait_seconds" field.</summary>
+    public const int WaitSecondsFieldNumber = 7;
+    private static readonly pb::FieldCodec<float> _repeated_waitSeconds_codec
+        = pb::FieldCodec.ForFloat(58);
+    private readonly pbc::RepeatedField<float> waitSeconds_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> WaitSeconds {
+      get { return waitSeconds_; }
+    }
+
+    /// <summary>Field number for the "transition_seconds" field.</summary>
+    public const int TransitionSecondsFieldNumber = 8;
+    private static readonly pb::FieldCodec<float> _repeated_transitionSeconds_codec
+        = pb::FieldCodec.ForFloat(66);
+    private readonly pbc::RepeatedField<float> transitionSeconds_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> TransitionSeconds {
+      get { return transitionSeconds_; }
+    }
+
+    /// <summary>Field number for the "angle_degree" field.</summary>
+    public const int AngleDegreeFieldNumber = 9;
+    private static readonly pb::FieldCodec<float> _repeated_angleDegree_codec
+        = pb::FieldCodec.ForFloat(74);
+    private readonly pbc::RepeatedField<float> angleDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AngleDegree {
+      get { return angleDegree_; }
+    }
+
+    /// <summary>Field number for the "angle_offset_degree" field.</summary>
+    public const int AngleOffsetDegreeFieldNumber = 10;
+    private static readonly pb::FieldCodec<float> _repeated_angleOffsetDegree_codec
+        = pb::FieldCodec.ForFloat(82);
+    private readonly pbc::RepeatedField<float> angleOffsetDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AngleOffsetDegree {
+      get { return angleOffsetDegree_; }
+    }
+
+    /// <summary>Field number for the "pitch_degree" field.</summary>
+    public const int PitchDegreeFieldNumber = 11;
+    private static readonly pb::FieldCodec<float> _repeated_pitchDegree_codec
+        = pb::FieldCodec.ForFloat(90);
+    private readonly pbc::RepeatedField<float> pitchDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> PitchDegree {
+      get { return pitchDegree_; }
+    }
+
+    /// <summary>Field number for the "pitch_offset_degree" field.</summary>
+    public const int PitchOffsetDegreeFieldNumber = 12;
+    private static readonly pb::FieldCodec<float> _repeated_pitchOffsetDegree_codec
+        = pb::FieldCodec.ForFloat(98);
+    private readonly pbc::RepeatedField<float> pitchOffsetDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> PitchOffsetDegree {
+      get { return pitchOffsetDegree_; }
+    }
+
+    /// <summary>Field number for the "roll_degree" field.</summary>
+    public const int RollDegreeFieldNumber = 13;
+    private static readonly pb::FieldCodec<float> _repeated_rollDegree_codec
+        = pb::FieldCodec.ForFloat(106);
+    private readonly pbc::RepeatedField<float> rollDegree_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> RollDegree {
+      get { return rollDegree_; }
+    }
+
+    /// <summary>Field number for the "distance_meters" field.</summary>
+    public const int DistanceMetersFieldNumber = 14;
+    private static readonly pb::FieldCodec<float> _repeated_distanceMeters_codec
+        = pb::FieldCodec.ForFloat(114);
+    private readonly pbc::RepeatedField<float> distanceMeters_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> DistanceMeters {
+      get { return distanceMeters_; }
+    }
+
+    /// <summary>Field number for the "height_percent" field.</summary>
+    public const int HeightPercentFieldNumber = 15;
+    private static readonly pb::FieldCodec<float> _repeated_heightPercent_codec
+        = pb::FieldCodec.ForFloat(122);
+    private readonly pbc::RepeatedField<float> heightPercent_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> HeightPercent {
+      get { return heightPercent_; }
+    }
+
+    /// <summary>Field number for the "vert_ctr_ratio" field.</summary>
+    public const int VertCtrRatioFieldNumber = 16;
+    private static readonly pb::FieldCodec<float> _repeated_vertCtrRatio_codec
+        = pb::FieldCodec.ForFloat(130);
+    private readonly pbc::RepeatedField<float> vertCtrRatio_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> VertCtrRatio {
+      get { return vertCtrRatio_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CameraSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CameraSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (NextCamera != other.NextCamera) return false;
+      if(!interpolation_.Equals(other.interpolation_)) return false;
+      if(!targetType_.Equals(other.targetType_)) return false;
+      if(!easeInSpeed_.Equals(other.easeInSpeed_)) return false;
+      if(!eastOutSpeed_.Equals(other.eastOutSpeed_)) return false;
+      if(!durationSeconds_.Equals(other.durationSeconds_)) return false;
+      if(!waitSeconds_.Equals(other.waitSeconds_)) return false;
+      if(!transitionSeconds_.Equals(other.transitionSeconds_)) return false;
+      if(!angleDegree_.Equals(other.angleDegree_)) return false;
+      if(!angleOffsetDegree_.Equals(other.angleOffsetDegree_)) return false;
+      if(!pitchDegree_.Equals(other.pitchDegree_)) return false;
+      if(!pitchOffsetDegree_.Equals(other.pitchOffsetDegree_)) return false;
+      if(!rollDegree_.Equals(other.rollDegree_)) return false;
+      if(!distanceMeters_.Equals(other.distanceMeters_)) return false;
+      if(!heightPercent_.Equals(other.heightPercent_)) return false;
+      if(!vertCtrRatio_.Equals(other.vertCtrRatio_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (NextCamera.Length != 0) hash ^= NextCamera.GetHashCode();
+      hash ^= interpolation_.GetHashCode();
+      hash ^= targetType_.GetHashCode();
+      hash ^= easeInSpeed_.GetHashCode();
+      hash ^= eastOutSpeed_.GetHashCode();
+      hash ^= durationSeconds_.GetHashCode();
+      hash ^= waitSeconds_.GetHashCode();
+      hash ^= transitionSeconds_.GetHashCode();
+      hash ^= angleDegree_.GetHashCode();
+      hash ^= angleOffsetDegree_.GetHashCode();
+      hash ^= pitchDegree_.GetHashCode();
+      hash ^= pitchOffsetDegree_.GetHashCode();
+      hash ^= rollDegree_.GetHashCode();
+      hash ^= distanceMeters_.GetHashCode();
+      hash ^= heightPercent_.GetHashCode();
+      hash ^= vertCtrRatio_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (NextCamera.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(NextCamera);
+      }
+      interpolation_.WriteTo(output, _repeated_interpolation_codec);
+      targetType_.WriteTo(output, _repeated_targetType_codec);
+      easeInSpeed_.WriteTo(output, _repeated_easeInSpeed_codec);
+      eastOutSpeed_.WriteTo(output, _repeated_eastOutSpeed_codec);
+      durationSeconds_.WriteTo(output, _repeated_durationSeconds_codec);
+      waitSeconds_.WriteTo(output, _repeated_waitSeconds_codec);
+      transitionSeconds_.WriteTo(output, _repeated_transitionSeconds_codec);
+      angleDegree_.WriteTo(output, _repeated_angleDegree_codec);
+      angleOffsetDegree_.WriteTo(output, _repeated_angleOffsetDegree_codec);
+      pitchDegree_.WriteTo(output, _repeated_pitchDegree_codec);
+      pitchOffsetDegree_.WriteTo(output, _repeated_pitchOffsetDegree_codec);
+      rollDegree_.WriteTo(output, _repeated_rollDegree_codec);
+      distanceMeters_.WriteTo(output, _repeated_distanceMeters_codec);
+      heightPercent_.WriteTo(output, _repeated_heightPercent_codec);
+      vertCtrRatio_.WriteTo(output, _repeated_vertCtrRatio_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (NextCamera.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(NextCamera);
+      }
+      size += interpolation_.CalculateSize(_repeated_interpolation_codec);
+      size += targetType_.CalculateSize(_repeated_targetType_codec);
+      size += easeInSpeed_.CalculateSize(_repeated_easeInSpeed_codec);
+      size += eastOutSpeed_.CalculateSize(_repeated_eastOutSpeed_codec);
+      size += durationSeconds_.CalculateSize(_repeated_durationSeconds_codec);
+      size += waitSeconds_.CalculateSize(_repeated_waitSeconds_codec);
+      size += transitionSeconds_.CalculateSize(_repeated_transitionSeconds_codec);
+      size += angleDegree_.CalculateSize(_repeated_angleDegree_codec);
+      size += angleOffsetDegree_.CalculateSize(_repeated_angleOffsetDegree_codec);
+      size += pitchDegree_.CalculateSize(_repeated_pitchDegree_codec);
+      size += pitchOffsetDegree_.CalculateSize(_repeated_pitchOffsetDegree_codec);
+      size += rollDegree_.CalculateSize(_repeated_rollDegree_codec);
+      size += distanceMeters_.CalculateSize(_repeated_distanceMeters_codec);
+      size += heightPercent_.CalculateSize(_repeated_heightPercent_codec);
+      size += vertCtrRatio_.CalculateSize(_repeated_vertCtrRatio_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CameraSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.NextCamera.Length != 0) {
+        NextCamera = other.NextCamera;
+      }
+      interpolation_.Add(other.interpolation_);
+      targetType_.Add(other.targetType_);
+      easeInSpeed_.Add(other.easeInSpeed_);
+      eastOutSpeed_.Add(other.eastOutSpeed_);
+      durationSeconds_.Add(other.durationSeconds_);
+      waitSeconds_.Add(other.waitSeconds_);
+      transitionSeconds_.Add(other.transitionSeconds_);
+      angleDegree_.Add(other.angleDegree_);
+      angleOffsetDegree_.Add(other.angleOffsetDegree_);
+      pitchDegree_.Add(other.pitchDegree_);
+      pitchOffsetDegree_.Add(other.pitchOffsetDegree_);
+      rollDegree_.Add(other.rollDegree_);
+      distanceMeters_.Add(other.distanceMeters_);
+      heightPercent_.Add(other.heightPercent_);
+      vertCtrRatio_.Add(other.vertCtrRatio_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            NextCamera = input.ReadString();
+            break;
+          }
+          case 18:
+          case 16: {
+            interpolation_.AddEntriesFrom(input, _repeated_interpolation_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            targetType_.AddEntriesFrom(input, _repeated_targetType_codec);
+            break;
+          }
+          case 34:
+          case 37: {
+            easeInSpeed_.AddEntriesFrom(input, _repeated_easeInSpeed_codec);
+            break;
+          }
+          case 42:
+          case 45: {
+            eastOutSpeed_.AddEntriesFrom(input, _repeated_eastOutSpeed_codec);
+            break;
+          }
+          case 50:
+          case 53: {
+            durationSeconds_.AddEntriesFrom(input, _repeated_durationSeconds_codec);
+            break;
+          }
+          case 58:
+          case 61: {
+            waitSeconds_.AddEntriesFrom(input, _repeated_waitSeconds_codec);
+            break;
+          }
+          case 66:
+          case 69: {
+            transitionSeconds_.AddEntriesFrom(input, _repeated_transitionSeconds_codec);
+            break;
+          }
+          case 74:
+          case 77: {
+            angleDegree_.AddEntriesFrom(input, _repeated_angleDegree_codec);
+            break;
+          }
+          case 82:
+          case 85: {
+            angleOffsetDegree_.AddEntriesFrom(input, _repeated_angleOffsetDegree_codec);
+            break;
+          }
+          case 90:
+          case 93: {
+            pitchDegree_.AddEntriesFrom(input, _repeated_pitchDegree_codec);
+            break;
+          }
+          case 98:
+          case 101: {
+            pitchOffsetDegree_.AddEntriesFrom(input, _repeated_pitchOffsetDegree_codec);
+            break;
+          }
+          case 106:
+          case 109: {
+            rollDegree_.AddEntriesFrom(input, _repeated_rollDegree_codec);
+            break;
+          }
+          case 114:
+          case 117: {
+            distanceMeters_.AddEntriesFrom(input, _repeated_distanceMeters_codec);
+            break;
+          }
+          case 122:
+          case 125: {
+            heightPercent_.AddEntriesFrom(input, _repeated_heightPercent_codec);
+            break;
+          }
+          case 130:
+          case 133: {
+            vertCtrRatio_.AddEntriesFrom(input, _repeated_vertCtrRatio_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GymBattleSettings : pb::IMessage<GymBattleSettings> {
+    private static readonly pb::MessageParser<GymBattleSettings> _parser = new pb::MessageParser<GymBattleSettings>(() => new GymBattleSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymBattleSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymBattleSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymBattleSettings(GymBattleSettings other) : this() {
+      energyPerSec_ = other.energyPerSec_;
+      dodgeEnergyCost_ = other.dodgeEnergyCost_;
+      retargetSeconds_ = other.retargetSeconds_;
+      enemyAttackInterval_ = other.enemyAttackInterval_;
+      attackServerInterval_ = other.attackServerInterval_;
+      roundDurationSeconds_ = other.roundDurationSeconds_;
+      bonusTimePerAllySeconds_ = other.bonusTimePerAllySeconds_;
+      maximumAttackersPerBattle_ = other.maximumAttackersPerBattle_;
+      sameTypeAttackBonusMultiplier_ = other.sameTypeAttackBonusMultiplier_;
+      maximumEnergy_ = other.maximumEnergy_;
+      energyDeltaPerHealthLost_ = other.energyDeltaPerHealthLost_;
+      dodgeDurationMs_ = other.dodgeDurationMs_;
+      minimumPlayerLevel_ = other.minimumPlayerLevel_;
+      swapDurationMs_ = other.swapDurationMs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymBattleSettings Clone() {
+      return new GymBattleSettings(this);
+    }
+
+    /// <summary>Field number for the "energy_per_sec" field.</summary>
+    public const int EnergyPerSecFieldNumber = 1;
+    private float energyPerSec_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float EnergyPerSec {
+      get { return energyPerSec_; }
+      set {
+        energyPerSec_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "dodge_energy_cost" field.</summary>
+    public const int DodgeEnergyCostFieldNumber = 2;
+    private float dodgeEnergyCost_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DodgeEnergyCost {
+      get { return dodgeEnergyCost_; }
+      set {
+        dodgeEnergyCost_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "retarget_seconds" field.</summary>
+    public const int RetargetSecondsFieldNumber = 3;
+    private float retargetSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float RetargetSeconds {
+      get { return retargetSeconds_; }
+      set {
+        retargetSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "enemy_attack_interval" field.</summary>
+    public const int EnemyAttackIntervalFieldNumber = 4;
+    private float enemyAttackInterval_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float EnemyAttackInterval {
+      get { return enemyAttackInterval_; }
+      set {
+        enemyAttackInterval_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attack_server_interval" field.</summary>
+    public const int AttackServerIntervalFieldNumber = 5;
+    private float attackServerInterval_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AttackServerInterval {
+      get { return attackServerInterval_; }
+      set {
+        attackServerInterval_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "round_duration_seconds" field.</summary>
+    public const int RoundDurationSecondsFieldNumber = 6;
+    private float roundDurationSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float RoundDurationSeconds {
+      get { return roundDurationSeconds_; }
+      set {
+        roundDurationSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "bonus_time_per_ally_seconds" field.</summary>
+    public const int BonusTimePerAllySecondsFieldNumber = 7;
+    private float bonusTimePerAllySeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float BonusTimePerAllySeconds {
+      get { return bonusTimePerAllySeconds_; }
+      set {
+        bonusTimePerAllySeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "maximum_attackers_per_battle" field.</summary>
+    public const int MaximumAttackersPerBattleFieldNumber = 8;
+    private int maximumAttackersPerBattle_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaximumAttackersPerBattle {
+      get { return maximumAttackersPerBattle_; }
+      set {
+        maximumAttackersPerBattle_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "same_type_attack_bonus_multiplier" field.</summary>
+    public const int SameTypeAttackBonusMultiplierFieldNumber = 9;
+    private float sameTypeAttackBonusMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float SameTypeAttackBonusMultiplier {
+      get { return sameTypeAttackBonusMultiplier_; }
+      set {
+        sameTypeAttackBonusMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "maximum_energy" field.</summary>
+    public const int MaximumEnergyFieldNumber = 10;
+    private int maximumEnergy_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaximumEnergy {
+      get { return maximumEnergy_; }
+      set {
+        maximumEnergy_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "energy_delta_per_health_lost" field.</summary>
+    public const int EnergyDeltaPerHealthLostFieldNumber = 11;
+    private float energyDeltaPerHealthLost_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float EnergyDeltaPerHealthLost {
+      get { return energyDeltaPerHealthLost_; }
+      set {
+        energyDeltaPerHealthLost_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "dodge_duration_ms" field.</summary>
+    public const int DodgeDurationMsFieldNumber = 12;
+    private int dodgeDurationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DodgeDurationMs {
+      get { return dodgeDurationMs_; }
+      set {
+        dodgeDurationMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "minimum_player_level" field.</summary>
+    public const int MinimumPlayerLevelFieldNumber = 13;
+    private int minimumPlayerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MinimumPlayerLevel {
+      get { return minimumPlayerLevel_; }
+      set {
+        minimumPlayerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "swap_duration_ms" field.</summary>
+    public const int SwapDurationMsFieldNumber = 14;
+    private int swapDurationMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int SwapDurationMs {
+      get { return swapDurationMs_; }
+      set {
+        swapDurationMs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymBattleSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymBattleSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EnergyPerSec != other.EnergyPerSec) return false;
+      if (DodgeEnergyCost != other.DodgeEnergyCost) return false;
+      if (RetargetSeconds != other.RetargetSeconds) return false;
+      if (EnemyAttackInterval != other.EnemyAttackInterval) return false;
+      if (AttackServerInterval != other.AttackServerInterval) return false;
+      if (RoundDurationSeconds != other.RoundDurationSeconds) return false;
+      if (BonusTimePerAllySeconds != other.BonusTimePerAllySeconds) return false;
+      if (MaximumAttackersPerBattle != other.MaximumAttackersPerBattle) return false;
+      if (SameTypeAttackBonusMultiplier != other.SameTypeAttackBonusMultiplier) return false;
+      if (MaximumEnergy != other.MaximumEnergy) return false;
+      if (EnergyDeltaPerHealthLost != other.EnergyDeltaPerHealthLost) return false;
+      if (DodgeDurationMs != other.DodgeDurationMs) return false;
+      if (MinimumPlayerLevel != other.MinimumPlayerLevel) return false;
+      if (SwapDurationMs != other.SwapDurationMs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EnergyPerSec != 0F) hash ^= EnergyPerSec.GetHashCode();
+      if (DodgeEnergyCost != 0F) hash ^= DodgeEnergyCost.GetHashCode();
+      if (RetargetSeconds != 0F) hash ^= RetargetSeconds.GetHashCode();
+      if (EnemyAttackInterval != 0F) hash ^= EnemyAttackInterval.GetHashCode();
+      if (AttackServerInterval != 0F) hash ^= AttackServerInterval.GetHashCode();
+      if (RoundDurationSeconds != 0F) hash ^= RoundDurationSeconds.GetHashCode();
+      if (BonusTimePerAllySeconds != 0F) hash ^= BonusTimePerAllySeconds.GetHashCode();
+      if (MaximumAttackersPerBattle != 0) hash ^= MaximumAttackersPerBattle.GetHashCode();
+      if (SameTypeAttackBonusMultiplier != 0F) hash ^= SameTypeAttackBonusMultiplier.GetHashCode();
+      if (MaximumEnergy != 0) hash ^= MaximumEnergy.GetHashCode();
+      if (EnergyDeltaPerHealthLost != 0F) hash ^= EnergyDeltaPerHealthLost.GetHashCode();
+      if (DodgeDurationMs != 0) hash ^= DodgeDurationMs.GetHashCode();
+      if (MinimumPlayerLevel != 0) hash ^= MinimumPlayerLevel.GetHashCode();
+      if (SwapDurationMs != 0) hash ^= SwapDurationMs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EnergyPerSec != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(EnergyPerSec);
+      }
+      if (DodgeEnergyCost != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(DodgeEnergyCost);
+      }
+      if (RetargetSeconds != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(RetargetSeconds);
+      }
+      if (EnemyAttackInterval != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(EnemyAttackInterval);
+      }
+      if (AttackServerInterval != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(AttackServerInterval);
+      }
+      if (RoundDurationSeconds != 0F) {
+        output.WriteRawTag(53);
+        output.WriteFloat(RoundDurationSeconds);
+      }
+      if (BonusTimePerAllySeconds != 0F) {
+        output.WriteRawTag(61);
+        output.WriteFloat(BonusTimePerAllySeconds);
+      }
+      if (MaximumAttackersPerBattle != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(MaximumAttackersPerBattle);
+      }
+      if (SameTypeAttackBonusMultiplier != 0F) {
+        output.WriteRawTag(77);
+        output.WriteFloat(SameTypeAttackBonusMultiplier);
+      }
+      if (MaximumEnergy != 0) {
+        output.WriteRawTag(80);
+        output.WriteInt32(MaximumEnergy);
+      }
+      if (EnergyDeltaPerHealthLost != 0F) {
+        output.WriteRawTag(93);
+        output.WriteFloat(EnergyDeltaPerHealthLost);
+      }
+      if (DodgeDurationMs != 0) {
+        output.WriteRawTag(96);
+        output.WriteInt32(DodgeDurationMs);
+      }
+      if (MinimumPlayerLevel != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(MinimumPlayerLevel);
+      }
+      if (SwapDurationMs != 0) {
+        output.WriteRawTag(112);
+        output.WriteInt32(SwapDurationMs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EnergyPerSec != 0F) {
+        size += 1 + 4;
+      }
+      if (DodgeEnergyCost != 0F) {
+        size += 1 + 4;
+      }
+      if (RetargetSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (EnemyAttackInterval != 0F) {
+        size += 1 + 4;
+      }
+      if (AttackServerInterval != 0F) {
+        size += 1 + 4;
+      }
+      if (RoundDurationSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (BonusTimePerAllySeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (MaximumAttackersPerBattle != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaximumAttackersPerBattle);
+      }
+      if (SameTypeAttackBonusMultiplier != 0F) {
+        size += 1 + 4;
+      }
+      if (MaximumEnergy != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaximumEnergy);
+      }
+      if (EnergyDeltaPerHealthLost != 0F) {
+        size += 1 + 4;
+      }
+      if (DodgeDurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DodgeDurationMs);
+      }
+      if (MinimumPlayerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MinimumPlayerLevel);
+      }
+      if (SwapDurationMs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(SwapDurationMs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymBattleSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EnergyPerSec != 0F) {
+        EnergyPerSec = other.EnergyPerSec;
+      }
+      if (other.DodgeEnergyCost != 0F) {
+        DodgeEnergyCost = other.DodgeEnergyCost;
+      }
+      if (other.RetargetSeconds != 0F) {
+        RetargetSeconds = other.RetargetSeconds;
+      }
+      if (other.EnemyAttackInterval != 0F) {
+        EnemyAttackInterval = other.EnemyAttackInterval;
+      }
+      if (other.AttackServerInterval != 0F) {
+        AttackServerInterval = other.AttackServerInterval;
+      }
+      if (other.RoundDurationSeconds != 0F) {
+        RoundDurationSeconds = other.RoundDurationSeconds;
+      }
+      if (other.BonusTimePerAllySeconds != 0F) {
+        BonusTimePerAllySeconds = other.BonusTimePerAllySeconds;
+      }
+      if (other.MaximumAttackersPerBattle != 0) {
+        MaximumAttackersPerBattle = other.MaximumAttackersPerBattle;
+      }
+      if (other.SameTypeAttackBonusMultiplier != 0F) {
+        SameTypeAttackBonusMultiplier = other.SameTypeAttackBonusMultiplier;
+      }
+      if (other.MaximumEnergy != 0) {
+        MaximumEnergy = other.MaximumEnergy;
+      }
+      if (other.EnergyDeltaPerHealthLost != 0F) {
+        EnergyDeltaPerHealthLost = other.EnergyDeltaPerHealthLost;
+      }
+      if (other.DodgeDurationMs != 0) {
+        DodgeDurationMs = other.DodgeDurationMs;
+      }
+      if (other.MinimumPlayerLevel != 0) {
+        MinimumPlayerLevel = other.MinimumPlayerLevel;
+      }
+      if (other.SwapDurationMs != 0) {
+        SwapDurationMs = other.SwapDurationMs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            EnergyPerSec = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            DodgeEnergyCost = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            RetargetSeconds = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            EnemyAttackInterval = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            AttackServerInterval = input.ReadFloat();
+            break;
+          }
+          case 53: {
+            RoundDurationSeconds = input.ReadFloat();
+            break;
+          }
+          case 61: {
+            BonusTimePerAllySeconds = input.ReadFloat();
+            break;
+          }
+          case 64: {
+            MaximumAttackersPerBattle = input.ReadInt32();
+            break;
+          }
+          case 77: {
+            SameTypeAttackBonusMultiplier = input.ReadFloat();
+            break;
+          }
+          case 80: {
+            MaximumEnergy = input.ReadInt32();
+            break;
+          }
+          case 93: {
+            EnergyDeltaPerHealthLost = input.ReadFloat();
+            break;
+          }
+          case 96: {
+            DodgeDurationMs = input.ReadInt32();
+            break;
+          }
+          case 104: {
+            MinimumPlayerLevel = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            SwapDurationMs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EquippedBadgeSettings : pb::IMessage<EquippedBadgeSettings> {
+    private static readonly pb::MessageParser<EquippedBadgeSettings> _parser = new pb::MessageParser<EquippedBadgeSettings>(() => new EquippedBadgeSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EquippedBadgeSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadgeSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadgeSettings(EquippedBadgeSettings other) : this() {
+      equipBadgeCooldownMs_ = other.equipBadgeCooldownMs_;
+      catchProbabilityBonus_ = other.catchProbabilityBonus_.Clone();
+      fleeProbabilityBonus_ = other.fleeProbabilityBonus_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EquippedBadgeSettings Clone() {
+      return new EquippedBadgeSettings(this);
+    }
+
+    /// <summary>Field number for the "equip_badge_cooldown_ms" field.</summary>
+    public const int EquipBadgeCooldownMsFieldNumber = 1;
+    private long equipBadgeCooldownMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long EquipBadgeCooldownMs {
+      get { return equipBadgeCooldownMs_; }
+      set {
+        equipBadgeCooldownMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "catch_probability_bonus" field.</summary>
+    public const int CatchProbabilityBonusFieldNumber = 2;
+    private static readonly pb::FieldCodec<float> _repeated_catchProbabilityBonus_codec
+        = pb::FieldCodec.ForFloat(18);
+    private readonly pbc::RepeatedField<float> catchProbabilityBonus_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> CatchProbabilityBonus {
+      get { return catchProbabilityBonus_; }
+    }
+
+    /// <summary>Field number for the "flee_probability_bonus" field.</summary>
+    public const int FleeProbabilityBonusFieldNumber = 3;
+    private static readonly pb::FieldCodec<float> _repeated_fleeProbabilityBonus_codec
+        = pb::FieldCodec.ForFloat(26);
+    private readonly pbc::RepeatedField<float> fleeProbabilityBonus_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> FleeProbabilityBonus {
+      get { return fleeProbabilityBonus_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EquippedBadgeSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EquippedBadgeSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (EquipBadgeCooldownMs != other.EquipBadgeCooldownMs) return false;
+      if(!catchProbabilityBonus_.Equals(other.catchProbabilityBonus_)) return false;
+      if(!fleeProbabilityBonus_.Equals(other.fleeProbabilityBonus_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (EquipBadgeCooldownMs != 0L) hash ^= EquipBadgeCooldownMs.GetHashCode();
+      hash ^= catchProbabilityBonus_.GetHashCode();
+      hash ^= fleeProbabilityBonus_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (EquipBadgeCooldownMs != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(EquipBadgeCooldownMs);
+      }
+      catchProbabilityBonus_.WriteTo(output, _repeated_catchProbabilityBonus_codec);
+      fleeProbabilityBonus_.WriteTo(output, _repeated_fleeProbabilityBonus_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (EquipBadgeCooldownMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(EquipBadgeCooldownMs);
+      }
+      size += catchProbabilityBonus_.CalculateSize(_repeated_catchProbabilityBonus_codec);
+      size += fleeProbabilityBonus_.CalculateSize(_repeated_fleeProbabilityBonus_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EquippedBadgeSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.EquipBadgeCooldownMs != 0L) {
+        EquipBadgeCooldownMs = other.EquipBadgeCooldownMs;
+      }
+      catchProbabilityBonus_.Add(other.catchProbabilityBonus_);
+      fleeProbabilityBonus_.Add(other.fleeProbabilityBonus_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            EquipBadgeCooldownMs = input.ReadInt64();
+            break;
+          }
+          case 18:
+          case 21: {
+            catchProbabilityBonus_.AddEntriesFrom(input, _repeated_catchProbabilityBonus_codec);
+            break;
+          }
+          case 26:
+          case 29: {
+            fleeProbabilityBonus_.AddEntriesFrom(input, _repeated_fleeProbabilityBonus_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class IapSettings : pb::IMessage<IapSettings> {
+    private static readonly pb::MessageParser<IapSettings> _parser = new pb::MessageParser<IapSettings>(() => new IapSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<IapSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[9]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapSettings(IapSettings other) : this() {
+      dailyBonusCoins_ = other.dailyBonusCoins_;
+      dailyDefenderBonusPerPokemon_ = other.dailyDefenderBonusPerPokemon_.Clone();
+      dailyDefenderBonusMaxDefenders_ = other.dailyDefenderBonusMaxDefenders_;
+      dailyDefenderBonusCurrency_ = other.dailyDefenderBonusCurrency_.Clone();
+      minTimeBetweenClaimsMs_ = other.minTimeBetweenClaimsMs_;
+      dailyBonusEnabled_ = other.dailyBonusEnabled_;
+      dailyDefenderBonusEnabled_ = other.dailyDefenderBonusEnabled_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public IapSettings Clone() {
+      return new IapSettings(this);
+    }
+
+    /// <summary>Field number for the "daily_bonus_coins" field.</summary>
+    public const int DailyBonusCoinsFieldNumber = 1;
+    private int dailyBonusCoins_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DailyBonusCoins {
+      get { return dailyBonusCoins_; }
+      set {
+        dailyBonusCoins_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_per_pokemon" field.</summary>
+    public const int DailyDefenderBonusPerPokemonFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_dailyDefenderBonusPerPokemon_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> dailyDefenderBonusPerPokemon_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> DailyDefenderBonusPerPokemon {
+      get { return dailyDefenderBonusPerPokemon_; }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_max_defenders" field.</summary>
+    public const int DailyDefenderBonusMaxDefendersFieldNumber = 3;
+    private int dailyDefenderBonusMaxDefenders_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DailyDefenderBonusMaxDefenders {
+      get { return dailyDefenderBonusMaxDefenders_; }
+      set {
+        dailyDefenderBonusMaxDefenders_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_currency" field.</summary>
+    public const int DailyDefenderBonusCurrencyFieldNumber = 4;
+    private static readonly pb::FieldCodec<string> _repeated_dailyDefenderBonusCurrency_codec
+        = pb::FieldCodec.ForString(34);
+    private readonly pbc::RepeatedField<string> dailyDefenderBonusCurrency_ = new pbc::RepeatedField<string>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<string> DailyDefenderBonusCurrency {
+      get { return dailyDefenderBonusCurrency_; }
+    }
+
+    /// <summary>Field number for the "min_time_between_claims_ms" field.</summary>
+    public const int MinTimeBetweenClaimsMsFieldNumber = 5;
+    private long minTimeBetweenClaimsMs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public long MinTimeBetweenClaimsMs {
+      get { return minTimeBetweenClaimsMs_; }
+      set {
+        minTimeBetweenClaimsMs_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_bonus_enabled" field.</summary>
+    public const int DailyBonusEnabledFieldNumber = 6;
+    private bool dailyBonusEnabled_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool DailyBonusEnabled {
+      get { return dailyBonusEnabled_; }
+      set {
+        dailyBonusEnabled_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "daily_defender_bonus_enabled" field.</summary>
+    public const int DailyDefenderBonusEnabledFieldNumber = 7;
+    private bool dailyDefenderBonusEnabled_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool DailyDefenderBonusEnabled {
+      get { return dailyDefenderBonusEnabled_; }
+      set {
+        dailyDefenderBonusEnabled_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as IapSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(IapSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (DailyBonusCoins != other.DailyBonusCoins) return false;
+      if(!dailyDefenderBonusPerPokemon_.Equals(other.dailyDefenderBonusPerPokemon_)) return false;
+      if (DailyDefenderBonusMaxDefenders != other.DailyDefenderBonusMaxDefenders) return false;
+      if(!dailyDefenderBonusCurrency_.Equals(other.dailyDefenderBonusCurrency_)) return false;
+      if (MinTimeBetweenClaimsMs != other.MinTimeBetweenClaimsMs) return false;
+      if (DailyBonusEnabled != other.DailyBonusEnabled) return false;
+      if (DailyDefenderBonusEnabled != other.DailyDefenderBonusEnabled) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (DailyBonusCoins != 0) hash ^= DailyBonusCoins.GetHashCode();
+      hash ^= dailyDefenderBonusPerPokemon_.GetHashCode();
+      if (DailyDefenderBonusMaxDefenders != 0) hash ^= DailyDefenderBonusMaxDefenders.GetHashCode();
+      hash ^= dailyDefenderBonusCurrency_.GetHashCode();
+      if (MinTimeBetweenClaimsMs != 0L) hash ^= MinTimeBetweenClaimsMs.GetHashCode();
+      if (DailyBonusEnabled != false) hash ^= DailyBonusEnabled.GetHashCode();
+      if (DailyDefenderBonusEnabled != false) hash ^= DailyDefenderBonusEnabled.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (DailyBonusCoins != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(DailyBonusCoins);
+      }
+      dailyDefenderBonusPerPokemon_.WriteTo(output, _repeated_dailyDefenderBonusPerPokemon_codec);
+      if (DailyDefenderBonusMaxDefenders != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(DailyDefenderBonusMaxDefenders);
+      }
+      dailyDefenderBonusCurrency_.WriteTo(output, _repeated_dailyDefenderBonusCurrency_codec);
+      if (MinTimeBetweenClaimsMs != 0L) {
+        output.WriteRawTag(40);
+        output.WriteInt64(MinTimeBetweenClaimsMs);
+      }
+      if (DailyBonusEnabled != false) {
+        output.WriteRawTag(48);
+        output.WriteBool(DailyBonusEnabled);
+      }
+      if (DailyDefenderBonusEnabled != false) {
+        output.WriteRawTag(56);
+        output.WriteBool(DailyDefenderBonusEnabled);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (DailyBonusCoins != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DailyBonusCoins);
+      }
+      size += dailyDefenderBonusPerPokemon_.CalculateSize(_repeated_dailyDefenderBonusPerPokemon_codec);
+      if (DailyDefenderBonusMaxDefenders != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DailyDefenderBonusMaxDefenders);
+      }
+      size += dailyDefenderBonusCurrency_.CalculateSize(_repeated_dailyDefenderBonusCurrency_codec);
+      if (MinTimeBetweenClaimsMs != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(MinTimeBetweenClaimsMs);
+      }
+      if (DailyBonusEnabled != false) {
+        size += 1 + 1;
+      }
+      if (DailyDefenderBonusEnabled != false) {
+        size += 1 + 1;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(IapSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.DailyBonusCoins != 0) {
+        DailyBonusCoins = other.DailyBonusCoins;
+      }
+      dailyDefenderBonusPerPokemon_.Add(other.dailyDefenderBonusPerPokemon_);
+      if (other.DailyDefenderBonusMaxDefenders != 0) {
+        DailyDefenderBonusMaxDefenders = other.DailyDefenderBonusMaxDefenders;
+      }
+      dailyDefenderBonusCurrency_.Add(other.dailyDefenderBonusCurrency_);
+      if (other.MinTimeBetweenClaimsMs != 0L) {
+        MinTimeBetweenClaimsMs = other.MinTimeBetweenClaimsMs;
+      }
+      if (other.DailyBonusEnabled != false) {
+        DailyBonusEnabled = other.DailyBonusEnabled;
+      }
+      if (other.DailyDefenderBonusEnabled != false) {
+        DailyDefenderBonusEnabled = other.DailyDefenderBonusEnabled;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            DailyBonusCoins = input.ReadInt32();
+            break;
+          }
+          case 18:
+          case 16: {
+            dailyDefenderBonusPerPokemon_.AddEntriesFrom(input, _repeated_dailyDefenderBonusPerPokemon_codec);
+            break;
+          }
+          case 24: {
+            DailyDefenderBonusMaxDefenders = input.ReadInt32();
+            break;
+          }
+          case 34: {
+            dailyDefenderBonusCurrency_.AddEntriesFrom(input, _repeated_dailyDefenderBonusCurrency_codec);
+            break;
+          }
+          case 40: {
+            MinTimeBetweenClaimsMs = input.ReadInt64();
+            break;
+          }
+          case 48: {
+            DailyBonusEnabled = input.ReadBool();
+            break;
+          }
+          case 56: {
+            DailyDefenderBonusEnabled = input.ReadBool();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class ItemSettings : pb::IMessage<ItemSettings> {
+    private static readonly pb::MessageParser<ItemSettings> _parser = new pb::MessageParser<ItemSettings>(() => new ItemSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<ItemSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[10]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemSettings(ItemSettings other) : this() {
+      itemId_ = other.itemId_;
+      itemType_ = other.itemType_;
+      category_ = other.category_;
+      dropFreq_ = other.dropFreq_;
+      dropTrainerLevel_ = other.dropTrainerLevel_;
+      Pokeball = other.pokeball_ != null ? other.Pokeball.Clone() : null;
+      Potion = other.potion_ != null ? other.Potion.Clone() : null;
+      Revive = other.revive_ != null ? other.Revive.Clone() : null;
+      Battle = other.battle_ != null ? other.Battle.Clone() : null;
+      Food = other.food_ != null ? other.Food.Clone() : null;
+      InventoryUpgrade = other.inventoryUpgrade_ != null ? other.InventoryUpgrade.Clone() : null;
+      XpBoost = other.xpBoost_ != null ? other.XpBoost.Clone() : null;
+      Incense = other.incense_ != null ? other.Incense.Clone() : null;
+      EggIncubator = other.eggIncubator_ != null ? other.EggIncubator.Clone() : null;
+      FortModifier = other.fortModifier_ != null ? other.FortModifier.Clone() : null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public ItemSettings Clone() {
+      return new ItemSettings(this);
+    }
+
+    /// <summary>Field number for the "item_id" field.</summary>
+    public const int ItemIdFieldNumber = 1;
+    private global::POGOProtos.Inventory.Item.ItemId itemId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemId ItemId {
+      get { return itemId_; }
+      set {
+        itemId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "item_type" field.</summary>
+    public const int ItemTypeFieldNumber = 2;
+    private global::POGOProtos.Inventory.Item.ItemType itemType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Inventory.Item.ItemType ItemType {
+      get { return itemType_; }
+      set {
+        itemType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "category" field.</summary>
+    public const int CategoryFieldNumber = 3;
+    private global::POGOProtos.Enums.ItemCategory category_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.ItemCategory Category {
+      get { return category_; }
+      set {
+        category_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "drop_freq" field.</summary>
+    public const int DropFreqFieldNumber = 4;
+    private float dropFreq_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DropFreq {
+      get { return dropFreq_; }
+      set {
+        dropFreq_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "drop_trainer_level" field.</summary>
+    public const int DropTrainerLevelFieldNumber = 5;
+    private int dropTrainerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DropTrainerLevel {
+      get { return dropTrainerLevel_; }
+      set {
+        dropTrainerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokeball" field.</summary>
+    public const int PokeballFieldNumber = 6;
+    private global::POGOProtos.Settings.Master.Item.PokeballAttributes pokeball_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.PokeballAttributes Pokeball {
+      get { return pokeball_; }
+      set {
+        pokeball_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "potion" field.</summary>
+    public const int PotionFieldNumber = 7;
+    private global::POGOProtos.Settings.Master.Item.PotionAttributes potion_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.PotionAttributes Potion {
+      get { return potion_; }
+      set {
+        potion_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "revive" field.</summary>
+    public const int ReviveFieldNumber = 8;
+    private global::POGOProtos.Settings.Master.Item.ReviveAttributes revive_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.ReviveAttributes Revive {
+      get { return revive_; }
+      set {
+        revive_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "battle" field.</summary>
+    public const int BattleFieldNumber = 9;
+    private global::POGOProtos.Settings.Master.Item.BattleAttributes battle_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.BattleAttributes Battle {
+      get { return battle_; }
+      set {
+        battle_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "food" field.</summary>
+    public const int FoodFieldNumber = 10;
+    private global::POGOProtos.Settings.Master.Item.FoodAttributes food_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.FoodAttributes Food {
+      get { return food_; }
+      set {
+        food_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_upgrade" field.</summary>
+    public const int InventoryUpgradeFieldNumber = 11;
+    private global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes inventoryUpgrade_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes InventoryUpgrade {
+      get { return inventoryUpgrade_; }
+      set {
+        inventoryUpgrade_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "xp_boost" field.</summary>
+    public const int XpBoostFieldNumber = 12;
+    private global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes xpBoost_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes XpBoost {
+      get { return xpBoost_; }
+      set {
+        xpBoost_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "incense" field.</summary>
+    public const int IncenseFieldNumber = 13;
+    private global::POGOProtos.Settings.Master.Item.IncenseAttributes incense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.IncenseAttributes Incense {
+      get { return incense_; }
+      set {
+        incense_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "egg_incubator" field.</summary>
+    public const int EggIncubatorFieldNumber = 14;
+    private global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes eggIncubator_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes EggIncubator {
+      get { return eggIncubator_; }
+      set {
+        eggIncubator_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fort_modifier" field.</summary>
+    public const int FortModifierFieldNumber = 15;
+    private global::POGOProtos.Settings.Master.Item.FortModifierAttributes fortModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Item.FortModifierAttributes FortModifier {
+      get { return fortModifier_; }
+      set {
+        fortModifier_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as ItemSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(ItemSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (ItemId != other.ItemId) return false;
+      if (ItemType != other.ItemType) return false;
+      if (Category != other.Category) return false;
+      if (DropFreq != other.DropFreq) return false;
+      if (DropTrainerLevel != other.DropTrainerLevel) return false;
+      if (!object.Equals(Pokeball, other.Pokeball)) return false;
+      if (!object.Equals(Potion, other.Potion)) return false;
+      if (!object.Equals(Revive, other.Revive)) return false;
+      if (!object.Equals(Battle, other.Battle)) return false;
+      if (!object.Equals(Food, other.Food)) return false;
+      if (!object.Equals(InventoryUpgrade, other.InventoryUpgrade)) return false;
+      if (!object.Equals(XpBoost, other.XpBoost)) return false;
+      if (!object.Equals(Incense, other.Incense)) return false;
+      if (!object.Equals(EggIncubator, other.EggIncubator)) return false;
+      if (!object.Equals(FortModifier, other.FortModifier)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (ItemId != 0) hash ^= ItemId.GetHashCode();
+      if (ItemType != 0) hash ^= ItemType.GetHashCode();
+      if (Category != 0) hash ^= Category.GetHashCode();
+      if (DropFreq != 0F) hash ^= DropFreq.GetHashCode();
+      if (DropTrainerLevel != 0) hash ^= DropTrainerLevel.GetHashCode();
+      if (pokeball_ != null) hash ^= Pokeball.GetHashCode();
+      if (potion_ != null) hash ^= Potion.GetHashCode();
+      if (revive_ != null) hash ^= Revive.GetHashCode();
+      if (battle_ != null) hash ^= Battle.GetHashCode();
+      if (food_ != null) hash ^= Food.GetHashCode();
+      if (inventoryUpgrade_ != null) hash ^= InventoryUpgrade.GetHashCode();
+      if (xpBoost_ != null) hash ^= XpBoost.GetHashCode();
+      if (incense_ != null) hash ^= Incense.GetHashCode();
+      if (eggIncubator_ != null) hash ^= EggIncubator.GetHashCode();
+      if (fortModifier_ != null) hash ^= FortModifier.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (ItemId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) ItemId);
+      }
+      if (ItemType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) ItemType);
+      }
+      if (Category != 0) {
+        output.WriteRawTag(24);
+        output.WriteEnum((int) Category);
+      }
+      if (DropFreq != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(DropFreq);
+      }
+      if (DropTrainerLevel != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(DropTrainerLevel);
+      }
+      if (pokeball_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Pokeball);
+      }
+      if (potion_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Potion);
+      }
+      if (revive_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(Revive);
+      }
+      if (battle_ != null) {
+        output.WriteRawTag(74);
+        output.WriteMessage(Battle);
+      }
+      if (food_ != null) {
+        output.WriteRawTag(82);
+        output.WriteMessage(Food);
+      }
+      if (inventoryUpgrade_ != null) {
+        output.WriteRawTag(90);
+        output.WriteMessage(InventoryUpgrade);
+      }
+      if (xpBoost_ != null) {
+        output.WriteRawTag(98);
+        output.WriteMessage(XpBoost);
+      }
+      if (incense_ != null) {
+        output.WriteRawTag(106);
+        output.WriteMessage(Incense);
+      }
+      if (eggIncubator_ != null) {
+        output.WriteRawTag(114);
+        output.WriteMessage(EggIncubator);
+      }
+      if (fortModifier_ != null) {
+        output.WriteRawTag(122);
+        output.WriteMessage(FortModifier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (ItemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemId);
+      }
+      if (ItemType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ItemType);
+      }
+      if (Category != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Category);
+      }
+      if (DropFreq != 0F) {
+        size += 1 + 4;
+      }
+      if (DropTrainerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DropTrainerLevel);
+      }
+      if (pokeball_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Pokeball);
+      }
+      if (potion_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Potion);
+      }
+      if (revive_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Revive);
+      }
+      if (battle_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Battle);
+      }
+      if (food_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Food);
+      }
+      if (inventoryUpgrade_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryUpgrade);
+      }
+      if (xpBoost_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(XpBoost);
+      }
+      if (incense_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Incense);
+      }
+      if (eggIncubator_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubator);
+      }
+      if (fortModifier_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortModifier);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(ItemSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.ItemId != 0) {
+        ItemId = other.ItemId;
+      }
+      if (other.ItemType != 0) {
+        ItemType = other.ItemType;
+      }
+      if (other.Category != 0) {
+        Category = other.Category;
+      }
+      if (other.DropFreq != 0F) {
+        DropFreq = other.DropFreq;
+      }
+      if (other.DropTrainerLevel != 0) {
+        DropTrainerLevel = other.DropTrainerLevel;
+      }
+      if (other.pokeball_ != null) {
+        if (pokeball_ == null) {
+          pokeball_ = new global::POGOProtos.Settings.Master.Item.PokeballAttributes();
+        }
+        Pokeball.MergeFrom(other.Pokeball);
+      }
+      if (other.potion_ != null) {
+        if (potion_ == null) {
+          potion_ = new global::POGOProtos.Settings.Master.Item.PotionAttributes();
+        }
+        Potion.MergeFrom(other.Potion);
+      }
+      if (other.revive_ != null) {
+        if (revive_ == null) {
+          revive_ = new global::POGOProtos.Settings.Master.Item.ReviveAttributes();
+        }
+        Revive.MergeFrom(other.Revive);
+      }
+      if (other.battle_ != null) {
+        if (battle_ == null) {
+          battle_ = new global::POGOProtos.Settings.Master.Item.BattleAttributes();
+        }
+        Battle.MergeFrom(other.Battle);
+      }
+      if (other.food_ != null) {
+        if (food_ == null) {
+          food_ = new global::POGOProtos.Settings.Master.Item.FoodAttributes();
+        }
+        Food.MergeFrom(other.Food);
+      }
+      if (other.inventoryUpgrade_ != null) {
+        if (inventoryUpgrade_ == null) {
+          inventoryUpgrade_ = new global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes();
+        }
+        InventoryUpgrade.MergeFrom(other.InventoryUpgrade);
+      }
+      if (other.xpBoost_ != null) {
+        if (xpBoost_ == null) {
+          xpBoost_ = new global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes();
+        }
+        XpBoost.MergeFrom(other.XpBoost);
+      }
+      if (other.incense_ != null) {
+        if (incense_ == null) {
+          incense_ = new global::POGOProtos.Settings.Master.Item.IncenseAttributes();
+        }
+        Incense.MergeFrom(other.Incense);
+      }
+      if (other.eggIncubator_ != null) {
+        if (eggIncubator_ == null) {
+          eggIncubator_ = new global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes();
+        }
+        EggIncubator.MergeFrom(other.EggIncubator);
+      }
+      if (other.fortModifier_ != null) {
+        if (fortModifier_ == null) {
+          fortModifier_ = new global::POGOProtos.Settings.Master.Item.FortModifierAttributes();
+        }
+        FortModifier.MergeFrom(other.FortModifier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            itemId_ = (global::POGOProtos.Inventory.Item.ItemId) input.ReadEnum();
+            break;
+          }
+          case 16: {
+            itemType_ = (global::POGOProtos.Inventory.Item.ItemType) input.ReadEnum();
+            break;
+          }
+          case 24: {
+            category_ = (global::POGOProtos.Enums.ItemCategory) input.ReadEnum();
+            break;
+          }
+          case 37: {
+            DropFreq = input.ReadFloat();
+            break;
+          }
+          case 40: {
+            DropTrainerLevel = input.ReadInt32();
+            break;
+          }
+          case 50: {
+            if (pokeball_ == null) {
+              pokeball_ = new global::POGOProtos.Settings.Master.Item.PokeballAttributes();
+            }
+            input.ReadMessage(pokeball_);
+            break;
+          }
+          case 58: {
+            if (potion_ == null) {
+              potion_ = new global::POGOProtos.Settings.Master.Item.PotionAttributes();
+            }
+            input.ReadMessage(potion_);
+            break;
+          }
+          case 66: {
+            if (revive_ == null) {
+              revive_ = new global::POGOProtos.Settings.Master.Item.ReviveAttributes();
+            }
+            input.ReadMessage(revive_);
+            break;
+          }
+          case 74: {
+            if (battle_ == null) {
+              battle_ = new global::POGOProtos.Settings.Master.Item.BattleAttributes();
+            }
+            input.ReadMessage(battle_);
+            break;
+          }
+          case 82: {
+            if (food_ == null) {
+              food_ = new global::POGOProtos.Settings.Master.Item.FoodAttributes();
+            }
+            input.ReadMessage(food_);
+            break;
+          }
+          case 90: {
+            if (inventoryUpgrade_ == null) {
+              inventoryUpgrade_ = new global::POGOProtos.Settings.Master.Item.InventoryUpgradeAttributes();
+            }
+            input.ReadMessage(inventoryUpgrade_);
+            break;
+          }
+          case 98: {
+            if (xpBoost_ == null) {
+              xpBoost_ = new global::POGOProtos.Settings.Master.Item.ExperienceBoostAttributes();
+            }
+            input.ReadMessage(xpBoost_);
+            break;
+          }
+          case 106: {
+            if (incense_ == null) {
+              incense_ = new global::POGOProtos.Settings.Master.Item.IncenseAttributes();
+            }
+            input.ReadMessage(incense_);
+            break;
+          }
+          case 114: {
+            if (eggIncubator_ == null) {
+              eggIncubator_ = new global::POGOProtos.Settings.Master.Item.EggIncubatorAttributes();
+            }
+            input.ReadMessage(eggIncubator_);
+            break;
+          }
+          case 122: {
+            if (fortModifier_ == null) {
+              fortModifier_ = new global::POGOProtos.Settings.Master.Item.FortModifierAttributes();
+            }
+            input.ReadMessage(fortModifier_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class PlayerLevelSettings : pb::IMessage<PlayerLevelSettings> {
+    private static readonly pb::MessageParser<PlayerLevelSettings> _parser = new pb::MessageParser<PlayerLevelSettings>(() => new PlayerLevelSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerLevelSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[11]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerLevelSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerLevelSettings(PlayerLevelSettings other) : this() {
+      rankNum_ = other.rankNum_.Clone();
+      requiredExperience_ = other.requiredExperience_.Clone();
+      cpMultiplier_ = other.cpMultiplier_.Clone();
+      maxEggPlayerLevel_ = other.maxEggPlayerLevel_;
+      maxEncounterPlayerLevel_ = other.maxEncounterPlayerLevel_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerLevelSettings Clone() {
+      return new PlayerLevelSettings(this);
+    }
+
+    /// <summary>Field number for the "rank_num" field.</summary>
+    public const int RankNumFieldNumber = 1;
+    private static readonly pb::FieldCodec<int> _repeated_rankNum_codec
+        = pb::FieldCodec.ForInt32(10);
+    private readonly pbc::RepeatedField<int> rankNum_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> RankNum {
+      get { return rankNum_; }
+    }
+
+    /// <summary>Field number for the "required_experience" field.</summary>
+    public const int RequiredExperienceFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_requiredExperience_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> requiredExperience_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> RequiredExperience {
+      get { return requiredExperience_; }
+    }
+
+    /// <summary>Field number for the "cp_multiplier" field.</summary>
+    public const int CpMultiplierFieldNumber = 3;
+    private static readonly pb::FieldCodec<float> _repeated_cpMultiplier_codec
+        = pb::FieldCodec.ForFloat(26);
+    private readonly pbc::RepeatedField<float> cpMultiplier_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> CpMultiplier {
+      get { return cpMultiplier_; }
+    }
+
+    /// <summary>Field number for the "max_egg_player_level" field.</summary>
+    public const int MaxEggPlayerLevelFieldNumber = 4;
+    private int maxEggPlayerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxEggPlayerLevel {
+      get { return maxEggPlayerLevel_; }
+      set {
+        maxEggPlayerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_encounter_player_level" field.</summary>
+    public const int MaxEncounterPlayerLevelFieldNumber = 5;
+    private int maxEncounterPlayerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxEncounterPlayerLevel {
+      get { return maxEncounterPlayerLevel_; }
+      set {
+        maxEncounterPlayerLevel_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerLevelSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerLevelSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!rankNum_.Equals(other.rankNum_)) return false;
+      if(!requiredExperience_.Equals(other.requiredExperience_)) return false;
+      if(!cpMultiplier_.Equals(other.cpMultiplier_)) return false;
+      if (MaxEggPlayerLevel != other.MaxEggPlayerLevel) return false;
+      if (MaxEncounterPlayerLevel != other.MaxEncounterPlayerLevel) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= rankNum_.GetHashCode();
+      hash ^= requiredExperience_.GetHashCode();
+      hash ^= cpMultiplier_.GetHashCode();
+      if (MaxEggPlayerLevel != 0) hash ^= MaxEggPlayerLevel.GetHashCode();
+      if (MaxEncounterPlayerLevel != 0) hash ^= MaxEncounterPlayerLevel.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      rankNum_.WriteTo(output, _repeated_rankNum_codec);
+      requiredExperience_.WriteTo(output, _repeated_requiredExperience_codec);
+      cpMultiplier_.WriteTo(output, _repeated_cpMultiplier_codec);
+      if (MaxEggPlayerLevel != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(MaxEggPlayerLevel);
+      }
+      if (MaxEncounterPlayerLevel != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(MaxEncounterPlayerLevel);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += rankNum_.CalculateSize(_repeated_rankNum_codec);
+      size += requiredExperience_.CalculateSize(_repeated_requiredExperience_codec);
+      size += cpMultiplier_.CalculateSize(_repeated_cpMultiplier_codec);
+      if (MaxEggPlayerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxEggPlayerLevel);
+      }
+      if (MaxEncounterPlayerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxEncounterPlayerLevel);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerLevelSettings other) {
+      if (other == null) {
+        return;
+      }
+      rankNum_.Add(other.rankNum_);
+      requiredExperience_.Add(other.requiredExperience_);
+      cpMultiplier_.Add(other.cpMultiplier_);
+      if (other.MaxEggPlayerLevel != 0) {
+        MaxEggPlayerLevel = other.MaxEggPlayerLevel;
+      }
+      if (other.MaxEncounterPlayerLevel != 0) {
+        MaxEncounterPlayerLevel = other.MaxEncounterPlayerLevel;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            rankNum_.AddEntriesFrom(input, _repeated_rankNum_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            requiredExperience_.AddEntriesFrom(input, _repeated_requiredExperience_codec);
+            break;
+          }
+          case 26:
+          case 29: {
+            cpMultiplier_.AddEntriesFrom(input, _repeated_cpMultiplier_codec);
+            break;
+          }
+          case 32: {
+            MaxEggPlayerLevel = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            MaxEncounterPlayerLevel = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GymLevelSettings : pb::IMessage<GymLevelSettings> {
+    private static readonly pb::MessageParser<GymLevelSettings> _parser = new pb::MessageParser<GymLevelSettings>(() => new GymLevelSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GymLevelSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[12]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymLevelSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymLevelSettings(GymLevelSettings other) : this() {
+      requiredExperience_ = other.requiredExperience_.Clone();
+      leaderSlots_ = other.leaderSlots_.Clone();
+      trainerSlots_ = other.trainerSlots_.Clone();
+      searchRollBonus_ = other.searchRollBonus_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GymLevelSettings Clone() {
+      return new GymLevelSettings(this);
+    }
+
+    /// <summary>Field number for the "required_experience" field.</summary>
+    public const int RequiredExperienceFieldNumber = 1;
+    private static readonly pb::FieldCodec<int> _repeated_requiredExperience_codec
+        = pb::FieldCodec.ForInt32(10);
+    private readonly pbc::RepeatedField<int> requiredExperience_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> RequiredExperience {
+      get { return requiredExperience_; }
+    }
+
+    /// <summary>Field number for the "leader_slots" field.</summary>
+    public const int LeaderSlotsFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_leaderSlots_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> leaderSlots_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> LeaderSlots {
+      get { return leaderSlots_; }
+    }
+
+    /// <summary>Field number for the "trainer_slots" field.</summary>
+    public const int TrainerSlotsFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_trainerSlots_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> trainerSlots_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> TrainerSlots {
+      get { return trainerSlots_; }
+    }
+
+    /// <summary>Field number for the "search_roll_bonus" field.</summary>
+    public const int SearchRollBonusFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_searchRollBonus_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> searchRollBonus_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> SearchRollBonus {
+      get { return searchRollBonus_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GymLevelSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GymLevelSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!requiredExperience_.Equals(other.requiredExperience_)) return false;
+      if(!leaderSlots_.Equals(other.leaderSlots_)) return false;
+      if(!trainerSlots_.Equals(other.trainerSlots_)) return false;
+      if(!searchRollBonus_.Equals(other.searchRollBonus_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= requiredExperience_.GetHashCode();
+      hash ^= leaderSlots_.GetHashCode();
+      hash ^= trainerSlots_.GetHashCode();
+      hash ^= searchRollBonus_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      requiredExperience_.WriteTo(output, _repeated_requiredExperience_codec);
+      leaderSlots_.WriteTo(output, _repeated_leaderSlots_codec);
+      trainerSlots_.WriteTo(output, _repeated_trainerSlots_codec);
+      searchRollBonus_.WriteTo(output, _repeated_searchRollBonus_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += requiredExperience_.CalculateSize(_repeated_requiredExperience_codec);
+      size += leaderSlots_.CalculateSize(_repeated_leaderSlots_codec);
+      size += trainerSlots_.CalculateSize(_repeated_trainerSlots_codec);
+      size += searchRollBonus_.CalculateSize(_repeated_searchRollBonus_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GymLevelSettings other) {
+      if (other == null) {
+        return;
+      }
+      requiredExperience_.Add(other.requiredExperience_);
+      leaderSlots_.Add(other.leaderSlots_);
+      trainerSlots_.Add(other.trainerSlots_);
+      searchRollBonus_.Add(other.searchRollBonus_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            requiredExperience_.AddEntriesFrom(input, _repeated_requiredExperience_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            leaderSlots_.AddEntriesFrom(input, _repeated_leaderSlots_codec);
+            break;
+          }
+          case 26:
+          case 24: {
+            trainerSlots_.AddEntriesFrom(input, _repeated_trainerSlots_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            searchRollBonus_.AddEntriesFrom(input, _repeated_searchRollBonus_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class TypeEffectiveSettings : pb::IMessage<TypeEffectiveSettings> {
+    private static readonly pb::MessageParser<TypeEffectiveSettings> _parser = new pb::MessageParser<TypeEffectiveSettings>(() => new TypeEffectiveSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<TypeEffectiveSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[13]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public TypeEffectiveSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public TypeEffectiveSettings(TypeEffectiveSettings other) : this() {
+      attackScalar_ = other.attackScalar_.Clone();
+      attackType_ = other.attackType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public TypeEffectiveSettings Clone() {
+      return new TypeEffectiveSettings(this);
+    }
+
+    /// <summary>Field number for the "attack_scalar" field.</summary>
+    public const int AttackScalarFieldNumber = 1;
+    private static readonly pb::FieldCodec<float> _repeated_attackScalar_codec
+        = pb::FieldCodec.ForFloat(10);
+    private readonly pbc::RepeatedField<float> attackScalar_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AttackScalar {
+      get { return attackScalar_; }
+    }
+
+    /// <summary>Field number for the "attack_type" field.</summary>
+    public const int AttackTypeFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonType attackType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType AttackType {
+      get { return attackType_; }
+      set {
+        attackType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as TypeEffectiveSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(TypeEffectiveSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!attackScalar_.Equals(other.attackScalar_)) return false;
+      if (AttackType != other.AttackType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= attackScalar_.GetHashCode();
+      if (AttackType != 0) hash ^= AttackType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      attackScalar_.WriteTo(output, _repeated_attackScalar_codec);
+      if (AttackType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) AttackType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += attackScalar_.CalculateSize(_repeated_attackScalar_codec);
+      if (AttackType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) AttackType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(TypeEffectiveSettings other) {
+      if (other == null) {
+        return;
+      }
+      attackScalar_.Add(other.attackScalar_);
+      if (other.AttackType != 0) {
+        AttackType = other.AttackType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 13: {
+            attackScalar_.AddEntriesFrom(input, _repeated_attackScalar_codec);
+            break;
+          }
+          case 16: {
+            attackType_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EncounterSettings : pb::IMessage<EncounterSettings> {
+    private static readonly pb::MessageParser<EncounterSettings> _parser = new pb::MessageParser<EncounterSettings>(() => new EncounterSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.POGOProtosSettingsMasterReflection.Descriptor.MessageTypes[14]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterSettings(EncounterSettings other) : this() {
+      spinBonusThreshold_ = other.spinBonusThreshold_;
+      excellentThrowThreshold_ = other.excellentThrowThreshold_;
+      greatThrowThreshold_ = other.greatThrowThreshold_;
+      niceThrowThreshold_ = other.niceThrowThreshold_;
+      milestoneThreshold_ = other.milestoneThreshold_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterSettings Clone() {
+      return new EncounterSettings(this);
+    }
+
+    /// <summary>Field number for the "spin_bonus_threshold" field.</summary>
+    public const int SpinBonusThresholdFieldNumber = 1;
+    private float spinBonusThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float SpinBonusThreshold {
+      get { return spinBonusThreshold_; }
+      set {
+        spinBonusThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "excellent_throw_threshold" field.</summary>
+    public const int ExcellentThrowThresholdFieldNumber = 2;
+    private float excellentThrowThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ExcellentThrowThreshold {
+      get { return excellentThrowThreshold_; }
+      set {
+        excellentThrowThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "great_throw_threshold" field.</summary>
+    public const int GreatThrowThresholdFieldNumber = 3;
+    private float greatThrowThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GreatThrowThreshold {
+      get { return greatThrowThreshold_; }
+      set {
+        greatThrowThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "nice_throw_threshold" field.</summary>
+    public const int NiceThrowThresholdFieldNumber = 4;
+    private float niceThrowThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float NiceThrowThreshold {
+      get { return niceThrowThreshold_; }
+      set {
+        niceThrowThreshold_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "milestone_threshold" field.</summary>
+    public const int MilestoneThresholdFieldNumber = 5;
+    private int milestoneThreshold_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MilestoneThreshold {
+      get { return milestoneThreshold_; }
+      set {
+        milestoneThreshold_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (SpinBonusThreshold != other.SpinBonusThreshold) return false;
+      if (ExcellentThrowThreshold != other.ExcellentThrowThreshold) return false;
+      if (GreatThrowThreshold != other.GreatThrowThreshold) return false;
+      if (NiceThrowThreshold != other.NiceThrowThreshold) return false;
+      if (MilestoneThreshold != other.MilestoneThreshold) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (SpinBonusThreshold != 0F) hash ^= SpinBonusThreshold.GetHashCode();
+      if (ExcellentThrowThreshold != 0F) hash ^= ExcellentThrowThreshold.GetHashCode();
+      if (GreatThrowThreshold != 0F) hash ^= GreatThrowThreshold.GetHashCode();
+      if (NiceThrowThreshold != 0F) hash ^= NiceThrowThreshold.GetHashCode();
+      if (MilestoneThreshold != 0) hash ^= MilestoneThreshold.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (SpinBonusThreshold != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(SpinBonusThreshold);
+      }
+      if (ExcellentThrowThreshold != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(ExcellentThrowThreshold);
+      }
+      if (GreatThrowThreshold != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(GreatThrowThreshold);
+      }
+      if (NiceThrowThreshold != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(NiceThrowThreshold);
+      }
+      if (MilestoneThreshold != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(MilestoneThreshold);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (SpinBonusThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (ExcellentThrowThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (GreatThrowThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (NiceThrowThreshold != 0F) {
+        size += 1 + 4;
+      }
+      if (MilestoneThreshold != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MilestoneThreshold);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.SpinBonusThreshold != 0F) {
+        SpinBonusThreshold = other.SpinBonusThreshold;
+      }
+      if (other.ExcellentThrowThreshold != 0F) {
+        ExcellentThrowThreshold = other.ExcellentThrowThreshold;
+      }
+      if (other.GreatThrowThreshold != 0F) {
+        GreatThrowThreshold = other.GreatThrowThreshold;
+      }
+      if (other.NiceThrowThreshold != 0F) {
+        NiceThrowThreshold = other.NiceThrowThreshold;
+      }
+      if (other.MilestoneThreshold != 0) {
+        MilestoneThreshold = other.MilestoneThreshold;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            SpinBonusThreshold = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            ExcellentThrowThreshold = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            GreatThrowThreshold = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            NiceThrowThreshold = input.ReadFloat();
+            break;
+          }
+          case 40: {
+            MilestoneThreshold = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/PlayerLevelSettings.cs b/PokemonGo/POGOProtos/Settings/Master/PlayerLevelSettings.cs
new file mode 100644
index 0000000..7758e26
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/PlayerLevelSettings.cs
@@ -0,0 +1,253 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/PlayerLevelSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/PlayerLevelSettings.proto</summary>
+  public static partial class PlayerLevelSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/PlayerLevelSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PlayerLevelSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjRQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9QbGF5ZXJMZXZlbFNldHRp",
+            "bmdzLnByb3RvEhpQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3RlciKdAQoTUGxh",
+            "eWVyTGV2ZWxTZXR0aW5ncxIQCghyYW5rX251bRgBIAMoBRIbChNyZXF1aXJl",
+            "ZF9leHBlcmllbmNlGAIgAygFEhUKDWNwX211bHRpcGxpZXIYAyADKAISHAoU",
+            "bWF4X2VnZ19wbGF5ZXJfbGV2ZWwYBCABKAUSIgoabWF4X2VuY291bnRlcl9w",
+            "bGF5ZXJfbGV2ZWwYBSABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.PlayerLevelSettings), global::POGOProtos.Settings.Master.PlayerLevelSettings.Parser, new[]{ "RankNum", "RequiredExperience", "CpMultiplier", "MaxEggPlayerLevel", "MaxEncounterPlayerLevel" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PlayerLevelSettings : pb::IMessage<PlayerLevelSettings> {
+    private static readonly pb::MessageParser<PlayerLevelSettings> _parser = new pb::MessageParser<PlayerLevelSettings>(() => new PlayerLevelSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PlayerLevelSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.PlayerLevelSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerLevelSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerLevelSettings(PlayerLevelSettings other) : this() {
+      rankNum_ = other.rankNum_.Clone();
+      requiredExperience_ = other.requiredExperience_.Clone();
+      cpMultiplier_ = other.cpMultiplier_.Clone();
+      maxEggPlayerLevel_ = other.maxEggPlayerLevel_;
+      maxEncounterPlayerLevel_ = other.maxEncounterPlayerLevel_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PlayerLevelSettings Clone() {
+      return new PlayerLevelSettings(this);
+    }
+
+    /// <summary>Field number for the "rank_num" field.</summary>
+    public const int RankNumFieldNumber = 1;
+    private static readonly pb::FieldCodec<int> _repeated_rankNum_codec
+        = pb::FieldCodec.ForInt32(10);
+    private readonly pbc::RepeatedField<int> rankNum_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> RankNum {
+      get { return rankNum_; }
+    }
+
+    /// <summary>Field number for the "required_experience" field.</summary>
+    public const int RequiredExperienceFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_requiredExperience_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> requiredExperience_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> RequiredExperience {
+      get { return requiredExperience_; }
+    }
+
+    /// <summary>Field number for the "cp_multiplier" field.</summary>
+    public const int CpMultiplierFieldNumber = 3;
+    private static readonly pb::FieldCodec<float> _repeated_cpMultiplier_codec
+        = pb::FieldCodec.ForFloat(26);
+    private readonly pbc::RepeatedField<float> cpMultiplier_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> CpMultiplier {
+      get { return cpMultiplier_; }
+    }
+
+    /// <summary>Field number for the "max_egg_player_level" field.</summary>
+    public const int MaxEggPlayerLevelFieldNumber = 4;
+    private int maxEggPlayerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxEggPlayerLevel {
+      get { return maxEggPlayerLevel_; }
+      set {
+        maxEggPlayerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_encounter_player_level" field.</summary>
+    public const int MaxEncounterPlayerLevelFieldNumber = 5;
+    private int maxEncounterPlayerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxEncounterPlayerLevel {
+      get { return maxEncounterPlayerLevel_; }
+      set {
+        maxEncounterPlayerLevel_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerLevelSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PlayerLevelSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!rankNum_.Equals(other.rankNum_)) return false;
+      if(!requiredExperience_.Equals(other.requiredExperience_)) return false;
+      if(!cpMultiplier_.Equals(other.cpMultiplier_)) return false;
+      if (MaxEggPlayerLevel != other.MaxEggPlayerLevel) return false;
+      if (MaxEncounterPlayerLevel != other.MaxEncounterPlayerLevel) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= rankNum_.GetHashCode();
+      hash ^= requiredExperience_.GetHashCode();
+      hash ^= cpMultiplier_.GetHashCode();
+      if (MaxEggPlayerLevel != 0) hash ^= MaxEggPlayerLevel.GetHashCode();
+      if (MaxEncounterPlayerLevel != 0) hash ^= MaxEncounterPlayerLevel.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      rankNum_.WriteTo(output, _repeated_rankNum_codec);
+      requiredExperience_.WriteTo(output, _repeated_requiredExperience_codec);
+      cpMultiplier_.WriteTo(output, _repeated_cpMultiplier_codec);
+      if (MaxEggPlayerLevel != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(MaxEggPlayerLevel);
+      }
+      if (MaxEncounterPlayerLevel != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(MaxEncounterPlayerLevel);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += rankNum_.CalculateSize(_repeated_rankNum_codec);
+      size += requiredExperience_.CalculateSize(_repeated_requiredExperience_codec);
+      size += cpMultiplier_.CalculateSize(_repeated_cpMultiplier_codec);
+      if (MaxEggPlayerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxEggPlayerLevel);
+      }
+      if (MaxEncounterPlayerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxEncounterPlayerLevel);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PlayerLevelSettings other) {
+      if (other == null) {
+        return;
+      }
+      rankNum_.Add(other.rankNum_);
+      requiredExperience_.Add(other.requiredExperience_);
+      cpMultiplier_.Add(other.cpMultiplier_);
+      if (other.MaxEggPlayerLevel != 0) {
+        MaxEggPlayerLevel = other.MaxEggPlayerLevel;
+      }
+      if (other.MaxEncounterPlayerLevel != 0) {
+        MaxEncounterPlayerLevel = other.MaxEncounterPlayerLevel;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 8: {
+            rankNum_.AddEntriesFrom(input, _repeated_rankNum_codec);
+            break;
+          }
+          case 18:
+          case 16: {
+            requiredExperience_.AddEntriesFrom(input, _repeated_requiredExperience_codec);
+            break;
+          }
+          case 26:
+          case 29: {
+            cpMultiplier_.AddEntriesFrom(input, _repeated_cpMultiplier_codec);
+            break;
+          }
+          case 32: {
+            MaxEggPlayerLevel = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            MaxEncounterPlayerLevel = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Pokemon/CameraAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Pokemon/CameraAttributes.cs
new file mode 100644
index 0000000..d95c6c3
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Pokemon/CameraAttributes.cs
@@ -0,0 +1,274 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Pokemon/CameraAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Pokemon/CameraAttributes.proto</summary>
+  public static partial class CameraAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Pokemon/CameraAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CameraAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjlQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Qb2tlbW9uL0NhbWVyYUF0",
+            "dHJpYnV0ZXMucHJvdG8SIlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyLlBv",
+            "a2Vtb24ilwEKEENhbWVyYUF0dHJpYnV0ZXMSFQoNZGlza19yYWRpdXNfbRgB",
+            "IAEoAhIZChFjeWxpbmRlcl9yYWRpdXNfbRgCIAEoAhIZChFjeWxpbmRlcl9o",
+            "ZWlnaHRfbRgDIAEoAhIZChFjeWxpbmRlcl9ncm91bmRfbRgEIAEoAhIbChNz",
+            "aG91bGRlcl9tb2RlX3NjYWxlGAUgASgCYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Pokemon.CameraAttributes), global::POGOProtos.Settings.Master.Pokemon.CameraAttributes.Parser, new[]{ "DiskRadiusM", "CylinderRadiusM", "CylinderHeightM", "CylinderGroundM", "ShoulderModeScale" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CameraAttributes : pb::IMessage<CameraAttributes> {
+    private static readonly pb::MessageParser<CameraAttributes> _parser = new pb::MessageParser<CameraAttributes>(() => new CameraAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CameraAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Pokemon.CameraAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraAttributes(CameraAttributes other) : this() {
+      diskRadiusM_ = other.diskRadiusM_;
+      cylinderRadiusM_ = other.cylinderRadiusM_;
+      cylinderHeightM_ = other.cylinderHeightM_;
+      cylinderGroundM_ = other.cylinderGroundM_;
+      shoulderModeScale_ = other.shoulderModeScale_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraAttributes Clone() {
+      return new CameraAttributes(this);
+    }
+
+    /// <summary>Field number for the "disk_radius_m" field.</summary>
+    public const int DiskRadiusMFieldNumber = 1;
+    private float diskRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DiskRadiusM {
+      get { return diskRadiusM_; }
+      set {
+        diskRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cylinder_radius_m" field.</summary>
+    public const int CylinderRadiusMFieldNumber = 2;
+    private float cylinderRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CylinderRadiusM {
+      get { return cylinderRadiusM_; }
+      set {
+        cylinderRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cylinder_height_m" field.</summary>
+    public const int CylinderHeightMFieldNumber = 3;
+    private float cylinderHeightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CylinderHeightM {
+      get { return cylinderHeightM_; }
+      set {
+        cylinderHeightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cylinder_ground_m" field.</summary>
+    public const int CylinderGroundMFieldNumber = 4;
+    private float cylinderGroundM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CylinderGroundM {
+      get { return cylinderGroundM_; }
+      set {
+        cylinderGroundM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "shoulder_mode_scale" field.</summary>
+    public const int ShoulderModeScaleFieldNumber = 5;
+    private float shoulderModeScale_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ShoulderModeScale {
+      get { return shoulderModeScale_; }
+      set {
+        shoulderModeScale_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CameraAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CameraAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (DiskRadiusM != other.DiskRadiusM) return false;
+      if (CylinderRadiusM != other.CylinderRadiusM) return false;
+      if (CylinderHeightM != other.CylinderHeightM) return false;
+      if (CylinderGroundM != other.CylinderGroundM) return false;
+      if (ShoulderModeScale != other.ShoulderModeScale) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (DiskRadiusM != 0F) hash ^= DiskRadiusM.GetHashCode();
+      if (CylinderRadiusM != 0F) hash ^= CylinderRadiusM.GetHashCode();
+      if (CylinderHeightM != 0F) hash ^= CylinderHeightM.GetHashCode();
+      if (CylinderGroundM != 0F) hash ^= CylinderGroundM.GetHashCode();
+      if (ShoulderModeScale != 0F) hash ^= ShoulderModeScale.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (DiskRadiusM != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(DiskRadiusM);
+      }
+      if (CylinderRadiusM != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(CylinderRadiusM);
+      }
+      if (CylinderHeightM != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(CylinderHeightM);
+      }
+      if (CylinderGroundM != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(CylinderGroundM);
+      }
+      if (ShoulderModeScale != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(ShoulderModeScale);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (DiskRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (CylinderRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (CylinderHeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (CylinderGroundM != 0F) {
+        size += 1 + 4;
+      }
+      if (ShoulderModeScale != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CameraAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.DiskRadiusM != 0F) {
+        DiskRadiusM = other.DiskRadiusM;
+      }
+      if (other.CylinderRadiusM != 0F) {
+        CylinderRadiusM = other.CylinderRadiusM;
+      }
+      if (other.CylinderHeightM != 0F) {
+        CylinderHeightM = other.CylinderHeightM;
+      }
+      if (other.CylinderGroundM != 0F) {
+        CylinderGroundM = other.CylinderGroundM;
+      }
+      if (other.ShoulderModeScale != 0F) {
+        ShoulderModeScale = other.ShoulderModeScale;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            DiskRadiusM = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            CylinderRadiusM = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            CylinderHeightM = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            CylinderGroundM = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            ShoulderModeScale = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Pokemon/EncounterAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Pokemon/EncounterAttributes.cs
new file mode 100644
index 0000000..0dcf4c9
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Pokemon/EncounterAttributes.cs
@@ -0,0 +1,390 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Pokemon/EncounterAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Pokemon/EncounterAttributes.proto</summary>
+  public static partial class EncounterAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Pokemon/EncounterAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjxQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Qb2tlbW9uL0VuY291bnRl",
+            "ckF0dHJpYnV0ZXMucHJvdG8SIlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVy",
+            "LlBva2Vtb24aKlBPR09Qcm90b3MvRW51bXMvUG9rZW1vbk1vdmVtZW50VHlw",
+            "ZS5wcm90byKmAgoTRW5jb3VudGVyQXR0cmlidXRlcxIZChFiYXNlX2NhcHR1",
+            "cmVfcmF0ZRgBIAEoAhIWCg5iYXNlX2ZsZWVfcmF0ZRgCIAEoAhIaChJjb2xs",
+            "aXNpb25fcmFkaXVzX20YAyABKAISGgoSY29sbGlzaW9uX2hlaWdodF9tGAQg",
+            "ASgCEh8KF2NvbGxpc2lvbl9oZWFkX3JhZGl1c19tGAUgASgCEjwKDW1vdmVt",
+            "ZW50X3R5cGUYBiABKA4yJS5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25Nb3Zl",
+            "bWVudFR5cGUSGAoQbW92ZW1lbnRfdGltZXJfcxgHIAEoAhITCgtqdW1wX3Rp",
+            "bWVfcxgIIAEoAhIWCg5hdHRhY2tfdGltZXJfcxgJIAEoAmIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonMovementTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes), global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes.Parser, new[]{ "BaseCaptureRate", "BaseFleeRate", "CollisionRadiusM", "CollisionHeightM", "CollisionHeadRadiusM", "MovementType", "MovementTimerS", "JumpTimeS", "AttackTimerS" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class EncounterAttributes : pb::IMessage<EncounterAttributes> {
+    private static readonly pb::MessageParser<EncounterAttributes> _parser = new pb::MessageParser<EncounterAttributes>(() => new EncounterAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Pokemon.EncounterAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterAttributes(EncounterAttributes other) : this() {
+      baseCaptureRate_ = other.baseCaptureRate_;
+      baseFleeRate_ = other.baseFleeRate_;
+      collisionRadiusM_ = other.collisionRadiusM_;
+      collisionHeightM_ = other.collisionHeightM_;
+      collisionHeadRadiusM_ = other.collisionHeadRadiusM_;
+      movementType_ = other.movementType_;
+      movementTimerS_ = other.movementTimerS_;
+      jumpTimeS_ = other.jumpTimeS_;
+      attackTimerS_ = other.attackTimerS_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterAttributes Clone() {
+      return new EncounterAttributes(this);
+    }
+
+    /// <summary>Field number for the "base_capture_rate" field.</summary>
+    public const int BaseCaptureRateFieldNumber = 1;
+    private float baseCaptureRate_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float BaseCaptureRate {
+      get { return baseCaptureRate_; }
+      set {
+        baseCaptureRate_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_flee_rate" field.</summary>
+    public const int BaseFleeRateFieldNumber = 2;
+    private float baseFleeRate_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float BaseFleeRate {
+      get { return baseFleeRate_; }
+      set {
+        baseFleeRate_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "collision_radius_m" field.</summary>
+    public const int CollisionRadiusMFieldNumber = 3;
+    private float collisionRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CollisionRadiusM {
+      get { return collisionRadiusM_; }
+      set {
+        collisionRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "collision_height_m" field.</summary>
+    public const int CollisionHeightMFieldNumber = 4;
+    private float collisionHeightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CollisionHeightM {
+      get { return collisionHeightM_; }
+      set {
+        collisionHeightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "collision_head_radius_m" field.</summary>
+    public const int CollisionHeadRadiusMFieldNumber = 5;
+    private float collisionHeadRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CollisionHeadRadiusM {
+      get { return collisionHeadRadiusM_; }
+      set {
+        collisionHeadRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "movement_type" field.</summary>
+    public const int MovementTypeFieldNumber = 6;
+    private global::POGOProtos.Enums.PokemonMovementType movementType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMovementType MovementType {
+      get { return movementType_; }
+      set {
+        movementType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "movement_timer_s" field.</summary>
+    public const int MovementTimerSFieldNumber = 7;
+    private float movementTimerS_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float MovementTimerS {
+      get { return movementTimerS_; }
+      set {
+        movementTimerS_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "jump_time_s" field.</summary>
+    public const int JumpTimeSFieldNumber = 8;
+    private float jumpTimeS_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float JumpTimeS {
+      get { return jumpTimeS_; }
+      set {
+        jumpTimeS_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attack_timer_s" field.</summary>
+    public const int AttackTimerSFieldNumber = 9;
+    private float attackTimerS_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AttackTimerS {
+      get { return attackTimerS_; }
+      set {
+        attackTimerS_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BaseCaptureRate != other.BaseCaptureRate) return false;
+      if (BaseFleeRate != other.BaseFleeRate) return false;
+      if (CollisionRadiusM != other.CollisionRadiusM) return false;
+      if (CollisionHeightM != other.CollisionHeightM) return false;
+      if (CollisionHeadRadiusM != other.CollisionHeadRadiusM) return false;
+      if (MovementType != other.MovementType) return false;
+      if (MovementTimerS != other.MovementTimerS) return false;
+      if (JumpTimeS != other.JumpTimeS) return false;
+      if (AttackTimerS != other.AttackTimerS) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BaseCaptureRate != 0F) hash ^= BaseCaptureRate.GetHashCode();
+      if (BaseFleeRate != 0F) hash ^= BaseFleeRate.GetHashCode();
+      if (CollisionRadiusM != 0F) hash ^= CollisionRadiusM.GetHashCode();
+      if (CollisionHeightM != 0F) hash ^= CollisionHeightM.GetHashCode();
+      if (CollisionHeadRadiusM != 0F) hash ^= CollisionHeadRadiusM.GetHashCode();
+      if (MovementType != 0) hash ^= MovementType.GetHashCode();
+      if (MovementTimerS != 0F) hash ^= MovementTimerS.GetHashCode();
+      if (JumpTimeS != 0F) hash ^= JumpTimeS.GetHashCode();
+      if (AttackTimerS != 0F) hash ^= AttackTimerS.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BaseCaptureRate != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(BaseCaptureRate);
+      }
+      if (BaseFleeRate != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(BaseFleeRate);
+      }
+      if (CollisionRadiusM != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(CollisionRadiusM);
+      }
+      if (CollisionHeightM != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(CollisionHeightM);
+      }
+      if (CollisionHeadRadiusM != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(CollisionHeadRadiusM);
+      }
+      if (MovementType != 0) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) MovementType);
+      }
+      if (MovementTimerS != 0F) {
+        output.WriteRawTag(61);
+        output.WriteFloat(MovementTimerS);
+      }
+      if (JumpTimeS != 0F) {
+        output.WriteRawTag(69);
+        output.WriteFloat(JumpTimeS);
+      }
+      if (AttackTimerS != 0F) {
+        output.WriteRawTag(77);
+        output.WriteFloat(AttackTimerS);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BaseCaptureRate != 0F) {
+        size += 1 + 4;
+      }
+      if (BaseFleeRate != 0F) {
+        size += 1 + 4;
+      }
+      if (CollisionRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (CollisionHeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (CollisionHeadRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (MovementType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) MovementType);
+      }
+      if (MovementTimerS != 0F) {
+        size += 1 + 4;
+      }
+      if (JumpTimeS != 0F) {
+        size += 1 + 4;
+      }
+      if (AttackTimerS != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BaseCaptureRate != 0F) {
+        BaseCaptureRate = other.BaseCaptureRate;
+      }
+      if (other.BaseFleeRate != 0F) {
+        BaseFleeRate = other.BaseFleeRate;
+      }
+      if (other.CollisionRadiusM != 0F) {
+        CollisionRadiusM = other.CollisionRadiusM;
+      }
+      if (other.CollisionHeightM != 0F) {
+        CollisionHeightM = other.CollisionHeightM;
+      }
+      if (other.CollisionHeadRadiusM != 0F) {
+        CollisionHeadRadiusM = other.CollisionHeadRadiusM;
+      }
+      if (other.MovementType != 0) {
+        MovementType = other.MovementType;
+      }
+      if (other.MovementTimerS != 0F) {
+        MovementTimerS = other.MovementTimerS;
+      }
+      if (other.JumpTimeS != 0F) {
+        JumpTimeS = other.JumpTimeS;
+      }
+      if (other.AttackTimerS != 0F) {
+        AttackTimerS = other.AttackTimerS;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            BaseCaptureRate = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            BaseFleeRate = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            CollisionRadiusM = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            CollisionHeightM = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            CollisionHeadRadiusM = input.ReadFloat();
+            break;
+          }
+          case 48: {
+            movementType_ = (global::POGOProtos.Enums.PokemonMovementType) input.ReadEnum();
+            break;
+          }
+          case 61: {
+            MovementTimerS = input.ReadFloat();
+            break;
+          }
+          case 69: {
+            JumpTimeS = input.ReadFloat();
+            break;
+          }
+          case 77: {
+            AttackTimerS = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Pokemon/POGOProtosSettingsMasterPokemon.cs b/PokemonGo/POGOProtos/Settings/Master/Pokemon/POGOProtosSettingsMasterPokemon.cs
new file mode 100644
index 0000000..14c46ab
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Pokemon/POGOProtosSettingsMasterPokemon.cs
@@ -0,0 +1,827 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Settings.Master.Pokemon.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Settings.Master.Pokemon.proto</summary>
+  public static partial class POGOProtosSettingsMasterPokemonReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Settings.Master.Pokemon.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosSettingsMasterPokemonReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CihQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5Qb2tlbW9uLnByb3RvEiJQ",
+            "T0dPUHJvdG9zLlNldHRpbmdzLk1hc3Rlci5Qb2tlbW9uGhZQT0dPUHJvdG9z",
+            "LkVudW1zLnByb3RvIpcBChBDYW1lcmFBdHRyaWJ1dGVzEhUKDWRpc2tfcmFk",
+            "aXVzX20YASABKAISGQoRY3lsaW5kZXJfcmFkaXVzX20YAiABKAISGQoRY3ls",
+            "aW5kZXJfaGVpZ2h0X20YAyABKAISGQoRY3lsaW5kZXJfZ3JvdW5kX20YBCAB",
+            "KAISGwoTc2hvdWxkZXJfbW9kZV9zY2FsZRgFIAEoAiJuCg9TdGF0c0F0dHJp",
+            "YnV0ZXMSFAoMYmFzZV9zdGFtaW5hGAEgASgFEhMKC2Jhc2VfYXR0YWNrGAIg",
+            "ASgFEhQKDGJhc2VfZGVmZW5zZRgDIAEoBRIaChJkb2RnZV9lbmVyZ3lfZGVs",
+            "dGEYCCABKAUipgIKE0VuY291bnRlckF0dHJpYnV0ZXMSGQoRYmFzZV9jYXB0",
+            "dXJlX3JhdGUYASABKAISFgoOYmFzZV9mbGVlX3JhdGUYAiABKAISGgoSY29s",
+            "bGlzaW9uX3JhZGl1c19tGAMgASgCEhoKEmNvbGxpc2lvbl9oZWlnaHRfbRgE",
+            "IAEoAhIfChdjb2xsaXNpb25faGVhZF9yYWRpdXNfbRgFIAEoAhI8Cg1tb3Zl",
+            "bWVudF90eXBlGAYgASgOMiUuUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uTW92",
+            "ZW1lbnRUeXBlEhgKEG1vdmVtZW50X3RpbWVyX3MYByABKAISEwoLanVtcF90",
+            "aW1lX3MYCCABKAISFgoOYXR0YWNrX3RpbWVyX3MYCSABKAJQAGIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.POGOProtosEnumsReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Pokemon.CameraAttributes), global::POGOProtos.Settings.Master.Pokemon.CameraAttributes.Parser, new[]{ "DiskRadiusM", "CylinderRadiusM", "CylinderHeightM", "CylinderGroundM", "ShoulderModeScale" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Pokemon.StatsAttributes), global::POGOProtos.Settings.Master.Pokemon.StatsAttributes.Parser, new[]{ "BaseStamina", "BaseAttack", "BaseDefense", "DodgeEnergyDelta" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes), global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes.Parser, new[]{ "BaseCaptureRate", "BaseFleeRate", "CollisionRadiusM", "CollisionHeightM", "CollisionHeadRadiusM", "MovementType", "MovementTimerS", "JumpTimeS", "AttackTimerS" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class CameraAttributes : pb::IMessage<CameraAttributes> {
+    private static readonly pb::MessageParser<CameraAttributes> _parser = new pb::MessageParser<CameraAttributes>(() => new CameraAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<CameraAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Pokemon.POGOProtosSettingsMasterPokemonReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraAttributes(CameraAttributes other) : this() {
+      diskRadiusM_ = other.diskRadiusM_;
+      cylinderRadiusM_ = other.cylinderRadiusM_;
+      cylinderHeightM_ = other.cylinderHeightM_;
+      cylinderGroundM_ = other.cylinderGroundM_;
+      shoulderModeScale_ = other.shoulderModeScale_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public CameraAttributes Clone() {
+      return new CameraAttributes(this);
+    }
+
+    /// <summary>Field number for the "disk_radius_m" field.</summary>
+    public const int DiskRadiusMFieldNumber = 1;
+    private float diskRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float DiskRadiusM {
+      get { return diskRadiusM_; }
+      set {
+        diskRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cylinder_radius_m" field.</summary>
+    public const int CylinderRadiusMFieldNumber = 2;
+    private float cylinderRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CylinderRadiusM {
+      get { return cylinderRadiusM_; }
+      set {
+        cylinderRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cylinder_height_m" field.</summary>
+    public const int CylinderHeightMFieldNumber = 3;
+    private float cylinderHeightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CylinderHeightM {
+      get { return cylinderHeightM_; }
+      set {
+        cylinderHeightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "cylinder_ground_m" field.</summary>
+    public const int CylinderGroundMFieldNumber = 4;
+    private float cylinderGroundM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CylinderGroundM {
+      get { return cylinderGroundM_; }
+      set {
+        cylinderGroundM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "shoulder_mode_scale" field.</summary>
+    public const int ShoulderModeScaleFieldNumber = 5;
+    private float shoulderModeScale_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ShoulderModeScale {
+      get { return shoulderModeScale_; }
+      set {
+        shoulderModeScale_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as CameraAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(CameraAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (DiskRadiusM != other.DiskRadiusM) return false;
+      if (CylinderRadiusM != other.CylinderRadiusM) return false;
+      if (CylinderHeightM != other.CylinderHeightM) return false;
+      if (CylinderGroundM != other.CylinderGroundM) return false;
+      if (ShoulderModeScale != other.ShoulderModeScale) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (DiskRadiusM != 0F) hash ^= DiskRadiusM.GetHashCode();
+      if (CylinderRadiusM != 0F) hash ^= CylinderRadiusM.GetHashCode();
+      if (CylinderHeightM != 0F) hash ^= CylinderHeightM.GetHashCode();
+      if (CylinderGroundM != 0F) hash ^= CylinderGroundM.GetHashCode();
+      if (ShoulderModeScale != 0F) hash ^= ShoulderModeScale.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (DiskRadiusM != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(DiskRadiusM);
+      }
+      if (CylinderRadiusM != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(CylinderRadiusM);
+      }
+      if (CylinderHeightM != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(CylinderHeightM);
+      }
+      if (CylinderGroundM != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(CylinderGroundM);
+      }
+      if (ShoulderModeScale != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(ShoulderModeScale);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (DiskRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (CylinderRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (CylinderHeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (CylinderGroundM != 0F) {
+        size += 1 + 4;
+      }
+      if (ShoulderModeScale != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(CameraAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.DiskRadiusM != 0F) {
+        DiskRadiusM = other.DiskRadiusM;
+      }
+      if (other.CylinderRadiusM != 0F) {
+        CylinderRadiusM = other.CylinderRadiusM;
+      }
+      if (other.CylinderHeightM != 0F) {
+        CylinderHeightM = other.CylinderHeightM;
+      }
+      if (other.CylinderGroundM != 0F) {
+        CylinderGroundM = other.CylinderGroundM;
+      }
+      if (other.ShoulderModeScale != 0F) {
+        ShoulderModeScale = other.ShoulderModeScale;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            DiskRadiusM = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            CylinderRadiusM = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            CylinderHeightM = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            CylinderGroundM = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            ShoulderModeScale = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class StatsAttributes : pb::IMessage<StatsAttributes> {
+    private static readonly pb::MessageParser<StatsAttributes> _parser = new pb::MessageParser<StatsAttributes>(() => new StatsAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<StatsAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Pokemon.POGOProtosSettingsMasterPokemonReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StatsAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StatsAttributes(StatsAttributes other) : this() {
+      baseStamina_ = other.baseStamina_;
+      baseAttack_ = other.baseAttack_;
+      baseDefense_ = other.baseDefense_;
+      dodgeEnergyDelta_ = other.dodgeEnergyDelta_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StatsAttributes Clone() {
+      return new StatsAttributes(this);
+    }
+
+    /// <summary>Field number for the "base_stamina" field.</summary>
+    public const int BaseStaminaFieldNumber = 1;
+    private int baseStamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseStamina {
+      get { return baseStamina_; }
+      set {
+        baseStamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_attack" field.</summary>
+    public const int BaseAttackFieldNumber = 2;
+    private int baseAttack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseAttack {
+      get { return baseAttack_; }
+      set {
+        baseAttack_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_defense" field.</summary>
+    public const int BaseDefenseFieldNumber = 3;
+    private int baseDefense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseDefense {
+      get { return baseDefense_; }
+      set {
+        baseDefense_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "dodge_energy_delta" field.</summary>
+    public const int DodgeEnergyDeltaFieldNumber = 8;
+    private int dodgeEnergyDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DodgeEnergyDelta {
+      get { return dodgeEnergyDelta_; }
+      set {
+        dodgeEnergyDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as StatsAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(StatsAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BaseStamina != other.BaseStamina) return false;
+      if (BaseAttack != other.BaseAttack) return false;
+      if (BaseDefense != other.BaseDefense) return false;
+      if (DodgeEnergyDelta != other.DodgeEnergyDelta) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BaseStamina != 0) hash ^= BaseStamina.GetHashCode();
+      if (BaseAttack != 0) hash ^= BaseAttack.GetHashCode();
+      if (BaseDefense != 0) hash ^= BaseDefense.GetHashCode();
+      if (DodgeEnergyDelta != 0) hash ^= DodgeEnergyDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BaseStamina != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(BaseStamina);
+      }
+      if (BaseAttack != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(BaseAttack);
+      }
+      if (BaseDefense != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(BaseDefense);
+      }
+      if (DodgeEnergyDelta != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(DodgeEnergyDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BaseStamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseStamina);
+      }
+      if (BaseAttack != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseAttack);
+      }
+      if (BaseDefense != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseDefense);
+      }
+      if (DodgeEnergyDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DodgeEnergyDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(StatsAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BaseStamina != 0) {
+        BaseStamina = other.BaseStamina;
+      }
+      if (other.BaseAttack != 0) {
+        BaseAttack = other.BaseAttack;
+      }
+      if (other.BaseDefense != 0) {
+        BaseDefense = other.BaseDefense;
+      }
+      if (other.DodgeEnergyDelta != 0) {
+        DodgeEnergyDelta = other.DodgeEnergyDelta;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            BaseStamina = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            BaseAttack = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            BaseDefense = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            DodgeEnergyDelta = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class EncounterAttributes : pb::IMessage<EncounterAttributes> {
+    private static readonly pb::MessageParser<EncounterAttributes> _parser = new pb::MessageParser<EncounterAttributes>(() => new EncounterAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<EncounterAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Pokemon.POGOProtosSettingsMasterPokemonReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterAttributes(EncounterAttributes other) : this() {
+      baseCaptureRate_ = other.baseCaptureRate_;
+      baseFleeRate_ = other.baseFleeRate_;
+      collisionRadiusM_ = other.collisionRadiusM_;
+      collisionHeightM_ = other.collisionHeightM_;
+      collisionHeadRadiusM_ = other.collisionHeadRadiusM_;
+      movementType_ = other.movementType_;
+      movementTimerS_ = other.movementTimerS_;
+      jumpTimeS_ = other.jumpTimeS_;
+      attackTimerS_ = other.attackTimerS_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public EncounterAttributes Clone() {
+      return new EncounterAttributes(this);
+    }
+
+    /// <summary>Field number for the "base_capture_rate" field.</summary>
+    public const int BaseCaptureRateFieldNumber = 1;
+    private float baseCaptureRate_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float BaseCaptureRate {
+      get { return baseCaptureRate_; }
+      set {
+        baseCaptureRate_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_flee_rate" field.</summary>
+    public const int BaseFleeRateFieldNumber = 2;
+    private float baseFleeRate_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float BaseFleeRate {
+      get { return baseFleeRate_; }
+      set {
+        baseFleeRate_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "collision_radius_m" field.</summary>
+    public const int CollisionRadiusMFieldNumber = 3;
+    private float collisionRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CollisionRadiusM {
+      get { return collisionRadiusM_; }
+      set {
+        collisionRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "collision_height_m" field.</summary>
+    public const int CollisionHeightMFieldNumber = 4;
+    private float collisionHeightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CollisionHeightM {
+      get { return collisionHeightM_; }
+      set {
+        collisionHeightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "collision_head_radius_m" field.</summary>
+    public const int CollisionHeadRadiusMFieldNumber = 5;
+    private float collisionHeadRadiusM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float CollisionHeadRadiusM {
+      get { return collisionHeadRadiusM_; }
+      set {
+        collisionHeadRadiusM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "movement_type" field.</summary>
+    public const int MovementTypeFieldNumber = 6;
+    private global::POGOProtos.Enums.PokemonMovementType movementType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonMovementType MovementType {
+      get { return movementType_; }
+      set {
+        movementType_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "movement_timer_s" field.</summary>
+    public const int MovementTimerSFieldNumber = 7;
+    private float movementTimerS_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float MovementTimerS {
+      get { return movementTimerS_; }
+      set {
+        movementTimerS_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "jump_time_s" field.</summary>
+    public const int JumpTimeSFieldNumber = 8;
+    private float jumpTimeS_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float JumpTimeS {
+      get { return jumpTimeS_; }
+      set {
+        jumpTimeS_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "attack_timer_s" field.</summary>
+    public const int AttackTimerSFieldNumber = 9;
+    private float attackTimerS_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float AttackTimerS {
+      get { return attackTimerS_; }
+      set {
+        attackTimerS_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as EncounterAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(EncounterAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BaseCaptureRate != other.BaseCaptureRate) return false;
+      if (BaseFleeRate != other.BaseFleeRate) return false;
+      if (CollisionRadiusM != other.CollisionRadiusM) return false;
+      if (CollisionHeightM != other.CollisionHeightM) return false;
+      if (CollisionHeadRadiusM != other.CollisionHeadRadiusM) return false;
+      if (MovementType != other.MovementType) return false;
+      if (MovementTimerS != other.MovementTimerS) return false;
+      if (JumpTimeS != other.JumpTimeS) return false;
+      if (AttackTimerS != other.AttackTimerS) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BaseCaptureRate != 0F) hash ^= BaseCaptureRate.GetHashCode();
+      if (BaseFleeRate != 0F) hash ^= BaseFleeRate.GetHashCode();
+      if (CollisionRadiusM != 0F) hash ^= CollisionRadiusM.GetHashCode();
+      if (CollisionHeightM != 0F) hash ^= CollisionHeightM.GetHashCode();
+      if (CollisionHeadRadiusM != 0F) hash ^= CollisionHeadRadiusM.GetHashCode();
+      if (MovementType != 0) hash ^= MovementType.GetHashCode();
+      if (MovementTimerS != 0F) hash ^= MovementTimerS.GetHashCode();
+      if (JumpTimeS != 0F) hash ^= JumpTimeS.GetHashCode();
+      if (AttackTimerS != 0F) hash ^= AttackTimerS.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BaseCaptureRate != 0F) {
+        output.WriteRawTag(13);
+        output.WriteFloat(BaseCaptureRate);
+      }
+      if (BaseFleeRate != 0F) {
+        output.WriteRawTag(21);
+        output.WriteFloat(BaseFleeRate);
+      }
+      if (CollisionRadiusM != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(CollisionRadiusM);
+      }
+      if (CollisionHeightM != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(CollisionHeightM);
+      }
+      if (CollisionHeadRadiusM != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(CollisionHeadRadiusM);
+      }
+      if (MovementType != 0) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) MovementType);
+      }
+      if (MovementTimerS != 0F) {
+        output.WriteRawTag(61);
+        output.WriteFloat(MovementTimerS);
+      }
+      if (JumpTimeS != 0F) {
+        output.WriteRawTag(69);
+        output.WriteFloat(JumpTimeS);
+      }
+      if (AttackTimerS != 0F) {
+        output.WriteRawTag(77);
+        output.WriteFloat(AttackTimerS);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BaseCaptureRate != 0F) {
+        size += 1 + 4;
+      }
+      if (BaseFleeRate != 0F) {
+        size += 1 + 4;
+      }
+      if (CollisionRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (CollisionHeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (CollisionHeadRadiusM != 0F) {
+        size += 1 + 4;
+      }
+      if (MovementType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) MovementType);
+      }
+      if (MovementTimerS != 0F) {
+        size += 1 + 4;
+      }
+      if (JumpTimeS != 0F) {
+        size += 1 + 4;
+      }
+      if (AttackTimerS != 0F) {
+        size += 1 + 4;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(EncounterAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BaseCaptureRate != 0F) {
+        BaseCaptureRate = other.BaseCaptureRate;
+      }
+      if (other.BaseFleeRate != 0F) {
+        BaseFleeRate = other.BaseFleeRate;
+      }
+      if (other.CollisionRadiusM != 0F) {
+        CollisionRadiusM = other.CollisionRadiusM;
+      }
+      if (other.CollisionHeightM != 0F) {
+        CollisionHeightM = other.CollisionHeightM;
+      }
+      if (other.CollisionHeadRadiusM != 0F) {
+        CollisionHeadRadiusM = other.CollisionHeadRadiusM;
+      }
+      if (other.MovementType != 0) {
+        MovementType = other.MovementType;
+      }
+      if (other.MovementTimerS != 0F) {
+        MovementTimerS = other.MovementTimerS;
+      }
+      if (other.JumpTimeS != 0F) {
+        JumpTimeS = other.JumpTimeS;
+      }
+      if (other.AttackTimerS != 0F) {
+        AttackTimerS = other.AttackTimerS;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 13: {
+            BaseCaptureRate = input.ReadFloat();
+            break;
+          }
+          case 21: {
+            BaseFleeRate = input.ReadFloat();
+            break;
+          }
+          case 29: {
+            CollisionRadiusM = input.ReadFloat();
+            break;
+          }
+          case 37: {
+            CollisionHeightM = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            CollisionHeadRadiusM = input.ReadFloat();
+            break;
+          }
+          case 48: {
+            movementType_ = (global::POGOProtos.Enums.PokemonMovementType) input.ReadEnum();
+            break;
+          }
+          case 61: {
+            MovementTimerS = input.ReadFloat();
+            break;
+          }
+          case 69: {
+            JumpTimeS = input.ReadFloat();
+            break;
+          }
+          case 77: {
+            AttackTimerS = input.ReadFloat();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/Pokemon/StatsAttributes.cs b/PokemonGo/POGOProtos/Settings/Master/Pokemon/StatsAttributes.cs
new file mode 100644
index 0000000..5a8b814
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/Pokemon/StatsAttributes.cs
@@ -0,0 +1,245 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/Pokemon/StatsAttributes.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master.Pokemon {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/Pokemon/StatsAttributes.proto</summary>
+  public static partial class StatsAttributesReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/Pokemon/StatsAttributes.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static StatsAttributesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjhQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Qb2tlbW9uL1N0YXRzQXR0",
+            "cmlidXRlcy5wcm90bxIiUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuUG9r",
+            "ZW1vbiJuCg9TdGF0c0F0dHJpYnV0ZXMSFAoMYmFzZV9zdGFtaW5hGAEgASgF",
+            "EhMKC2Jhc2VfYXR0YWNrGAIgASgFEhQKDGJhc2VfZGVmZW5zZRgDIAEoBRIa",
+            "ChJkb2RnZV9lbmVyZ3lfZGVsdGEYCCABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.Pokemon.StatsAttributes), global::POGOProtos.Settings.Master.Pokemon.StatsAttributes.Parser, new[]{ "BaseStamina", "BaseAttack", "BaseDefense", "DodgeEnergyDelta" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class StatsAttributes : pb::IMessage<StatsAttributes> {
+    private static readonly pb::MessageParser<StatsAttributes> _parser = new pb::MessageParser<StatsAttributes>(() => new StatsAttributes());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<StatsAttributes> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.Pokemon.StatsAttributesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StatsAttributes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StatsAttributes(StatsAttributes other) : this() {
+      baseStamina_ = other.baseStamina_;
+      baseAttack_ = other.baseAttack_;
+      baseDefense_ = other.baseDefense_;
+      dodgeEnergyDelta_ = other.dodgeEnergyDelta_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public StatsAttributes Clone() {
+      return new StatsAttributes(this);
+    }
+
+    /// <summary>Field number for the "base_stamina" field.</summary>
+    public const int BaseStaminaFieldNumber = 1;
+    private int baseStamina_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseStamina {
+      get { return baseStamina_; }
+      set {
+        baseStamina_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_attack" field.</summary>
+    public const int BaseAttackFieldNumber = 2;
+    private int baseAttack_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseAttack {
+      get { return baseAttack_; }
+      set {
+        baseAttack_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_defense" field.</summary>
+    public const int BaseDefenseFieldNumber = 3;
+    private int baseDefense_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseDefense {
+      get { return baseDefense_; }
+      set {
+        baseDefense_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "dodge_energy_delta" field.</summary>
+    public const int DodgeEnergyDeltaFieldNumber = 8;
+    private int dodgeEnergyDelta_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int DodgeEnergyDelta {
+      get { return dodgeEnergyDelta_; }
+      set {
+        dodgeEnergyDelta_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as StatsAttributes);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(StatsAttributes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (BaseStamina != other.BaseStamina) return false;
+      if (BaseAttack != other.BaseAttack) return false;
+      if (BaseDefense != other.BaseDefense) return false;
+      if (DodgeEnergyDelta != other.DodgeEnergyDelta) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (BaseStamina != 0) hash ^= BaseStamina.GetHashCode();
+      if (BaseAttack != 0) hash ^= BaseAttack.GetHashCode();
+      if (BaseDefense != 0) hash ^= BaseDefense.GetHashCode();
+      if (DodgeEnergyDelta != 0) hash ^= DodgeEnergyDelta.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (BaseStamina != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(BaseStamina);
+      }
+      if (BaseAttack != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(BaseAttack);
+      }
+      if (BaseDefense != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(BaseDefense);
+      }
+      if (DodgeEnergyDelta != 0) {
+        output.WriteRawTag(64);
+        output.WriteInt32(DodgeEnergyDelta);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (BaseStamina != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseStamina);
+      }
+      if (BaseAttack != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseAttack);
+      }
+      if (BaseDefense != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseDefense);
+      }
+      if (DodgeEnergyDelta != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(DodgeEnergyDelta);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(StatsAttributes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.BaseStamina != 0) {
+        BaseStamina = other.BaseStamina;
+      }
+      if (other.BaseAttack != 0) {
+        BaseAttack = other.BaseAttack;
+      }
+      if (other.BaseDefense != 0) {
+        BaseDefense = other.BaseDefense;
+      }
+      if (other.DodgeEnergyDelta != 0) {
+        DodgeEnergyDelta = other.DodgeEnergyDelta;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            BaseStamina = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            BaseAttack = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            BaseDefense = input.ReadInt32();
+            break;
+          }
+          case 64: {
+            DodgeEnergyDelta = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/PokemonSettings.cs b/PokemonGo/POGOProtos/Settings/Master/PokemonSettings.cs
new file mode 100644
index 0000000..bd638f1
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/PokemonSettings.cs
@@ -0,0 +1,737 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/PokemonSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/PokemonSettings.proto</summary>
+  public static partial class PokemonSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/PokemonSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjBQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Qb2tlbW9uU2V0dGluZ3Mu",
+            "cHJvdG8SGlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyGiBQT0dPUHJvdG9z",
+            "L0VudW1zL1Bva2Vtb25JZC5wcm90bxokUE9HT1Byb3Rvcy9FbnVtcy9Qb2tl",
+            "bW9uUmFyaXR5LnByb3RvGiJQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25UeXBl",
+            "LnByb3RvGiJQT0dPUHJvdG9zL0VudW1zL1Bva2Vtb25Nb3ZlLnByb3RvGiZQ",
+            "T0dPUHJvdG9zL0VudW1zL1Bva2Vtb25GYW1pbHlJZC5wcm90bxo4UE9HT1By",
+            "b3Rvcy9TZXR0aW5ncy9NYXN0ZXIvUG9rZW1vbi9TdGF0c0F0dHJpYnV0ZXMu",
+            "cHJvdG8aOVBPR09Qcm90b3MvU2V0dGluZ3MvTWFzdGVyL1Bva2Vtb24vQ2Ft",
+            "ZXJhQXR0cmlidXRlcy5wcm90bxo8UE9HT1Byb3Rvcy9TZXR0aW5ncy9NYXN0",
+            "ZXIvUG9rZW1vbi9FbmNvdW50ZXJBdHRyaWJ1dGVzLnByb3RvIpQHCg9Qb2tl",
+            "bW9uU2V0dGluZ3MSLwoKcG9rZW1vbl9pZBgBIAEoDjIbLlBPR09Qcm90b3Mu",
+            "RW51bXMuUG9rZW1vbklkEhMKC21vZGVsX3NjYWxlGAMgASgCEisKBHR5cGUY",
+            "BCABKA4yHS5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25UeXBlEi0KBnR5cGVf",
+            "MhgFIAEoDjIdLlBPR09Qcm90b3MuRW51bXMuUG9rZW1vblR5cGUSRAoGY2Ft",
+            "ZXJhGAYgASgLMjQuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXN0ZXIuUG9rZW1v",
+            "bi5DYW1lcmFBdHRyaWJ1dGVzEkoKCWVuY291bnRlchgHIAEoCzI3LlBPR09Q",
+            "cm90b3MuU2V0dGluZ3MuTWFzdGVyLlBva2Vtb24uRW5jb3VudGVyQXR0cmli",
+            "dXRlcxJCCgVzdGF0cxgIIAEoCzIzLlBPR09Qcm90b3MuU2V0dGluZ3MuTWFz",
+            "dGVyLlBva2Vtb24uU3RhdHNBdHRyaWJ1dGVzEjIKC3F1aWNrX21vdmVzGAkg",
+            "AygOMh0uUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uTW92ZRI2Cg9jaW5lbWF0",
+            "aWNfbW92ZXMYCiADKA4yHS5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25Nb3Zl",
+            "EhYKDmFuaW1hdGlvbl90aW1lGAsgAygCEjIKDWV2b2x1dGlvbl9pZHMYDCAD",
+            "KA4yGy5QT0dPUHJvdG9zLkVudW1zLlBva2Vtb25JZBIWCg5ldm9sdXRpb25f",
+            "cGlwcxgNIAEoBRIvCgZyYXJpdHkYDiABKA4yHy5QT0dPUHJvdG9zLkVudW1z",
+            "LlBva2Vtb25SYXJpdHkSGAoQcG9rZWRleF9oZWlnaHRfbRgPIAEoAhIZChFw",
+            "b2tlZGV4X3dlaWdodF9rZxgQIAEoAhI2ChFwYXJlbnRfcG9rZW1vbl9pZBgR",
+            "IAEoDjIbLlBPR09Qcm90b3MuRW51bXMuUG9rZW1vbklkEhYKDmhlaWdodF9z",
+            "dGRfZGV2GBIgASgCEhYKDndlaWdodF9zdGRfZGV2GBMgASgCEhwKFGttX2Rp",
+            "c3RhbmNlX3RvX2hhdGNoGBQgASgCEjQKCWZhbWlseV9pZBgVIAEoDjIhLlBP",
+            "R09Qcm90b3MuRW51bXMuUG9rZW1vbkZhbWlseUlkEhcKD2NhbmR5X3RvX2V2",
+            "b2x2ZRgWIAEoBWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonIdReflection.Descriptor, global::POGOProtos.Enums.PokemonRarityReflection.Descriptor, global::POGOProtos.Enums.PokemonTypeReflection.Descriptor, global::POGOProtos.Enums.PokemonMoveReflection.Descriptor, global::POGOProtos.Enums.PokemonFamilyIdReflection.Descriptor, global::POGOProtos.Settings.Master.Pokemon.StatsAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Pokemon.CameraAttributesReflection.Descriptor, global::POGOProtos.Settings.Master.Pokemon.EncounterAttributesReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.PokemonSettings), global::POGOProtos.Settings.Master.PokemonSettings.Parser, new[]{ "PokemonId", "ModelScale", "Type", "Type2", "Camera", "Encounter", "Stats", "QuickMoves", "CinematicMoves", "AnimationTime", "EvolutionIds", "EvolutionPips", "Rarity", "PokedexHeightM", "PokedexWeightKg", "ParentPokemonId", "HeightStdDev", "WeightStdDev", "KmDistanceToHatch", "FamilyId", "CandyToEvolve" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PokemonSettings : pb::IMessage<PokemonSettings> {
+    private static readonly pb::MessageParser<PokemonSettings> _parser = new pb::MessageParser<PokemonSettings>(() => new PokemonSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokemonSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.PokemonSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonSettings(PokemonSettings other) : this() {
+      pokemonId_ = other.pokemonId_;
+      modelScale_ = other.modelScale_;
+      type_ = other.type_;
+      type2_ = other.type2_;
+      Camera = other.camera_ != null ? other.Camera.Clone() : null;
+      Encounter = other.encounter_ != null ? other.Encounter.Clone() : null;
+      Stats = other.stats_ != null ? other.Stats.Clone() : null;
+      quickMoves_ = other.quickMoves_.Clone();
+      cinematicMoves_ = other.cinematicMoves_.Clone();
+      animationTime_ = other.animationTime_.Clone();
+      evolutionIds_ = other.evolutionIds_.Clone();
+      evolutionPips_ = other.evolutionPips_;
+      rarity_ = other.rarity_;
+      pokedexHeightM_ = other.pokedexHeightM_;
+      pokedexWeightKg_ = other.pokedexWeightKg_;
+      parentPokemonId_ = other.parentPokemonId_;
+      heightStdDev_ = other.heightStdDev_;
+      weightStdDev_ = other.weightStdDev_;
+      kmDistanceToHatch_ = other.kmDistanceToHatch_;
+      familyId_ = other.familyId_;
+      candyToEvolve_ = other.candyToEvolve_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonSettings Clone() {
+      return new PokemonSettings(this);
+    }
+
+    /// <summary>Field number for the "pokemon_id" field.</summary>
+    public const int PokemonIdFieldNumber = 1;
+    private global::POGOProtos.Enums.PokemonId pokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId PokemonId {
+      get { return pokemonId_; }
+      set {
+        pokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "model_scale" field.</summary>
+    public const int ModelScaleFieldNumber = 3;
+    private float modelScale_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float ModelScale {
+      get { return modelScale_; }
+      set {
+        modelScale_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type" field.</summary>
+    public const int TypeFieldNumber = 4;
+    private global::POGOProtos.Enums.PokemonType type_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType Type {
+      get { return type_; }
+      set {
+        type_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "type_2" field.</summary>
+    public const int Type2FieldNumber = 5;
+    private global::POGOProtos.Enums.PokemonType type2_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType Type2 {
+      get { return type2_; }
+      set {
+        type2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "camera" field.</summary>
+    public const int CameraFieldNumber = 6;
+    private global::POGOProtos.Settings.Master.Pokemon.CameraAttributes camera_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Pokemon.CameraAttributes Camera {
+      get { return camera_; }
+      set {
+        camera_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter" field.</summary>
+    public const int EncounterFieldNumber = 7;
+    private global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes encounter_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes Encounter {
+      get { return encounter_; }
+      set {
+        encounter_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "stats" field.</summary>
+    public const int StatsFieldNumber = 8;
+    private global::POGOProtos.Settings.Master.Pokemon.StatsAttributes stats_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.Master.Pokemon.StatsAttributes Stats {
+      get { return stats_; }
+      set {
+        stats_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "quick_moves" field.</summary>
+    public const int QuickMovesFieldNumber = 9;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonMove> _repeated_quickMoves_codec
+        = pb::FieldCodec.ForEnum(74, x => (int) x, x => (global::POGOProtos.Enums.PokemonMove) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> quickMoves_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> QuickMoves {
+      get { return quickMoves_; }
+    }
+
+    /// <summary>Field number for the "cinematic_moves" field.</summary>
+    public const int CinematicMovesFieldNumber = 10;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonMove> _repeated_cinematicMoves_codec
+        = pb::FieldCodec.ForEnum(82, x => (int) x, x => (global::POGOProtos.Enums.PokemonMove) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> cinematicMoves_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonMove> CinematicMoves {
+      get { return cinematicMoves_; }
+    }
+
+    /// <summary>Field number for the "animation_time" field.</summary>
+    public const int AnimationTimeFieldNumber = 11;
+    private static readonly pb::FieldCodec<float> _repeated_animationTime_codec
+        = pb::FieldCodec.ForFloat(90);
+    private readonly pbc::RepeatedField<float> animationTime_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AnimationTime {
+      get { return animationTime_; }
+    }
+
+    /// <summary>Field number for the "evolution_ids" field.</summary>
+    public const int EvolutionIdsFieldNumber = 12;
+    private static readonly pb::FieldCodec<global::POGOProtos.Enums.PokemonId> _repeated_evolutionIds_codec
+        = pb::FieldCodec.ForEnum(98, x => (int) x, x => (global::POGOProtos.Enums.PokemonId) x);
+    private readonly pbc::RepeatedField<global::POGOProtos.Enums.PokemonId> evolutionIds_ = new pbc::RepeatedField<global::POGOProtos.Enums.PokemonId>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::POGOProtos.Enums.PokemonId> EvolutionIds {
+      get { return evolutionIds_; }
+    }
+
+    /// <summary>Field number for the "evolution_pips" field.</summary>
+    public const int EvolutionPipsFieldNumber = 13;
+    private int evolutionPips_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int EvolutionPips {
+      get { return evolutionPips_; }
+      set {
+        evolutionPips_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "rarity" field.</summary>
+    public const int RarityFieldNumber = 14;
+    private global::POGOProtos.Enums.PokemonRarity rarity_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonRarity Rarity {
+      get { return rarity_; }
+      set {
+        rarity_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokedex_height_m" field.</summary>
+    public const int PokedexHeightMFieldNumber = 15;
+    private float pokedexHeightM_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float PokedexHeightM {
+      get { return pokedexHeightM_; }
+      set {
+        pokedexHeightM_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "pokedex_weight_kg" field.</summary>
+    public const int PokedexWeightKgFieldNumber = 16;
+    private float pokedexWeightKg_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float PokedexWeightKg {
+      get { return pokedexWeightKg_; }
+      set {
+        pokedexWeightKg_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "parent_pokemon_id" field.</summary>
+    public const int ParentPokemonIdFieldNumber = 17;
+    private global::POGOProtos.Enums.PokemonId parentPokemonId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonId ParentPokemonId {
+      get { return parentPokemonId_; }
+      set {
+        parentPokemonId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "height_std_dev" field.</summary>
+    public const int HeightStdDevFieldNumber = 18;
+    private float heightStdDev_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float HeightStdDev {
+      get { return heightStdDev_; }
+      set {
+        heightStdDev_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "weight_std_dev" field.</summary>
+    public const int WeightStdDevFieldNumber = 19;
+    private float weightStdDev_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float WeightStdDev {
+      get { return weightStdDev_; }
+      set {
+        weightStdDev_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "km_distance_to_hatch" field.</summary>
+    public const int KmDistanceToHatchFieldNumber = 20;
+    private float kmDistanceToHatch_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float KmDistanceToHatch {
+      get { return kmDistanceToHatch_; }
+      set {
+        kmDistanceToHatch_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "family_id" field.</summary>
+    public const int FamilyIdFieldNumber = 21;
+    private global::POGOProtos.Enums.PokemonFamilyId familyId_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonFamilyId FamilyId {
+      get { return familyId_; }
+      set {
+        familyId_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_to_evolve" field.</summary>
+    public const int CandyToEvolveFieldNumber = 22;
+    private int candyToEvolve_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CandyToEvolve {
+      get { return candyToEvolve_; }
+      set {
+        candyToEvolve_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokemonSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokemonSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonId != other.PokemonId) return false;
+      if (ModelScale != other.ModelScale) return false;
+      if (Type != other.Type) return false;
+      if (Type2 != other.Type2) return false;
+      if (!object.Equals(Camera, other.Camera)) return false;
+      if (!object.Equals(Encounter, other.Encounter)) return false;
+      if (!object.Equals(Stats, other.Stats)) return false;
+      if(!quickMoves_.Equals(other.quickMoves_)) return false;
+      if(!cinematicMoves_.Equals(other.cinematicMoves_)) return false;
+      if(!animationTime_.Equals(other.animationTime_)) return false;
+      if(!evolutionIds_.Equals(other.evolutionIds_)) return false;
+      if (EvolutionPips != other.EvolutionPips) return false;
+      if (Rarity != other.Rarity) return false;
+      if (PokedexHeightM != other.PokedexHeightM) return false;
+      if (PokedexWeightKg != other.PokedexWeightKg) return false;
+      if (ParentPokemonId != other.ParentPokemonId) return false;
+      if (HeightStdDev != other.HeightStdDev) return false;
+      if (WeightStdDev != other.WeightStdDev) return false;
+      if (KmDistanceToHatch != other.KmDistanceToHatch) return false;
+      if (FamilyId != other.FamilyId) return false;
+      if (CandyToEvolve != other.CandyToEvolve) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
+      if (ModelScale != 0F) hash ^= ModelScale.GetHashCode();
+      if (Type != 0) hash ^= Type.GetHashCode();
+      if (Type2 != 0) hash ^= Type2.GetHashCode();
+      if (camera_ != null) hash ^= Camera.GetHashCode();
+      if (encounter_ != null) hash ^= Encounter.GetHashCode();
+      if (stats_ != null) hash ^= Stats.GetHashCode();
+      hash ^= quickMoves_.GetHashCode();
+      hash ^= cinematicMoves_.GetHashCode();
+      hash ^= animationTime_.GetHashCode();
+      hash ^= evolutionIds_.GetHashCode();
+      if (EvolutionPips != 0) hash ^= EvolutionPips.GetHashCode();
+      if (Rarity != 0) hash ^= Rarity.GetHashCode();
+      if (PokedexHeightM != 0F) hash ^= PokedexHeightM.GetHashCode();
+      if (PokedexWeightKg != 0F) hash ^= PokedexWeightKg.GetHashCode();
+      if (ParentPokemonId != 0) hash ^= ParentPokemonId.GetHashCode();
+      if (HeightStdDev != 0F) hash ^= HeightStdDev.GetHashCode();
+      if (WeightStdDev != 0F) hash ^= WeightStdDev.GetHashCode();
+      if (KmDistanceToHatch != 0F) hash ^= KmDistanceToHatch.GetHashCode();
+      if (FamilyId != 0) hash ^= FamilyId.GetHashCode();
+      if (CandyToEvolve != 0) hash ^= CandyToEvolve.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonId != 0) {
+        output.WriteRawTag(8);
+        output.WriteEnum((int) PokemonId);
+      }
+      if (ModelScale != 0F) {
+        output.WriteRawTag(29);
+        output.WriteFloat(ModelScale);
+      }
+      if (Type != 0) {
+        output.WriteRawTag(32);
+        output.WriteEnum((int) Type);
+      }
+      if (Type2 != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) Type2);
+      }
+      if (camera_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Camera);
+      }
+      if (encounter_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Encounter);
+      }
+      if (stats_ != null) {
+        output.WriteRawTag(66);
+        output.WriteMessage(Stats);
+      }
+      quickMoves_.WriteTo(output, _repeated_quickMoves_codec);
+      cinematicMoves_.WriteTo(output, _repeated_cinematicMoves_codec);
+      animationTime_.WriteTo(output, _repeated_animationTime_codec);
+      evolutionIds_.WriteTo(output, _repeated_evolutionIds_codec);
+      if (EvolutionPips != 0) {
+        output.WriteRawTag(104);
+        output.WriteInt32(EvolutionPips);
+      }
+      if (Rarity != 0) {
+        output.WriteRawTag(112);
+        output.WriteEnum((int) Rarity);
+      }
+      if (PokedexHeightM != 0F) {
+        output.WriteRawTag(125);
+        output.WriteFloat(PokedexHeightM);
+      }
+      if (PokedexWeightKg != 0F) {
+        output.WriteRawTag(133, 1);
+        output.WriteFloat(PokedexWeightKg);
+      }
+      if (ParentPokemonId != 0) {
+        output.WriteRawTag(136, 1);
+        output.WriteEnum((int) ParentPokemonId);
+      }
+      if (HeightStdDev != 0F) {
+        output.WriteRawTag(149, 1);
+        output.WriteFloat(HeightStdDev);
+      }
+      if (WeightStdDev != 0F) {
+        output.WriteRawTag(157, 1);
+        output.WriteFloat(WeightStdDev);
+      }
+      if (KmDistanceToHatch != 0F) {
+        output.WriteRawTag(165, 1);
+        output.WriteFloat(KmDistanceToHatch);
+      }
+      if (FamilyId != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteEnum((int) FamilyId);
+      }
+      if (CandyToEvolve != 0) {
+        output.WriteRawTag(176, 1);
+        output.WriteInt32(CandyToEvolve);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) PokemonId);
+      }
+      if (ModelScale != 0F) {
+        size += 1 + 4;
+      }
+      if (Type != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
+      }
+      if (Type2 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type2);
+      }
+      if (camera_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Camera);
+      }
+      if (encounter_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Encounter);
+      }
+      if (stats_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stats);
+      }
+      size += quickMoves_.CalculateSize(_repeated_quickMoves_codec);
+      size += cinematicMoves_.CalculateSize(_repeated_cinematicMoves_codec);
+      size += animationTime_.CalculateSize(_repeated_animationTime_codec);
+      size += evolutionIds_.CalculateSize(_repeated_evolutionIds_codec);
+      if (EvolutionPips != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionPips);
+      }
+      if (Rarity != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Rarity);
+      }
+      if (PokedexHeightM != 0F) {
+        size += 1 + 4;
+      }
+      if (PokedexWeightKg != 0F) {
+        size += 2 + 4;
+      }
+      if (ParentPokemonId != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) ParentPokemonId);
+      }
+      if (HeightStdDev != 0F) {
+        size += 2 + 4;
+      }
+      if (WeightStdDev != 0F) {
+        size += 2 + 4;
+      }
+      if (KmDistanceToHatch != 0F) {
+        size += 2 + 4;
+      }
+      if (FamilyId != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) FamilyId);
+      }
+      if (CandyToEvolve != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(CandyToEvolve);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokemonSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonId != 0) {
+        PokemonId = other.PokemonId;
+      }
+      if (other.ModelScale != 0F) {
+        ModelScale = other.ModelScale;
+      }
+      if (other.Type != 0) {
+        Type = other.Type;
+      }
+      if (other.Type2 != 0) {
+        Type2 = other.Type2;
+      }
+      if (other.camera_ != null) {
+        if (camera_ == null) {
+          camera_ = new global::POGOProtos.Settings.Master.Pokemon.CameraAttributes();
+        }
+        Camera.MergeFrom(other.Camera);
+      }
+      if (other.encounter_ != null) {
+        if (encounter_ == null) {
+          encounter_ = new global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes();
+        }
+        Encounter.MergeFrom(other.Encounter);
+      }
+      if (other.stats_ != null) {
+        if (stats_ == null) {
+          stats_ = new global::POGOProtos.Settings.Master.Pokemon.StatsAttributes();
+        }
+        Stats.MergeFrom(other.Stats);
+      }
+      quickMoves_.Add(other.quickMoves_);
+      cinematicMoves_.Add(other.cinematicMoves_);
+      animationTime_.Add(other.animationTime_);
+      evolutionIds_.Add(other.evolutionIds_);
+      if (other.EvolutionPips != 0) {
+        EvolutionPips = other.EvolutionPips;
+      }
+      if (other.Rarity != 0) {
+        Rarity = other.Rarity;
+      }
+      if (other.PokedexHeightM != 0F) {
+        PokedexHeightM = other.PokedexHeightM;
+      }
+      if (other.PokedexWeightKg != 0F) {
+        PokedexWeightKg = other.PokedexWeightKg;
+      }
+      if (other.ParentPokemonId != 0) {
+        ParentPokemonId = other.ParentPokemonId;
+      }
+      if (other.HeightStdDev != 0F) {
+        HeightStdDev = other.HeightStdDev;
+      }
+      if (other.WeightStdDev != 0F) {
+        WeightStdDev = other.WeightStdDev;
+      }
+      if (other.KmDistanceToHatch != 0F) {
+        KmDistanceToHatch = other.KmDistanceToHatch;
+      }
+      if (other.FamilyId != 0) {
+        FamilyId = other.FamilyId;
+      }
+      if (other.CandyToEvolve != 0) {
+        CandyToEvolve = other.CandyToEvolve;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            pokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 29: {
+            ModelScale = input.ReadFloat();
+            break;
+          }
+          case 32: {
+            type_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+          case 40: {
+            type2_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+          case 50: {
+            if (camera_ == null) {
+              camera_ = new global::POGOProtos.Settings.Master.Pokemon.CameraAttributes();
+            }
+            input.ReadMessage(camera_);
+            break;
+          }
+          case 58: {
+            if (encounter_ == null) {
+              encounter_ = new global::POGOProtos.Settings.Master.Pokemon.EncounterAttributes();
+            }
+            input.ReadMessage(encounter_);
+            break;
+          }
+          case 66: {
+            if (stats_ == null) {
+              stats_ = new global::POGOProtos.Settings.Master.Pokemon.StatsAttributes();
+            }
+            input.ReadMessage(stats_);
+            break;
+          }
+          case 74:
+          case 72: {
+            quickMoves_.AddEntriesFrom(input, _repeated_quickMoves_codec);
+            break;
+          }
+          case 82:
+          case 80: {
+            cinematicMoves_.AddEntriesFrom(input, _repeated_cinematicMoves_codec);
+            break;
+          }
+          case 90:
+          case 93: {
+            animationTime_.AddEntriesFrom(input, _repeated_animationTime_codec);
+            break;
+          }
+          case 98:
+          case 96: {
+            evolutionIds_.AddEntriesFrom(input, _repeated_evolutionIds_codec);
+            break;
+          }
+          case 104: {
+            EvolutionPips = input.ReadInt32();
+            break;
+          }
+          case 112: {
+            rarity_ = (global::POGOProtos.Enums.PokemonRarity) input.ReadEnum();
+            break;
+          }
+          case 125: {
+            PokedexHeightM = input.ReadFloat();
+            break;
+          }
+          case 133: {
+            PokedexWeightKg = input.ReadFloat();
+            break;
+          }
+          case 136: {
+            parentPokemonId_ = (global::POGOProtos.Enums.PokemonId) input.ReadEnum();
+            break;
+          }
+          case 149: {
+            HeightStdDev = input.ReadFloat();
+            break;
+          }
+          case 157: {
+            WeightStdDev = input.ReadFloat();
+            break;
+          }
+          case 165: {
+            KmDistanceToHatch = input.ReadFloat();
+            break;
+          }
+          case 168: {
+            familyId_ = (global::POGOProtos.Enums.PokemonFamilyId) input.ReadEnum();
+            break;
+          }
+          case 176: {
+            CandyToEvolve = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/PokemonUpgradeSettings.cs b/PokemonGo/POGOProtos/Settings/Master/PokemonUpgradeSettings.cs
new file mode 100644
index 0000000..475fa9c
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/PokemonUpgradeSettings.cs
@@ -0,0 +1,232 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/PokemonUpgradeSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/PokemonUpgradeSettings.proto</summary>
+  public static partial class PokemonUpgradeSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/PokemonUpgradeSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static PokemonUpgradeSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjdQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9Qb2tlbW9uVXBncmFkZVNl",
+            "dHRpbmdzLnByb3RvEhpQT0dPUHJvdG9zLlNldHRpbmdzLk1hc3RlciKEAQoW",
+            "UG9rZW1vblVwZ3JhZGVTZXR0aW5ncxIaChJ1cGdyYWRlc19wZXJfbGV2ZWwY",
+            "ASABKAUSIwobYWxsb3dlZF9sZXZlbHNfYWJvdmVfcGxheWVyGAIgASgFEhIK",
+            "CmNhbmR5X2Nvc3QYAyADKAUSFQoNc3RhcmR1c3RfY29zdBgEIAMoBWIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.PokemonUpgradeSettings), global::POGOProtos.Settings.Master.PokemonUpgradeSettings.Parser, new[]{ "UpgradesPerLevel", "AllowedLevelsAbovePlayer", "CandyCost", "StardustCost" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class PokemonUpgradeSettings : pb::IMessage<PokemonUpgradeSettings> {
+    private static readonly pb::MessageParser<PokemonUpgradeSettings> _parser = new pb::MessageParser<PokemonUpgradeSettings>(() => new PokemonUpgradeSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<PokemonUpgradeSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.PokemonUpgradeSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonUpgradeSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonUpgradeSettings(PokemonUpgradeSettings other) : this() {
+      upgradesPerLevel_ = other.upgradesPerLevel_;
+      allowedLevelsAbovePlayer_ = other.allowedLevelsAbovePlayer_;
+      candyCost_ = other.candyCost_.Clone();
+      stardustCost_ = other.stardustCost_.Clone();
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public PokemonUpgradeSettings Clone() {
+      return new PokemonUpgradeSettings(this);
+    }
+
+    /// <summary>Field number for the "upgrades_per_level" field.</summary>
+    public const int UpgradesPerLevelFieldNumber = 1;
+    private int upgradesPerLevel_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int UpgradesPerLevel {
+      get { return upgradesPerLevel_; }
+      set {
+        upgradesPerLevel_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "allowed_levels_above_player" field.</summary>
+    public const int AllowedLevelsAbovePlayerFieldNumber = 2;
+    private int allowedLevelsAbovePlayer_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int AllowedLevelsAbovePlayer {
+      get { return allowedLevelsAbovePlayer_; }
+      set {
+        allowedLevelsAbovePlayer_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "candy_cost" field.</summary>
+    public const int CandyCostFieldNumber = 3;
+    private static readonly pb::FieldCodec<int> _repeated_candyCost_codec
+        = pb::FieldCodec.ForInt32(26);
+    private readonly pbc::RepeatedField<int> candyCost_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> CandyCost {
+      get { return candyCost_; }
+    }
+
+    /// <summary>Field number for the "stardust_cost" field.</summary>
+    public const int StardustCostFieldNumber = 4;
+    private static readonly pb::FieldCodec<int> _repeated_stardustCost_codec
+        = pb::FieldCodec.ForInt32(34);
+    private readonly pbc::RepeatedField<int> stardustCost_ = new pbc::RepeatedField<int>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<int> StardustCost {
+      get { return stardustCost_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as PokemonUpgradeSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(PokemonUpgradeSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (UpgradesPerLevel != other.UpgradesPerLevel) return false;
+      if (AllowedLevelsAbovePlayer != other.AllowedLevelsAbovePlayer) return false;
+      if(!candyCost_.Equals(other.candyCost_)) return false;
+      if(!stardustCost_.Equals(other.stardustCost_)) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (UpgradesPerLevel != 0) hash ^= UpgradesPerLevel.GetHashCode();
+      if (AllowedLevelsAbovePlayer != 0) hash ^= AllowedLevelsAbovePlayer.GetHashCode();
+      hash ^= candyCost_.GetHashCode();
+      hash ^= stardustCost_.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (UpgradesPerLevel != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(UpgradesPerLevel);
+      }
+      if (AllowedLevelsAbovePlayer != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(AllowedLevelsAbovePlayer);
+      }
+      candyCost_.WriteTo(output, _repeated_candyCost_codec);
+      stardustCost_.WriteTo(output, _repeated_stardustCost_codec);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (UpgradesPerLevel != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(UpgradesPerLevel);
+      }
+      if (AllowedLevelsAbovePlayer != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(AllowedLevelsAbovePlayer);
+      }
+      size += candyCost_.CalculateSize(_repeated_candyCost_codec);
+      size += stardustCost_.CalculateSize(_repeated_stardustCost_codec);
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(PokemonUpgradeSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.UpgradesPerLevel != 0) {
+        UpgradesPerLevel = other.UpgradesPerLevel;
+      }
+      if (other.AllowedLevelsAbovePlayer != 0) {
+        AllowedLevelsAbovePlayer = other.AllowedLevelsAbovePlayer;
+      }
+      candyCost_.Add(other.candyCost_);
+      stardustCost_.Add(other.stardustCost_);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            UpgradesPerLevel = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            AllowedLevelsAbovePlayer = input.ReadInt32();
+            break;
+          }
+          case 26:
+          case 24: {
+            candyCost_.AddEntriesFrom(input, _repeated_candyCost_codec);
+            break;
+          }
+          case 34:
+          case 32: {
+            stardustCost_.AddEntriesFrom(input, _repeated_stardustCost_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/Master/TypeEffectiveSettings.cs b/PokemonGo/POGOProtos/Settings/Master/TypeEffectiveSettings.cs
new file mode 100644
index 0000000..fa89e8f
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/Master/TypeEffectiveSettings.cs
@@ -0,0 +1,183 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos/Settings/Master/TypeEffectiveSettings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings.Master {
+
+  /// <summary>Holder for reflection information generated from POGOProtos/Settings/Master/TypeEffectiveSettings.proto</summary>
+  public static partial class TypeEffectiveSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos/Settings/Master/TypeEffectiveSettings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static TypeEffectiveSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CjZQT0dPUHJvdG9zL1NldHRpbmdzL01hc3Rlci9UeXBlRWZmZWN0aXZlU2V0",
+            "dGluZ3MucHJvdG8SGlBPR09Qcm90b3MuU2V0dGluZ3MuTWFzdGVyGiJQT0dP",
+            "UHJvdG9zL0VudW1zL1Bva2Vtb25UeXBlLnByb3RvImIKFVR5cGVFZmZlY3Rp",
+            "dmVTZXR0aW5ncxIVCg1hdHRhY2tfc2NhbGFyGAEgAygCEjIKC2F0dGFja190",
+            "eXBlGAIgASgOMh0uUE9HT1Byb3Rvcy5FbnVtcy5Qb2tlbW9uVHlwZWIGcHJv",
+            "dG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { global::POGOProtos.Enums.PokemonTypeReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.Master.TypeEffectiveSettings), global::POGOProtos.Settings.Master.TypeEffectiveSettings.Parser, new[]{ "AttackScalar", "AttackType" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class TypeEffectiveSettings : pb::IMessage<TypeEffectiveSettings> {
+    private static readonly pb::MessageParser<TypeEffectiveSettings> _parser = new pb::MessageParser<TypeEffectiveSettings>(() => new TypeEffectiveSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<TypeEffectiveSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.Master.TypeEffectiveSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public TypeEffectiveSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public TypeEffectiveSettings(TypeEffectiveSettings other) : this() {
+      attackScalar_ = other.attackScalar_.Clone();
+      attackType_ = other.attackType_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public TypeEffectiveSettings Clone() {
+      return new TypeEffectiveSettings(this);
+    }
+
+    /// <summary>Field number for the "attack_scalar" field.</summary>
+    public const int AttackScalarFieldNumber = 1;
+    private static readonly pb::FieldCodec<float> _repeated_attackScalar_codec
+        = pb::FieldCodec.ForFloat(10);
+    private readonly pbc::RepeatedField<float> attackScalar_ = new pbc::RepeatedField<float>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<float> AttackScalar {
+      get { return attackScalar_; }
+    }
+
+    /// <summary>Field number for the "attack_type" field.</summary>
+    public const int AttackTypeFieldNumber = 2;
+    private global::POGOProtos.Enums.PokemonType attackType_ = 0;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Enums.PokemonType AttackType {
+      get { return attackType_; }
+      set {
+        attackType_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as TypeEffectiveSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(TypeEffectiveSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!attackScalar_.Equals(other.attackScalar_)) return false;
+      if (AttackType != other.AttackType) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= attackScalar_.GetHashCode();
+      if (AttackType != 0) hash ^= AttackType.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      attackScalar_.WriteTo(output, _repeated_attackScalar_codec);
+      if (AttackType != 0) {
+        output.WriteRawTag(16);
+        output.WriteEnum((int) AttackType);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      size += attackScalar_.CalculateSize(_repeated_attackScalar_codec);
+      if (AttackType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) AttackType);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(TypeEffectiveSettings other) {
+      if (other == null) {
+        return;
+      }
+      attackScalar_.Add(other.attackScalar_);
+      if (other.AttackType != 0) {
+        AttackType = other.AttackType;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10:
+          case 13: {
+            attackScalar_.AddEntriesFrom(input, _repeated_attackScalar_codec);
+            break;
+          }
+          case 16: {
+            attackType_ = (global::POGOProtos.Enums.PokemonType) input.ReadEnum();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/POGOProtos/Settings/POGOProtosSettings.cs b/PokemonGo/POGOProtos/Settings/POGOProtosSettings.cs
new file mode 100644
index 0000000..5d52024
--- /dev/null
+++ b/PokemonGo/POGOProtos/Settings/POGOProtosSettings.cs
@@ -0,0 +1,1355 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: POGOProtos.Settings.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace POGOProtos.Settings {
+
+  /// <summary>Holder for reflection information generated from POGOProtos.Settings.proto</summary>
+  public static partial class POGOProtosSettingsReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for POGOProtos.Settings.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static POGOProtosSettingsReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChlQT0dPUHJvdG9zLlNldHRpbmdzLnByb3RvEhNQT0dPUHJvdG9zLlNldHRp",
+            "bmdzIo8CCgtNYXBTZXR0aW5ncxIdChVwb2tlbW9uX3Zpc2libGVfcmFuZ2UY",
+            "ASABKAESHQoVcG9rZV9uYXZfcmFuZ2VfbWV0ZXJzGAIgASgBEh4KFmVuY291",
+            "bnRlcl9yYW5nZV9tZXRlcnMYAyABKAESKwojZ2V0X21hcF9vYmplY3RzX21p",
+            "bl9yZWZyZXNoX3NlY29uZHMYBCABKAISKwojZ2V0X21hcF9vYmplY3RzX21h",
+            "eF9yZWZyZXNoX3NlY29uZHMYBSABKAISKwojZ2V0X21hcF9vYmplY3RzX21p",
+            "bl9kaXN0YW5jZV9tZXRlcnMYBiABKAISGwoTZ29vZ2xlX21hcHNfYXBpX2tl",
+            "eRgHIAEoCSKAAQoRSW52ZW50b3J5U2V0dGluZ3MSEwoLbWF4X3Bva2Vtb24Y",
+            "ASABKAUSFQoNbWF4X2JhZ19pdGVtcxgCIAEoBRIUCgxiYXNlX3Bva2Vtb24Y",
+            "AyABKAUSFgoOYmFzZV9iYWdfaXRlbXMYBCABKAUSEQoJYmFzZV9lZ2dzGAUg",
+            "ASgFIuQBCgxGb3J0U2V0dGluZ3MSIAoYaW50ZXJhY3Rpb25fcmFuZ2VfbWV0",
+            "ZXJzGAEgASgBEiIKGm1heF90b3RhbF9kZXBsb3llZF9wb2tlbW9uGAIgASgF",
+            "EiMKG21heF9wbGF5ZXJfZGVwbG95ZWRfcG9rZW1vbhgDIAEoBRIhChlkZXBs",
+            "b3lfc3RhbWluYV9tdWx0aXBsaWVyGAQgASgBEiAKGGRlcGxveV9hdHRhY2tf",
+            "bXVsdGlwbGllchgFIAEoARIkChxmYXJfaW50ZXJhY3Rpb25fcmFuZ2VfbWV0",
+            "ZXJzGAYgASgBIqICCg5HbG9iYWxTZXR0aW5ncxI4Cg1mb3J0X3NldHRpbmdz",
+            "GAIgASgLMiEuUE9HT1Byb3Rvcy5TZXR0aW5ncy5Gb3J0U2V0dGluZ3MSNgoM",
+            "bWFwX3NldHRpbmdzGAMgASgLMiAuUE9HT1Byb3Rvcy5TZXR0aW5ncy5NYXBT",
+            "ZXR0aW5ncxI6Cg5sZXZlbF9zZXR0aW5ncxgEIAEoCzIiLlBPR09Qcm90b3Mu",
+            "U2V0dGluZ3MuTGV2ZWxTZXR0aW5ncxJCChJpbnZlbnRvcnlfc2V0dGluZ3MY",
+            "BSABKAsyJi5QT0dPUHJvdG9zLlNldHRpbmdzLkludmVudG9yeVNldHRpbmdz",
+            "Eh4KFm1pbmltdW1fY2xpZW50X3ZlcnNpb24YBiABKAkiJgoWRG93bmxvYWRT",
+            "ZXR0aW5nc0FjdGlvbhIMCgRoYXNoGAEgASgJIlEKDUxldmVsU2V0dGluZ3MS",
+            "GwoTdHJhaW5lcl9jcF9tb2RpZmllchgCIAEoARIjCht0cmFpbmVyX2RpZmZp",
+            "Y3VsdHlfbW9kaWZpZXIYAyABKAFiBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.MapSettings), global::POGOProtos.Settings.MapSettings.Parser, new[]{ "PokemonVisibleRange", "PokeNavRangeMeters", "EncounterRangeMeters", "GetMapObjectsMinRefreshSeconds", "GetMapObjectsMaxRefreshSeconds", "GetMapObjectsMinDistanceMeters", "GoogleMapsApiKey" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.InventorySettings), global::POGOProtos.Settings.InventorySettings.Parser, new[]{ "MaxPokemon", "MaxBagItems", "BasePokemon", "BaseBagItems", "BaseEggs" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.FortSettings), global::POGOProtos.Settings.FortSettings.Parser, new[]{ "InteractionRangeMeters", "MaxTotalDeployedPokemon", "MaxPlayerDeployedPokemon", "DeployStaminaMultiplier", "DeployAttackMultiplier", "FarInteractionRangeMeters" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.GlobalSettings), global::POGOProtos.Settings.GlobalSettings.Parser, new[]{ "FortSettings", "MapSettings", "LevelSettings", "InventorySettings", "MinimumClientVersion" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.DownloadSettingsAction), global::POGOProtos.Settings.DownloadSettingsAction.Parser, new[]{ "Hash" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::POGOProtos.Settings.LevelSettings), global::POGOProtos.Settings.LevelSettings.Parser, new[]{ "TrainerCpModifier", "TrainerDifficultyModifier" }, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  public sealed partial class MapSettings : pb::IMessage<MapSettings> {
+    private static readonly pb::MessageParser<MapSettings> _parser = new pb::MessageParser<MapSettings>(() => new MapSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<MapSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapSettings(MapSettings other) : this() {
+      pokemonVisibleRange_ = other.pokemonVisibleRange_;
+      pokeNavRangeMeters_ = other.pokeNavRangeMeters_;
+      encounterRangeMeters_ = other.encounterRangeMeters_;
+      getMapObjectsMinRefreshSeconds_ = other.getMapObjectsMinRefreshSeconds_;
+      getMapObjectsMaxRefreshSeconds_ = other.getMapObjectsMaxRefreshSeconds_;
+      getMapObjectsMinDistanceMeters_ = other.getMapObjectsMinDistanceMeters_;
+      googleMapsApiKey_ = other.googleMapsApiKey_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public MapSettings Clone() {
+      return new MapSettings(this);
+    }
+
+    /// <summary>Field number for the "pokemon_visible_range" field.</summary>
+    public const int PokemonVisibleRangeFieldNumber = 1;
+    private double pokemonVisibleRange_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PokemonVisibleRange {
+      get { return pokemonVisibleRange_; }
+      set {
+        pokemonVisibleRange_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "poke_nav_range_meters" field.</summary>
+    public const int PokeNavRangeMetersFieldNumber = 2;
+    private double pokeNavRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double PokeNavRangeMeters {
+      get { return pokeNavRangeMeters_; }
+      set {
+        pokeNavRangeMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "encounter_range_meters" field.</summary>
+    public const int EncounterRangeMetersFieldNumber = 3;
+    private double encounterRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double EncounterRangeMeters {
+      get { return encounterRangeMeters_; }
+      set {
+        encounterRangeMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "get_map_objects_min_refresh_seconds" field.</summary>
+    public const int GetMapObjectsMinRefreshSecondsFieldNumber = 4;
+    private float getMapObjectsMinRefreshSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GetMapObjectsMinRefreshSeconds {
+      get { return getMapObjectsMinRefreshSeconds_; }
+      set {
+        getMapObjectsMinRefreshSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "get_map_objects_max_refresh_seconds" field.</summary>
+    public const int GetMapObjectsMaxRefreshSecondsFieldNumber = 5;
+    private float getMapObjectsMaxRefreshSeconds_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GetMapObjectsMaxRefreshSeconds {
+      get { return getMapObjectsMaxRefreshSeconds_; }
+      set {
+        getMapObjectsMaxRefreshSeconds_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "get_map_objects_min_distance_meters" field.</summary>
+    public const int GetMapObjectsMinDistanceMetersFieldNumber = 6;
+    private float getMapObjectsMinDistanceMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public float GetMapObjectsMinDistanceMeters {
+      get { return getMapObjectsMinDistanceMeters_; }
+      set {
+        getMapObjectsMinDistanceMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "google_maps_api_key" field.</summary>
+    public const int GoogleMapsApiKeyFieldNumber = 7;
+    private string googleMapsApiKey_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string GoogleMapsApiKey {
+      get { return googleMapsApiKey_; }
+      set {
+        googleMapsApiKey_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as MapSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(MapSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (PokemonVisibleRange != other.PokemonVisibleRange) return false;
+      if (PokeNavRangeMeters != other.PokeNavRangeMeters) return false;
+      if (EncounterRangeMeters != other.EncounterRangeMeters) return false;
+      if (GetMapObjectsMinRefreshSeconds != other.GetMapObjectsMinRefreshSeconds) return false;
+      if (GetMapObjectsMaxRefreshSeconds != other.GetMapObjectsMaxRefreshSeconds) return false;
+      if (GetMapObjectsMinDistanceMeters != other.GetMapObjectsMinDistanceMeters) return false;
+      if (GoogleMapsApiKey != other.GoogleMapsApiKey) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (PokemonVisibleRange != 0D) hash ^= PokemonVisibleRange.GetHashCode();
+      if (PokeNavRangeMeters != 0D) hash ^= PokeNavRangeMeters.GetHashCode();
+      if (EncounterRangeMeters != 0D) hash ^= EncounterRangeMeters.GetHashCode();
+      if (GetMapObjectsMinRefreshSeconds != 0F) hash ^= GetMapObjectsMinRefreshSeconds.GetHashCode();
+      if (GetMapObjectsMaxRefreshSeconds != 0F) hash ^= GetMapObjectsMaxRefreshSeconds.GetHashCode();
+      if (GetMapObjectsMinDistanceMeters != 0F) hash ^= GetMapObjectsMinDistanceMeters.GetHashCode();
+      if (GoogleMapsApiKey.Length != 0) hash ^= GoogleMapsApiKey.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (PokemonVisibleRange != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(PokemonVisibleRange);
+      }
+      if (PokeNavRangeMeters != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(PokeNavRangeMeters);
+      }
+      if (EncounterRangeMeters != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(EncounterRangeMeters);
+      }
+      if (GetMapObjectsMinRefreshSeconds != 0F) {
+        output.WriteRawTag(37);
+        output.WriteFloat(GetMapObjectsMinRefreshSeconds);
+      }
+      if (GetMapObjectsMaxRefreshSeconds != 0F) {
+        output.WriteRawTag(45);
+        output.WriteFloat(GetMapObjectsMaxRefreshSeconds);
+      }
+      if (GetMapObjectsMinDistanceMeters != 0F) {
+        output.WriteRawTag(53);
+        output.WriteFloat(GetMapObjectsMinDistanceMeters);
+      }
+      if (GoogleMapsApiKey.Length != 0) {
+        output.WriteRawTag(58);
+        output.WriteString(GoogleMapsApiKey);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (PokemonVisibleRange != 0D) {
+        size += 1 + 8;
+      }
+      if (PokeNavRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      if (EncounterRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      if (GetMapObjectsMinRefreshSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (GetMapObjectsMaxRefreshSeconds != 0F) {
+        size += 1 + 4;
+      }
+      if (GetMapObjectsMinDistanceMeters != 0F) {
+        size += 1 + 4;
+      }
+      if (GoogleMapsApiKey.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(GoogleMapsApiKey);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(MapSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.PokemonVisibleRange != 0D) {
+        PokemonVisibleRange = other.PokemonVisibleRange;
+      }
+      if (other.PokeNavRangeMeters != 0D) {
+        PokeNavRangeMeters = other.PokeNavRangeMeters;
+      }
+      if (other.EncounterRangeMeters != 0D) {
+        EncounterRangeMeters = other.EncounterRangeMeters;
+      }
+      if (other.GetMapObjectsMinRefreshSeconds != 0F) {
+        GetMapObjectsMinRefreshSeconds = other.GetMapObjectsMinRefreshSeconds;
+      }
+      if (other.GetMapObjectsMaxRefreshSeconds != 0F) {
+        GetMapObjectsMaxRefreshSeconds = other.GetMapObjectsMaxRefreshSeconds;
+      }
+      if (other.GetMapObjectsMinDistanceMeters != 0F) {
+        GetMapObjectsMinDistanceMeters = other.GetMapObjectsMinDistanceMeters;
+      }
+      if (other.GoogleMapsApiKey.Length != 0) {
+        GoogleMapsApiKey = other.GoogleMapsApiKey;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            PokemonVisibleRange = input.ReadDouble();
+            break;
+          }
+          case 17: {
+            PokeNavRangeMeters = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            EncounterRangeMeters = input.ReadDouble();
+            break;
+          }
+          case 37: {
+            GetMapObjectsMinRefreshSeconds = input.ReadFloat();
+            break;
+          }
+          case 45: {
+            GetMapObjectsMaxRefreshSeconds = input.ReadFloat();
+            break;
+          }
+          case 53: {
+            GetMapObjectsMinDistanceMeters = input.ReadFloat();
+            break;
+          }
+          case 58: {
+            GoogleMapsApiKey = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class InventorySettings : pb::IMessage<InventorySettings> {
+    private static readonly pb::MessageParser<InventorySettings> _parser = new pb::MessageParser<InventorySettings>(() => new InventorySettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<InventorySettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventorySettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventorySettings(InventorySettings other) : this() {
+      maxPokemon_ = other.maxPokemon_;
+      maxBagItems_ = other.maxBagItems_;
+      basePokemon_ = other.basePokemon_;
+      baseBagItems_ = other.baseBagItems_;
+      baseEggs_ = other.baseEggs_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public InventorySettings Clone() {
+      return new InventorySettings(this);
+    }
+
+    /// <summary>Field number for the "max_pokemon" field.</summary>
+    public const int MaxPokemonFieldNumber = 1;
+    private int maxPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxPokemon {
+      get { return maxPokemon_; }
+      set {
+        maxPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_bag_items" field.</summary>
+    public const int MaxBagItemsFieldNumber = 2;
+    private int maxBagItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxBagItems {
+      get { return maxBagItems_; }
+      set {
+        maxBagItems_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_pokemon" field.</summary>
+    public const int BasePokemonFieldNumber = 3;
+    private int basePokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BasePokemon {
+      get { return basePokemon_; }
+      set {
+        basePokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_bag_items" field.</summary>
+    public const int BaseBagItemsFieldNumber = 4;
+    private int baseBagItems_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseBagItems {
+      get { return baseBagItems_; }
+      set {
+        baseBagItems_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "base_eggs" field.</summary>
+    public const int BaseEggsFieldNumber = 5;
+    private int baseEggs_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int BaseEggs {
+      get { return baseEggs_; }
+      set {
+        baseEggs_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as InventorySettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(InventorySettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (MaxPokemon != other.MaxPokemon) return false;
+      if (MaxBagItems != other.MaxBagItems) return false;
+      if (BasePokemon != other.BasePokemon) return false;
+      if (BaseBagItems != other.BaseBagItems) return false;
+      if (BaseEggs != other.BaseEggs) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (MaxPokemon != 0) hash ^= MaxPokemon.GetHashCode();
+      if (MaxBagItems != 0) hash ^= MaxBagItems.GetHashCode();
+      if (BasePokemon != 0) hash ^= BasePokemon.GetHashCode();
+      if (BaseBagItems != 0) hash ^= BaseBagItems.GetHashCode();
+      if (BaseEggs != 0) hash ^= BaseEggs.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (MaxPokemon != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(MaxPokemon);
+      }
+      if (MaxBagItems != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(MaxBagItems);
+      }
+      if (BasePokemon != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(BasePokemon);
+      }
+      if (BaseBagItems != 0) {
+        output.WriteRawTag(32);
+        output.WriteInt32(BaseBagItems);
+      }
+      if (BaseEggs != 0) {
+        output.WriteRawTag(40);
+        output.WriteInt32(BaseEggs);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (MaxPokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPokemon);
+      }
+      if (MaxBagItems != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxBagItems);
+      }
+      if (BasePokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BasePokemon);
+      }
+      if (BaseBagItems != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseBagItems);
+      }
+      if (BaseEggs != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseEggs);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(InventorySettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.MaxPokemon != 0) {
+        MaxPokemon = other.MaxPokemon;
+      }
+      if (other.MaxBagItems != 0) {
+        MaxBagItems = other.MaxBagItems;
+      }
+      if (other.BasePokemon != 0) {
+        BasePokemon = other.BasePokemon;
+      }
+      if (other.BaseBagItems != 0) {
+        BaseBagItems = other.BaseBagItems;
+      }
+      if (other.BaseEggs != 0) {
+        BaseEggs = other.BaseEggs;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            MaxPokemon = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            MaxBagItems = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            BasePokemon = input.ReadInt32();
+            break;
+          }
+          case 32: {
+            BaseBagItems = input.ReadInt32();
+            break;
+          }
+          case 40: {
+            BaseEggs = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class FortSettings : pb::IMessage<FortSettings> {
+    private static readonly pb::MessageParser<FortSettings> _parser = new pb::MessageParser<FortSettings>(() => new FortSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<FortSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSettings(FortSettings other) : this() {
+      interactionRangeMeters_ = other.interactionRangeMeters_;
+      maxTotalDeployedPokemon_ = other.maxTotalDeployedPokemon_;
+      maxPlayerDeployedPokemon_ = other.maxPlayerDeployedPokemon_;
+      deployStaminaMultiplier_ = other.deployStaminaMultiplier_;
+      deployAttackMultiplier_ = other.deployAttackMultiplier_;
+      farInteractionRangeMeters_ = other.farInteractionRangeMeters_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public FortSettings Clone() {
+      return new FortSettings(this);
+    }
+
+    /// <summary>Field number for the "interaction_range_meters" field.</summary>
+    public const int InteractionRangeMetersFieldNumber = 1;
+    private double interactionRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double InteractionRangeMeters {
+      get { return interactionRangeMeters_; }
+      set {
+        interactionRangeMeters_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_total_deployed_pokemon" field.</summary>
+    public const int MaxTotalDeployedPokemonFieldNumber = 2;
+    private int maxTotalDeployedPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxTotalDeployedPokemon {
+      get { return maxTotalDeployedPokemon_; }
+      set {
+        maxTotalDeployedPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "max_player_deployed_pokemon" field.</summary>
+    public const int MaxPlayerDeployedPokemonFieldNumber = 3;
+    private int maxPlayerDeployedPokemon_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int MaxPlayerDeployedPokemon {
+      get { return maxPlayerDeployedPokemon_; }
+      set {
+        maxPlayerDeployedPokemon_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deploy_stamina_multiplier" field.</summary>
+    public const int DeployStaminaMultiplierFieldNumber = 4;
+    private double deployStaminaMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double DeployStaminaMultiplier {
+      get { return deployStaminaMultiplier_; }
+      set {
+        deployStaminaMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "deploy_attack_multiplier" field.</summary>
+    public const int DeployAttackMultiplierFieldNumber = 5;
+    private double deployAttackMultiplier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double DeployAttackMultiplier {
+      get { return deployAttackMultiplier_; }
+      set {
+        deployAttackMultiplier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "far_interaction_range_meters" field.</summary>
+    public const int FarInteractionRangeMetersFieldNumber = 6;
+    private double farInteractionRangeMeters_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double FarInteractionRangeMeters {
+      get { return farInteractionRangeMeters_; }
+      set {
+        farInteractionRangeMeters_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as FortSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(FortSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (InteractionRangeMeters != other.InteractionRangeMeters) return false;
+      if (MaxTotalDeployedPokemon != other.MaxTotalDeployedPokemon) return false;
+      if (MaxPlayerDeployedPokemon != other.MaxPlayerDeployedPokemon) return false;
+      if (DeployStaminaMultiplier != other.DeployStaminaMultiplier) return false;
+      if (DeployAttackMultiplier != other.DeployAttackMultiplier) return false;
+      if (FarInteractionRangeMeters != other.FarInteractionRangeMeters) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (InteractionRangeMeters != 0D) hash ^= InteractionRangeMeters.GetHashCode();
+      if (MaxTotalDeployedPokemon != 0) hash ^= MaxTotalDeployedPokemon.GetHashCode();
+      if (MaxPlayerDeployedPokemon != 0) hash ^= MaxPlayerDeployedPokemon.GetHashCode();
+      if (DeployStaminaMultiplier != 0D) hash ^= DeployStaminaMultiplier.GetHashCode();
+      if (DeployAttackMultiplier != 0D) hash ^= DeployAttackMultiplier.GetHashCode();
+      if (FarInteractionRangeMeters != 0D) hash ^= FarInteractionRangeMeters.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (InteractionRangeMeters != 0D) {
+        output.WriteRawTag(9);
+        output.WriteDouble(InteractionRangeMeters);
+      }
+      if (MaxTotalDeployedPokemon != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(MaxTotalDeployedPokemon);
+      }
+      if (MaxPlayerDeployedPokemon != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(MaxPlayerDeployedPokemon);
+      }
+      if (DeployStaminaMultiplier != 0D) {
+        output.WriteRawTag(33);
+        output.WriteDouble(DeployStaminaMultiplier);
+      }
+      if (DeployAttackMultiplier != 0D) {
+        output.WriteRawTag(41);
+        output.WriteDouble(DeployAttackMultiplier);
+      }
+      if (FarInteractionRangeMeters != 0D) {
+        output.WriteRawTag(49);
+        output.WriteDouble(FarInteractionRangeMeters);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (InteractionRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      if (MaxTotalDeployedPokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxTotalDeployedPokemon);
+      }
+      if (MaxPlayerDeployedPokemon != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPlayerDeployedPokemon);
+      }
+      if (DeployStaminaMultiplier != 0D) {
+        size += 1 + 8;
+      }
+      if (DeployAttackMultiplier != 0D) {
+        size += 1 + 8;
+      }
+      if (FarInteractionRangeMeters != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(FortSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.InteractionRangeMeters != 0D) {
+        InteractionRangeMeters = other.InteractionRangeMeters;
+      }
+      if (other.MaxTotalDeployedPokemon != 0) {
+        MaxTotalDeployedPokemon = other.MaxTotalDeployedPokemon;
+      }
+      if (other.MaxPlayerDeployedPokemon != 0) {
+        MaxPlayerDeployedPokemon = other.MaxPlayerDeployedPokemon;
+      }
+      if (other.DeployStaminaMultiplier != 0D) {
+        DeployStaminaMultiplier = other.DeployStaminaMultiplier;
+      }
+      if (other.DeployAttackMultiplier != 0D) {
+        DeployAttackMultiplier = other.DeployAttackMultiplier;
+      }
+      if (other.FarInteractionRangeMeters != 0D) {
+        FarInteractionRangeMeters = other.FarInteractionRangeMeters;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 9: {
+            InteractionRangeMeters = input.ReadDouble();
+            break;
+          }
+          case 16: {
+            MaxTotalDeployedPokemon = input.ReadInt32();
+            break;
+          }
+          case 24: {
+            MaxPlayerDeployedPokemon = input.ReadInt32();
+            break;
+          }
+          case 33: {
+            DeployStaminaMultiplier = input.ReadDouble();
+            break;
+          }
+          case 41: {
+            DeployAttackMultiplier = input.ReadDouble();
+            break;
+          }
+          case 49: {
+            FarInteractionRangeMeters = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class GlobalSettings : pb::IMessage<GlobalSettings> {
+    private static readonly pb::MessageParser<GlobalSettings> _parser = new pb::MessageParser<GlobalSettings>(() => new GlobalSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<GlobalSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GlobalSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GlobalSettings(GlobalSettings other) : this() {
+      FortSettings = other.fortSettings_ != null ? other.FortSettings.Clone() : null;
+      MapSettings = other.mapSettings_ != null ? other.MapSettings.Clone() : null;
+      LevelSettings = other.levelSettings_ != null ? other.LevelSettings.Clone() : null;
+      InventorySettings = other.inventorySettings_ != null ? other.InventorySettings.Clone() : null;
+      minimumClientVersion_ = other.minimumClientVersion_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public GlobalSettings Clone() {
+      return new GlobalSettings(this);
+    }
+
+    /// <summary>Field number for the "fort_settings" field.</summary>
+    public const int FortSettingsFieldNumber = 2;
+    private global::POGOProtos.Settings.FortSettings fortSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.FortSettings FortSettings {
+      get { return fortSettings_; }
+      set {
+        fortSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "map_settings" field.</summary>
+    public const int MapSettingsFieldNumber = 3;
+    private global::POGOProtos.Settings.MapSettings mapSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.MapSettings MapSettings {
+      get { return mapSettings_; }
+      set {
+        mapSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "level_settings" field.</summary>
+    public const int LevelSettingsFieldNumber = 4;
+    private global::POGOProtos.Settings.LevelSettings levelSettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.LevelSettings LevelSettings {
+      get { return levelSettings_; }
+      set {
+        levelSettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "inventory_settings" field.</summary>
+    public const int InventorySettingsFieldNumber = 5;
+    private global::POGOProtos.Settings.InventorySettings inventorySettings_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::POGOProtos.Settings.InventorySettings InventorySettings {
+      get { return inventorySettings_; }
+      set {
+        inventorySettings_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "minimum_client_version" field.</summary>
+    public const int MinimumClientVersionFieldNumber = 6;
+    private string minimumClientVersion_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string MinimumClientVersion {
+      get { return minimumClientVersion_; }
+      set {
+        minimumClientVersion_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as GlobalSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(GlobalSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(FortSettings, other.FortSettings)) return false;
+      if (!object.Equals(MapSettings, other.MapSettings)) return false;
+      if (!object.Equals(LevelSettings, other.LevelSettings)) return false;
+      if (!object.Equals(InventorySettings, other.InventorySettings)) return false;
+      if (MinimumClientVersion != other.MinimumClientVersion) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (fortSettings_ != null) hash ^= FortSettings.GetHashCode();
+      if (mapSettings_ != null) hash ^= MapSettings.GetHashCode();
+      if (levelSettings_ != null) hash ^= LevelSettings.GetHashCode();
+      if (inventorySettings_ != null) hash ^= InventorySettings.GetHashCode();
+      if (MinimumClientVersion.Length != 0) hash ^= MinimumClientVersion.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (fortSettings_ != null) {
+        output.WriteRawTag(18);
+        output.WriteMessage(FortSettings);
+      }
+      if (mapSettings_ != null) {
+        output.WriteRawTag(26);
+        output.WriteMessage(MapSettings);
+      }
+      if (levelSettings_ != null) {
+        output.WriteRawTag(34);
+        output.WriteMessage(LevelSettings);
+      }
+      if (inventorySettings_ != null) {
+        output.WriteRawTag(42);
+        output.WriteMessage(InventorySettings);
+      }
+      if (MinimumClientVersion.Length != 0) {
+        output.WriteRawTag(50);
+        output.WriteString(MinimumClientVersion);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (fortSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortSettings);
+      }
+      if (mapSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(MapSettings);
+      }
+      if (levelSettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelSettings);
+      }
+      if (inventorySettings_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventorySettings);
+      }
+      if (MinimumClientVersion.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(MinimumClientVersion);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(GlobalSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.fortSettings_ != null) {
+        if (fortSettings_ == null) {
+          fortSettings_ = new global::POGOProtos.Settings.FortSettings();
+        }
+        FortSettings.MergeFrom(other.FortSettings);
+      }
+      if (other.mapSettings_ != null) {
+        if (mapSettings_ == null) {
+          mapSettings_ = new global::POGOProtos.Settings.MapSettings();
+        }
+        MapSettings.MergeFrom(other.MapSettings);
+      }
+      if (other.levelSettings_ != null) {
+        if (levelSettings_ == null) {
+          levelSettings_ = new global::POGOProtos.Settings.LevelSettings();
+        }
+        LevelSettings.MergeFrom(other.LevelSettings);
+      }
+      if (other.inventorySettings_ != null) {
+        if (inventorySettings_ == null) {
+          inventorySettings_ = new global::POGOProtos.Settings.InventorySettings();
+        }
+        InventorySettings.MergeFrom(other.InventorySettings);
+      }
+      if (other.MinimumClientVersion.Length != 0) {
+        MinimumClientVersion = other.MinimumClientVersion;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 18: {
+            if (fortSettings_ == null) {
+              fortSettings_ = new global::POGOProtos.Settings.FortSettings();
+            }
+            input.ReadMessage(fortSettings_);
+            break;
+          }
+          case 26: {
+            if (mapSettings_ == null) {
+              mapSettings_ = new global::POGOProtos.Settings.MapSettings();
+            }
+            input.ReadMessage(mapSettings_);
+            break;
+          }
+          case 34: {
+            if (levelSettings_ == null) {
+              levelSettings_ = new global::POGOProtos.Settings.LevelSettings();
+            }
+            input.ReadMessage(levelSettings_);
+            break;
+          }
+          case 42: {
+            if (inventorySettings_ == null) {
+              inventorySettings_ = new global::POGOProtos.Settings.InventorySettings();
+            }
+            input.ReadMessage(inventorySettings_);
+            break;
+          }
+          case 50: {
+            MinimumClientVersion = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class DownloadSettingsAction : pb::IMessage<DownloadSettingsAction> {
+    private static readonly pb::MessageParser<DownloadSettingsAction> _parser = new pb::MessageParser<DownloadSettingsAction>(() => new DownloadSettingsAction());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<DownloadSettingsAction> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsAction() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsAction(DownloadSettingsAction other) : this() {
+      hash_ = other.hash_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public DownloadSettingsAction Clone() {
+      return new DownloadSettingsAction(this);
+    }
+
+    /// <summary>Field number for the "hash" field.</summary>
+    public const int HashFieldNumber = 1;
+    private string hash_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string Hash {
+      get { return hash_; }
+      set {
+        hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as DownloadSettingsAction);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(DownloadSettingsAction other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Hash != other.Hash) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Hash.Length != 0) hash ^= Hash.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Hash.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Hash);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (Hash.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(DownloadSettingsAction other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Hash.Length != 0) {
+        Hash = other.Hash;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 10: {
+            Hash = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  public sealed partial class LevelSettings : pb::IMessage<LevelSettings> {
+    private static readonly pb::MessageParser<LevelSettings> _parser = new pb::MessageParser<LevelSettings>(() => new LevelSettings());
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pb::MessageParser<LevelSettings> Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::POGOProtos.Settings.POGOProtosSettingsReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelSettings() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelSettings(LevelSettings other) : this() {
+      trainerCpModifier_ = other.trainerCpModifier_;
+      trainerDifficultyModifier_ = other.trainerDifficultyModifier_;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public LevelSettings Clone() {
+      return new LevelSettings(this);
+    }
+
+    /// <summary>Field number for the "trainer_cp_modifier" field.</summary>
+    public const int TrainerCpModifierFieldNumber = 2;
+    private double trainerCpModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double TrainerCpModifier {
+      get { return trainerCpModifier_; }
+      set {
+        trainerCpModifier_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "trainer_difficulty_modifier" field.</summary>
+    public const int TrainerDifficultyModifierFieldNumber = 3;
+    private double trainerDifficultyModifier_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double TrainerDifficultyModifier {
+      get { return trainerDifficultyModifier_; }
+      set {
+        trainerDifficultyModifier_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override bool Equals(object other) {
+      return Equals(other as LevelSettings);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool Equals(LevelSettings other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (TrainerCpModifier != other.TrainerCpModifier) return false;
+      if (TrainerDifficultyModifier != other.TrainerDifficultyModifier) return false;
+      return true;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (TrainerCpModifier != 0D) hash ^= TrainerCpModifier.GetHashCode();
+      if (TrainerDifficultyModifier != 0D) hash ^= TrainerDifficultyModifier.GetHashCode();
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (TrainerCpModifier != 0D) {
+        output.WriteRawTag(17);
+        output.WriteDouble(TrainerCpModifier);
+      }
+      if (TrainerDifficultyModifier != 0D) {
+        output.WriteRawTag(25);
+        output.WriteDouble(TrainerDifficultyModifier);
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int CalculateSize() {
+      int size = 0;
+      if (TrainerCpModifier != 0D) {
+        size += 1 + 8;
+      }
+      if (TrainerDifficultyModifier != 0D) {
+        size += 1 + 8;
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(LevelSettings other) {
+      if (other == null) {
+        return;
+      }
+      if (other.TrainerCpModifier != 0D) {
+        TrainerCpModifier = other.TrainerCpModifier;
+      }
+      if (other.TrainerDifficultyModifier != 0D) {
+        TrainerDifficultyModifier = other.TrainerDifficultyModifier;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 17: {
+            TrainerCpModifier = input.ReadDouble();
+            break;
+          }
+          case 25: {
+            TrainerDifficultyModifier = input.ReadDouble();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/RocketAPI/.gitattributes b/PokemonGo/RocketAPI/.gitattributes
new file mode 100644
index 0000000..bdb0cab
--- /dev/null
+++ b/PokemonGo/RocketAPI/.gitattributes
@@ -0,0 +1,17 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs     diff=csharp
+
+# Standard to msysgit
+*.doc	 diff=astextplain
+*.DOC	 diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot  diff=astextplain
+*.DOT  diff=astextplain
+*.pdf  diff=astextplain
+*.PDF	 diff=astextplain
+*.rtf	 diff=astextplain
+*.RTF	 diff=astextplain
diff --git a/PokemonGo/RocketAPI/.gitignore b/PokemonGo/RocketAPI/.gitignore
new file mode 100644
index 0000000..f91ff2b
--- /dev/null
+++ b/PokemonGo/RocketAPI/.gitignore
@@ -0,0 +1,216 @@
+#################
+## Eclipse
+#################
+
+*.pydevproject
+.project
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+
+#################
+## Visual Studio
+#################
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+
+[Dd]ebug/
+[Rr]elease/
+x64/
+build/
+[Bb]in/
+[Oo]bj/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.log
+*.scc
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+*.ncrunch*
+.*crunch*.local.xml
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.Publish.xml
+*.pubxml
+*.publishproj
+
+# NuGet Packages Directory
+## TODO: If you have NuGet Package Restore enabled, uncomment the next line
+#packages/
+
+# Windows Azure Build Output
+csx
+*.build.csdef
+
+# Windows Store app package directory
+AppPackages/
+
+# Others
+sql/
+*.Cache
+ClientBin/
+[Ss]tyle[Cc]op.*
+~$*
+*~
+*.dbmdl
+*.[Pp]ublish.xml
+*.pfx
+*.publishsettings
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+App_Data/*.mdf
+App_Data/*.ldf
+
+#############
+## Windows detritus
+#############
+
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Mac crap
+.DS_Store
+
+
+#############
+## Python
+#############
+
+*.py[cod]
+
+# Packages
+*.egg
+*.egg-info
+dist/
+build/
+eggs/
+parts/
+var/
+sdist/
+develop-eggs/
+.installed.cfg
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+
+#Translations
+*.mo
+
+#Mr Developer
+.mr.developer.cfg
diff --git a/PokemonGo/RocketAPI/Client.cs b/PokemonGo/RocketAPI/Client.cs
index b045725..f100f7f 100644
--- a/PokemonGo/RocketAPI/Client.cs
+++ b/PokemonGo/RocketAPI/Client.cs
@@ -1,576 +1,63 @@
-#region
-
-using System;
-using System.Linq;
+using System;
 using System.Net;
 using System.Net.Http;
 using System.Threading.Tasks;
 using Google.Protobuf;
 using PokemonGo.RocketAPI.Enums;
+using PokemonGo.RocketAPI.Exceptions;
 using PokemonGo.RocketAPI.Extensions;
-using PokemonGo.RocketAPI.GeneratedCode;
 using PokemonGo.RocketAPI.Helpers;
+using PokemonGo.RocketAPI.HttpClient;
 using PokemonGo.RocketAPI.Login;
-using AllEnum;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using System.Threading;
-using PokemonGo.RocketAPI.Exceptions;
-using System.Text;
-using System.IO;
-using Newtonsoft.Json;
-
-#endregion
+using POGOProtos.Inventory;
+using POGOProtos.Inventory.Item;
+using POGOProtos.Networking.Envelopes;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;

 namespace PokemonGo.RocketAPI
 {
     public class Client
     {
-        private readonly HttpClient _httpClient;
-        private ISettings _settings;
-        private string _accessToken;
-        private string _apiUrl;
-
-        private double _currentLat;
-        private double _currentLng;
-        private Request.Types.UnknownAuth _unknownAuth;
-        public static string AccessToken { get; set; } = string.Empty;
-
-        private readonly ILoginType login;
-
-        public delegate void ConsoleWriteDelegate(ConsoleColor color, string message);
-        public static event ConsoleWriteDelegate OnConsoleWrite;
-
-        public Client(ISettings settings)
-        {
-            _settings = settings;
-            SetCoordinates(_settings.DefaultLatitude, _settings.DefaultLongitude);
-
-            //Setup HttpClient and create default headers
-            var handler = new HttpClientHandler
-            {
-                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
-                AllowAutoRedirect = false
-            };
-            _httpClient = new HttpClient(new RetryHandler(handler));
-            _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Niantic App");
-            //"Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G900F Build/LMY48G)");
-            _httpClient.DefaultRequestHeaders.ExpectContinue = false;
-            _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Connection", "keep-alive");
-            _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "*/*");
-            _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type",
-                "application/x-www-form-urlencoded");
-
-            login = CreateLoginType(settings);
-        }
-
-        static ILoginType CreateLoginType(ISettings settings)
-        {
-            switch (settings.AuthType)
-            {
-                case AuthType.Google:
-                    return new GoogleLogin(settings.Email, settings.Password);
-                case AuthType.Ptc:
-                    return new PtcLogin(settings.PtcUsername, settings.PtcPassword);
-            }
-            throw new ArgumentOutOfRangeException(nameof(settings.AuthType), "unknown auth type");
-        }
+        public Rpc.Login Login;
+        public Rpc.Player Player;
+        public Rpc.Download Download;
+        public Rpc.Inventory Inventory;
+        public Rpc.Map Map;
+        public Rpc.Fort Fort;
+        public Rpc.Encounter Encounter;
+        public Rpc.Misc Misc;

-        public async Task<CatchPokemonResponse> CatchPokemon(ulong encounterId, string spawnPointGuid, double pokemonLat,
-            double pokemonLng, MiscEnums.Item pokeball, int? pokemonCP)
-        {
-            var customRequest = new Request.Types.CatchPokemonRequest
-            {
-                EncounterId = encounterId,
-                Pokeball = (int)GetBestBall(pokemonCP).Result,
-                SpawnPointGuid = spawnPointGuid,
-                HitPokemon = 1,
-                NormalizedReticleSize = Utils.FloatAsUlong(1.950),
-                SpinModifier = Utils.FloatAsUlong(1),
-                NormalizedHitPosition = Utils.FloatAsUlong(1)
-            };
-
-            var catchPokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.CATCH_POKEMON,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, CatchPokemonResponse>($"https://{_apiUrl}/rpc",
-                        catchPokemonRequest);
-        }
-
-        public async Task Login()
-        {
-            string errorMessage;
-            do
-            {
-                errorMessage = null;
-
-                try
-                {
-                    _accessToken = await login.GetAccessToken().ConfigureAwait(false);
-                }
-                catch (LoginFailedException) { errorMessage = "Login failed - wrong username or password? - Restarting"; }
-                catch (PtcOfflineException) { errorMessage = "PTC login server is down - Restarting"; }
-                catch (JsonReaderException) { errorMessage = "Json Reader Exception - Server down? - Restarting"; }
-                catch (Exception ex) { errorMessage = ex.ToString() + "Exception - Please report - Restarting"; }
+        public IApiFailureStrategy ApiFailure { get; set; }
+        public ISettings Settings { get; }
+        public string AuthToken { get; set; }

-                if (errorMessage != null)
-                    ColoredConsoleWrite(ConsoleColor.White, errorMessage);
+        public double CurrentLatitude { get; internal set; }
+        public double CurrentLongitude { get; internal set; }
+        public double CurrentAltitude { get; internal set; }

-            } while (errorMessage != null);
+        public AuthType AuthType => Settings.AuthType;

-        }
+        internal readonly PokemonHttpClient PokemonHttpClient = new PokemonHttpClient();
+        internal string ApiUrl { get; set; }
+        internal AuthTicket AuthTicket { get; set; }

-        public async Task<EncounterResponse> EncounterPokemon(ulong encounterId, string spawnPointGuid)
+        public Client(ISettings settings, IApiFailureStrategy apiFailureStrategy)
         {
-            var customRequest = new Request.Types.EncounterRequest
-            {
-                EncounterId = encounterId,
-                SpawnpointId = spawnPointGuid,
-                PlayerLatDegrees = Utils.FloatAsUlong(_currentLat),
-                PlayerLngDegrees = Utils.FloatAsUlong(_currentLng)
-            };
+            Settings = settings;
+            ApiFailure = apiFailureStrategy;

-            var encounterResponse = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.ENCOUNTER,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, EncounterResponse>($"https://{_apiUrl}/rpc", encounterResponse);
-        }
-
-        public async Task<EvolvePokemonOut> EvolvePokemon(ulong pokemonId)
-        {
-            var customRequest = new EvolvePokemon
-            {
-                PokemonId = pokemonId
-            };
-
-            var releasePokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.EVOLVE_POKEMON,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, EvolvePokemonOut>($"https://{_apiUrl}/rpc",
-                        releasePokemonRequest);
-        }
-
-
-        public async Task<EvolvePokemonOut> PowerUp(ulong pokemonId)
-        {
-            var customRequest = new EvolvePokemon
-            {
-                PokemonId = pokemonId
-            };
-
-            var releasePokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.UPGRADE_POKEMON,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, EvolvePokemonOut>($"https://{_apiUrl}/rpc",
-                        releasePokemonRequest);
-        }
-
-        private async Task<MiscEnums.Item> GetBestBall(int? pokemonCP)
-        {
-            var inventory = await GetInventory();
-
-            var ballCollection = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Item)
-                .Where(p => p != null)
-                .GroupBy(i => (MiscEnums.Item)i.Item_)
-                .Select(kvp => new { ItemId = kvp.Key, Amount = kvp.Sum(x => x.Count) })
-                .Where(y => y.ItemId == MiscEnums.Item.ITEM_POKE_BALL
-                            || y.ItemId == MiscEnums.Item.ITEM_GREAT_BALL
-                            || y.ItemId == MiscEnums.Item.ITEM_ULTRA_BALL
-                            || y.ItemId == MiscEnums.Item.ITEM_MASTER_BALL);
-
-            var pokeBallsCount = ballCollection.Where(p => p.ItemId == MiscEnums.Item.ITEM_POKE_BALL).
-                DefaultIfEmpty(new { ItemId = MiscEnums.Item.ITEM_POKE_BALL, Amount = 0 }).FirstOrDefault().Amount;
-            var greatBallsCount = ballCollection.Where(p => p.ItemId == MiscEnums.Item.ITEM_GREAT_BALL).
-                DefaultIfEmpty(new { ItemId = MiscEnums.Item.ITEM_GREAT_BALL, Amount = 0 }).FirstOrDefault().Amount;
-            var ultraBallsCount = ballCollection.Where(p => p.ItemId == MiscEnums.Item.ITEM_ULTRA_BALL).
-                DefaultIfEmpty(new { ItemId = MiscEnums.Item.ITEM_ULTRA_BALL, Amount = 0 }).FirstOrDefault().Amount;
-            var masterBallsCount = ballCollection.Where(p => p.ItemId == MiscEnums.Item.ITEM_MASTER_BALL).
-                DefaultIfEmpty(new { ItemId = MiscEnums.Item.ITEM_MASTER_BALL, Amount = 0 }).FirstOrDefault().Amount;
-
-            // Use better balls for high CP pokemon
-            if (masterBallsCount > 0 && pokemonCP >= 1000)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Master Ball is being used");
-                return MiscEnums.Item.ITEM_MASTER_BALL;
-            }
-
-            if (ultraBallsCount > 0 && pokemonCP >= 600)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Ultra Ball is being used");
-                return MiscEnums.Item.ITEM_ULTRA_BALL;
-            }
-
-            if (greatBallsCount > 0 && pokemonCP >= 350)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Great Ball is being used");
-                return MiscEnums.Item.ITEM_GREAT_BALL;
-            }
-
-            // If low CP pokemon, but no more pokeballs; only use better balls if pokemon are of semi-worthy quality
-            if (pokeBallsCount > 0)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Poke Ball is being used");
-                return MiscEnums.Item.ITEM_POKE_BALL;
-            }
-            else if ((greatBallsCount < 40 && pokemonCP >= 200) || greatBallsCount >= 40)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Great Ball is being used");
-                return MiscEnums.Item.ITEM_GREAT_BALL;
-            }
-            else if (ultraBallsCount > 0 && pokemonCP >= 500)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Ultra Ball is being used");
-                return MiscEnums.Item.ITEM_ULTRA_BALL;
-            }
-            else if (masterBallsCount > 0 && pokemonCP >= 700)
-            {
-                ColoredConsoleWrite(ConsoleColor.Green, $"Master Ball is being used");
-                return MiscEnums.Item.ITEM_MASTER_BALL;
-            }
-
-            return MiscEnums.Item.ITEM_POKE_BALL;
-        }
-
-        public static void ColoredConsoleWrite(ConsoleColor color, string text)
-        {
-            ConsoleColor originalColor = System.Console.ForegroundColor;
-            System.Console.ForegroundColor = color;
-            System.Console.WriteLine(text);
-            System.Console.ForegroundColor = originalColor;
-            if (OnConsoleWrite != null)
-            {
-                OnConsoleWrite(color, text);
-            }
-        }
-
-        public async Task<FortDetailsResponse> GetFort(string fortId, double fortLat, double fortLng)
-        {
-            var customRequest = new Request.Types.FortDetailsRequest
-            {
-                Id = ByteString.CopyFromUtf8(fortId),
-                Latitude = Utils.FloatAsUlong(fortLat),
-                Longitude = Utils.FloatAsUlong(fortLng)
-            };
-
-            var fortDetailRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 10,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.FORT_DETAILS,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, FortDetailsResponse>($"https://{_apiUrl}/rpc",
-                        fortDetailRequest);
-        }
-
-        public async Task<GetInventoryResponse> GetInventory()
-        {
-            var inventoryRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                RequestType.GET_INVENTORY);
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, GetInventoryResponse>($"https://{_apiUrl}/rpc",
-                        inventoryRequest);
-        }
-
-        public async Task<GetMapObjectsResponse> GetMapObjects()
-        {
-            var customRequest = new Request.Types.MapObjectsRequest
-            {
-                CellIds =
-                    ByteString.CopyFrom(
-                        ProtoHelper.EncodeUlongList(S2Helper.GetNearbyCellIds(_currentLng,
-                            _currentLat))),
-                Latitude = Utils.FloatAsUlong(_currentLat),
-                Longitude = Utils.FloatAsUlong(_currentLng),
-                Unknown14 = ByteString.CopyFromUtf8("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
-            };
-
-            var mapRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 10,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.GET_MAP_OBJECTS,
-                    Message = customRequest.ToByteString()
-                },
-                new Request.Types.Requests { Type = (int)RequestType.GET_HATCHED_OBJECTS },
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.GET_INVENTORY,
-                    Message = new Request.Types.Time { Time_ = DateTime.UtcNow.ToUnixTime() }.ToByteString()
-                },
-                new Request.Types.Requests { Type = (int)RequestType.CHECK_AWARDED_BADGES },
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.DOWNLOAD_SETTINGS,
-                    Message =
-                        new Request.Types.SettingsGuid
-                        {
-                            Guid = ByteString.CopyFromUtf8("4a2e9bc330dae60e7b74fc85b98868ab4700802e")
-                        }.ToByteString()
-                });
-
-            return
-                await _httpClient.PostProtoPayload<Request, GetMapObjectsResponse>($"https://{_apiUrl}/rpc", mapRequest);
-        }
-
-        public async Task<GetPlayerResponse> GetProfile()
-        {
-            var profileRequest = RequestBuilder.GetInitialRequest(_accessToken, _settings.AuthType, _currentLat, _currentLng, 10,
-                new Request.Types.Requests { Type = (int)RequestType.GET_PLAYER });
-            return
-                await _httpClient.PostProtoPayload<Request, GetPlayerResponse>($"https://{_apiUrl}/rpc", profileRequest);
-        }
-
-        public async Task<DownloadSettingsResponse> GetSettings()
-        {
-            var settingsRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 10,
-                RequestType.DOWNLOAD_SETTINGS);
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, DownloadSettingsResponse>($"https://{_apiUrl}/rpc",
-                        settingsRequest);
-        }
-
-        /*num Holoholo.Rpc.Types.FortSearchOutProto.Result {
-         NO_RESULT_SET = 0;
-         SUCCESS = 1;
-         OUT_OF_RANGE = 2;
-         IN_COOLDOWN_PERIOD = 3;
-         INVENTORY_FULL = 4;
-        }*/
-
-        public async Task<FortSearchResponse> SearchFort(string fortId, double fortLat, double fortLng)
-        {
-            var customRequest = new Request.Types.FortSearchRequest
-            {
-                Id = ByteString.CopyFromUtf8(fortId),
-                FortLatDegrees = Utils.FloatAsUlong(fortLat),
-                FortLngDegrees = Utils.FloatAsUlong(fortLng),
-                PlayerLatDegrees = Utils.FloatAsUlong(_currentLat),
-                PlayerLngDegrees = Utils.FloatAsUlong(_currentLng)
-            };
-
-            var fortDetailRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.FORT_SEARCH,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, FortSearchResponse>($"https://{_apiUrl}/rpc",
-                        fortDetailRequest);
-        }
-
-        private void SetCoordinates(double lat, double lng)
-        {
-            _currentLat = lat;
-            _currentLng = lng;
-            //            _settings.DefaultLatitude = lat;
-            //            _settings.DefaultLongitude = lng;
-        }
-
-        public async Task SetServer()
-        {
-            var serverRequest = RequestBuilder.GetInitialRequest(_accessToken, _settings.AuthType, _currentLat, _currentLng, 10,
-                RequestType.GET_PLAYER, RequestType.GET_HATCHED_OBJECTS, RequestType.GET_INVENTORY,
-                RequestType.CHECK_AWARDED_BADGES, RequestType.DOWNLOAD_SETTINGS);
-            var serverResponse = await _httpClient.PostProto(Resources.RpcUrl, serverRequest);
-            _unknownAuth = new Request.Types.UnknownAuth
-            {
-                Unknown71 = serverResponse.Auth.Unknown71,
-                Timestamp = serverResponse.Auth.Timestamp,
-                Unknown73 = serverResponse.Auth.Unknown73
-            };
-
-            _apiUrl = serverResponse.ApiUrl;
-        }
-
-        public async Task<TransferPokemonOut> TransferPokemon(ulong pokemonId)
-        {
-            var customRequest = new TransferPokemon
-            {
-                PokemonId = pokemonId
-            };
-
-            var releasePokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.RELEASE_POKEMON,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, TransferPokemonOut>($"https://{_apiUrl}/rpc",
-                        releasePokemonRequest);
-        }
-
-        public double CurrentLatitude
-        {
-            get
-            {
-                return this._currentLat;
-            }
-        }
-
-        public double CurrentLongitude
-        {
-            get
-            {
-                return this._currentLng;
-            }
-        }
-
-        public async Task<PlayerUpdateResponse> UpdatePlayerLocation(double lat, double lng)
-        {
-            SetCoordinates(lat, lng);
-            var latlng = _currentLat + ":" + _currentLng;
-            File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "coords.txt", latlng);
-
-            var customRequest = new Request.Types.PlayerUpdateProto
-            {
-                Lat = Utils.FloatAsUlong(_currentLat),
-                Lng = Utils.FloatAsUlong(_currentLng)
-            };
-
-            var updateRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 10,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.PLAYER_UPDATE,
-                    Message = customRequest.ToByteString()
-                });
-            var updateResponse =
-                await
-                    _httpClient.PostProtoPayload<Request, PlayerUpdateResponse>($"https://{_apiUrl}/rpc", updateRequest);
-            return updateResponse;
-        }
-
-
-
-
-        public async Task<IEnumerable<Item>> GetItemsToRecycle(ISettings settings, Client client)
-        {
-            var myItems = await GetItems(client);
-
-            return myItems
-                .Where(x => settings.ItemRecycleFilter.Any(f => f.Key == ((ItemId)x.Item_) && x.Count > f.Value))
-                .Select(x => new Item { Item_ = x.Item_, Count = x.Count - settings.ItemRecycleFilter.Single(f => f.Key == (AllEnum.ItemId)x.Item_).Value, Unseen = x.Unseen });
-        }
-
-        public async Task RecycleItems(Client client)
-        {
-            var items = await GetItemsToRecycle(_settings, client);
-
-            foreach (var item in items)
-            {
-                var transfer = await RecycleItem((AllEnum.ItemId)item.Item_, item.Count);
-                ColoredConsoleWrite(ConsoleColor.DarkCyan, $"Recycled {item.Count}x {((AllEnum.ItemId)item.Item_).ToString().Substring(4)}");
-                await Task.Delay(500);
-            }
-            await Task.Delay(_settings.RecycleItemsInterval * 1000);
-            RecycleItems(client);
-        }
-
-        public async Task<Response.Types.Unknown6> RecycleItem(AllEnum.ItemId itemId, int amount)
-        {
-            var customRequest = new InventoryItemData.RecycleInventoryItem
-            {
-                ItemId = (AllEnum.ItemId)Enum.Parse(typeof(AllEnum.ItemId), itemId.ToString()),
-                Count = amount
-            };
-
-            var releasePokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests()
-                {
-                    Type = (int)RequestType.RECYCLE_INVENTORY_ITEM,
-                    Message = customRequest.ToByteString()
-                });
-            return await _httpClient.PostProtoPayload<Request, Response.Types.Unknown6>($"https://{_apiUrl}/rpc", releasePokemonRequest);
-        }
-
-        public async Task<IEnumerable<Item>> GetItems(Client client)
-        {
-            var inventory = await client.GetInventory();
-            return inventory.InventoryDelta.InventoryItems
-                .Select(i => i.InventoryItemData?.Item)
-                .Where(p => p != null);
-        }
-
-        public async Task<UseItemCaptureRequest> UseCaptureItem(ulong encounterId, AllEnum.ItemId itemId, string spawnPointGuid)
-        {
-            var customRequest = new UseItemCaptureRequest
-            {
-                EncounterId = encounterId,
-                ItemId = itemId,
-                SpawnPointGuid = spawnPointGuid
-            };
-
-            var useItemRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests()
-                {
-                    Type = (int)RequestType.USE_ITEM_CAPTURE,
-                    Message = customRequest.ToByteString()
-                });
-            return await _httpClient.PostProtoPayload<Request, UseItemCaptureRequest>($"https://{_apiUrl}/rpc", useItemRequest);
-        }
-
-        public async Task UseRazzBerry(Client client, ulong encounterId, string spawnPointGuid)
-        {
-            IEnumerable<Item> myItems = await GetItems(client);
-            IEnumerable<Item> RazzBerries = myItems.Where(i => (ItemId)i.Item_ == ItemId.ItemRazzBerry);
-            Item RazzBerry = RazzBerries.FirstOrDefault();
-            if (RazzBerry != null)
-            {
-                UseItemCaptureRequest useRazzBerry = await client.UseCaptureItem(encounterId, AllEnum.ItemId.ItemRazzBerry, spawnPointGuid);
-                ColoredConsoleWrite(ConsoleColor.Green, $"Using a Razz Berry, we have {RazzBerry.Count} left");
-                await Task.Delay(2000);
-            }
-            else
-            {
-                ColoredConsoleWrite(ConsoleColor.Red, $"You don't have any Razz Berry to use.");
-            }
-        }
-
-        public async Task<UseItemRequest> UseItemXpBoost(ItemId itemId)
-        {
-            var customRequest = new UseItemRequest
-            {
-                ItemId = itemId,
-            };
+            Login = new Rpc.Login(this);
+            Player = new Rpc.Player(this);
+            Download = new Rpc.Download(this);
+            Inventory = new Rpc.Inventory(this);
+            Map = new Rpc.Map(this);
+            Fort = new Rpc.Fort(this);
+            Encounter = new Rpc.Encounter(this);
+            Misc = new Rpc.Misc(this);

-            var useItemRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
-                new Request.Types.Requests
-                {
-                    Type = (int)RequestType.USE_ITEM_XP_BOOST,
-                    Message = customRequest.ToByteString()
-                });
-            return
-                await
-                    _httpClient.PostProtoPayload<Request, UseItemRequest>($"https://{_apiUrl}/rpc",
-                        useItemRequest);
+            Player.SetCoordinates(Settings.DefaultLatitude, Settings.DefaultLongitude, Settings.DefaultAltitude);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Exceptions/AccessTokenExpiredException.cs b/PokemonGo/RocketAPI/Exceptions/AccessTokenExpiredException.cs
new file mode 100644
index 0000000..95710c2
--- /dev/null
+++ b/PokemonGo/RocketAPI/Exceptions/AccessTokenExpiredException.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace PokemonGo.RocketAPI.Exceptions
+{
+    public class AccessTokenExpiredException : Exception
+    {
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Exceptions/AccountNotVerifiedException.cs b/PokemonGo/RocketAPI/Exceptions/AccountNotVerifiedException.cs
new file mode 100644
index 0000000..12e7c66
--- /dev/null
+++ b/PokemonGo/RocketAPI/Exceptions/AccountNotVerifiedException.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace PokemonGo.RocketAPI.Exceptions
+{
+    public class AccountNotVerifiedException : Exception
+    {
+        public AccountNotVerifiedException(string message) : base(message)
+        {
+
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Exceptions/GoogleException.cs b/PokemonGo/RocketAPI/Exceptions/GoogleException.cs
new file mode 100644
index 0000000..c6f8dd3
--- /dev/null
+++ b/PokemonGo/RocketAPI/Exceptions/GoogleException.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PokemonGo.RocketAPI.Exceptions
+{
+    public class GoogleException : Exception
+    {
+        public GoogleException(string message) : base(message)
+        {
+
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/Exceptions/GoogleOfflineException.cs b/PokemonGo/RocketAPI/Exceptions/GoogleOfflineException.cs
new file mode 100644
index 0000000..07507d2
--- /dev/null
+++ b/PokemonGo/RocketAPI/Exceptions/GoogleOfflineException.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PokemonGo.RocketAPI.Exceptions
+{
+    public class GoogleOfflineException : Exception
+    {
+    }
+}
diff --git a/PokemonGo/RocketAPI/Exceptions/InvalidResponseException.cs b/PokemonGo/RocketAPI/Exceptions/InvalidResponseException.cs
new file mode 100644
index 0000000..5a5bc37
--- /dev/null
+++ b/PokemonGo/RocketAPI/Exceptions/InvalidResponseException.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace PokemonGo.RocketAPI.Exceptions
+{
+    public class InvalidResponseException : Exception
+    {
+        public InvalidResponseException()
+        {}
+
+        public InvalidResponseException(string message)
+            : base(message)
+        { }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Exceptions/PTCOfflineException.cs b/PokemonGo/RocketAPI/Exceptions/PTCOfflineException.cs
index e3100bb..23828dc 100644
--- a/PokemonGo/RocketAPI/Exceptions/PTCOfflineException.cs
+++ b/PokemonGo/RocketAPI/Exceptions/PTCOfflineException.cs
@@ -1,8 +1,4 @@
-#region
-
-using System;
-
-#endregion
+using System;

 namespace PokemonGo.RocketAPI.Exceptions
 {
diff --git a/PokemonGo/RocketAPI/Extensions/DateTimeExtensions.cs b/PokemonGo/RocketAPI/Extensions/DateTimeExtensions.cs
index 5c5b111..b26454a 100644
--- a/PokemonGo/RocketAPI/Extensions/DateTimeExtensions.cs
+++ b/PokemonGo/RocketAPI/Extensions/DateTimeExtensions.cs
@@ -1,8 +1,4 @@
-#region
-
-using System;
-
-#endregion
+using System;

 namespace PokemonGo.RocketAPI.Extensions
 {
diff --git a/PokemonGo/RocketAPI/Extensions/HttpClientExtensions.cs b/PokemonGo/RocketAPI/Extensions/HttpClientExtensions.cs
index e543a7a..0116f01 100644
--- a/PokemonGo/RocketAPI/Extensions/HttpClientExtensions.cs
+++ b/PokemonGo/RocketAPI/Extensions/HttpClientExtensions.cs
@@ -1,75 +1,109 @@
-#region
-
+using System.Diagnostics;
 using System.Net.Http;
 using System.Threading.Tasks;
 using Google.Protobuf;
-using PokemonGo.RocketAPI.GeneratedCode;
-using System;
-
-#endregion
+using PokemonGo.RocketAPI.Exceptions;
+using POGOProtos.Networking.Envelopes;

 namespace PokemonGo.RocketAPI.Extensions
 {
+    using System;
+
+    public enum ApiOperation
+    {
+        Retry,
+        Abort
+    }
+
+    public interface IApiFailureStrategy
+    {
+        Task<ApiOperation> HandleApiFailure(RequestEnvelope request, ResponseEnvelope response);
+        void HandleApiSuccess(RequestEnvelope request, ResponseEnvelope response);
+    }
+
     public static class HttpClientExtensions
     {
-        public static async Task<Response> PostProto<TRequest>(this HttpClient client, string url, TRequest request)
-            where TRequest : IMessage<TRequest>
+        public static async Task<IMessage[]> PostProtoPayload<TRequest>(this System.Net.Http.HttpClient client,
+            string url, RequestEnvelope requestEnvelope,
+            IApiFailureStrategy strategy,
+            params Type[] responseTypes) where TRequest : IMessage<TRequest>
         {
-            //Encode payload and put in envelop, then send
-            var data = request.ToByteString();
-            var result = await client.PostAsync(url, new ByteArrayContent(data.ToByteArray()));
+            var result = new IMessage[responseTypes.Length];
+            for (var i = 0; i < responseTypes.Length; i++)
+            {
+                result[i] = Activator.CreateInstance(responseTypes[i]) as IMessage;
+                if (result[i] == null)
+                {
+                    throw new ArgumentException($"ResponseType {i} is not an IMessage");
+                }
+            }

-            //Decode message
-            var responseData = await result.Content.ReadAsByteArrayAsync();
-            var codedStream = new CodedInputStream(responseData);
-            var decodedResponse = new Response();
-            decodedResponse.MergeFrom(codedStream);
+            ResponseEnvelope response;
+            while ((response = await PostProto<TRequest>(client, url, requestEnvelope)).Returns.Count != responseTypes.Length)
+            {
+                var operation = await strategy.HandleApiFailure(requestEnvelope, response);
+                if (operation == ApiOperation.Abort)
+                {
+                    throw new InvalidResponseException($"Expected {responseTypes.Length} responses, but got {response.Returns.Count} responses");
+                }
+            }

-            return decodedResponse;
+            strategy.HandleApiSuccess(requestEnvelope, response);
+
+            for (var i = 0; i < responseTypes.Length; i++)
+            {
+                var payload = response.Returns[i];
+                result[i].MergeFrom(payload);
+            }
+            return result;
         }

-        private static bool waitingForResponse = false;
-        public static async Task<TResponsePayload> PostProtoPayload<TRequest, TResponsePayload>(this HttpClient client,
-            string url, TRequest request) where TRequest : IMessage<TRequest>
+        public static async Task<TResponsePayload> PostProtoPayload<TRequest, TResponsePayload>(this System.Net.Http.HttpClient client,
+            string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy) where TRequest : IMessage<TRequest>
             where TResponsePayload : IMessage<TResponsePayload>, new()
         {
-            ByteString payload = null;
-
-            while (waitingForResponse)
-                await Task.Delay(30);
-            waitingForResponse = true;
+            Debug.WriteLine($"Requesting {typeof(TResponsePayload).Name}");
+            var response = await PostProto<TRequest>(client, url, requestEnvelope);

-            Response response = null;
-            int count = 0;
-            do
+            while (response.Returns.Count == 0)
             {
-                count++;
-                ColoredConsoleWrite(ConsoleColor.Red, "ArgumentOutOfRangeException - Restarting");
-                ColoredConsoleWrite(ConsoleColor.Red, ($"[DEBUG] [{DateTime.Now.ToString("HH:mm:ss")}] requesting {typeof(TResponsePayload).Name}"));
-                response = await PostProto(client, url, request);
-                waitingForResponse = false;
+                var operation = await strategy.HandleApiFailure(requestEnvelope, response);
+                if (operation == ApiOperation.Abort)
+                {
+                    break;
+                }

+                response = await PostProto<TRequest>(client, url, requestEnvelope);
+            }

+            if (response.Returns.Count == 0)
+                throw new InvalidResponseException();

-                //Decode payload
-                //todo: multi-payload support
-
-                await Task.Delay(30);// request every 30ms, up this value for not spam their server
-            } while (response.Payload.Count < 1 && count < 30);
-            payload = response.Payload[0];
+            strategy.HandleApiSuccess(requestEnvelope, response);

+            //Decode payload
+            //todo: multi-payload support
+            var payload = response.Returns[0];
             var parsedPayload = new TResponsePayload();
             parsedPayload.MergeFrom(payload);

             return parsedPayload;
         }
-        public static void ColoredConsoleWrite(ConsoleColor color, string text)
+
+        public static async Task<ResponseEnvelope> PostProto<TRequest>(this System.Net.Http.HttpClient client, string url,
+            RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
         {
-            ConsoleColor originalColor = System.Console.ForegroundColor;
-            System.Console.ForegroundColor = color;
-            System.Console.WriteLine(text);
-            System.Console.ForegroundColor = originalColor;
-        }
+            //Encode payload and put in envelop, then send
+            var data = requestEnvelope.ToByteString();
+            var result = await client.PostAsync(url, new ByteArrayContent(data.ToByteArray()));
+
+            //Decode message
+            var responseData = await result.Content.ReadAsByteArrayAsync();
+            var codedStream = new CodedInputStream(responseData);
+            var decodedResponse = new ResponseEnvelope();
+            decodedResponse.MergeFrom(codedStream);

+            return decodedResponse;
+        }
     }
 }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/GeneratedCode/AllEnum.cs b/PokemonGo/RocketAPI/GeneratedCode/AllEnum.cs
deleted file mode 100644
index a313b7e..0000000
--- a/PokemonGo/RocketAPI/GeneratedCode/AllEnum.cs
+++ /dev/null
@@ -1,1159 +0,0 @@
-#pragma warning disable 1591, 0612, 3021
-
-#region Designer generated code
-
-#region
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-
-#endregion
-
-namespace AllEnum
-{
-    /// <summary>Holder for reflection information generated from AllEnum.proto</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public static partial class AllEnumReflection
-    {
-        #region Descriptor
-
-        /// <summary>File descriptor for AllEnum.proto</summary>
-        public static pbr::FileDescriptor Descriptor
-        {
-            get { return descriptor; }
-        }
-
-        private static pbr::FileDescriptor descriptor;
-
-        static AllEnumReflection()
-        {
-            var descriptorData = global::System.Convert.FromBase64String(
-                string.Concat(
-                    "Cg1BbGxFbnVtLnByb3RvEgdBbGxFbnVtKjYKDFJwY0RpcmVjdGlvbhILCgdV",
-                    "TktOT1dOEAASDAoIUkVTUE9OU0UQARILCgdSRVFVRVNUEAIqNwoJVGVhbUNv",
-                    "bG9yEgsKB05FVVRSQUwQABIICgRCTFVFEAESBwoDUkVEEAISCgoGWUVMTE9X",
-                    "EAMqwwwKDVJlcXVlc3RNZXRob2QSEAoMTUVUSE9EX1VOU0VUEAASEQoNUExB",
-                    "WUVSX1VQREFURRABEg4KCkdFVF9QTEFZRVIQAhIRCg1HRVRfSU5WRU5UT1JZ",
-                    "EAQSFQoRRE9XTkxPQURfU0VUVElOR1MQBRIbChdET1dOTE9BRF9JVEVNX1RF",
-                    "TVBMQVRFUxAGEiIKHkRPV05MT0FEX1JFTU9URV9DT05GSUdfVkVSU0lPThAH",
-                    "Eg8KC0ZPUlRfU0VBUkNIEGUSDQoJRU5DT1VOVEVSEGYSEQoNQ0FUQ0hfUE9L",
-                    "RU1PThBnEhAKDEZPUlRfREVUQUlMUxBoEgwKCElURU1fVVNFEGkSEwoPR0VU",
-                    "X01BUF9PQkpFQ1RTEGoSFwoTRk9SVF9ERVBMT1lfUE9LRU1PThBuEhcKE0ZP",
-                    "UlRfUkVDQUxMX1BPS0VNT04QbxITCg9SRUxFQVNFX1BPS0VNT04QcBITCg9V",
-                    "U0VfSVRFTV9QT1RJT04QcRIUChBVU0VfSVRFTV9DQVBUVVJFEHISEQoNVVNF",
-                    "X0lURU1fRkxFRRBzEhMKD1VTRV9JVEVNX1JFVklWRRB0EhAKDFRSQURFX1NF",
-                    "QVJDSBB1Eg8KC1RSQURFX09GRkVSEHYSEgoOVFJBREVfUkVTUE9OU0UQdxIQ",
-                    "CgxUUkFERV9SRVNVTFQQeBIWChJHRVRfUExBWUVSX1BST0ZJTEUQeRIRCg1H",
-                    "RVRfSVRFTV9QQUNLEHoSEQoNQlVZX0lURU1fUEFDSxB7EhAKDEJVWV9HRU1f",
-                    "UEFDSxB8EhIKDkVWT0xWRV9QT0tFTU9OEH0SFAoQR0VUX0hBVENIRURfRUdH",
-                    "UxB+Eh8KG0VOQ09VTlRFUl9UVVRPUklBTF9DT01QTEVURRB/EhUKEExFVkVM",
-                    "X1VQX1JFV0FSRFMQgAESGQoUQ0hFQ0tfQVdBUkRFRF9CQURHRVMQgQESEQoM",
-                    "VVNFX0lURU1fR1lNEIUBEhQKD0dFVF9HWU1fREVUQUlMUxCGARIVChBTVEFS",
-                    "VF9HWU1fQkFUVExFEIcBEg8KCkFUVEFDS19HWU0QiAESGwoWUkVDWUNMRV9J",
-                    "TlZFTlRPUllfSVRFTRCJARIYChNDT0xMRUNUX0RBSUxZX0JPTlVTEIoBEhYK",
-                    "EVVTRV9JVEVNX1hQX0JPT1NUEIsBEhsKFlVTRV9JVEVNX0VHR19JTkNVQkFU",
-                    "T1IQjAESEAoLVVNFX0lOQ0VOU0UQjQESGAoTR0VUX0lOQ0VOU0VfUE9LRU1P",
-                    "ThCOARIWChFJTkNFTlNFX0VOQ09VTlRFUhCPARIWChFBRERfRk9SVF9NT0RJ",
-                    "RklFUhCQARITCg5ESVNLX0VOQ09VTlRFUhCRARIhChxDT0xMRUNUX0RBSUxZ",
-                    "X0RFRkVOREVSX0JPTlVTEJIBEhQKD1VQR1JBREVfUE9LRU1PThCTARIZChRT",
-                    "RVRfRkFWT1JJVEVfUE9LRU1PThCUARIVChBOSUNLTkFNRV9QT0tFTU9OEJUB",
-                    "EhAKC0VRVUlQX0JBREdFEJYBEhkKFFNFVF9DT05UQUNUX1NFVFRJTkdTEJcB",
-                    "EhUKEEdFVF9BU1NFVF9ESUdFU1QQrAISFgoRR0VUX0RPV05MT0FEX1VSTFMQ",
-                    "rQISHAoXR0VUX1NVR0dFU1RFRF9DT0RFTkFNRVMQkQMSHQoYQ0hFQ0tfQ09E",
-                    "RU5BTUVfQVZBSUxBQkxFEJIDEhMKDkNMQUlNX0NPREVOQU1FEJMDEg8KClNF",
-                    "VF9BVkFUQVIQlAMSFAoPU0VUX1BMQVlFUl9URUFNEJUDEhsKFk1BUktfVFVU",
-                    "T1JJQUxfQ09NUExFVEUQlgMSFgoRTE9BRF9TUEFXTl9QT0lOVFMQ9AMSCQoE",
-                    "RUNITxCaBRIbChZERUJVR19VUERBVEVfSU5WRU5UT1JZELwFEhgKE0RFQlVH",
-                    "X0RFTEVURV9QTEFZRVIQvQUSFwoSU0ZJREFfUkVHSVNUUkFUSU9OEKAGEhUK",
-                    "EFNGSURBX0FDVElPTl9MT0cQoQYSGAoTU0ZJREFfQ0VSVElGSUNBVElPThCi",
-                    "BhIRCgxTRklEQV9VUERBVEUQowYSEQoMU0ZJREFfQUNUSU9OEKQGEhEKDFNG",
-                    "SURBX0RPV1NFUhClBhISCg1TRklEQV9DQVBUVVJFEKYGKs4XCgtQb2tlbW9u",
-                    "TW92ZRIOCgpNT1ZFX1VOU0VUEAASEQoNVEhVTkRFUl9TSE9DSxABEhAKDFFV",
-                    "SUNLX0FUVEFDSxACEgsKB1NDUkFUQ0gQAxIJCgVFTUJFUhAEEg0KCVZJTkVf",
-                    "V0hJUBAFEgoKBlRBQ0tMRRAGEg4KClJBWk9SX0xFQUYQBxINCglUQUtFX0RP",
-                    "V04QCBINCglXQVRFUl9HVU4QCRIICgRCSVRFEAoSCQoFUE9VTkQQCxIPCgtE",
-                    "T1VCTEVfU0xBUBAMEggKBFdSQVAQDRIOCgpIWVBFUl9CRUFNEA4SCAoETElD",
-                    "SxAPEg4KCkRBUktfUFVMU0UQEBIICgRTTU9HEBESCgoGU0xVREdFEBISDgoK",
-                    "TUVUQUxfQ0xBVxATEg0KCVZJQ0VfR1JJUBAUEg8KC0ZMQU1FX1dIRUVMEBUS",
-                    "DAoITUVHQUhPUk4QFhIPCgtXSU5HX0FUVEFDSxAXEhAKDEZMQU1FVEhST1dF",
-                    "UhAYEhAKDFNVQ0tFUl9QVU5DSBAZEgcKA0RJRxAaEgwKCExPV19LSUNLEBsS",
-                    "DgoKQ1JPU1NfQ0hPUBAcEg4KClBTWUNIT19DVVQQHRILCgdQU1lCRUFNEB4S",
-                    "DgoKRUFSVEhRVUFLRRAfEg4KClNUT05FX0VER0UQIBINCglJQ0VfUFVOQ0gQ",
-                    "IRIPCgtIRUFSVF9TVEFNUBAiEg0KCURJU0NIQVJHRRAjEhAKDEZMQVNIX0NB",
-                    "Tk5PThAkEggKBFBFQ0sQJRIOCgpEUklMTF9QRUNLECYSDAoISUNFX0JFQU0Q",
-                    "JxIMCghCTElaWkFSRBAoEg0KCUFJUl9TTEFTSBApEg0KCUhFQVRfV0FWRRAq",
-                    "Eg0KCVRXSU5FRURMRRArEg4KClBPSVNPTl9KQUIQLBIOCgpBRVJJQUxfQUNF",
-                    "EC0SDQoJRFJJTExfUlVOEC4SEgoOUEVUQUxfQkxJWlpBUkQQLxIOCgpNRUdB",
-                    "X0RSQUlOEDASDAoIQlVHX0JVWloQMRIPCgtQT0lTT05fRkFORxAyEg8KC05J",
-                    "R0hUX1NMQVNIEDMSCQoFU0xBU0gQNBIPCgtCVUJCTEVfQkVBTRA1Eg4KClNV",
-                    "Qk1JU1NJT04QNhIPCgtLQVJBVEVfQ0hPUBA3Eg0KCUxPV19TV0VFUBA4EgwK",
-                    "CEFRVUFfSkVUEDkSDQoJQVFVQV9UQUlMEDoSDQoJU0VFRF9CT01CEDsSDAoI",
-                    "UFNZU0hPQ0sQPBIOCgpST0NLX1RIUk9XED0SEQoNQU5DSUVOVF9QT1dFUhA+",
-                    "Eg0KCVJPQ0tfVE9NQhA/Eg4KClJPQ0tfU0xJREUQQBINCglQT1dFUl9HRU0Q",
-                    "QRIQCgxTSEFET1dfU05FQUsQQhIQCgxTSEFET1dfUFVOQ0gQQxIPCgtTSEFE",
-                    "T1dfQ0xBVxBEEhAKDE9NSU5PVVNfV0lORBBFEg8KC1NIQURPV19CQUxMEEYS",
-                    "EAoMQlVMTEVUX1BVTkNIEEcSDwoLTUFHTkVUX0JPTUIQSBIOCgpTVEVFTF9X",
-                    "SU5HEEkSDQoJSVJPTl9IRUFEEEoSFAoQUEFSQUJPTElDX0NIQVJHRRBLEgkK",
-                    "BVNQQVJLEEwSEQoNVEhVTkRFUl9QVU5DSBBNEgsKB1RIVU5ERVIQThIPCgtU",
-                    "SFVOREVSQk9MVBBPEgsKB1RXSVNURVIQUBIRCg1EUkFHT05fQlJFQVRIEFES",
-                    "EAoMRFJBR09OX1BVTFNFEFISDwoLRFJBR09OX0NMQVcQUxITCg9ESVNBUk1J",
-                    "TkdfVk9JQ0UQVBIRCg1EUkFJTklOR19LSVNTEFUSEgoOREFaWkxJTkdfR0xF",
-                    "QU0QVhINCglNT09OQkxBU1QQVxIOCgpQTEFZX1JPVUdIEFgSEAoMQ1JPU1Nf",
-                    "UE9JU09OEFkSDwoLU0xVREdFX0JPTUIQWhIPCgtTTFVER0VfV0FWRRBbEg0K",
-                    "CUdVTktfU0hPVBBcEgwKCE1VRF9TSE9UEF0SDQoJQk9ORV9DTFVCEF4SDAoI",
-                    "QlVMTERPWkUQXxIMCghNVURfQk9NQhBgEg8KC0ZVUllfQ1VUVEVSEGESDAoI",
-                    "QlVHX0JJVEUQYhIPCgtTSUdOQUxfQkVBTRBjEg0KCVhfU0NJU1NPUhBkEhAK",
-                    "DEZMQU1FX0NIQVJHRRBlEg8KC0ZMQU1FX0JVUlNUEGYSDgoKRklSRV9CTEFT",
-                    "VBBnEgkKBUJSSU5FEGgSDwoLV0FURVJfUFVMU0UQaRIJCgVTQ0FMRBBqEg4K",
-                    "CkhZRFJPX1BVTVAQaxILCgdQU1lDSElDEGwSDQoJUFNZU1RSSUtFEG0SDQoJ",
-                    "SUNFX1NIQVJEEG4SDAoISUNZX1dJTkQQbxIQCgxGUk9TVF9CUkVBVEgQcBIK",
-                    "CgZBQlNPUkIQcRIOCgpHSUdBX0RSQUlOEHISDgoKRklSRV9QVU5DSBBzEg4K",
-                    "ClNPTEFSX0JFQU0QdBIOCgpMRUFGX0JMQURFEHUSDgoKUE9XRVJfV0hJUBB2",
-                    "EgoKBlNQTEFTSBB3EggKBEFDSUQQeBIOCgpBSVJfQ1VUVEVSEHkSDQoJSFVS",
-                    "UklDQU5FEHoSDwoLQlJJQ0tfQlJFQUsQexIHCgNDVVQQfBIJCgVTV0lGVBB9",
-                    "Eg8KC0hPUk5fQVRUQUNLEH4SCQoFU1RPTVAQfxINCghIRUFEQlVUVBCAARIP",
-                    "CgpIWVBFUl9GQU5HEIEBEgkKBFNMQU0QggESDgoJQk9EWV9TTEFNEIMBEgkK",
-                    "BFJFU1QQhAESDQoIU1RSVUdHTEUQhQESFAoPU0NBTERfQkxBU1RPSVNFEIYB",
-                    "EhkKFEhZRFJPX1BVTVBfQkxBU1RPSVNFEIcBEg8KCldSQVBfR1JFRU4QiAES",
-                    "DgoJV1JBUF9QSU5LEIkBEhUKEEZVUllfQ1VUVEVSX0ZBU1QQyAESEgoNQlVH",
-                    "X0JJVEVfRkFTVBDJARIOCglCSVRFX0ZBU1QQygESFgoRU1VDS0VSX1BVTkNI",
-                    "X0ZBU1QQywESFwoSRFJBR09OX0JSRUFUSF9GQVNUEMwBEhcKElRIVU5ERVJf",
-                    "U0hPQ0tfRkFTVBDNARIPCgpTUEFSS19GQVNUEM4BEhIKDUxPV19LSUNLX0ZB",
-                    "U1QQzwESFQoQS0FSQVRFX0NIT1BfRkFTVBDQARIPCgpFTUJFUl9GQVNUENEB",
-                    "EhUKEFdJTkdfQVRUQUNLX0ZBU1QQ0gESDgoJUEVDS19GQVNUENMBEg4KCUxJ",
-                    "Q0tfRkFTVBDUARIVChBTSEFET1dfQ0xBV19GQVNUENUBEhMKDlZJTkVfV0hJ",
-                    "UF9GQVNUENYBEhQKD1JBWk9SX0xFQUZfRkFTVBDXARISCg1NVURfU0hPVF9G",
-                    "QVNUENgBEhMKDklDRV9TSEFSRF9GQVNUENkBEhYKEUZST1NUX0JSRUFUSF9G",
-                    "QVNUENoBEhYKEVFVSUNLX0FUVEFDS19GQVNUENsBEhEKDFNDUkFUQ0hfRkFT",
-                    "VBDcARIQCgtUQUNLTEVfRkFTVBDdARIPCgpQT1VORF9GQVNUEN4BEg0KCENV",
-                    "VF9GQVNUEN8BEhQKD1BPSVNPTl9KQUJfRkFTVBDgARIOCglBQ0lEX0ZBU1QQ",
-                    "4QESFAoPUFNZQ0hPX0NVVF9GQVNUEOIBEhQKD1JPQ0tfVEhST1dfRkFTVBDj",
-                    "ARIUCg9NRVRBTF9DTEFXX0ZBU1QQ5AESFgoRQlVMTEVUX1BVTkNIX0ZBU1QQ",
-                    "5QESEwoOV0FURVJfR1VOX0ZBU1QQ5gESEAoLU1BMQVNIX0ZBU1QQ5wESHQoY",
-                    "V0FURVJfR1VOX0ZBU1RfQkxBU1RPSVNFEOgBEhIKDU1VRF9TTEFQX0ZBU1QQ",
-                    "6QESFgoRWkVOX0hFQURCVVRUX0ZBU1QQ6gESEwoOQ09ORlVTSU9OX0ZBU1QQ",
-                    "6wESFgoRUE9JU09OX1NUSU5HX0ZBU1QQ7AESEAoLQlVCQkxFX0ZBU1QQ7QES",
-                    "FgoRRkVJTlRfQVRUQUNLX0ZBU1QQ7gESFAoPU1RFRUxfV0lOR19GQVNUEO8B",
-                    "EhMKDkZJUkVfRkFOR19GQVNUEPABEhQKD1JPQ0tfU01BU0hfRkFTVBDxASrH",
-                    "BQoGSXRlbUlkEhAKDElURU1fVU5LTk9XThAAEhIKDklURU1fUE9LRV9CQUxM",
-                    "EAESEwoPSVRFTV9HUkVBVF9CQUxMEAISEwoPSVRFTV9VTFRSQV9CQUxMEAMS",
-                    "FAoQSVRFTV9NQVNURVJfQkFMTBAEEg8KC0lURU1fUE9USU9OEGUSFQoRSVRF",
-                    "TV9TVVBFUl9QT1RJT04QZhIVChFJVEVNX0hZUEVSX1BPVElPThBnEhMKD0lU",
-                    "RU1fTUFYX1BPVElPThBoEhAKC0lURU1fUkVWSVZFEMkBEhQKD0lURU1fTUFY",
-                    "X1JFVklWRRDKARITCg5JVEVNX0xVQ0tZX0VHRxCtAhIaChVJVEVNX0lOQ0VO",
-                    "U0VfT1JESU5BUlkQkQMSFwoSSVRFTV9JTkNFTlNFX1NQSUNZEJIDEhYKEUlU",
-                    "RU1fSU5DRU5TRV9DT09MEJMDEhgKE0lURU1fSU5DRU5TRV9GTE9SQUwQlAMS",
-                    "EwoOSVRFTV9UUk9ZX0RJU0sQ9QMSEgoNSVRFTV9YX0FUVEFDSxDaBBITCg5J",
-                    "VEVNX1hfREVGRU5TRRDbBBITCg5JVEVNX1hfTUlSQUNMRRDcBBIUCg9JVEVN",
-                    "X1JBWlpfQkVSUlkQvQUSFAoPSVRFTV9CTFVLX0JFUlJZEL4FEhUKEElURU1f",
-                    "TkFOQUJfQkVSUlkQvwUSFQoQSVRFTV9XRVBBUl9CRVJSWRDABRIVChBJVEVN",
-                    "X1BJTkFQX0JFUlJZEMEFEhgKE0lURU1fU1BFQ0lBTF9DQU1FUkEQoQYSIwoe",
-                    "SVRFTV9JTkNVQkFUT1JfQkFTSUNfVU5MSU1JVEVEEIUHEhkKFElURU1fSU5D",
-                    "VUJBVE9SX0JBU0lDEIYHEiEKHElURU1fUE9LRU1PTl9TVE9SQUdFX1VQR1JB",
-                    "REUQ6QcSHgoZSVRFTV9JVEVNX1NUT1JBR0VfVVBHUkFERRDqBypiChRJbnZl",
-                    "bnRvcnlVcGdyYWRlVHlwZRIRCg1VUEdSQURFX1VOU0VUEAASGQoVSU5DUkVB",
-                    "U0VfSVRFTV9TVE9SQUdFEAESHAoYSU5DUkVBU0VfUE9LRU1PTl9TVE9SQUdF",
-                    "EAIqPwoQRWdnSW5jdWJhdG9yVHlwZRITCg9JTkNVQkFUT1JfVU5TRVQQABIW",
-                    "ChJJTkNVQkFUT1JfRElTVEFOQ0UQASrdDAoPUG9rZW1vbkZhbWlseUlkEhAK",
-                    "DEZBTUlMWV9VTlNFVBAAEhQKEEZBTUlMWV9CVUxCQVNBVVIQARIVChFGQU1J",
-                    "TFlfQ0hBUk1BTkRFUhAEEhMKD0ZBTUlMWV9TUVVJUlRMRRAHEhMKD0ZBTUlM",
-                    "WV9DQVRFUlBJRRAKEhEKDUZBTUlMWV9XRUVETEUQDRIRCg1GQU1JTFlfUElE",
-                    "R0VZEBASEgoORkFNSUxZX1JBVFRBVEEQExISCg5GQU1JTFlfU1BFQVJPVxAV",
-                    "EhAKDEZBTUlMWV9FS0FOUxAXEhIKDkZBTUlMWV9QSUtBQ0hVEBkSFAoQRkFN",
-                    "SUxZX1NBTkRTSFJFVxAbEhIKDkZBTUlMWV9OSURPUkFOEB0SEwoPRkFNSUxZ",
-                    "X05JRE9SQU4yECASEwoPRkFNSUxZX0NMRUZBSVJZECMSEQoNRkFNSUxZX1ZV",
-                    "TFBJWBAlEhUKEUZBTUlMWV9KSUdHTFlQVUZGECcSEAoMRkFNSUxZX1pVQkFU",
-                    "ECkSEQoNRkFNSUxZX09ERElTSBArEhAKDEZBTUlMWV9QQVJBUxAuEhIKDkZB",
-                    "TUlMWV9WRU5PTkFUEDASEgoORkFNSUxZX0RJR0xFVFQQMhIRCg1GQU1JTFlf",
-                    "TUVPV1RIEDQSEgoORkFNSUxZX1BTWURVQ0sQNhIRCg1GQU1JTFlfTUFOS0VZ",
-                    "EDgSFAoQRkFNSUxZX0dST1dMSVRIRRA6EhIKDkZBTUlMWV9QT0xJV0FHEDwS",
-                    "DwoLRkFNSUxZX0FCUkEQPxIRCg1GQU1JTFlfTUFDSE9QEEISFQoRRkFNSUxZ",
-                    "X0JFTExTUFJPVVQQRRIUChBGQU1JTFlfVEVOVEFDT09MEEgSEgoORkFNSUxZ",
-                    "X0dFT0RVREUQShIRCg1GQU1JTFlfUE9OWVRBEE0SEwoPRkFNSUxZX1NMT1dQ",
-                    "T0tFEE8SFAoQRkFNSUxZX01BR05FTUlURRBREhQKEEZBTUlMWV9GQVJGRVRD",
-                    "SEQQUxIQCgxGQU1JTFlfRE9EVU8QVBIPCgtGQU1JTFlfU0VFTBBWEhEKDUZB",
-                    "TUlMWV9HUklNRVIQWBITCg9GQU1JTFlfU0hFTExERVIQWhIRCg1GQU1JTFlf",
-                    "R0FTVExZEFwSDwoLRkFNSUxZX09OSVgQXxISCg5GQU1JTFlfRFJPV1pFRRBg",
-                    "EhEKDUZBTUlMWV9LUkFCQlkQYhISCg5GQU1JTFlfVk9MVE9SQhBkEhQKEEZB",
-                    "TUlMWV9FWEVHR0NVVEUQZhIRCg1GQU1JTFlfQ1VCT05FEGgSFAoQRkFNSUxZ",
-                    "X0hJVE1PTkxFRRBqEhUKEUZBTUlMWV9ISVRNT05DSEFOEGsSFAoQRkFNSUxZ",
-                    "X0xJQ0tJVFVORxBsEhIKDkZBTUlMWV9LT0ZGSU5HEG0SEgoORkFNSUxZX1JI",
-                    "WUhPUk4QbxISCg5GQU1JTFlfQ0hBTlNFWRBxEhIKDkZBTUlMWV9UQU5HRUxB",
-                    "EHISFQoRRkFNSUxZX0tBTkdBU0tIQU4QcxIRCg1GQU1JTFlfSE9SU0VBEHQS",
-                    "EgoORkFNSUxZX0dPTERFRU4QdhIRCg1GQU1JTFlfU1RBUllVEHgSEgoORkFN",
-                    "SUxZX01SX01JTUUQehISCg5GQU1JTFlfU0NZVEhFUhB7Eg8KC0ZBTUlMWV9K",
-                    "WU5YEHwSFQoRRkFNSUxZX0VMRUNUQUJVWloQfRIRCg1GQU1JTFlfTUFHTUFS",
-                    "EH4SEQoNRkFNSUxZX1BJTlNJUhB/EhIKDUZBTUlMWV9UQVVST1MQgAESFAoP",
-                    "RkFNSUxZX01BR0lLQVJQEIEBEhIKDUZBTUlMWV9MQVBSQVMQgwESEQoMRkFN",
-                    "SUxZX0RJVFRPEIQBEhEKDEZBTUlMWV9FRVZFRRCFARITCg5GQU1JTFlfUE9S",
-                    "WUdPThCJARITCg5GQU1JTFlfT01BTllURRCKARISCg1GQU1JTFlfS0FCVVRP",
-                    "EIwBEhYKEUZBTUlMWV9BRVJPREFDVFlMEI4BEhMKDkZBTUlMWV9TTk9STEFY",
-                    "EI8BEhQKD0ZBTUlMWV9BUlRJQ1VOTxCQARISCg1GQU1JTFlfWkFQRE9TEJEB",
-                    "EhMKDkZBTUlMWV9NT0xUUkVTEJIBEhMKDkZBTUlMWV9EUkFUSU5JEJMBEhIK",
-                    "DUZBTUlMWV9NRVdUV08QlgESDwoKRkFNSUxZX01FVxCXASpFChBNYXBPYmpl",
-                    "Y3RzU3RhdHVzEhAKDFVOU0VUX1NUQVRVUxAAEgsKB1NVQ0NFU1MQARISCg5M",
-                    "T0NBVElPTl9VTlNFVBACKiMKCEZvcnRUeXBlEgcKA0dZTRAAEg4KCkNIRUNL",
-                    "UE9JTlQQASqTEAoJUG9rZW1vbklkEg0KCU1JU1NJTkdOTxAAEg0KCUJVTEJB",
-                    "U0FVUhABEgsKB0lWWVNBVVIQAhIMCghWRU5VU0FVUhADEg4KCkNIQVJNRU5E",
-                    "RVIQBBIOCgpDSEFSTUVMRU9OEAUSDQoJQ0hBUklaQVJEEAYSDAoIU1FVSVJU",
-                    "TEUQBxINCglXQVJUT1JUTEUQCBINCglCTEFTVE9JU0UQCRIMCghDQVRFUlBJ",
-                    "RRAKEgsKB01FVEFQT0QQCxIOCgpCVVRURVJGUkVFEAwSCgoGV0VFRExFEA0S",
-                    "CgoGS0FLVU5BEA4SDAoIQkVFRFJJTEwQDxIKCgZQSURHRVkQEBINCglQSURH",
-                    "RU9UVE8QERILCgdQSURHRU9UEBISCwoHUkFUVEFUQRATEgwKCFJBVElDQVRF",
-                    "EBQSCwoHU1BFQVJPVxAVEgoKBkZFQVJPVxAWEgkKBUVLQU5TEBcSCQoFQVJC",
-                    "T0sQGBILCgdQSUtBQ0hVEBkSCgoGUkFJQ0hVEBoSDQoJU0FORFNIUkVXEBsS",
-                    "DAoIU0FORExBU0gQHBISCg5OSURPUkFOX0ZFTUFMRRAdEgwKCE5JRE9SSU5B",
-                    "EB4SDQoJTklET1FVRUVOEB8SEAoMTklET1JBTl9NQUxFECASDAoITklET1JJ",
-                    "Tk8QIRIMCghOSURPS0lORxAiEgsKB0NMRUZBUlkQIxIMCghDTEVGQUJMRRAk",
-                    "EgoKBlZVTFBJWBAlEg0KCU5JTkVUQUxFUxAmEg4KCkpJR0dMWVBVRkYQJxIO",
-                    "CgpXSUdHTFlUVUZGECgSCQoFWlVCQVQQKRIKCgZHT0xCQVQQKhIKCgZPRERJ",
-                    "U0gQKxIJCgVHTE9PTRAsEg0KCVZJTEVQTFVNRRAtEgkKBVBBUkFTEC4SDAoI",
-                    "UEFSQVNFQ1QQLxILCgdWRU5PTkFUEDASDAoIVkVOT01PVEgQMRILCgdESUdM",
-                    "RVRUEDISCwoHRFVHVFJJTxAzEgoKBk1FT1dUSBA0EgsKB1BFUlNJQU4QNRIL",
-                    "CgdQU1lEVUNLEDYSCwoHR09MRFVDSxA3EgoKBk1BTktFWRA4EgwKCFBSSU1F",
-                    "QVBFEDkSDQoJR1JPV0xJVEhFEDoSDAoIQVJDQU5JTkUQOxILCgdQT0xJV0FH",
-                    "EDwSDQoJUE9MSVdISVJMED0SDQoJUE9MSVdSQVRIED4SCAoEQUJSQRA/EgsK",
-                    "B0tBREFCUkEQQBINCglBTEFLSEFaQU0QQRIKCgZNQUNIT1AQQhILCgdNQUNI",
-                    "T0tFEEMSCwoHTUFDSEFNUBBEEg4KCkJFTExTUFJPVVQQRRIOCgpXRUVQSU5C",
-                    "RUxMEEYSDwoLVklDVFJFRUJFTEwQRxINCglURU5UQUNPT0wQSBIOCgpURU5U",
-                    "QUNSVUVMEEkSCwoHR0VPRFVHRRBKEgwKCEdSQVZFTEVSEEsSCQoFR09MRU0Q",
-                    "TBIKCgZQT05ZVEEQTRIMCghSQVBJREFTSBBOEgwKCFNMT1dQT0tFEE8SCwoH",
-                    "U0xPV0JSTxBQEg0KCU1BR05FTUlURRBREgwKCE1BR05FVE9OEFISDQoJRkFS",
-                    "RkVUQ0hEEFMSCQoFRE9EVU8QVBIKCgZET0RSSU8QVRIICgRTRUVMEFYSCwoH",
-                    "REVXR09ORxBXEgoKBkdSSU1FUhBYEgcKA01VSxBZEgwKCFNIRUxMREVSEFoS",
-                    "DAoIQ0xPWVNURVIQWxIKCgZHQVNUTFkQXBILCgdIQVVOVEVSEF0SCgoGR0VO",
-                    "R0FSEF4SCAoET05JWBBfEgsKB0RST1daRUUQYBIJCgVIWVBOTxBhEgoKBktS",
-                    "QUJCWRBiEgsKB0tJTkdMRVIQYxILCgdWT0xUT1JCEGQSDQoJRUxFQ1RST0RF",
-                    "EGUSDQoJRVhFR0dDVVRFEGYSDQoJRVhFR0dVVE9SEGcSCgoGQ1VCT05FEGgS",
-                    "CwoHTUFST1dBSxBpEg0KCUhJVE1PTkxFRRBqEg4KCkhJVE1PTkNIQU4QaxIN",
-                    "CglMSUNLSVRVTkcQbBILCgdLT0ZGSU5HEG0SCwoHV0VFWklORxBuEgsKB1JI",
-                    "WUhPUk4QbxIKCgZSSFlET04QcBILCgdDSEFOU0VZEHESCwoHVEFOR0VMQRBy",
-                    "Eg4KCktBTkdBU0tIQU4QcxIKCgZIT1JTRUEQdBIKCgZTRUFEUkEQdRILCgdH",
-                    "T0xERUVOEHYSCwoHU0VBS0lORxB3EgoKBlNUQVJZVRB4EgsKB1NUQVJNSUUQ",
-                    "eRILCgdNUl9NSU1FEHoSCwoHU0NZVEhFUhB7EggKBEpZTlgQfBIOCgpFTEVD",
-                    "VEFCVVpaEH0SCgoGTUFHTUFSEH4SCgoGUElOU0lSEH8SCwoGVEFVUk9TEIAB",
-                    "Eg0KCE1BR0lLQVJQEIEBEg0KCEdZQVJBRE9TEIIBEgsKBkxBUFJBUxCDARIK",
-                    "CgVESVRUTxCEARIKCgVFRVZFRRCFARINCghWQVBPUkVPThCGARIMCgdKT0xU",
-                    "RU9OEIcBEgwKB0ZMQVJFT04QiAESDAoHUE9SWUdPThCJARIMCgdPTUFOWVRF",
-                    "EIoBEgwKB09NQVNUQVIQiwESCwoGS0FCVVRPEIwBEg0KCEtBQlVUT1BTEI0B",
-                    "Eg8KCkFFUk9EQUNUWUwQjgESDAoHU05PUkxBWBCPARINCghBUlRJQ1VOTxCQ",
-                    "ARILCgZaQVBET1MQkQESDAoHTU9MVFJFUxCSARIMCgdEUkFUSU5JEJMBEg4K",
-                    "CURSQUdPTkFJUhCUARIOCglEUkFHT05JVEUQlQESCwoGTUVXVFdPEJYBEggK",
-                    "A01FVxCXASpCCgtGb3J0U3BvbnNvchIRCg1VTlNFVF9TUE9OU09SEAASDQoJ",
-                    "TUNET05BTERTEAESEQoNUE9LRU1PTl9TVE9SRRACKjMKEUZvcnRSZW5kZXJp",
-                    "bmdUeXBlEgsKB0RFRkFVTFQQABIRCg1JTlRFUk5BTF9URVNUEAEqsgIKCEl0",
-                    "ZW1UeXBlEhIKDklURU1fVFlQRV9OT05FEAASFgoSSVRFTV9UWVBFX1BPS0VC",
-                    "QUxMEAESFAoQSVRFTV9UWVBFX1BPVElPThACEhQKEElURU1fVFlQRV9SRVZJ",
-                    "VkUQAxIRCg1JVEVNX1RZUEVfTUFQEAQSFAoQSVRFTV9UWVBFX0JBVFRMRRAF",
-                    "EhIKDklURU1fVFlQRV9GT09EEAYSFAoQSVRFTV9UWVBFX0NBTUVSQRAHEhIK",
-                    "DklURU1fVFlQRV9ESVNLEAgSFwoTSVRFTV9UWVBFX0lOQ1VCQVRPUhAJEhUK",
-                    "EUlURU1fVFlQRV9JTkNFTlNFEAoSFgoSSVRFTV9UWVBFX1hQX0JPT1NUEAsS",
-                    "HwobSVRFTV9UWVBFX0lOVkVOVE9SWV9VUEdSQURFEAwq1gIKDEl0ZW1DYXRl",
-                    "Z29yeRIWChJJVEVNX0NBVEVHT1JZX05PTkUQABIaChZJVEVNX0NBVEVHT1JZ",
-                    "X1BPS0VCQUxMEAESFgoSSVRFTV9DQVRFR09SWV9GT09EEAISGgoWSVRFTV9D",
-                    "QVRFR09SWV9NRURJQ0lORRADEhcKE0lURU1fQ0FURUdPUllfQk9PU1QQBBIa",
-                    "ChZJVEVNX0NBVEVHT1JZX1VUSUxJVEVTEAUSGAoUSVRFTV9DQVRFR09SWV9D",
-                    "QU1FUkEQBhIWChJJVEVNX0NBVEVHT1JZX0RJU0sQBxIbChdJVEVNX0NBVEVH",
-                    "T1JZX0lOQ1VCQVRPUhAIEhkKFUlURU1fQ0FURUdPUllfSU5DRU5TRRAJEhoK",
-                    "FklURU1fQ0FURUdPUllfWFBfQk9PU1QQChIjCh9JVEVNX0NBVEVHT1JZX0lO",
-                    "VkVOVE9SWV9VUEdSQURFEAsqmAQKCkl0ZW1FZmZlY3QSFAoQSVRFTV9FRkZF",
-                    "Q1RfTk9ORRAAEhwKF0lURU1fRUZGRUNUX0NBUF9OT19GTEVFEOgHEiAKG0lU",
-                    "RU1fRUZGRUNUX0NBUF9OT19NT1ZFTUVOVBDqBxIeChlJVEVNX0VGRkVDVF9D",
-                    "QVBfTk9fVEhSRUFUEOsHEh8KGklURU1fRUZGRUNUX0NBUF9UQVJHRVRfTUFY",
-                    "EOwHEiAKG0lURU1fRUZGRUNUX0NBUF9UQVJHRVRfU0xPVxDtBxIhChxJVEVN",
-                    "X0VGRkVDVF9DQVBfQ0hBTkNFX05JR0hUEO4HEiMKHklURU1fRUZGRUNUX0NB",
-                    "UF9DSEFOQ0VfVFJBSU5FUhDvBxInCiJJVEVNX0VGRkVDVF9DQVBfQ0hBTkNF",
-                    "X0ZJUlNUX1RIUk9XEPAHEiIKHUlURU1fRUZGRUNUX0NBUF9DSEFOQ0VfTEVH",
-                    "RU5EEPEHEiEKHElURU1fRUZGRUNUX0NBUF9DSEFOQ0VfSEVBVlkQ8gcSIgod",
-                    "SVRFTV9FRkZFQ1RfQ0FQX0NIQU5DRV9SRVBFQVQQ8wcSJwoiSVRFTV9FRkZF",
-                    "Q1RfQ0FQX0NIQU5DRV9NVUxUSV9USFJPVxD0BxIiCh1JVEVNX0VGRkVDVF9D",
-                    "QVBfQ0hBTkNFX0FMV0FZUxD1BxIoCiNJVEVNX0VGRkVDVF9DQVBfQ0hBTkNF",
-                    "X1NJTkdMRV9USFJPVxD2ByrsBQoMQWN0aXZpdHlUeXBlEhQKEEFDVElWSVRZ",
-                    "X1VOS05PV04QABIaChZBQ1RJVklUWV9DQVRDSF9QT0tFTU9OEAESIQodQUNU",
-                    "SVZJVFlfQ0FUQ0hfTEVHRU5EX1BPS0VNT04QAhIZChVBQ1RJVklUWV9GTEVF",
-                    "X1BPS0VNT04QAxIYChRBQ1RJVklUWV9ERUZFQVRfRk9SVBAEEhsKF0FDVElW",
-                    "SVRZX0VWT0xWRV9QT0tFTU9OEAUSFgoSQUNUSVZJVFlfSEFUQ0hfRUdHEAYS",
-                    "FAoQQUNUSVZJVFlfV0FMS19LTRAHEh4KGkFDVElWSVRZX1BPS0VERVhfRU5U",
-                    "UllfTkVXEAgSHgoaQUNUSVZJVFlfQ0FUQ0hfRklSU1RfVEhST1cQCRIdChlB",
-                    "Q1RJVklUWV9DQVRDSF9OSUNFX1RIUk9XEAoSHgoaQUNUSVZJVFlfQ0FUQ0hf",
-                    "R1JFQVRfVEhST1cQCxIiCh5BQ1RJVklUWV9DQVRDSF9FWENFTExFTlRfVEhS",
-                    "T1cQDBIcChhBQ1RJVklUWV9DQVRDSF9DVVJWRUJBTEwQDRIlCiFBQ1RJVklU",
-                    "WV9DQVRDSF9GSVJTVF9DQVRDSF9PRl9EQVkQDhIcChhBQ1RJVklUWV9DQVRD",
-                    "SF9NSUxFU1RPTkUQDxIaChZBQ1RJVklUWV9UUkFJTl9QT0tFTU9OEBASGAoU",
-                    "QUNUSVZJVFlfU0VBUkNIX0ZPUlQQERIcChhBQ1RJVklUWV9SRUxFQVNFX1BP",
-                    "S0VNT04QEhIiCh5BQ1RJVklUWV9IQVRDSF9FR0dfU01BTExfQk9OVVMQExIj",
-                    "Ch9BQ1RJVklUWV9IQVRDSF9FR0dfTUVESVVNX0JPTlVTEBQSIgoeQUNUSVZJ",
-                    "VFlfSEFUQ0hfRUdHX0xBUkdFX0JPTlVTEBUSIAocQUNUSVZJVFlfREVGRUFU",
-                    "X0dZTV9ERUZFTkRFUhAWEh4KGkFDVElWSVRZX0RFRkVBVF9HWU1fTEVBREVS",
-                    "EBcqoQcKCUJhZGdlVHlwZRIPCgtCQURHRV9VTlNFVBAAEhMKD0JBREdFX1RS",
-                    "QVZFTF9LTRABEhkKFUJBREdFX1BPS0VERVhfRU5UUklFUxACEhcKE0JBREdF",
-                    "X0NBUFRVUkVfVE9UQUwQAxIXChNCQURHRV9ERUZFQVRFRF9GT1JUEAQSFwoT",
-                    "QkFER0VfRVZPTFZFRF9UT1RBTBAFEhcKE0JBREdFX0hBVENIRURfVE9UQUwQ",
-                    "BhIbChdCQURHRV9FTkNPVU5URVJFRF9UT1RBTBAHEhsKF0JBREdFX1BPS0VT",
-                    "VE9QU19WSVNJVEVEEAgSGgoWQkFER0VfVU5JUVVFX1BPS0VTVE9QUxAJEhkK",
-                    "FUJBREdFX1BPS0VCQUxMX1RIUk9XThAKEhYKEkJBREdFX0JJR19NQUdJS0FS",
-                    "UBALEhgKFEJBREdFX0RFUExPWUVEX1RPVEFMEAwSGwoXQkFER0VfQkFUVExF",
-                    "X0FUVEFDS19XT04QDRIdChlCQURHRV9CQVRUTEVfVFJBSU5JTkdfV09OEA4S",
-                    "GwoXQkFER0VfQkFUVExFX0RFRkVORF9XT04QDxIZChVCQURHRV9QUkVTVElH",
-                    "RV9SQUlTRUQQEBIaChZCQURHRV9QUkVTVElHRV9EUk9QUEVEEBESFQoRQkFE",
-                    "R0VfVFlQRV9OT1JNQUwQEhIXChNCQURHRV9UWVBFX0ZJR0hUSU5HEBMSFQoR",
-                    "QkFER0VfVFlQRV9GTFlJTkcQFBIVChFCQURHRV9UWVBFX1BPSVNPThAVEhUK",
-                    "EUJBREdFX1RZUEVfR1JPVU5EEBYSEwoPQkFER0VfVFlQRV9ST0NLEBcSEgoO",
-                    "QkFER0VfVFlQRV9CVUcQGBIUChBCQURHRV9UWVBFX0dIT1NUEBkSFAoQQkFE",
-                    "R0VfVFlQRV9TVEVFTBAaEhMKD0JBREdFX1RZUEVfRklSRRAbEhQKEEJBREdF",
-                    "X1RZUEVfV0FURVIQHBIUChBCQURHRV9UWVBFX0dSQVNTEB0SFwoTQkFER0Vf",
-                    "VFlQRV9FTEVDVFJJQxAeEhYKEkJBREdFX1RZUEVfUFNZQ0hJQxAfEhIKDkJB",
-                    "REdFX1RZUEVfSUNFECASFQoRQkFER0VfVFlQRV9EUkFHT04QIRITCg9CQURH",
-                    "RV9UWVBFX0RBUksQIhIUChBCQURHRV9UWVBFX0ZBSVJZECMSFwoTQkFER0Vf",
-                    "U01BTExfUkFUVEFUQRAkEhEKDUJBREdFX1BJS0FDSFUQJSqUAQoTSG9sb0lh",
-                    "cEl0ZW1DYXRlZ29yeRIVChFJQVBfQ0FURUdPUllfTk9ORRAAEhcKE0lBUF9D",
-                    "QVRFR09SWV9CVU5ETEUQARIWChJJQVBfQ0FURUdPUllfSVRFTVMQAhIZChVJ",
-                    "QVBfQ0FURUdPUllfVVBHUkFERVMQAxIaChZJQVBfQ0FURUdPUllfUE9LRUNP",
-                    "SU5TEAQqlgEKE0NhbWVyYUludGVycG9sYXRpb24SEgoOQ0FNX0lOVEVSUF9D",
-                    "VVQQABIVChFDQU1fSU5URVJQX0xJTkVBUhABEhUKEUNBTV9JTlRFUlBfU01P",
-                    "T1RIEAISJQohQ0FNX0lOVEVSUF9TTU9PVEhfUk9UX0xJTkVBUl9NT1ZFEAMS",
-                    "FgoSQ0FNX0lOVEVSUF9ERVBFTkRTEAQq/AMKDENhbWVyYVRhcmdldBIXChND",
-                    "QU1fVEFSR0VUX0FUVEFDS0VSEAASHAoYQ0FNX1RBUkdFVF9BVFRBQ0tFUl9F",
-                    "REdFEAESHgoaQ0FNX1RBUkdFVF9BVFRBQ0tFUl9HUk9VTkQQAhIXChNDQU1f",
-                    "VEFSR0VUX0RFRkVOREVSEAMSHAoYQ0FNX1RBUkdFVF9ERUZFTkRFUl9FREdF",
-                    "EAQSHgoaQ0FNX1RBUkdFVF9ERUZFTkRFUl9HUk9VTkQQBRIgChxDQU1fVEFS",
-                    "R0VUX0FUVEFDS0VSX0RFRkVOREVSEAYSJQohQ0FNX1RBUkdFVF9BVFRBQ0tF",
-                    "Ul9ERUZFTkRFUl9FREdFEAcSIAocQ0FNX1RBUkdFVF9ERUZFTkRFUl9BVFRB",
-                    "Q0tFUhAIEiUKIUNBTV9UQVJHRVRfREVGRU5ERVJfQVRUQUNLRVJfRURHRRAJ",
-                    "EicKI0NBTV9UQVJHRVRfQVRUQUNLRVJfREVGRU5ERVJfTUlSUk9SEAsSKQol",
-                    "Q0FNX1RBUkdFVF9TSE9VTERFUl9BVFRBQ0tFUl9ERUZFTkRFUhAMEjAKLENB",
-                    "TV9UQVJHRVRfU0hPVUxERVJfQVRUQUNLRVJfREVGRU5ERVJfTUlSUk9SEA0S",
-                    "JgoiQ0FNX1RBUkdFVF9BVFRBQ0tFUl9ERUZFTkRFUl9XT1JMRBAOKtoDCgtQ",
-                    "b2tlbW9uVHlwZRIVChFQT0tFTU9OX1RZUEVfTk9ORRAAEhcKE1BPS0VNT05f",
-                    "VFlQRV9OT1JNQUwQARIZChVQT0tFTU9OX1RZUEVfRklHSFRJTkcQAhIXChNQ",
-                    "T0tFTU9OX1RZUEVfRkxZSU5HEAMSFwoTUE9LRU1PTl9UWVBFX1BPSVNPThAE",
-                    "EhcKE1BPS0VNT05fVFlQRV9HUk9VTkQQBRIVChFQT0tFTU9OX1RZUEVfUk9D",
-                    "SxAGEhQKEFBPS0VNT05fVFlQRV9CVUcQBxIWChJQT0tFTU9OX1RZUEVfR0hP",
-                    "U1QQCBIWChJQT0tFTU9OX1RZUEVfU1RFRUwQCRIVChFQT0tFTU9OX1RZUEVf",
-                    "RklSRRAKEhYKElBPS0VNT05fVFlQRV9XQVRFUhALEhYKElBPS0VNT05fVFlQ",
-                    "RV9HUkFTUxAMEhkKFVBPS0VNT05fVFlQRV9FTEVDVFJJQxANEhgKFFBPS0VN",
-                    "T05fVFlQRV9QU1lDSElDEA4SFAoQUE9LRU1PTl9UWVBFX0lDRRAPEhcKE1BP",
-                    "S0VNT05fVFlQRV9EUkFHT04QEBIVChFQT0tFTU9OX1RZUEVfREFSSxAREhYK",
-                    "ElBPS0VNT05fVFlQRV9GQUlSWRASKq0BChNQb2tlbW9uTW92ZW1lbnRUeXBl",
-                    "EhMKD01PVkVNRU5UX1NUQVRJQxAAEhEKDU1PVkVNRU5UX0pVTVAQARIVChFN",
-                    "T1ZFTUVOVF9WRVJUSUNBTBACEhQKEE1PVkVNRU5UX1BTWUNISUMQAxIVChFN",
-                    "T1ZFTUVOVF9FTEVDVFJJQxAEEhMKD01PVkVNRU5UX0ZMWUlORxAFEhUKEU1P",
-                    "VkVNRU5UX0hPVkVSSU5HEAYqNQoMUG9rZW1vbkNsYXNzEgoKBk5PUk1BTBAA",
-                    "Eg0KCUxFR0VOREFSWRABEgoKBk1ZVEhJQxACYgZwcm90bzM="));
-            descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-                new pbr::FileDescriptor[] {},
-                new pbr::GeneratedClrTypeInfo(
-                    new[]
-                    {
-                        typeof(global::AllEnum.RpcDirection), typeof(global::AllEnum.TeamColor),
-                        typeof(global::AllEnum.RequestMethod), typeof(global::AllEnum.PokemonMove),
-                        typeof(global::AllEnum.ItemId), typeof(global::AllEnum.InventoryUpgradeType),
-                        typeof(global::AllEnum.EggIncubatorType), typeof(global::AllEnum.PokemonFamilyId),
-                        typeof(global::AllEnum.MapObjectsStatus), typeof(global::AllEnum.FortType),
-                        typeof(global::AllEnum.PokemonId), typeof(global::AllEnum.FortSponsor),
-                        typeof(global::AllEnum.FortRenderingType), typeof(global::AllEnum.ItemType),
-                        typeof(global::AllEnum.ItemCategory), typeof(global::AllEnum.ItemEffect),
-                        typeof(global::AllEnum.ActivityType), typeof(global::AllEnum.BadgeType),
-                        typeof(global::AllEnum.HoloIapItemCategory), typeof(global::AllEnum.CameraInterpolation),
-                        typeof(global::AllEnum.CameraTarget), typeof(global::AllEnum.PokemonType),
-                        typeof(global::AllEnum.PokemonMovementType), typeof(global::AllEnum.PokemonClass),
-                    }, null));
-        }
-
-        #endregion
-    }
-
-    #region Enums
-
-    public enum RpcDirection
-    {
-        [pbr::OriginalName("UNKNOWN")] Unknown = 0,
-        [pbr::OriginalName("RESPONSE")] Response = 1,
-        [pbr::OriginalName("REQUEST")] Request = 2,
-    }
-
-    public enum TeamColor
-    {
-        [pbr::OriginalName("NEUTRAL")] Neutral = 0,
-        [pbr::OriginalName("BLUE")] Blue = 1,
-        [pbr::OriginalName("RED")] Red = 2,
-        [pbr::OriginalName("YELLOW")] Yellow = 3,
-    }
-
-    public enum RequestMethod
-    {
-        [pbr::OriginalName("METHOD_UNSET")] MethodUnset = 0,
-        [pbr::OriginalName("PLAYER_UPDATE")] PlayerUpdate = 1,
-        [pbr::OriginalName("GET_PLAYER")] GetPlayer = 2,
-        [pbr::OriginalName("GET_INVENTORY")] GetInventory = 4,
-        [pbr::OriginalName("DOWNLOAD_SETTINGS")] DownloadSettings = 5,
-        [pbr::OriginalName("DOWNLOAD_ITEM_TEMPLATES")] DownloadItemTemplates = 6,
-        [pbr::OriginalName("DOWNLOAD_REMOTE_CONFIG_VERSION")] DownloadRemoteConfigVersion = 7,
-        [pbr::OriginalName("FORT_SEARCH")] FortSearch = 101,
-        [pbr::OriginalName("ENCOUNTER")] Encounter = 102,
-        [pbr::OriginalName("CATCH_POKEMON")] CatchPokemon = 103,
-        [pbr::OriginalName("FORT_DETAILS")] FortDetails = 104,
-        [pbr::OriginalName("ITEM_USE")] ItemUse = 105,
-        [pbr::OriginalName("GET_MAP_OBJECTS")] GetMapObjects = 106,
-        [pbr::OriginalName("FORT_DEPLOY_POKEMON")] FortDeployPokemon = 110,
-        [pbr::OriginalName("FORT_RECALL_POKEMON")] FortRecallPokemon = 111,
-        [pbr::OriginalName("RELEASE_POKEMON")] ReleasePokemon = 112,
-        [pbr::OriginalName("USE_ITEM_POTION")] UseItemPotion = 113,
-        [pbr::OriginalName("USE_ITEM_CAPTURE")] UseItemCapture = 114,
-        [pbr::OriginalName("USE_ITEM_FLEE")] UseItemFlee = 115,
-        [pbr::OriginalName("USE_ITEM_REVIVE")] UseItemRevive = 116,
-        [pbr::OriginalName("TRADE_SEARCH")] TradeSearch = 117,
-        [pbr::OriginalName("TRADE_OFFER")] TradeOffer = 118,
-        [pbr::OriginalName("TRADE_RESPONSE")] TradeResponse = 119,
-        [pbr::OriginalName("TRADE_RESULT")] TradeResult = 120,
-        [pbr::OriginalName("GET_PLAYER_PROFILE")] GetPlayerProfile = 121,
-        [pbr::OriginalName("GET_ITEM_PACK")] GetItemPack = 122,
-        [pbr::OriginalName("BUY_ITEM_PACK")] BuyItemPack = 123,
-        [pbr::OriginalName("BUY_GEM_PACK")] BuyGemPack = 124,
-        [pbr::OriginalName("EVOLVE_POKEMON")] EvolvePokemon = 125,
-        [pbr::OriginalName("GET_HATCHED_EGGS")] GetHatchedEggs = 126,
-        [pbr::OriginalName("ENCOUNTER_TUTORIAL_COMPLETE")] EncounterTutorialComplete = 127,
-        [pbr::OriginalName("LEVEL_UP_REWARDS")] LevelUpRewards = 128,
-        [pbr::OriginalName("CHECK_AWARDED_BADGES")] CheckAwardedBadges = 129,
-        [pbr::OriginalName("USE_ITEM_GYM")] UseItemGym = 133,
-        [pbr::OriginalName("GET_GYM_DETAILS")] GetGymDetails = 134,
-        [pbr::OriginalName("START_GYM_BATTLE")] StartGymBattle = 135,
-        [pbr::OriginalName("ATTACK_GYM")] AttackGym = 136,
-        [pbr::OriginalName("RECYCLE_INVENTORY_ITEM")] RecycleInventoryItem = 137,
-        [pbr::OriginalName("COLLECT_DAILY_BONUS")] CollectDailyBonus = 138,
-        [pbr::OriginalName("USE_ITEM_XP_BOOST")] UseItemXpBoost = 139,
-        [pbr::OriginalName("USE_ITEM_EGG_INCUBATOR")] UseItemEggIncubator = 140,
-        [pbr::OriginalName("USE_INCENSE")] UseIncense = 141,
-        [pbr::OriginalName("GET_INCENSE_POKEMON")] GetIncensePokemon = 142,
-        [pbr::OriginalName("INCENSE_ENCOUNTER")] IncenseEncounter = 143,
-        [pbr::OriginalName("ADD_FORT_MODIFIER")] AddFortModifier = 144,
-        [pbr::OriginalName("DISK_ENCOUNTER")] DiskEncounter = 145,
-        [pbr::OriginalName("COLLECT_DAILY_DEFENDER_BONUS")] CollectDailyDefenderBonus = 146,
-        [pbr::OriginalName("UPGRADE_POKEMON")] UpgradePokemon = 147,
-        [pbr::OriginalName("SET_FAVORITE_POKEMON")] SetFavoritePokemon = 148,
-        [pbr::OriginalName("NICKNAME_POKEMON")] NicknamePokemon = 149,
-        [pbr::OriginalName("EQUIP_BADGE")] EquipBadge = 150,
-        [pbr::OriginalName("SET_CONTACT_SETTINGS")] SetContactSettings = 151,
-        [pbr::OriginalName("GET_ASSET_DIGEST")] GetAssetDigest = 300,
-        [pbr::OriginalName("GET_DOWNLOAD_URLS")] GetDownloadUrls = 301,
-        [pbr::OriginalName("GET_SUGGESTED_CODENAMES")] GetSuggestedCodenames = 401,
-        [pbr::OriginalName("CHECK_CODENAME_AVAILABLE")] CheckCodenameAvailable = 402,
-        [pbr::OriginalName("CLAIM_CODENAME")] ClaimCodename = 403,
-        [pbr::OriginalName("SET_AVATAR")] SetAvatar = 404,
-        [pbr::OriginalName("SET_PLAYER_TEAM")] SetPlayerTeam = 405,
-        [pbr::OriginalName("MARK_TUTORIAL_COMPLETE")] MarkTutorialComplete = 406,
-        [pbr::OriginalName("LOAD_SPAWN_POINTS")] LoadSpawnPoints = 500,
-        [pbr::OriginalName("ECHO")] Echo = 666,
-        [pbr::OriginalName("DEBUG_UPDATE_INVENTORY")] DebugUpdateInventory = 700,
-        [pbr::OriginalName("DEBUG_DELETE_PLAYER")] DebugDeletePlayer = 701,
-        [pbr::OriginalName("SFIDA_REGISTRATION")] SfidaRegistration = 800,
-        [pbr::OriginalName("SFIDA_ACTION_LOG")] SfidaActionLog = 801,
-        [pbr::OriginalName("SFIDA_CERTIFICATION")] SfidaCertification = 802,
-        [pbr::OriginalName("SFIDA_UPDATE")] SfidaUpdate = 803,
-        [pbr::OriginalName("SFIDA_ACTION")] SfidaAction = 804,
-        [pbr::OriginalName("SFIDA_DOWSER")] SfidaDowser = 805,
-        [pbr::OriginalName("SFIDA_CAPTURE")] SfidaCapture = 806,
-    }
-
-    public enum PokemonMove
-    {
-        [pbr::OriginalName("MOVE_UNSET")] MoveUnset = 0,
-        [pbr::OriginalName("THUNDER_SHOCK")] ThunderShock = 1,
-        [pbr::OriginalName("QUICK_ATTACK")] QuickAttack = 2,
-        [pbr::OriginalName("SCRATCH")] Scratch = 3,
-        [pbr::OriginalName("EMBER")] Ember = 4,
-        [pbr::OriginalName("VINE_WHIP")] VineWhip = 5,
-        [pbr::OriginalName("TACKLE")] Tackle = 6,
-        [pbr::OriginalName("RAZOR_LEAF")] RazorLeaf = 7,
-        [pbr::OriginalName("TAKE_DOWN")] TakeDown = 8,
-        [pbr::OriginalName("WATER_GUN")] WaterGun = 9,
-        [pbr::OriginalName("BITE")] Bite = 10,
-        [pbr::OriginalName("POUND")] Pound = 11,
-        [pbr::OriginalName("DOUBLE_SLAP")] DoubleSlap = 12,
-        [pbr::OriginalName("WRAP")] Wrap = 13,
-        [pbr::OriginalName("HYPER_BEAM")] HyperBeam = 14,
-        [pbr::OriginalName("LICK")] Lick = 15,
-        [pbr::OriginalName("DARK_PULSE")] DarkPulse = 16,
-        [pbr::OriginalName("SMOG")] Smog = 17,
-        [pbr::OriginalName("SLUDGE")] Sludge = 18,
-        [pbr::OriginalName("METAL_CLAW")] MetalClaw = 19,
-        [pbr::OriginalName("VICE_GRIP")] ViceGrip = 20,
-        [pbr::OriginalName("FLAME_WHEEL")] FlameWheel = 21,
-        [pbr::OriginalName("MEGAHORN")] Megahorn = 22,
-        [pbr::OriginalName("WING_ATTACK")] WingAttack = 23,
-        [pbr::OriginalName("FLAMETHROWER")] Flamethrower = 24,
-        [pbr::OriginalName("SUCKER_PUNCH")] SuckerPunch = 25,
-        [pbr::OriginalName("DIG")] Dig = 26,
-        [pbr::OriginalName("LOW_KICK")] LowKick = 27,
-        [pbr::OriginalName("CROSS_CHOP")] CrossChop = 28,
-        [pbr::OriginalName("PSYCHO_CUT")] PsychoCut = 29,
-        [pbr::OriginalName("PSYBEAM")] Psybeam = 30,
-        [pbr::OriginalName("EARTHQUAKE")] Earthquake = 31,
-        [pbr::OriginalName("STONE_EDGE")] StoneEdge = 32,
-        [pbr::OriginalName("ICE_PUNCH")] IcePunch = 33,
-        [pbr::OriginalName("HEART_STAMP")] HeartStamp = 34,
-        [pbr::OriginalName("DISCHARGE")] Discharge = 35,
-        [pbr::OriginalName("FLASH_CANNON")] FlashCannon = 36,
-        [pbr::OriginalName("PECK")] Peck = 37,
-        [pbr::OriginalName("DRILL_PECK")] DrillPeck = 38,
-        [pbr::OriginalName("ICE_BEAM")] IceBeam = 39,
-        [pbr::OriginalName("BLIZZARD")] Blizzard = 40,
-        [pbr::OriginalName("AIR_SLASH")] AirSlash = 41,
-        [pbr::OriginalName("HEAT_WAVE")] HeatWave = 42,
-        [pbr::OriginalName("TWINEEDLE")] Twineedle = 43,
-        [pbr::OriginalName("POISON_JAB")] PoisonJab = 44,
-        [pbr::OriginalName("AERIAL_ACE")] AerialAce = 45,
-        [pbr::OriginalName("DRILL_RUN")] DrillRun = 46,
-        [pbr::OriginalName("PETAL_BLIZZARD")] PetalBlizzard = 47,
-        [pbr::OriginalName("MEGA_DRAIN")] MegaDrain = 48,
-        [pbr::OriginalName("BUG_BUZZ")] BugBuzz = 49,
-        [pbr::OriginalName("POISON_FANG")] PoisonFang = 50,
-        [pbr::OriginalName("NIGHT_SLASH")] NightSlash = 51,
-        [pbr::OriginalName("SLASH")] Slash = 52,
-        [pbr::OriginalName("BUBBLE_BEAM")] BubbleBeam = 53,
-        [pbr::OriginalName("SUBMISSION")] Submission = 54,
-        [pbr::OriginalName("KARATE_CHOP")] KarateChop = 55,
-        [pbr::OriginalName("LOW_SWEEP")] LowSweep = 56,
-        [pbr::OriginalName("AQUA_JET")] AquaJet = 57,
-        [pbr::OriginalName("AQUA_TAIL")] AquaTail = 58,
-        [pbr::OriginalName("SEED_BOMB")] SeedBomb = 59,
-        [pbr::OriginalName("PSYSHOCK")] Psyshock = 60,
-        [pbr::OriginalName("ROCK_THROW")] RockThrow = 61,
-        [pbr::OriginalName("ANCIENT_POWER")] AncientPower = 62,
-        [pbr::OriginalName("ROCK_TOMB")] RockTomb = 63,
-        [pbr::OriginalName("ROCK_SLIDE")] RockSlide = 64,
-        [pbr::OriginalName("POWER_GEM")] PowerGem = 65,
-        [pbr::OriginalName("SHADOW_SNEAK")] ShadowSneak = 66,
-        [pbr::OriginalName("SHADOW_PUNCH")] ShadowPunch = 67,
-        [pbr::OriginalName("SHADOW_CLAW")] ShadowClaw = 68,
-        [pbr::OriginalName("OMINOUS_WIND")] OminousWind = 69,
-        [pbr::OriginalName("SHADOW_BALL")] ShadowBall = 70,
-        [pbr::OriginalName("BULLET_PUNCH")] BulletPunch = 71,
-        [pbr::OriginalName("MAGNET_BOMB")] MagnetBomb = 72,
-        [pbr::OriginalName("STEEL_WING")] SteelWing = 73,
-        [pbr::OriginalName("IRON_HEAD")] IronHead = 74,
-        [pbr::OriginalName("PARABOLIC_CHARGE")] ParabolicCharge = 75,
-        [pbr::OriginalName("SPARK")] Spark = 76,
-        [pbr::OriginalName("THUNDER_PUNCH")] ThunderPunch = 77,
-        [pbr::OriginalName("THUNDER")] Thunder = 78,
-        [pbr::OriginalName("THUNDERBOLT")] Thunderbolt = 79,
-        [pbr::OriginalName("TWISTER")] Twister = 80,
-        [pbr::OriginalName("DRAGON_BREATH")] DragonBreath = 81,
-        [pbr::OriginalName("DRAGON_PULSE")] DragonPulse = 82,
-        [pbr::OriginalName("DRAGON_CLAW")] DragonClaw = 83,
-        [pbr::OriginalName("DISARMING_VOICE")] DisarmingVoice = 84,
-        [pbr::OriginalName("DRAINING_KISS")] DrainingKiss = 85,
-        [pbr::OriginalName("DAZZLING_GLEAM")] DazzlingGleam = 86,
-        [pbr::OriginalName("MOONBLAST")] Moonblast = 87,
-        [pbr::OriginalName("PLAY_ROUGH")] PlayRough = 88,
-        [pbr::OriginalName("CROSS_POISON")] CrossPoison = 89,
-        [pbr::OriginalName("SLUDGE_BOMB")] SludgeBomb = 90,
-        [pbr::OriginalName("SLUDGE_WAVE")] SludgeWave = 91,
-        [pbr::OriginalName("GUNK_SHOT")] GunkShot = 92,
-        [pbr::OriginalName("MUD_SHOT")] MudShot = 93,
-        [pbr::OriginalName("BONE_CLUB")] BoneClub = 94,
-        [pbr::OriginalName("BULLDOZE")] Bulldoze = 95,
-        [pbr::OriginalName("MUD_BOMB")] MudBomb = 96,
-        [pbr::OriginalName("FURY_CUTTER")] FuryCutter = 97,
-        [pbr::OriginalName("BUG_BITE")] BugBite = 98,
-        [pbr::OriginalName("SIGNAL_BEAM")] SignalBeam = 99,
-        [pbr::OriginalName("X_SCISSOR")] XScissor = 100,
-        [pbr::OriginalName("FLAME_CHARGE")] FlameCharge = 101,
-        [pbr::OriginalName("FLAME_BURST")] FlameBurst = 102,
-        [pbr::OriginalName("FIRE_BLAST")] FireBlast = 103,
-        [pbr::OriginalName("BRINE")] Brine = 104,
-        [pbr::OriginalName("WATER_PULSE")] WaterPulse = 105,
-        [pbr::OriginalName("SCALD")] Scald = 106,
-        [pbr::OriginalName("HYDRO_PUMP")] HydroPump = 107,
-        [pbr::OriginalName("PSYCHIC")] Psychic = 108,
-        [pbr::OriginalName("PSYSTRIKE")] Psystrike = 109,
-        [pbr::OriginalName("ICE_SHARD")] IceShard = 110,
-        [pbr::OriginalName("ICY_WIND")] IcyWind = 111,
-        [pbr::OriginalName("FROST_BREATH")] FrostBreath = 112,
-        [pbr::OriginalName("ABSORB")] Absorb = 113,
-        [pbr::OriginalName("GIGA_DRAIN")] GigaDrain = 114,
-        [pbr::OriginalName("FIRE_PUNCH")] FirePunch = 115,
-        [pbr::OriginalName("SOLAR_BEAM")] SolarBeam = 116,
-        [pbr::OriginalName("LEAF_BLADE")] LeafBlade = 117,
-        [pbr::OriginalName("POWER_WHIP")] PowerWhip = 118,
-        [pbr::OriginalName("SPLASH")] Splash = 119,
-        [pbr::OriginalName("ACID")] Acid = 120,
-        [pbr::OriginalName("AIR_CUTTER")] AirCutter = 121,
-        [pbr::OriginalName("HURRICANE")] Hurricane = 122,
-        [pbr::OriginalName("BRICK_BREAK")] BrickBreak = 123,
-        [pbr::OriginalName("CUT")] Cut = 124,
-        [pbr::OriginalName("SWIFT")] Swift = 125,
-        [pbr::OriginalName("HORN_ATTACK")] HornAttack = 126,
-        [pbr::OriginalName("STOMP")] Stomp = 127,
-        [pbr::OriginalName("HEADBUTT")] Headbutt = 128,
-        [pbr::OriginalName("HYPER_FANG")] HyperFang = 129,
-        [pbr::OriginalName("SLAM")] Slam = 130,
-        [pbr::OriginalName("BODY_SLAM")] BodySlam = 131,
-        [pbr::OriginalName("REST")] Rest = 132,
-        [pbr::OriginalName("STRUGGLE")] Struggle = 133,
-        [pbr::OriginalName("SCALD_BLASTOISE")] ScaldBlastoise = 134,
-        [pbr::OriginalName("HYDRO_PUMP_BLASTOISE")] HydroPumpBlastoise = 135,
-        [pbr::OriginalName("WRAP_GREEN")] WrapGreen = 136,
-        [pbr::OriginalName("WRAP_PINK")] WrapPink = 137,
-        [pbr::OriginalName("FURY_CUTTER_FAST")] FuryCutterFast = 200,
-        [pbr::OriginalName("BUG_BITE_FAST")] BugBiteFast = 201,
-        [pbr::OriginalName("BITE_FAST")] BiteFast = 202,
-        [pbr::OriginalName("SUCKER_PUNCH_FAST")] SuckerPunchFast = 203,
-        [pbr::OriginalName("DRAGON_BREATH_FAST")] DragonBreathFast = 204,
-        [pbr::OriginalName("THUNDER_SHOCK_FAST")] ThunderShockFast = 205,
-        [pbr::OriginalName("SPARK_FAST")] SparkFast = 206,
-        [pbr::OriginalName("LOW_KICK_FAST")] LowKickFast = 207,
-        [pbr::OriginalName("KARATE_CHOP_FAST")] KarateChopFast = 208,
-        [pbr::OriginalName("EMBER_FAST")] EmberFast = 209,
-        [pbr::OriginalName("WING_ATTACK_FAST")] WingAttackFast = 210,
-        [pbr::OriginalName("PECK_FAST")] PeckFast = 211,
-        [pbr::OriginalName("LICK_FAST")] LickFast = 212,
-        [pbr::OriginalName("SHADOW_CLAW_FAST")] ShadowClawFast = 213,
-        [pbr::OriginalName("VINE_WHIP_FAST")] VineWhipFast = 214,
-        [pbr::OriginalName("RAZOR_LEAF_FAST")] RazorLeafFast = 215,
-        [pbr::OriginalName("MUD_SHOT_FAST")] MudShotFast = 216,
-        [pbr::OriginalName("ICE_SHARD_FAST")] IceShardFast = 217,
-        [pbr::OriginalName("FROST_BREATH_FAST")] FrostBreathFast = 218,
-        [pbr::OriginalName("QUICK_ATTACK_FAST")] QuickAttackFast = 219,
-        [pbr::OriginalName("SCRATCH_FAST")] ScratchFast = 220,
-        [pbr::OriginalName("TACKLE_FAST")] TackleFast = 221,
-        [pbr::OriginalName("POUND_FAST")] PoundFast = 222,
-        [pbr::OriginalName("CUT_FAST")] CutFast = 223,
-        [pbr::OriginalName("POISON_JAB_FAST")] PoisonJabFast = 224,
-        [pbr::OriginalName("ACID_FAST")] AcidFast = 225,
-        [pbr::OriginalName("PSYCHO_CUT_FAST")] PsychoCutFast = 226,
-        [pbr::OriginalName("ROCK_THROW_FAST")] RockThrowFast = 227,
-        [pbr::OriginalName("METAL_CLAW_FAST")] MetalClawFast = 228,
-        [pbr::OriginalName("BULLET_PUNCH_FAST")] BulletPunchFast = 229,
-        [pbr::OriginalName("WATER_GUN_FAST")] WaterGunFast = 230,
-        [pbr::OriginalName("SPLASH_FAST")] SplashFast = 231,
-        [pbr::OriginalName("WATER_GUN_FAST_BLASTOISE")] WaterGunFastBlastoise = 232,
-        [pbr::OriginalName("MUD_SLAP_FAST")] MudSlapFast = 233,
-        [pbr::OriginalName("ZEN_HEADBUTT_FAST")] ZenHeadbuttFast = 234,
-        [pbr::OriginalName("CONFUSION_FAST")] ConfusionFast = 235,
-        [pbr::OriginalName("POISON_STING_FAST")] PoisonStingFast = 236,
-        [pbr::OriginalName("BUBBLE_FAST")] BubbleFast = 237,
-        [pbr::OriginalName("FEINT_ATTACK_FAST")] FeintAttackFast = 238,
-        [pbr::OriginalName("STEEL_WING_FAST")] SteelWingFast = 239,
-        [pbr::OriginalName("FIRE_FANG_FAST")] FireFangFast = 240,
-        [pbr::OriginalName("ROCK_SMASH_FAST")] RockSmashFast = 241,
-    }
-
-    public enum ItemId
-    {
-        [pbr::OriginalName("ITEM_UNKNOWN")] ItemUnknown = 0,
-        [pbr::OriginalName("ITEM_POKE_BALL")] ItemPokeBall = 1,
-        [pbr::OriginalName("ITEM_GREAT_BALL")] ItemGreatBall = 2,
-        [pbr::OriginalName("ITEM_ULTRA_BALL")] ItemUltraBall = 3,
-        [pbr::OriginalName("ITEM_MASTER_BALL")] ItemMasterBall = 4,
-        [pbr::OriginalName("ITEM_POTION")] ItemPotion = 101,
-        [pbr::OriginalName("ITEM_SUPER_POTION")] ItemSuperPotion = 102,
-        [pbr::OriginalName("ITEM_HYPER_POTION")] ItemHyperPotion = 103,
-        [pbr::OriginalName("ITEM_MAX_POTION")] ItemMaxPotion = 104,
-        [pbr::OriginalName("ITEM_REVIVE")] ItemRevive = 201,
-        [pbr::OriginalName("ITEM_MAX_REVIVE")] ItemMaxRevive = 202,
-        [pbr::OriginalName("ITEM_LUCKY_EGG")] ItemLuckyEgg = 301,
-        [pbr::OriginalName("ITEM_INCENSE_ORDINARY")] ItemIncenseOrdinary = 401,
-        [pbr::OriginalName("ITEM_INCENSE_SPICY")] ItemIncenseSpicy = 402,
-        [pbr::OriginalName("ITEM_INCENSE_COOL")] ItemIncenseCool = 403,
-        [pbr::OriginalName("ITEM_INCENSE_FLORAL")] ItemIncenseFloral = 404,
-        [pbr::OriginalName("ITEM_TROY_DISK")] ItemTroyDisk = 501,
-        [pbr::OriginalName("ITEM_X_ATTACK")] ItemXAttack = 602,
-        [pbr::OriginalName("ITEM_X_DEFENSE")] ItemXDefense = 603,
-        [pbr::OriginalName("ITEM_X_MIRACLE")] ItemXMiracle = 604,
-        [pbr::OriginalName("ITEM_RAZZ_BERRY")] ItemRazzBerry = 701,
-        [pbr::OriginalName("ITEM_BLUK_BERRY")] ItemBlukBerry = 702,
-        [pbr::OriginalName("ITEM_NANAB_BERRY")] ItemNanabBerry = 703,
-        [pbr::OriginalName("ITEM_WEPAR_BERRY")] ItemWeparBerry = 704,
-        [pbr::OriginalName("ITEM_PINAP_BERRY")] ItemPinapBerry = 705,
-        [pbr::OriginalName("ITEM_SPECIAL_CAMERA")] ItemSpecialCamera = 801,
-        [pbr::OriginalName("ITEM_INCUBATOR_BASIC_UNLIMITED")] ItemIncubatorBasicUnlimited = 901,
-        [pbr::OriginalName("ITEM_INCUBATOR_BASIC")] ItemIncubatorBasic = 902,
-        [pbr::OriginalName("ITEM_POKEMON_STORAGE_UPGRADE")] ItemPokemonStorageUpgrade = 1001,
-        [pbr::OriginalName("ITEM_ITEM_STORAGE_UPGRADE")] ItemItemStorageUpgrade = 1002,
-    }
-
-    public enum InventoryUpgradeType
-    {
-        [pbr::OriginalName("UPGRADE_UNSET")] UpgradeUnset = 0,
-        [pbr::OriginalName("INCREASE_ITEM_STORAGE")] IncreaseItemStorage = 1,
-        [pbr::OriginalName("INCREASE_POKEMON_STORAGE")] IncreasePokemonStorage = 2,
-    }
-
-    public enum EggIncubatorType
-    {
-        [pbr::OriginalName("INCUBATOR_UNSET")] IncubatorUnset = 0,
-        [pbr::OriginalName("INCUBATOR_DISTANCE")] IncubatorDistance = 1,
-    }
-
-    public enum PokemonFamilyId
-    {
-        [pbr::OriginalName("FAMILY_UNSET")] FamilyUnset = 0,
-        [pbr::OriginalName("FAMILY_BULBASAUR")] FamilyBulbasaur = 1,
-        [pbr::OriginalName("FAMILY_CHARMANDER")] FamilyCharmander = 4,
-        [pbr::OriginalName("FAMILY_SQUIRTLE")] FamilySquirtle = 7,
-        [pbr::OriginalName("FAMILY_CATERPIE")] FamilyCaterpie = 10,
-        [pbr::OriginalName("FAMILY_WEEDLE")] FamilyWeedle = 13,
-        [pbr::OriginalName("FAMILY_PIDGEY")] FamilyPidgey = 16,
-        [pbr::OriginalName("FAMILY_RATTATA")] FamilyRattata = 19,
-        [pbr::OriginalName("FAMILY_SPEAROW")] FamilySpearow = 21,
-        [pbr::OriginalName("FAMILY_EKANS")] FamilyEkans = 23,
-        [pbr::OriginalName("FAMILY_PIKACHU")] FamilyPikachu = 25,
-        [pbr::OriginalName("FAMILY_SANDSHREW")] FamilySandshrew = 27,
-        [pbr::OriginalName("FAMILY_NIDORAN")] FamilyNidoran = 29,
-        [pbr::OriginalName("FAMILY_NIDORAN2")] FamilyNidoran2 = 32,
-        [pbr::OriginalName("FAMILY_CLEFAIRY")] FamilyClefairy = 35,
-        [pbr::OriginalName("FAMILY_VULPIX")] FamilyVulpix = 37,
-        [pbr::OriginalName("FAMILY_JIGGLYPUFF")] FamilyJigglypuff = 39,
-        [pbr::OriginalName("FAMILY_ZUBAT")] FamilyZubat = 41,
-        [pbr::OriginalName("FAMILY_ODDISH")] FamilyOddish = 43,
-        [pbr::OriginalName("FAMILY_PARAS")] FamilyParas = 46,
-        [pbr::OriginalName("FAMILY_VENONAT")] FamilyVenonat = 48,
-        [pbr::OriginalName("FAMILY_DIGLETT")] FamilyDiglett = 50,
-        [pbr::OriginalName("FAMILY_MEOWTH")] FamilyMeowth = 52,
-        [pbr::OriginalName("FAMILY_PSYDUCK")] FamilyPsyduck = 54,
-        [pbr::OriginalName("FAMILY_MANKEY")] FamilyMankey = 56,
-        [pbr::OriginalName("FAMILY_GROWLITHE")] FamilyGrowlithe = 58,
-        [pbr::OriginalName("FAMILY_POLIWAG")] FamilyPoliwag = 60,
-        [pbr::OriginalName("FAMILY_ABRA")] FamilyAbra = 63,
-        [pbr::OriginalName("FAMILY_MACHOP")] FamilyMachop = 66,
-        [pbr::OriginalName("FAMILY_BELLSPROUT")] FamilyBellsprout = 69,
-        [pbr::OriginalName("FAMILY_TENTACOOL")] FamilyTentacool = 72,
-        [pbr::OriginalName("FAMILY_GEODUDE")] FamilyGeodude = 74,
-        [pbr::OriginalName("FAMILY_PONYTA")] FamilyPonyta = 77,
-        [pbr::OriginalName("FAMILY_SLOWPOKE")] FamilySlowpoke = 79,
-        [pbr::OriginalName("FAMILY_MAGNEMITE")] FamilyMagnemite = 81,
-        [pbr::OriginalName("FAMILY_FARFETCHD")] FamilyFarfetchd = 83,
-        [pbr::OriginalName("FAMILY_DODUO")] FamilyDoduo = 84,
-        [pbr::OriginalName("FAMILY_SEEL")] FamilySeel = 86,
-        [pbr::OriginalName("FAMILY_GRIMER")] FamilyGrimer = 88,
-        [pbr::OriginalName("FAMILY_SHELLDER")] FamilyShellder = 90,
-        [pbr::OriginalName("FAMILY_GASTLY")] FamilyGastly = 92,
-        [pbr::OriginalName("FAMILY_ONIX")] FamilyOnix = 95,
-        [pbr::OriginalName("FAMILY_DROWZEE")] FamilyDrowzee = 96,
-        [pbr::OriginalName("FAMILY_KRABBY")] FamilyKrabby = 98,
-        [pbr::OriginalName("FAMILY_VOLTORB")] FamilyVoltorb = 100,
-        [pbr::OriginalName("FAMILY_EXEGGCUTE")] FamilyExeggcute = 102,
-        [pbr::OriginalName("FAMILY_CUBONE")] FamilyCubone = 104,
-        [pbr::OriginalName("FAMILY_HITMONLEE")] FamilyHitmonlee = 106,
-        [pbr::OriginalName("FAMILY_HITMONCHAN")] FamilyHitmonchan = 107,
-        [pbr::OriginalName("FAMILY_LICKITUNG")] FamilyLickitung = 108,
-        [pbr::OriginalName("FAMILY_KOFFING")] FamilyKoffing = 109,
-        [pbr::OriginalName("FAMILY_RHYHORN")] FamilyRhyhorn = 111,
-        [pbr::OriginalName("FAMILY_CHANSEY")] FamilyChansey = 113,
-        [pbr::OriginalName("FAMILY_TANGELA")] FamilyTangela = 114,
-        [pbr::OriginalName("FAMILY_KANGASKHAN")] FamilyKangaskhan = 115,
-        [pbr::OriginalName("FAMILY_HORSEA")] FamilyHorsea = 116,
-        [pbr::OriginalName("FAMILY_GOLDEEN")] FamilyGoldeen = 118,
-        [pbr::OriginalName("FAMILY_STARYU")] FamilyStaryu = 120,
-        [pbr::OriginalName("FAMILY_MR_MIME")] FamilyMrMime = 122,
-        [pbr::OriginalName("FAMILY_SCYTHER")] FamilyScyther = 123,
-        [pbr::OriginalName("FAMILY_JYNX")] FamilyJynx = 124,
-        [pbr::OriginalName("FAMILY_ELECTABUZZ")] FamilyElectabuzz = 125,
-        [pbr::OriginalName("FAMILY_MAGMAR")] FamilyMagmar = 126,
-        [pbr::OriginalName("FAMILY_PINSIR")] FamilyPinsir = 127,
-        [pbr::OriginalName("FAMILY_TAUROS")] FamilyTauros = 128,
-        [pbr::OriginalName("FAMILY_MAGIKARP")] FamilyMagikarp = 129,
-        [pbr::OriginalName("FAMILY_LAPRAS")] FamilyLapras = 131,
-        [pbr::OriginalName("FAMILY_DITTO")] FamilyDitto = 132,
-        [pbr::OriginalName("FAMILY_EEVEE")] FamilyEevee = 133,
-        [pbr::OriginalName("FAMILY_PORYGON")] FamilyPorygon = 137,
-        [pbr::OriginalName("FAMILY_OMANYTE")] FamilyOmanyte = 138,
-        [pbr::OriginalName("FAMILY_KABUTO")] FamilyKabuto = 140,
-        [pbr::OriginalName("FAMILY_AERODACTYL")] FamilyAerodactyl = 142,
-        [pbr::OriginalName("FAMILY_SNORLAX")] FamilySnorlax = 143,
-        [pbr::OriginalName("FAMILY_ARTICUNO")] FamilyArticuno = 144,
-        [pbr::OriginalName("FAMILY_ZAPDOS")] FamilyZapdos = 145,
-        [pbr::OriginalName("FAMILY_MOLTRES")] FamilyMoltres = 146,
-        [pbr::OriginalName("FAMILY_DRATINI")] FamilyDratini = 147,
-        [pbr::OriginalName("FAMILY_MEWTWO")] FamilyMewtwo = 150,
-        [pbr::OriginalName("FAMILY_MEW")] FamilyMew = 151,
-    }
-
-    public enum MapObjectsStatus
-    {
-        [pbr::OriginalName("UNSET_STATUS")] UnsetStatus = 0,
-        [pbr::OriginalName("SUCCESS")] Success = 1,
-        [pbr::OriginalName("LOCATION_UNSET")] LocationUnset = 2,
-    }
-
-    public enum FortType
-    {
-        [pbr::OriginalName("GYM")] Gym = 0,
-        [pbr::OriginalName("CHECKPOINT")] Checkpoint = 1,
-    }
-
-    public enum PokemonId
-    {
-        [pbr::OriginalName("MISSINGNO")] Missingno = 0,
-        [pbr::OriginalName("BULBASAUR")] Bulbasaur = 1,
-        [pbr::OriginalName("IVYSAUR")] Ivysaur = 2,
-        [pbr::OriginalName("VENUSAUR")] Venusaur = 3,
-        [pbr::OriginalName("CHARMANDER")] Charmander = 4,
-        [pbr::OriginalName("CHARMELEON")] Charmeleon = 5,
-        [pbr::OriginalName("CHARIZARD")] Charizard = 6,
-        [pbr::OriginalName("SQUIRTLE")] Squirtle = 7,
-        [pbr::OriginalName("WARTORTLE")] Wartortle = 8,
-        [pbr::OriginalName("BLASTOISE")] Blastoise = 9,
-        [pbr::OriginalName("CATERPIE")] Caterpie = 10,
-        [pbr::OriginalName("METAPOD")] Metapod = 11,
-        [pbr::OriginalName("BUTTERFREE")] Butterfree = 12,
-        [pbr::OriginalName("WEEDLE")] Weedle = 13,
-        [pbr::OriginalName("KAKUNA")] Kakuna = 14,
-        [pbr::OriginalName("BEEDRILL")] Beedrill = 15,
-        [pbr::OriginalName("PIDGEY")] Pidgey = 16,
-        [pbr::OriginalName("PIDGEOTTO")] Pidgeotto = 17,
-        [pbr::OriginalName("PIDGEOT")] Pidgeot = 18,
-        [pbr::OriginalName("RATTATA")] Rattata = 19,
-        [pbr::OriginalName("RATICATE")] Raticate = 20,
-        [pbr::OriginalName("SPEAROW")] Spearow = 21,
-        [pbr::OriginalName("FEAROW")] Fearow = 22,
-        [pbr::OriginalName("EKANS")] Ekans = 23,
-        [pbr::OriginalName("ARBOK")] Arbok = 24,
-        [pbr::OriginalName("PIKACHU")] Pikachu = 25,
-        [pbr::OriginalName("RAICHU")] Raichu = 26,
-        [pbr::OriginalName("SANDSHREW")] Sandshrew = 27,
-        [pbr::OriginalName("SANDLASH")] Sandlash = 28,
-        [pbr::OriginalName("NIDORAN_FEMALE")] NidoranFemale = 29,
-        [pbr::OriginalName("NIDORINA")] Nidorina = 30,
-        [pbr::OriginalName("NIDOQUEEN")] Nidoqueen = 31,
-        [pbr::OriginalName("NIDORAN_MALE")] NidoranMale = 32,
-        [pbr::OriginalName("NIDORINO")] Nidorino = 33,
-        [pbr::OriginalName("NIDOKING")] Nidoking = 34,
-        [pbr::OriginalName("CLEFAIRY")] Clefairy = 35,
-        [pbr::OriginalName("CLEFABLE")] Clefable = 36,
-        [pbr::OriginalName("VULPIX")] Vulpix = 37,
-        [pbr::OriginalName("NINETALES")] Ninetales = 38,
-        [pbr::OriginalName("JIGGLYPUFF")] Jigglypuff = 39,
-        [pbr::OriginalName("WIGGLYTUFF")] Wigglytuff = 40,
-        [pbr::OriginalName("ZUBAT")] Zubat = 41,
-        [pbr::OriginalName("GOLBAT")] Golbat = 42,
-        [pbr::OriginalName("ODDISH")] Oddish = 43,
-        [pbr::OriginalName("GLOOM")] Gloom = 44,
-        [pbr::OriginalName("VILEPLUME")] Vileplume = 45,
-        [pbr::OriginalName("PARAS")] Paras = 46,
-        [pbr::OriginalName("PARASECT")] Parasect = 47,
-        [pbr::OriginalName("VENONAT")] Venonat = 48,
-        [pbr::OriginalName("VENOMOTH")] Venomoth = 49,
-        [pbr::OriginalName("DIGLETT")] Diglett = 50,
-        [pbr::OriginalName("DUGTRIO")] Dugtrio = 51,
-        [pbr::OriginalName("MEOWTH")] Meowth = 52,
-        [pbr::OriginalName("PERSIAN")] Persian = 53,
-        [pbr::OriginalName("PSYDUCK")] Psyduck = 54,
-        [pbr::OriginalName("GOLDUCK")] Golduck = 55,
-        [pbr::OriginalName("MANKEY")] Mankey = 56,
-        [pbr::OriginalName("PRIMEAPE")] Primeape = 57,
-        [pbr::OriginalName("GROWLITHE")] Growlithe = 58,
-        [pbr::OriginalName("ARCANINE")] Arcanine = 59,
-        [pbr::OriginalName("POLIWAG")] Poliwag = 60,
-        [pbr::OriginalName("POLIWHIRL")] Poliwhirl = 61,
-        [pbr::OriginalName("POLIWRATH")] Poliwrath = 62,
-        [pbr::OriginalName("ABRA")] Abra = 63,
-        [pbr::OriginalName("KADABRA")] Kadabra = 64,
-        [pbr::OriginalName("ALAKHAZAM")] Alakhazam = 65,
-        [pbr::OriginalName("MACHOP")] Machop = 66,
-        [pbr::OriginalName("MACHOKE")] Machoke = 67,
-        [pbr::OriginalName("MACHAMP")] Machamp = 68,
-        [pbr::OriginalName("BELLSPROUT")] Bellsprout = 69,
-        [pbr::OriginalName("WEEPINBELL")] Weepinbell = 70,
-        [pbr::OriginalName("VICTREEBELL")] Victreebell = 71,
-        [pbr::OriginalName("TENTACOOL")] Tentacool = 72,
-        [pbr::OriginalName("TENTACRUEL")] Tentacruel = 73,
-        [pbr::OriginalName("GEODUDE")] Geodude = 74,
-        [pbr::OriginalName("GRAVELER")] Graveler = 75,
-        [pbr::OriginalName("GOLEM")] Golem = 76,
-        [pbr::OriginalName("PONYTA")] Ponyta = 77,
-        [pbr::OriginalName("RAPIDASH")] Rapidash = 78,
-        [pbr::OriginalName("SLOWPOKE")] Slowpoke = 79,
-        [pbr::OriginalName("SLOWBRO")] Slowbro = 80,
-        [pbr::OriginalName("MAGNEMITE")] Magnemite = 81,
-        [pbr::OriginalName("MAGNETON")] Magneton = 82,
-        [pbr::OriginalName("FARFETCHD")] Farfetchd = 83,
-        [pbr::OriginalName("DODUO")] Doduo = 84,
-        [pbr::OriginalName("DODRIO")] Dodrio = 85,
-        [pbr::OriginalName("SEEL")] Seel = 86,
-        [pbr::OriginalName("DEWGONG")] Dewgong = 87,
-        [pbr::OriginalName("GRIMER")] Grimer = 88,
-        [pbr::OriginalName("MUK")] Muk = 89,
-        [pbr::OriginalName("SHELLDER")] Shellder = 90,
-        [pbr::OriginalName("CLOYSTER")] Cloyster = 91,
-        [pbr::OriginalName("GASTLY")] Gastly = 92,
-        [pbr::OriginalName("HAUNTER")] Haunter = 93,
-        [pbr::OriginalName("GENGAR")] Gengar = 94,
-        [pbr::OriginalName("ONIX")] Onix = 95,
-        [pbr::OriginalName("DROWZEE")] Drowzee = 96,
-        [pbr::OriginalName("HYPNO")] Hypno = 97,
-        [pbr::OriginalName("KRABBY")] Krabby = 98,
-        [pbr::OriginalName("KINGLER")] Kingler = 99,
-        [pbr::OriginalName("VOLTORB")] Voltorb = 100,
-        [pbr::OriginalName("ELECTRODE")] Electrode = 101,
-        [pbr::OriginalName("EXEGGCUTE")] Exeggcute = 102,
-        [pbr::OriginalName("EXEGGUTOR")] Exeggutor = 103,
-        [pbr::OriginalName("CUBONE")] Cubone = 104,
-        [pbr::OriginalName("MAROWAK")] Marowak = 105,
-        [pbr::OriginalName("HITMONLEE")] Hitmonlee = 106,
-        [pbr::OriginalName("HITMONCHAN")] Hitmonchan = 107,
-        [pbr::OriginalName("LICKITUNG")] Lickitung = 108,
-        [pbr::OriginalName("KOFFING")] Koffing = 109,
-        [pbr::OriginalName("WEEZING")] Weezing = 110,
-        [pbr::OriginalName("RHYHORN")] Rhyhorn = 111,
-        [pbr::OriginalName("RHYDON")] Rhydon = 112,
-        [pbr::OriginalName("CHANSEY")] Chansey = 113,
-        [pbr::OriginalName("TANGELA")] Tangela = 114,
-        [pbr::OriginalName("KANGASKHAN")] Kangaskhan = 115,
-        [pbr::OriginalName("HORSEA")] Horsea = 116,
-        [pbr::OriginalName("SEADRA")] Seadra = 117,
-        [pbr::OriginalName("GOLDEEN")] Goldeen = 118,
-        [pbr::OriginalName("SEAKING")] Seaking = 119,
-        [pbr::OriginalName("STARYU")] Staryu = 120,
-        [pbr::OriginalName("STARMIE")] Starmie = 121,
-        [pbr::OriginalName("MR_MIME")] MrMime = 122,
-        [pbr::OriginalName("SCYTHER")] Scyther = 123,
-        [pbr::OriginalName("JYNX")] Jynx = 124,
-        [pbr::OriginalName("ELECTABUZZ")] Electabuzz = 125,
-        [pbr::OriginalName("MAGMAR")] Magmar = 126,
-        [pbr::OriginalName("PINSIR")] Pinsir = 127,
-        [pbr::OriginalName("TAUROS")] Tauros = 128,
-        [pbr::OriginalName("MAGIKARP")] Magikarp = 129,
-        [pbr::OriginalName("GYARADOS")] Gyarados = 130,
-        [pbr::OriginalName("LAPRAS")] Lapras = 131,
-        [pbr::OriginalName("DITTO")] Ditto = 132,
-        [pbr::OriginalName("EEVEE")] Eevee = 133,
-        [pbr::OriginalName("VAPOREON")] Vaporeon = 134,
-        [pbr::OriginalName("JOLTEON")] Jolteon = 135,
-        [pbr::OriginalName("FLAREON")] Flareon = 136,
-        [pbr::OriginalName("PORYGON")] Porygon = 137,
-        [pbr::OriginalName("OMANYTE")] Omanyte = 138,
-        [pbr::OriginalName("OMASTAR")] Omastar = 139,
-        [pbr::OriginalName("KABUTO")] Kabuto = 140,
-        [pbr::OriginalName("KABUTOPS")] Kabutops = 141,
-        [pbr::OriginalName("AERODACTYL")] Aerodactyl = 142,
-        [pbr::OriginalName("SNORLAX")] Snorlax = 143,
-        [pbr::OriginalName("ARTICUNO")] Articuno = 144,
-        [pbr::OriginalName("ZAPDOS")] Zapdos = 145,
-        [pbr::OriginalName("MOLTRES")] Moltres = 146,
-        [pbr::OriginalName("DRATINI")] Dratini = 147,
-        [pbr::OriginalName("DRAGONAIR")] Dragonair = 148,
-        [pbr::OriginalName("DRAGONITE")] Dragonite = 149,
-        [pbr::OriginalName("MEWTWO")] Mewtwo = 150,
-        [pbr::OriginalName("MEW")] Mew = 151,
-    }
-
-    public enum FortSponsor
-    {
-        [pbr::OriginalName("UNSET_SPONSOR")] UnsetSponsor = 0,
-        [pbr::OriginalName("MCDONALDS")] Mcdonalds = 1,
-        [pbr::OriginalName("POKEMON_STORE")] PokemonStore = 2,
-    }
-
-    public enum FortRenderingType
-    {
-        [pbr::OriginalName("DEFAULT")] Default = 0,
-        [pbr::OriginalName("INTERNAL_TEST")] InternalTest = 1,
-    }
-
-    public enum ItemType
-    {
-        [pbr::OriginalName("ITEM_TYPE_NONE")] None = 0,
-        [pbr::OriginalName("ITEM_TYPE_POKEBALL")] Pokeball = 1,
-        [pbr::OriginalName("ITEM_TYPE_POTION")] Potion = 2,
-        [pbr::OriginalName("ITEM_TYPE_REVIVE")] Revive = 3,
-        [pbr::OriginalName("ITEM_TYPE_MAP")] Map = 4,
-        [pbr::OriginalName("ITEM_TYPE_BATTLE")] Battle = 5,
-        [pbr::OriginalName("ITEM_TYPE_FOOD")] Food = 6,
-        [pbr::OriginalName("ITEM_TYPE_CAMERA")] Camera = 7,
-        [pbr::OriginalName("ITEM_TYPE_DISK")] Disk = 8,
-        [pbr::OriginalName("ITEM_TYPE_INCUBATOR")] Incubator = 9,
-        [pbr::OriginalName("ITEM_TYPE_INCENSE")] Incense = 10,
-        [pbr::OriginalName("ITEM_TYPE_XP_BOOST")] XpBoost = 11,
-        [pbr::OriginalName("ITEM_TYPE_INVENTORY_UPGRADE")] InventoryUpgrade = 12,
-    }
-
-    public enum ItemCategory
-    {
-        [pbr::OriginalName("ITEM_CATEGORY_NONE")] None = 0,
-        [pbr::OriginalName("ITEM_CATEGORY_POKEBALL")] Pokeball = 1,
-        [pbr::OriginalName("ITEM_CATEGORY_FOOD")] Food = 2,
-        [pbr::OriginalName("ITEM_CATEGORY_MEDICINE")] Medicine = 3,
-        [pbr::OriginalName("ITEM_CATEGORY_BOOST")] Boost = 4,
-        [pbr::OriginalName("ITEM_CATEGORY_UTILITES")] Utilites = 5,
-        [pbr::OriginalName("ITEM_CATEGORY_CAMERA")] Camera = 6,
-        [pbr::OriginalName("ITEM_CATEGORY_DISK")] Disk = 7,
-        [pbr::OriginalName("ITEM_CATEGORY_INCUBATOR")] Incubator = 8,
-        [pbr::OriginalName("ITEM_CATEGORY_INCENSE")] Incense = 9,
-        [pbr::OriginalName("ITEM_CATEGORY_XP_BOOST")] XpBoost = 10,
-        [pbr::OriginalName("ITEM_CATEGORY_INVENTORY_UPGRADE")] InventoryUpgrade = 11,
-    }
-
-    public enum ItemEffect
-    {
-        [pbr::OriginalName("ITEM_EFFECT_NONE")] None = 0,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_NO_FLEE")] CapNoFlee = 1000,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_NO_MOVEMENT")] CapNoMovement = 1002,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_NO_THREAT")] CapNoThreat = 1003,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_TARGET_MAX")] CapTargetMax = 1004,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_TARGET_SLOW")] CapTargetSlow = 1005,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_NIGHT")] CapChanceNight = 1006,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_TRAINER")] CapChanceTrainer = 1007,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_FIRST_THROW")] CapChanceFirstThrow = 1008,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_LEGEND")] CapChanceLegend = 1009,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_HEAVY")] CapChanceHeavy = 1010,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_REPEAT")] CapChanceRepeat = 1011,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_MULTI_THROW")] CapChanceMultiThrow = 1012,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_ALWAYS")] CapChanceAlways = 1013,
-        [pbr::OriginalName("ITEM_EFFECT_CAP_CHANCE_SINGLE_THROW")] CapChanceSingleThrow = 1014,
-    }
-
-    public enum ActivityType
-    {
-        [pbr::OriginalName("ACTIVITY_UNKNOWN")] ActivityUnknown = 0,
-        [pbr::OriginalName("ACTIVITY_CATCH_POKEMON")] ActivityCatchPokemon = 1,
-        [pbr::OriginalName("ACTIVITY_CATCH_LEGEND_POKEMON")] ActivityCatchLegendPokemon = 2,
-        [pbr::OriginalName("ACTIVITY_FLEE_POKEMON")] ActivityFleePokemon = 3,
-        [pbr::OriginalName("ACTIVITY_DEFEAT_FORT")] ActivityDefeatFort = 4,
-        [pbr::OriginalName("ACTIVITY_EVOLVE_POKEMON")] ActivityEvolvePokemon = 5,
-        [pbr::OriginalName("ACTIVITY_HATCH_EGG")] ActivityHatchEgg = 6,
-        [pbr::OriginalName("ACTIVITY_WALK_KM")] ActivityWalkKm = 7,
-        [pbr::OriginalName("ACTIVITY_POKEDEX_ENTRY_NEW")] ActivityPokedexEntryNew = 8,
-        [pbr::OriginalName("ACTIVITY_CATCH_FIRST_THROW")] ActivityCatchFirstThrow = 9,
-        [pbr::OriginalName("ACTIVITY_CATCH_NICE_THROW")] ActivityCatchNiceThrow = 10,
-        [pbr::OriginalName("ACTIVITY_CATCH_GREAT_THROW")] ActivityCatchGreatThrow = 11,
-        [pbr::OriginalName("ACTIVITY_CATCH_EXCELLENT_THROW")] ActivityCatchExcellentThrow = 12,
-        [pbr::OriginalName("ACTIVITY_CATCH_CURVEBALL")] ActivityCatchCurveball = 13,
-        [pbr::OriginalName("ACTIVITY_CATCH_FIRST_CATCH_OF_DAY")] ActivityCatchFirstCatchOfDay = 14,
-        [pbr::OriginalName("ACTIVITY_CATCH_MILESTONE")] ActivityCatchMilestone = 15,
-        [pbr::OriginalName("ACTIVITY_TRAIN_POKEMON")] ActivityTrainPokemon = 16,
-        [pbr::OriginalName("ACTIVITY_SEARCH_FORT")] ActivitySearchFort = 17,
-        [pbr::OriginalName("ACTIVITY_RELEASE_POKEMON")] ActivityReleasePokemon = 18,
-        [pbr::OriginalName("ACTIVITY_HATCH_EGG_SMALL_BONUS")] ActivityHatchEggSmallBonus = 19,
-        [pbr::OriginalName("ACTIVITY_HATCH_EGG_MEDIUM_BONUS")] ActivityHatchEggMediumBonus = 20,
-        [pbr::OriginalName("ACTIVITY_HATCH_EGG_LARGE_BONUS")] ActivityHatchEggLargeBonus = 21,
-        [pbr::OriginalName("ACTIVITY_DEFEAT_GYM_DEFENDER")] ActivityDefeatGymDefender = 22,
-        [pbr::OriginalName("ACTIVITY_DEFEAT_GYM_LEADER")] ActivityDefeatGymLeader = 23,
-    }
-
-    public enum BadgeType
-    {
-        [pbr::OriginalName("BADGE_UNSET")] BadgeUnset = 0,
-        [pbr::OriginalName("BADGE_TRAVEL_KM")] BadgeTravelKm = 1,
-        [pbr::OriginalName("BADGE_POKEDEX_ENTRIES")] BadgePokedexEntries = 2,
-        [pbr::OriginalName("BADGE_CAPTURE_TOTAL")] BadgeCaptureTotal = 3,
-        [pbr::OriginalName("BADGE_DEFEATED_FORT")] BadgeDefeatedFort = 4,
-        [pbr::OriginalName("BADGE_EVOLVED_TOTAL")] BadgeEvolvedTotal = 5,
-        [pbr::OriginalName("BADGE_HATCHED_TOTAL")] BadgeHatchedTotal = 6,
-        [pbr::OriginalName("BADGE_ENCOUNTERED_TOTAL")] BadgeEncounteredTotal = 7,
-        [pbr::OriginalName("BADGE_POKESTOPS_VISITED")] BadgePokestopsVisited = 8,
-        [pbr::OriginalName("BADGE_UNIQUE_POKESTOPS")] BadgeUniquePokestops = 9,
-        [pbr::OriginalName("BADGE_POKEBALL_THROWN")] BadgePokeballThrown = 10,
-        [pbr::OriginalName("BADGE_BIG_MAGIKARP")] BadgeBigMagikarp = 11,
-        [pbr::OriginalName("BADGE_DEPLOYED_TOTAL")] BadgeDeployedTotal = 12,
-        [pbr::OriginalName("BADGE_BATTLE_ATTACK_WON")] BadgeBattleAttackWon = 13,
-        [pbr::OriginalName("BADGE_BATTLE_TRAINING_WON")] BadgeBattleTrainingWon = 14,
-        [pbr::OriginalName("BADGE_BATTLE_DEFEND_WON")] BadgeBattleDefendWon = 15,
-        [pbr::OriginalName("BADGE_PRESTIGE_RAISED")] BadgePrestigeRaised = 16,
-        [pbr::OriginalName("BADGE_PRESTIGE_DROPPED")] BadgePrestigeDropped = 17,
-        [pbr::OriginalName("BADGE_TYPE_NORMAL")] Normal = 18,
-        [pbr::OriginalName("BADGE_TYPE_FIGHTING")] Fighting = 19,
-        [pbr::OriginalName("BADGE_TYPE_FLYING")] Flying = 20,
-        [pbr::OriginalName("BADGE_TYPE_POISON")] Poison = 21,
-        [pbr::OriginalName("BADGE_TYPE_GROUND")] Ground = 22,
-        [pbr::OriginalName("BADGE_TYPE_ROCK")] Rock = 23,
-        [pbr::OriginalName("BADGE_TYPE_BUG")] Bug = 24,
-        [pbr::OriginalName("BADGE_TYPE_GHOST")] Ghost = 25,
-        [pbr::OriginalName("BADGE_TYPE_STEEL")] Steel = 26,
-        [pbr::OriginalName("BADGE_TYPE_FIRE")] Fire = 27,
-        [pbr::OriginalName("BADGE_TYPE_WATER")] Water = 28,
-        [pbr::OriginalName("BADGE_TYPE_GRASS")] Grass = 29,
-        [pbr::OriginalName("BADGE_TYPE_ELECTRIC")] Electric = 30,
-        [pbr::OriginalName("BADGE_TYPE_PSYCHIC")] Psychic = 31,
-        [pbr::OriginalName("BADGE_TYPE_ICE")] Ice = 32,
-        [pbr::OriginalName("BADGE_TYPE_DRAGON")] Dragon = 33,
-        [pbr::OriginalName("BADGE_TYPE_DARK")] Dark = 34,
-        [pbr::OriginalName("BADGE_TYPE_FAIRY")] Fairy = 35,
-        [pbr::OriginalName("BADGE_SMALL_RATTATA")] BadgeSmallRattata = 36,
-        [pbr::OriginalName("BADGE_PIKACHU")] BadgePikachu = 37,
-    }
-
-    public enum HoloIapItemCategory
-    {
-        [pbr::OriginalName("IAP_CATEGORY_NONE")] IapCategoryNone = 0,
-        [pbr::OriginalName("IAP_CATEGORY_BUNDLE")] IapCategoryBundle = 1,
-        [pbr::OriginalName("IAP_CATEGORY_ITEMS")] IapCategoryItems = 2,
-        [pbr::OriginalName("IAP_CATEGORY_UPGRADES")] IapCategoryUpgrades = 3,
-        [pbr::OriginalName("IAP_CATEGORY_POKECOINS")] IapCategoryPokecoins = 4,
-    }
-
-    public enum CameraInterpolation
-    {
-        [pbr::OriginalName("CAM_INTERP_CUT")] CamInterpCut = 0,
-        [pbr::OriginalName("CAM_INTERP_LINEAR")] CamInterpLinear = 1,
-        [pbr::OriginalName("CAM_INTERP_SMOOTH")] CamInterpSmooth = 2,
-        [pbr::OriginalName("CAM_INTERP_SMOOTH_ROT_LINEAR_MOVE")] CamInterpSmoothRotLinearMove = 3,
-        [pbr::OriginalName("CAM_INTERP_DEPENDS")] CamInterpDepends = 4,
-    }
-
-    public enum CameraTarget
-    {
-        [pbr::OriginalName("CAM_TARGET_ATTACKER")] CamTargetAttacker = 0,
-        [pbr::OriginalName("CAM_TARGET_ATTACKER_EDGE")] CamTargetAttackerEdge = 1,
-        [pbr::OriginalName("CAM_TARGET_ATTACKER_GROUND")] CamTargetAttackerGround = 2,
-        [pbr::OriginalName("CAM_TARGET_DEFENDER")] CamTargetDefender = 3,
-        [pbr::OriginalName("CAM_TARGET_DEFENDER_EDGE")] CamTargetDefenderEdge = 4,
-        [pbr::OriginalName("CAM_TARGET_DEFENDER_GROUND")] CamTargetDefenderGround = 5,
-        [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER")] CamTargetAttackerDefender = 6,
-        [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_EDGE")] CamTargetAttackerDefenderEdge = 7,
-        [pbr::OriginalName("CAM_TARGET_DEFENDER_ATTACKER")] CamTargetDefenderAttacker = 8,
-        [pbr::OriginalName("CAM_TARGET_DEFENDER_ATTACKER_EDGE")] CamTargetDefenderAttackerEdge = 9,
-        [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_MIRROR")] CamTargetAttackerDefenderMirror = 11,
-        [pbr::OriginalName("CAM_TARGET_SHOULDER_ATTACKER_DEFENDER")] CamTargetShoulderAttackerDefender = 12,
-        [pbr::OriginalName("CAM_TARGET_SHOULDER_ATTACKER_DEFENDER_MIRROR")] CamTargetShoulderAttackerDefenderMirror = 13,
-        [pbr::OriginalName("CAM_TARGET_ATTACKER_DEFENDER_WORLD")] CamTargetAttackerDefenderWorld = 14,
-    }
-
-    public enum PokemonType
-    {
-        [pbr::OriginalName("POKEMON_TYPE_NONE")] None = 0,
-        [pbr::OriginalName("POKEMON_TYPE_NORMAL")] Normal = 1,
-        [pbr::OriginalName("POKEMON_TYPE_FIGHTING")] Fighting = 2,
-        [pbr::OriginalName("POKEMON_TYPE_FLYING")] Flying = 3,
-        [pbr::OriginalName("POKEMON_TYPE_POISON")] Poison = 4,
-        [pbr::OriginalName("POKEMON_TYPE_GROUND")] Ground = 5,
-        [pbr::OriginalName("POKEMON_TYPE_ROCK")] Rock = 6,
-        [pbr::OriginalName("POKEMON_TYPE_BUG")] Bug = 7,
-        [pbr::OriginalName("POKEMON_TYPE_GHOST")] Ghost = 8,
-        [pbr::OriginalName("POKEMON_TYPE_STEEL")] Steel = 9,
-        [pbr::OriginalName("POKEMON_TYPE_FIRE")] Fire = 10,
-        [pbr::OriginalName("POKEMON_TYPE_WATER")] Water = 11,
-        [pbr::OriginalName("POKEMON_TYPE_GRASS")] Grass = 12,
-        [pbr::OriginalName("POKEMON_TYPE_ELECTRIC")] Electric = 13,
-        [pbr::OriginalName("POKEMON_TYPE_PSYCHIC")] Psychic = 14,
-        [pbr::OriginalName("POKEMON_TYPE_ICE")] Ice = 15,
-        [pbr::OriginalName("POKEMON_TYPE_DRAGON")] Dragon = 16,
-        [pbr::OriginalName("POKEMON_TYPE_DARK")] Dark = 17,
-        [pbr::OriginalName("POKEMON_TYPE_FAIRY")] Fairy = 18,
-    }
-
-    public enum PokemonMovementType
-    {
-        [pbr::OriginalName("MOVEMENT_STATIC")] MovementStatic = 0,
-        [pbr::OriginalName("MOVEMENT_JUMP")] MovementJump = 1,
-        [pbr::OriginalName("MOVEMENT_VERTICAL")] MovementVertical = 2,
-        [pbr::OriginalName("MOVEMENT_PSYCHIC")] MovementPsychic = 3,
-        [pbr::OriginalName("MOVEMENT_ELECTRIC")] MovementElectric = 4,
-        [pbr::OriginalName("MOVEMENT_FLYING")] MovementFlying = 5,
-        [pbr::OriginalName("MOVEMENT_HOVERING")] MovementHovering = 6,
-    }
-
-    public enum PokemonClass
-    {
-        [pbr::OriginalName("NORMAL")] Normal = 0,
-        [pbr::OriginalName("LEGENDARY")] Legendary = 1,
-        [pbr::OriginalName("MYTHIC")] Mythic = 2,
-    }
-
-    #endregion
-}
-
-#endregion Designer generated code
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs b/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
deleted file mode 100644
index 589c206..0000000
--- a/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
+++ /dev/null
@@ -1,27702 +0,0 @@
-#pragma warning disable 1591, 0612, 3021
-
-#region Designer generated code
-
-#region
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-
-#endregion
-
-namespace PokemonGo.RocketAPI.GeneratedCode
-{
-    /// <summary>Holder for reflection information generated from Payloads.proto</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public static partial class PayloadsReflection
-    {
-        #region Descriptor
-
-        /// <summary>File descriptor for Payloads.proto</summary>
-        public static pbr::FileDescriptor Descriptor
-        {
-            get { return descriptor; }
-        }
-
-        private static pbr::FileDescriptor descriptor;
-
-        static PayloadsReflection()
-        {
-            var descriptorData = global::System.Convert.FromBase64String(
-                string.Concat(
-                    "Cg5QYXlsb2Fkcy5wcm90bxIhUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0",
-                    "ZWRDb2RlGg1BbGxFbnVtLnByb3RvImIKEUdldFBsYXllclJlc3BvbnNlEhAK",
-                    "CHVua25vd24xGAEgASgFEjsKB3Byb2ZpbGUYAiABKAsyKi5Qb2tlbW9uR28u",
-                    "Um9ja2V0QVBJLkdlbmVyYXRlZENvZGUuUHJvZmlsZSL9AgoHUHJvZmlsZRIV",
-                    "Cg1jcmVhdGlvbl90aW1lGAEgASgDEhAKCHVzZXJuYW1lGAIgASgJEiAKBHRl",
-                    "YW0YBSABKA4yEi5BbGxFbnVtLlRlYW1Db2xvchIQCgh0dXRvcmlhbBgHIAEo",
-                    "DBJACgZhdmF0YXIYCCABKAsyMC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVy",
-                    "YXRlZENvZGUuQXZhdGFyRGV0YWlscxIUCgxwb2tlX3N0b3JhZ2UYCSABKAUS",
-                    "FAoMaXRlbV9zdG9yYWdlGAogASgFEkIKC2RhaWx5X2JvbnVzGAsgASgLMi0u",
-                    "UG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkRhaWx5Qm9udXMS",
-                    "EQoJdW5rbm93bjEyGAwgASgMEhEKCXVua25vd24xMxgNIAEoDBI9CghjdXJy",
-                    "ZW5jeRgOIAMoCzIrLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29k",
-                    "ZS5DdXJyZW5jeSJZCgpEYWlseUJvbnVzEh4KFk5leHRDb2xsZWN0VGltZXN0",
-                    "YW1wTXMYASABKAMSKwojTmV4dERlZmVuZGVyQm9udXNDb2xsZWN0VGltZXN0",
-                    "YW1wTXMYAiABKAMiKAoIQ3VycmVuY3kSDAoEdHlwZRgBIAEoCRIOCgZhbW91",
-                    "bnQYAiABKAUiWAoNQXZhdGFyRGV0YWlscxIQCgh1bmtub3duMhgCIAEoBRIQ",
-                    "Cgh1bmtub3duMxgDIAEoBRIQCgh1bmtub3duORgJIAEoBRIRCgl1bmtub3du",
-                    "MTAYCiABKAUiJwoXRG93bmxvYWRTZXR0aW5nc1JlcXVlc3QSDAoEaGFzaBgB",
-                    "IAEoCSJzChRHZXRJbnZlbnRvcnlSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgI",
-                    "EkoKD2ludmVudG9yeV9kZWx0YRgCIAEoCzIxLlBva2Vtb25Hby5Sb2NrZXRB",
-                    "UEkuR2VuZXJhdGVkQ29kZS5JbnZlbnRvcnlEZWx0YSKUAQoOSW52ZW50b3J5",
-                    "RGVsdGESHQoVb3JpZ2luYWxfdGltZXN0YW1wX21zGAEgASgDEhgKEG5ld190",
-                    "aW1lc3RhbXBfbXMYAiABKAMSSQoPaW52ZW50b3J5X2l0ZW1zGAMgAygLMjAu",
-                    "UG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkludmVudG9yeUl0",
-                    "ZW0imwEKDUludmVudG9yeUl0ZW0SHQoVbW9kaWZpZWRfdGltZXN0YW1wX21z",
-                    "GAEgASgDEhgKEGRlbGV0ZWRfaXRlbV9rZXkYAiABKAMSUQoTaW52ZW50b3J5",
-                    "X2l0ZW1fZGF0YRgDIAEoCzI0LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJh",
-                    "dGVkQ29kZS5JbnZlbnRvcnlJdGVtRGF0YSLbBQoRSW52ZW50b3J5SXRlbURh",
-                    "dGESPwoHcG9rZW1vbhgBIAEoCzIuLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2Vu",
-                    "ZXJhdGVkQ29kZS5Qb2tlbW9uRGF0YRI1CgRpdGVtGAIgASgLMicuUG9rZW1v",
-                    "bkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkl0ZW0SRgoNcG9rZWRleF9l",
-                    "bnRyeRgDIAEoCzIvLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29k",
-                    "ZS5Qb2tlZGV4RW50cnkSRAoMcGxheWVyX3N0YXRzGAQgASgLMi4uUG9rZW1v",
-                    "bkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlBsYXllclN0YXRzEkoKD3Bs",
-                    "YXllcl9jdXJyZW5jeRgFIAEoCzIxLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2Vu",
-                    "ZXJhdGVkQ29kZS5QbGF5ZXJDdXJyZW5jeRJGCg1wbGF5ZXJfY2FtZXJhGAYg",
-                    "ASgLMi8uUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlBsYXll",
-                    "ckNhbWVyYRJQChJpbnZlbnRvcnlfdXBncmFkZXMYByABKAsyNC5Qb2tlbW9u",
-                    "R28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuSW52ZW50b3J5VXBncmFkZXMS",
-                    "RgoNYXBwbGllZF9pdGVtcxgIIAEoCzIvLlBva2Vtb25Hby5Sb2NrZXRBUEku",
-                    "R2VuZXJhdGVkQ29kZS5BcHBsaWVkSXRlbXMSSAoOZWdnX2luY3ViYXRvcnMY",
-                    "CSABKAsyMC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRWdn",
-                    "SW5jdWJhdG9ycxJICg5wb2tlbW9uX2ZhbWlseRgKIAEoCzIwLlBva2Vtb25H",
-                    "by5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5Qb2tlbW9uRmFtaWx5ItgFCgdQ",
-                    "b2tlbW9uEgoKAmlkGAEgASgFEigKDHBva2Vtb25fdHlwZRgCIAEoDjISLkFs",
-                    "bEVudW0uUG9rZW1vbklkEgoKAmNwGAMgASgFEg8KB3N0YW1pbmEYBCABKAUS",
-                    "EwoLc3RhbWluYV9tYXgYBSABKAUSJAoGbW92ZV8xGAYgASgOMhQuQWxsRW51",
-                    "bS5Qb2tlbW9uTW92ZRIkCgZtb3ZlXzIYByABKA4yFC5BbGxFbnVtLlBva2Vt",
-                    "b25Nb3ZlEhgKEGRlcGxveWVkX2ZvcnRfaWQYCCABKAUSEgoKb3duZXJfbmFt",
-                    "ZRgJIAEoCRIOCgZpc19lZ2cYCiABKAgSHAoUZWdnX2ttX3dhbGtlZF90YXJn",
-                    "ZXQYCyABKAUSGwoTZWdnX2ttX3dhbGtlZF9zdGFydBgMIAEoBRIOCgZvcmln",
-                    "aW4YDiABKAUSEAoIaGVpZ2h0X20YDyABKAISEQoJd2VpZ2h0X2tnGBAgASgC",
-                    "EhkKEWluZGl2aWR1YWxfYXR0YWNrGBEgASgFEhoKEmluZGl2aWR1YWxfZGVm",
-                    "ZW5zZRgSIAEoBRIaChJpbmRpdmlkdWFsX3N0YW1pbmEYEyABKAUSFQoNY3Bf",
-                    "bXVsdGlwbGllchgUIAEoBRIQCghwb2tlYmFsbBgVIAEoBRIYChBjYXB0dXJl",
-                    "ZF9jZWxsX2lkGBYgASgEEhgKEGJhdHRsZXNfYXR0YWNrZWQYFyABKAUSGAoQ",
-                    "YmF0dGxlc19kZWZlbmRlZBgYIAEoBRIYChBlZ2dfaW5jdWJhdG9yX2lkGBkg",
-                    "ASgFEhgKEGNyZWF0aW9uX3RpbWVfbXMYGiABKAQSFAoMbnVtX3VwZ3JhZGVz",
-                    "GBsgASgFEiAKGGFkZGl0aW9uYWxfY3BfbXVsdGlwbGllchgcIAEoBRIQCghm",
-                    "YXZvcml0ZRgdIAEoBRIQCghuaWNrbmFtZRgeIAEoCRIRCglmcm9tX2ZvcnQY",
-                    "HyABKAUiRgoESXRlbRIfCgRpdGVtGAEgASgOMhEuQWxsRW51bS5JdGVtVHlw",
-                    "ZRINCgVjb3VudBgCIAEoBRIOCgZ1bnNlZW4YAyABKAgimQEKDFBva2VkZXhF",
-                    "bnRyeRIcChRwb2tlZGV4X2VudHJ5X251bWJlchgBIAEoBRIZChF0aW1lc19l",
-                    "bmNvdW50ZXJlZBgCIAEoBRIWCg50aW1lc19jYXB0dXJlZBgDIAEoBRIeChZl",
-                    "dm9sdXRpb25fc3RvbmVfcGllY2VzGAQgASgFEhgKEGV2b2x1dGlvbl9zdG9u",
-                    "ZXMYBSABKAUi7QQKC1BsYXllclN0YXRzEg0KBWxldmVsGAEgASgFEhIKCmV4",
-                    "cGVyaWVuY2UYAiABKAMSFQoNcHJldl9sZXZlbF94cBgDIAEoAxIVCg1uZXh0",
-                    "X2xldmVsX3hwGAQgASgDEhEKCWttX3dhbGtlZBgFIAEoAhIcChRwb2tlbW9u",
-                    "c19lbmNvdW50ZXJlZBgGIAEoBRIeChZ1bmlxdWVfcG9rZWRleF9lbnRyaWVz",
-                    "GAcgASgFEhkKEXBva2Vtb25zX2NhcHR1cmVkGAggASgFEhIKCmV2b2x1dGlv",
-                    "bnMYCSABKAUSGAoQcG9rZV9zdG9wX3Zpc2l0cxgKIAEoBRIYChBwb2tlYmFs",
-                    "bHNfdGhyb3duGAsgASgFEhQKDGVnZ3NfaGF0Y2hlZBgMIAEoBRIbChNiaWdf",
-                    "bWFnaWthcnBfY2F1Z2h0GA0gASgFEhkKEWJhdHRsZV9hdHRhY2tfd29uGA4g",
-                    "ASgFEhsKE2JhdHRsZV9hdHRhY2tfdG90YWwYDyABKAUSGwoTYmF0dGxlX2Rl",
-                    "ZmVuZGVkX3dvbhgQIAEoBRIbChNiYXR0bGVfdHJhaW5pbmdfd29uGBEgASgF",
-                    "Eh0KFWJhdHRsZV90cmFpbmluZ190b3RhbBgSIAEoBRIdChVwcmVzdGlnZV9y",
-                    "YWlzZWRfdG90YWwYEyABKAUSHgoWcHJlc3RpZ2VfZHJvcHBlZF90b3RhbBgU",
-                    "IAEoBRIYChBwb2tlbW9uX2RlcGxveWVkGBUgASgFEh4KFnBva2Vtb25fY2F1",
-                    "Z2h0X2J5X3R5cGUYFiABKAwSHAoUc21hbGxfcmF0dGF0YV9jYXVnaHQYFyAB",
-                    "KAUiHgoOUGxheWVyQ3VycmVuY3kSDAoEZ2VtcxgBIAEoBSIpCgxQbGF5ZXJD",
-                    "YW1lcmESGQoRaXNfZGVmYXVsdF9jYW1lcmEYASABKAgiZAoRSW52ZW50b3J5",
-                    "VXBncmFkZXMSTwoSaW52ZW50b3J5X3VwZ3JhZGVzGAEgAygLMjMuUG9rZW1v",
-                    "bkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkludmVudG9yeVVwZ3JhZGUi",
-                    "hAEKEEludmVudG9yeVVwZ3JhZGUSHwoEaXRlbRgBIAEoDjIRLkFsbEVudW0u",
-                    "SXRlbVR5cGUSMwoMdXBncmFkZV90eXBlGAIgASgOMh0uQWxsRW51bS5JbnZl",
-                    "bnRvcnlVcGdyYWRlVHlwZRIaChJhZGRpdGlvbmFsX3N0b3JhZ2UYAyABKAUi",
-                    "TAoMQXBwbGllZEl0ZW1zEjwKBGl0ZW0YBCABKAsyLi5Qb2tlbW9uR28uUm9j",
-                    "a2V0QVBJLkdlbmVyYXRlZENvZGUuQXBwbGllZEl0ZW0ihwEKC0FwcGxpZWRJ",
-                    "dGVtEiIKCWl0ZW1fdHlwZRgBIAEoDjIPLkFsbEVudW0uSXRlbUlkEi0KEml0",
-                    "ZW1fdHlwZV9jYXRlZ29yeRgCIAEoDjIRLkFsbEVudW0uSXRlbVR5cGUSEQoJ",
-                    "ZXhwaXJlX21zGAMgASgDEhIKCmFwcGxpZWRfbXMYBCABKAMiVwoNRWdnSW5j",
-                    "dWJhdG9ycxJGCg1lZ2dfaW5jdWJhdG9yGAEgASgLMi8uUG9rZW1vbkdvLlJv",
-                    "Y2tldEFQSS5HZW5lcmF0ZWRDb2RlLkVnZ0luY3ViYXRvciLXAQoMRWdnSW5j",
-                    "dWJhdG9yEg8KB2l0ZW1faWQYASABKAkSJAoJaXRlbV90eXBlGAIgASgOMhEu",
-                    "QWxsRW51bS5JdGVtVHlwZRIxCg5pbmN1YmF0b3JfdHlwZRgDIAEoDjIZLkFs",
-                    "bEVudW0uRWdnSW5jdWJhdG9yVHlwZRIWCg51c2VzX3JlbWFpbmluZxgEIAEo",
-                    "BRISCgpwb2tlbW9uX2lkGAUgASgDEhcKD3N0YXJ0X2ttX3dhbGtlZBgGIAEo",
-                    "ARIYChB0YXJnZXRfa21fd2Fsa2VkGAcgASgBIksKDVBva2Vtb25GYW1pbHkS",
-                    "KwoJZmFtaWx5X2lkGAEgASgOMhguQWxsRW51bS5Qb2tlbW9uRmFtaWx5SWQS",
-                    "DQoFY2FuZHkYAiABKAUiaAoUR2V0TWFwT2JqZWN0c1JlcXVlc3QSDwoHY2Vs",
-                    "bF9pZBgBIAEoDBIaChJzaW5jZV90aW1lc3RhbXBfbXMYAiABKAwSEAoIbGF0",
-                    "aXR1ZGUYAyABKAESEQoJbG9uZ2l0dWRlGAQgASgBIoEBChVHZXRNYXBPYmpl",
-                    "Y3RzUmVzcG9uc2USPQoJbWFwX2NlbGxzGAEgAygLMiouUG9rZW1vbkdvLlJv",
-                    "Y2tldEFQSS5HZW5lcmF0ZWRDb2RlLk1hcENlbGwSKQoGc3RhdHVzGAIgASgO",
-                    "MhkuQWxsRW51bS5NYXBPYmplY3RzU3RhdHVzIuQECgdNYXBDZWxsEhIKCnMy",
-                    "X2NlbGxfaWQYASABKAQSHAoUY3VycmVudF90aW1lc3RhbXBfbXMYAiABKAMS",
-                    "OgoFZm9ydHMYAyADKAsyKy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUuRm9ydERhdGESQwoMc3Bhd25fcG9pbnRzGAQgAygLMi0uUG9rZW1v",
-                    "bkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlNwYXduUG9pbnQSFwoPZGVs",
-                    "ZXRlZF9vYmplY3RzGAYgAygJEhkKEWlzX3RydW5jYXRlZF9saXN0GAcgASgI",
-                    "EkYKDmZvcnRfc3VtbWFyaWVzGAggAygLMi4uUG9rZW1vbkdvLlJvY2tldEFQ",
-                    "SS5HZW5lcmF0ZWRDb2RlLkZvcnRTdW1tYXJ5Ek0KFmRlY2ltYXRlZF9zcGF3",
-                    "bl9wb2ludHMYCSADKAsyLS5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUuU3Bhd25Qb2ludBJFCg13aWxkX3Bva2Vtb25zGAUgAygLMi4uUG9r",
-                    "ZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLldpbGRQb2tlbW9uEkkK",
-                    "EmNhdGNoYWJsZV9wb2tlbW9ucxgKIAMoCzItLlBva2Vtb25Hby5Sb2NrZXRB",
-                    "UEkuR2VuZXJhdGVkQ29kZS5NYXBQb2tlbW9uEkkKD25lYXJieV9wb2tlbW9u",
-                    "cxgLIAMoCzIwLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5O",
-                    "ZWFyYnlQb2tlbW9uIpMECghGb3J0RGF0YRIKCgJpZBgBIAEoCRIiChpsYXN0",
-                    "X21vZGlmaWVkX3RpbWVzdGFtcF9tcxgCIAEoAxIQCghsYXRpdHVkZRgDIAEo",
-                    "ARIRCglsb25naXR1ZGUYBCABKAESDwoHZW5hYmxlZBgIIAEoCBIfCgR0eXBl",
-                    "GAkgASgOMhEuQWxsRW51bS5Gb3J0VHlwZRIpCg1vd25lZF9ieV90ZWFtGAUg",
-                    "ASgOMhIuQWxsRW51bS5UZWFtQ29sb3ISLAoQZ3VhcmRfcG9rZW1vbl9pZBgG",
-                    "IAEoDjISLkFsbEVudW0uUG9rZW1vbklkEhgKEGd1YXJkX3Bva2Vtb25fY3AY",
-                    "ByABKAUSEgoKZ3ltX3BvaW50cxgKIAEoAxIUCgxpc19pbl9iYXR0bGUYCyAB",
-                    "KAgSJgoeY29vbGRvd25fY29tcGxldGVfdGltZXN0YW1wX21zGA4gASgDEiUK",
-                    "B3Nwb25zb3IYDyABKA4yFC5BbGxFbnVtLkZvcnRTcG9uc29yEjIKDnJlbmRl",
-                    "cmluZ190eXBlGBAgASgOMhouQWxsRW51bS5Gb3J0UmVuZGVyaW5nVHlwZRIc",
-                    "ChRhY3RpdmVfZm9ydF9tb2RpZmllchgMIAEoDBJCCglsdXJlX2luZm8YDSAB",
-                    "KAsyLy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRm9ydEx1",
-                    "cmVJbmZvIoMBCgxGb3J0THVyZUluZm8SDwoHZm9ydF9pZBgBIAEoCRIQCgh1",
-                    "bmtub3duMhgCIAEoARItChFhY3RpdmVfcG9rZW1vbl9pZBgDIAEoDjISLkFs",
-                    "bEVudW0uUG9rZW1vbklkEiEKGWx1cmVfZXhwaXJlc190aW1lc3RhbXBfbXMY",
-                    "BCABKAMiMQoKU3Bhd25Qb2ludBIQCghsYXRpdHVkZRgCIAEoARIRCglsb25n",
-                    "aXR1ZGUYAyABKAEibwoLRm9ydFN1bW1hcnkSFwoPZm9ydF9zdW1tYXJ5X2lk",
-                    "GAEgASgFEiIKGmxhc3RfbW9kaWZpZWRfdGltZXN0YW1wX21zGAIgASgFEhAK",
-                    "CGxhdGl0dWRlGAMgASgFEhEKCWxvbmdpdHVkZRgEIAEoBSLmAQoLV2lsZFBv",
-                    "a2Vtb24SFAoMZW5jb3VudGVyX2lkGAEgASgGEiIKGmxhc3RfbW9kaWZpZWRf",
-                    "dGltZXN0YW1wX21zGAIgASgDEhAKCGxhdGl0dWRlGAMgASgBEhEKCWxvbmdp",
-                    "dHVkZRgEIAEoARIVCg1zcGF3bnBvaW50X2lkGAUgASgJEkQKDHBva2Vtb25f",
-                    "ZGF0YRgHIAEoCzIuLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29k",
-                    "ZS5Qb2tlbW9uRGF0YRIbChN0aW1lX3RpbGxfaGlkZGVuX21zGAsgASgFItoF",
-                    "CgtQb2tlbW9uRGF0YRIKCgJpZBgBIAEoBhImCgpwb2tlbW9uX2lkGAIgASgO",
-                    "MhIuQWxsRW51bS5Qb2tlbW9uSWQSCgoCY3AYAyABKAUSDwoHc3RhbWluYRgE",
-                    "IAEoBRITCgtzdGFtaW5hX21heBgFIAEoBRIkCgZtb3ZlXzEYBiABKA4yFC5B",
-                    "bGxFbnVtLlBva2Vtb25Nb3ZlEiQKBm1vdmVfMhgHIAEoDjIULkFsbEVudW0u",
-                    "UG9rZW1vbk1vdmUSGAoQZGVwbG95ZWRfZm9ydF9pZBgIIAEoBRISCgpvd25l",
-                    "cl9uYW1lGAkgASgJEg4KBmlzX2VnZxgKIAEoCBIcChRlZ2dfa21fd2Fsa2Vk",
-                    "X3RhcmdldBgLIAEoBRIbChNlZ2dfa21fd2Fsa2VkX3N0YXJ0GAwgASgFEg4K",
-                    "Bm9yaWdpbhgOIAEoBRIQCghoZWlnaHRfbRgPIAEoAhIRCgl3ZWlnaHRfa2cY",
-                    "ECABKAISGQoRaW5kaXZpZHVhbF9hdHRhY2sYESABKAUSGgoSaW5kaXZpZHVh",
-                    "bF9kZWZlbnNlGBIgASgFEhoKEmluZGl2aWR1YWxfc3RhbWluYRgTIAEoBRIV",
-                    "Cg1jcF9tdWx0aXBsaWVyGBQgASgFEhAKCHBva2ViYWxsGBUgASgFEhgKEGNh",
-                    "cHR1cmVkX2NlbGxfaWQYFiABKAQSGAoQYmF0dGxlc19hdHRhY2tlZBgXIAEo",
-                    "BRIYChBiYXR0bGVzX2RlZmVuZGVkGBggASgFEhgKEGVnZ19pbmN1YmF0b3Jf",
-                    "aWQYGSABKAUSGAoQY3JlYXRpb25fdGltZV9tcxgaIAEoBBIUCgxudW1fdXBn",
-                    "cmFkZXMYGyABKAUSIAoYYWRkaXRpb25hbF9jcF9tdWx0aXBsaWVyGBwgASgF",
-                    "EhAKCGZhdm9yaXRlGB0gASgFEhAKCG5pY2tuYW1lGB4gASgJEhEKCWZyb21f",
-                    "Zm9ydBgfIAEoBSKnAQoKTWFwUG9rZW1vbhIVCg1zcGF3bnBvaW50X2lkGAEg",
-                    "ASgJEhQKDGVuY291bnRlcl9pZBgCIAEoBhImCgpwb2tlbW9uX2lkGAMgASgO",
-                    "MhIuQWxsRW51bS5Qb2tlbW9uSWQSHwoXZXhwaXJhdGlvbl90aW1lc3RhbXBf",
-                    "bXMYBCABKAMSEAoIbGF0aXR1ZGUYBSABKAESEQoJbG9uZ2l0dWRlGAYgASgB",
-                    "ImkKDU5lYXJieVBva2Vtb24SJgoKcG9rZW1vbl9pZBgBIAEoDjISLkFsbEVu",
-                    "dW0uUG9rZW1vbklkEhoKEmRpc3RhbmNlX2luX21ldGVycxgCIAEoAhIUCgxl",
-                    "bmNvdW50ZXJfaWQYAyABKAYifAoYRG93bmxvYWRTZXR0aW5nc1Jlc3BvbnNl",
-                    "Eg0KBWVycm9yGAEgASgJEgwKBGhhc2gYAiABKAkSQwoIc2V0dGluZ3MYAyAB",
-                    "KAsyMS5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuR2xvYmFs",
-                    "U2V0dGluZ3Mi2gIKDkdsb2JhbFNldHRpbmdzEkYKDWZvcnRfc2V0dGluZ3MY",
-                    "AiABKAsyLy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRm9y",
-                    "dFNldHRpbmdzEkQKDG1hcF9zZXR0aW5ncxgDIAEoCzIuLlBva2Vtb25Hby5S",
-                    "b2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5NYXBTZXR0aW5ncxJICg5sZXZlbF9z",
-                    "ZXR0aW5ncxgEIAEoCzIwLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVk",
-                    "Q29kZS5MZXZlbFNldHRpbmdzElAKEmludmVudG9yeV9zZXR0aW5ncxgFIAEo",
-                    "CzI0LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5JbnZlbnRv",
-                    "cnlTZXR0aW5ncxIeChZtaW5pbXVtX2NsaWVudF92ZXJzaW9uGAYgASgJIuQB",
-                    "CgxGb3J0U2V0dGluZ3MSIAoYaW50ZXJhY3Rpb25fcmFuZ2VfbWV0ZXJzGAEg",
-                    "ASgBEiIKGm1heF90b3RhbF9kZXBsb3llZF9wb2tlbW9uGAIgASgFEiMKG21h",
-                    "eF9wbGF5ZXJfZGVwbG95ZWRfcG9rZW1vbhgDIAEoBRIhChlkZXBsb3lfc3Rh",
-                    "bWluYV9tdWx0aXBsaWVyGAQgASgBEiAKGGRlcGxveV9hdHRhY2tfbXVsdGlw",
-                    "bGllchgFIAEoARIkChxmYXJfaW50ZXJhY3Rpb25fcmFuZ2VfbWV0ZXJzGAYg",
-                    "ASgBIo8CCgtNYXBTZXR0aW5ncxIdChVwb2tlbW9uX3Zpc2libGVfcmFuZ2UY",
-                    "ASABKAESHQoVcG9rZV9uYXZfcmFuZ2VfbWV0ZXJzGAIgASgBEh4KFmVuY291",
-                    "bnRlcl9yYW5nZV9tZXRlcnMYAyABKAESKwojZ2V0X21hcF9vYmplY3RzX21p",
-                    "bl9yZWZyZXNoX3NlY29uZHMYBCABKAISKwojZ2V0X21hcF9vYmplY3RzX21h",
-                    "eF9yZWZyZXNoX3NlY29uZHMYBSABKAISKwojZ2V0X21hcF9vYmplY3RzX21p",
-                    "bl9kaXN0YW5jZV9tZXRlcnMYBiABKAISGwoTZ29vZ2xlX21hcHNfYXBpX2tl",
-                    "eRgHIAEoCSJRCg1MZXZlbFNldHRpbmdzEhsKE3RyYWluZXJfY3BfbW9kaWZp",
-                    "ZXIYAiABKAESIwobdHJhaW5lcl9kaWZmaWN1bHR5X21vZGlmaWVyGAMgASgB",
-                    "IoABChFJbnZlbnRvcnlTZXR0aW5ncxITCgttYXhfcG9rZW1vbhgBIAEoBRIV",
-                    "Cg1tYXhfYmFnX2l0ZW1zGAIgASgFEhQKDGJhc2VfcG9rZW1vbhgDIAEoBRIW",
-                    "Cg5iYXNlX2JhZ19pdGVtcxgEIAEoBRIRCgliYXNlX2VnZ3MYBSABKAUiOgoT",
-                    "UGxheWVyVXBkYXRlUmVxdWVzdBIQCghsYXRpdHVkZRgBIAEoARIRCglsb25n",
-                    "aXR1ZGUYAiABKAEirwEKFFBsYXllclVwZGF0ZVJlc3BvbnNlEkUKDXdpbGRf",
-                    "cG9rZW1vbnMYASADKAsyLi5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUuV2lsZFBva2Vtb24SOgoFZm9ydHMYAiADKAsyKy5Qb2tlbW9uR28u",
-                    "Um9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRm9ydERhdGESFAoMZm9ydHNfbmVh",
-                    "cmJ5GAMgASgFIh4KHERvd25sb2FkSXRlbVRlbXBsYXRlc1JlcXVlc3Qi2woK",
-                    "HURvd25sb2FkSXRlbVRlbXBsYXRlc1Jlc3BvbnNlEg8KB3N1Y2Nlc3MYASAB",
-                    "KAgSZQoOaXRlbV90ZW1wbGF0ZXMYAiADKAsyTS5Qb2tlbW9uR28uUm9ja2V0",
-                    "QVBJLkdlbmVyYXRlZENvZGUuRG93bmxvYWRJdGVtVGVtcGxhdGVzUmVzcG9u",
-                    "c2UuSXRlbVRlbXBsYXRlEhQKDHRpbWVzdGFtcF9tcxgDIAEoBBqrCQoMSXRl",
-                    "bVRlbXBsYXRlEhMKC3RlbXBsYXRlX2lkGAEgASgJEkwKEHBva2Vtb25fc2V0",
-                    "dGluZ3MYAiABKAsyMi5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENv",
-                    "ZGUuUG9rZW1vblNldHRpbmdzEkYKDWl0ZW1fc2V0dGluZ3MYAyABKAsyLy5Q",
-                    "b2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuSXRlbVNldHRpbmdz",
-                    "EkYKDW1vdmVfc2V0dGluZ3MYBCABKAsyLy5Qb2tlbW9uR28uUm9ja2V0QVBJ",
-                    "LkdlbmVyYXRlZENvZGUuTW92ZVNldHRpbmdzElcKFm1vdmVfc2VxdWVuY2Vf",
-                    "c2V0dGluZ3MYBSABKAsyNy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUuTW92ZVNlcXVlbmNlU2V0dGluZ3MSUAoOdHlwZV9lZmZlY3RpdmUY",
-                    "CCABKAsyOC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuVHlw",
-                    "ZUVmZmVjdGl2ZVNldHRpbmdzEkgKDmJhZGdlX3NldHRpbmdzGAogASgLMjAu",
-                    "UG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkJhZGdlU2V0dGlu",
-                    "Z3MSQQoGY2FtZXJhGAsgASgLMjEuUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5l",
-                    "cmF0ZWRDb2RlLkNhbWVyYVNldHRpbmdzEkwKDHBsYXllcl9sZXZlbBgMIAEo",
-                    "CzI2LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5QbGF5ZXJM",
-                    "ZXZlbFNldHRpbmdzEkYKCWd5bV9sZXZlbBgNIAEoCzIzLlBva2Vtb25Hby5S",
-                    "b2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5HeW1MZXZlbFNldHRpbmdzEk0KD2Jh",
-                    "dHRsZV9zZXR0aW5ncxgOIAEoCzI0LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2Vu",
-                    "ZXJhdGVkQ29kZS5HeW1CYXR0bGVTZXR0aW5ncxJQChJlbmNvdW50ZXJfc2V0",
-                    "dGluZ3MYDyABKAsyNC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENv",
-                    "ZGUuRW5jb3VudGVyU2V0dGluZ3MSSwoQaWFwX2l0ZW1fZGlzcGxheRgQIAEo",
-                    "CzIxLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5JYXBJdGVt",
-                    "RGlzcGxheRJECgxpYXBfc2V0dGluZ3MYESABKAsyLi5Qb2tlbW9uR28uUm9j",
-                    "a2V0QVBJLkdlbmVyYXRlZENvZGUuSWFwU2V0dGluZ3MSUwoQcG9rZW1vbl91",
-                    "cGdyYWRlcxgSIAEoCzI5LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVk",
-                    "Q29kZS5Qb2tlbW9uVXBncmFkZVNldHRpbmdzElEKD2VxdWlwcGVkX2JhZGdl",
-                    "cxgTIAEoCzI4LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5F",
-                    "cXVpcHBlZEJhZGdlU2V0dGluZ3MiaQoVVXNlSXRlbUNhcHR1cmVSZXF1ZXN0",
-                    "EiAKB2l0ZW1faWQYASABKA4yDy5BbGxFbnVtLkl0ZW1JZBIUCgxlbmNvdW50",
-                    "ZXJfaWQYAiABKAYSGAoQc3Bhd25fcG9pbnRfZ3VpZBgDIAEoCSKxAQoWVXNl",
-                    "SXRlbUNhcHR1cmVSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEhkKEWl0ZW1f",
-                    "Y2FwdHVyZV9tdWx0GAIgASgBEhYKDml0ZW1fZmxlZV9tdWx0GAMgASgBEhUK",
-                    "DXN0b3BfbW92ZW1lbnQYBCABKAgSEwoLc3RvcF9hdHRhY2sYBSABKAgSEgoK",
-                    "dGFyZ2V0X21heBgGIAEoCBITCgt0YXJnZXRfc2xvdxgHIAEoCCIrChVSZWxl",
-                    "YXNlUG9rZW1vblJlcXVlc3QSEgoKcG9rZW1vbl9pZBgBIAEoBiLfAQoWUmVs",
-                    "ZWFzZVBva2Vtb25SZXNwb25zZRJQCgZyZXN1bHQYASABKA4yQC5Qb2tlbW9u",
-                    "R28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuUmVsZWFzZVBva2Vtb25SZXNw",
-                    "b25zZS5SZXN1bHQSFQoNY2FuZHlfYXdhcmRlZBgCIAEoBSJcCgZSZXN1bHQS",
-                    "CQoFVU5TRVQQABILCgdTVUNDRVNTEAESFAoQUE9LRU1PTl9ERVBMT1lFRBAC",
-                    "EgoKBkZBSUxFRBADEhgKFEVSUk9SX1BPS0VNT05fSVNfRUdHEAQiFwoVR2V0",
-                    "SGF0Y2hlZEVnZ3NSZXF1ZXN0Io4BChZHZXRIYXRjaGVkRWdnc1Jlc3BvbnNl",
-                    "Eg8KB3N1Y2Nlc3MYASABKAgSFgoKcG9rZW1vbl9pZBgCIAMoBEICEAESGgoS",
-                    "ZXhwZXJpZW5jZV9hd2FyZGVkGAMgAygFEhUKDWNhbmR5X2F3YXJkZWQYBCAD",
-                    "KAUSGAoQc3RhcmR1c3RfYXdhcmRlZBgFIAMoBSKGAQoRRm9ydFNlYXJjaFJl",
-                    "cXVlc3QSDwoHZm9ydF9pZBgBIAEoCRIXCg9wbGF5ZXJfbGF0aXR1ZGUYAiAB",
-                    "KAESGAoQcGxheWVyX2xvbmdpdHVkZRgDIAEoARIVCg1mb3J0X2xhdGl0dWRl",
-                    "GAQgASgBEhYKDmZvcnRfbG9uZ2l0dWRlGAUgASgBIq0EChJGb3J0U2VhcmNo",
-                    "UmVzcG9uc2USTAoGcmVzdWx0GAEgASgOMjwuUG9rZW1vbkdvLlJvY2tldEFQ",
-                    "SS5HZW5lcmF0ZWRDb2RlLkZvcnRTZWFyY2hSZXNwb25zZS5SZXN1bHQSVgoN",
-                    "aXRlbXNfYXdhcmRlZBgCIAMoCzI/LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2Vu",
-                    "ZXJhdGVkQ29kZS5Gb3J0U2VhcmNoUmVzcG9uc2UuSXRlbUF3YXJkEhQKDGdl",
-                    "bXNfYXdhcmRlZBgDIAEoBRJIChBwb2tlbW9uX2RhdGFfZWdnGAQgASgLMi4u",
-                    "UG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlBva2Vtb25EYXRh",
-                    "EhoKEmV4cGVyaWVuY2VfYXdhcmRlZBgFIAEoBRImCh5jb29sZG93bl9jb21w",
-                    "bGV0ZV90aW1lc3RhbXBfbXMYBiABKAMSIgoaY2hhaW5faGFja19zZXF1ZW5j",
-                    "ZV9udW1iZXIYByABKAUaQQoJSXRlbUF3YXJkEiAKB2l0ZW1faWQYASABKA4y",
-                    "Dy5BbGxFbnVtLkl0ZW1JZBISCgppdGVtX2NvdW50GAIgASgFImYKBlJlc3Vs",
-                    "dBIRCg1OT19SRVNVTFRfU0VUEAASCwoHU1VDQ0VTUxABEhAKDE9VVF9PRl9S",
-                    "QU5HRRACEhYKEklOX0NPT0xET1dOX1BFUklPRBADEhIKDklOVkVOVE9SWV9G",
-                    "VUxMEAQiSgoSRm9ydERldGFpbHNSZXF1ZXN0Eg8KB2ZvcnRfaWQYASABKAkS",
-                    "EAoIbGF0aXR1ZGUYAiABKAESEQoJbG9uZ2l0dWRlGAMgASgBIocDChNGb3J0",
-                    "RGV0YWlsc1Jlc3BvbnNlEg8KB2ZvcnRfaWQYASABKAkSJgoKdGVhbV9jb2xv",
-                    "chgCIAEoDjISLkFsbEVudW0uVGVhbUNvbG9yEkQKDHBva2Vtb25fZGF0YRgD",
-                    "IAEoCzIuLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5Qb2tl",
-                    "bW9uRGF0YRIMCgRuYW1lGAQgASgJEhIKCmltYWdlX3VybHMYBSADKAkSCgoC",
-                    "ZnAYBiABKAUSDwoHc3RhbWluYRgHIAEoBRITCgttYXhfc3RhbWluYRgIIAEo",
-                    "BRIfCgR0eXBlGAkgASgOMhEuQWxsRW51bS5Gb3J0VHlwZRIQCghsYXRpdHVk",
-                    "ZRgKIAEoARIRCglsb25naXR1ZGUYCyABKAESEwoLZGVzY3JpcHRpb24YDCAB",
-                    "KAkSQgoJbW9kaWZpZXJzGA0gAygLMi8uUG9rZW1vbkdvLlJvY2tldEFQSS5H",
-                    "ZW5lcmF0ZWRDb2RlLkZvcnRNb2RpZmllciJzCgxGb3J0TW9kaWZpZXISIAoH",
-                    "aXRlbV9pZBgBIAEoDjIPLkFsbEVudW0uSXRlbUlkEh8KF2V4cGlyYXRpb25f",
-                    "dGltZXN0YW1wX21zGAIgASgDEiAKGGRlcGxveWVyX3BsYXllcl9jb2RlbmFt",
-                    "ZRgDIAEoCSJyChBFbmNvdW50ZXJSZXF1ZXN0EhQKDGVuY291bnRlcl9pZBgB",
-                    "IAEoBhIVCg1zcGF3bnBvaW50X2lkGAIgASgJEhcKD3BsYXllcl9sYXRpdHVk",
-                    "ZRgDIAEoARIYChBwbGF5ZXJfbG9uZ2l0dWRlGAQgASgBIs0EChFFbmNvdW50",
-                    "ZXJSZXNwb25zZRJECgx3aWxkX3Bva2Vtb24YASABKAsyLi5Qb2tlbW9uR28u",
-                    "Um9ja2V0QVBJLkdlbmVyYXRlZENvZGUuV2lsZFBva2Vtb24SUwoKYmFja2dy",
-                    "b3VuZBgCIAEoDjI/LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29k",
-                    "ZS5FbmNvdW50ZXJSZXNwb25zZS5CYWNrZ3JvdW5kEksKBnN0YXR1cxgDIAEo",
-                    "DjI7LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5FbmNvdW50",
-                    "ZXJSZXNwb25zZS5TdGF0dXMSUgoTY2FwdHVyZV9wcm9iYWJpbGl0eRgEIAEo",
-                    "CzI1LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5DYXB0dXJl",
-                    "UHJvYmFiaWxpdHkiIgoKQmFja2dyb3VuZBIICgRQQVJLEAASCgoGREVTRVJU",
-                    "EAEi1wEKBlN0YXR1cxITCg9FTkNPVU5URVJfRVJST1IQABIVChFFTkNPVU5U",
-                    "RVJfU1VDQ0VTUxABEhcKE0VOQ09VTlRFUl9OT1RfRk9VTkQQAhIUChBFTkNP",
-                    "VU5URVJfQ0xPU0VEEAMSGgoWRU5DT1VOVEVSX1BPS0VNT05fRkxFRBAEEhoK",
-                    "FkVOQ09VTlRFUl9OT1RfSU5fUkFOR0UQBRIeChpFTkNPVU5URVJfQUxSRUFE",
-                    "WV9IQVBQRU5FRBAGEhoKFlBPS0VNT05fSU5WRU5UT1JZX0ZVTEwQByJ7ChJD",
-                    "YXB0dXJlUHJvYmFiaWxpdHkSJgoNcG9rZWJhbGxfdHlwZRgBIAMoDjIPLkFs",
-                    "bEVudW0uSXRlbUlkEhsKE2NhcHR1cmVfcHJvYmFiaWxpdHkYAiADKAISIAoY",
-                    "cmV0aWNsZV9kaWZmaWN1bHR5X3NjYWxlGAwgASgBInAKFERpc2tFbmNvdW50",
-                    "ZXJSZXF1ZXN0EhQKDGVuY291bnRlcl9pZBgBIAEoBhIPCgdmb3J0X2lkGAIg",
-                    "ASgJEhcKD3BsYXllcl9sYXRpdHVkZRgDIAEoARIYChBwbGF5ZXJfbG9uZ2l0",
-                    "dWRlGAQgASgBIogDChVEaXNrRW5jb3VudGVyUmVzcG9uc2USTwoGcmVzdWx0",
-                    "GAEgASgOMj8uUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkRp",
-                    "c2tFbmNvdW50ZXJSZXNwb25zZS5SZXN1bHQSRAoMcG9rZW1vbl9kYXRhGAIg",
-                    "ASgLMi4uUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlBva2Vt",
-                    "b25EYXRhElIKE2NhcHR1cmVfcHJvYmFiaWxpdHkYAyABKAsyNS5Qb2tlbW9u",
-                    "R28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuQ2FwdHVyZVByb2JhYmlsaXR5",
-                    "IoMBCgZSZXN1bHQSCwoHVU5LTk9XThAAEgsKB1NVQ0NFU1MQARIRCg1OT1Rf",
-                    "QVZBSUxBQkxFEAISEAoMTk9UX0lOX1JBTkdFEAMSHgoaRU5DT1VOVEVSX0FM",
-                    "UkVBRFlfRklOSVNIRUQQBBIaChZQT0tFTU9OX0lOVkVOVE9SWV9GVUxMEAUi",
-                    "wwEKE0NhdGNoUG9rZW1vblJlcXVlc3QSFAoMZW5jb3VudGVyX2lkGAEgASgG",
-                    "EhAKCHBva2ViYWxsGAIgASgFEh8KF25vcm1hbGl6ZWRfcmV0aWNsZV9zaXpl",
-                    "GAMgASgBEhgKEHNwYXduX3BvaW50X2d1aWQYBCABKAkSEwoLaGl0X3Bva2Vt",
-                    "b24YBSABKAgSFQoNc3Bpbl9tb2RpZmllchgGIAEoARIdChVOb3JtYWxpemVk",
-                    "SGl0UG9zaXRpb24YByABKAEixgIKFENhdGNoUG9rZW1vblJlc3BvbnNlElMK",
-                    "BnN0YXR1cxgBIAEoDjJDLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVk",
-                    "Q29kZS5DYXRjaFBva2Vtb25SZXNwb25zZS5DYXRjaFN0YXR1cxIUCgxtaXNz",
-                    "X3BlcmNlbnQYAiABKAESGwoTY2FwdHVyZWRfcG9rZW1vbl9pZBgDIAEoBBI/",
-                    "CgZzY29yZXMYBCABKAsyLy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUuQ2FwdHVyZVNjb3JlImUKC0NhdGNoU3RhdHVzEg8KC0NBVENIX0VS",
-                    "Uk9SEAASEQoNQ0FUQ0hfU1VDQ0VTUxABEhAKDENBVENIX0VTQ0FQRRACEg4K",
-                    "CkNBVENIX0ZMRUUQAxIQCgxDQVRDSF9NSVNTRUQQBCJpCgxDYXB0dXJlU2Nv",
-                    "cmUSLAoNYWN0aXZpdHlfdHlwZRgBIAMoDjIVLkFsbEVudW0uQWN0aXZpdHlU",
-                    "eXBlEgoKAnhwGAIgAygFEg0KBWNhbmR5GAMgAygFEhAKCHN0YXJkdXN0GAQg",
-                    "AygFIhsKGUNoZWNrQXdhcmRlZEJhZGdlc1JlcXVlc3QidwoaQ2hlY2tBd2Fy",
-                    "ZGVkQmFkZ2VzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIqCg5hd2FyZGVk",
-                    "X2JhZGdlcxgCIAMoDjISLkFsbEVudW0uQmFkZ2VUeXBlEhwKFGF3YXJkZWRf",
-                    "YmFkZ2VfbGV2ZWxzGAMgAygFInkKFUVxdWlwcGVkQmFkZ2VTZXR0aW5ncxIf",
-                    "ChdlcXVpcF9iYWRnZV9jb29sZG93bl9tcxgBIAEoAxIfChdjYXRjaF9wcm9i",
-                    "YWJpbGl0eV9ib251cxgCIAMoAhIeChZmbGVlX3Byb2JhYmlsaXR5X2JvbnVz",
-                    "GAMgAygCIoQBChZQb2tlbW9uVXBncmFkZVNldHRpbmdzEhoKEnVwZ3JhZGVz",
-                    "X3Blcl9sZXZlbBgBIAEoBRIjChthbGxvd2VkX2xldmVsc19hYm92ZV9wbGF5",
-                    "ZXIYAiABKAUSEgoKY2FuZHlfY29zdBgDIAMoBRIVCg1zdGFyZHVzdF9jb3N0",
-                    "GAQgAygFIowCCgtJYXBTZXR0aW5ncxIZChFkYWlseV9ib251c19jb2lucxgB",
-                    "IAEoBRIoCiBkYWlseV9kZWZlbmRlcl9ib251c19wZXJfcG9rZW1vbhgCIAMo",
-                    "BRIqCiJkYWlseV9kZWZlbmRlcl9ib251c19tYXhfZGVmZW5kZXJzGAMgASgF",
-                    "EiUKHWRhaWx5X2RlZmVuZGVyX2JvbnVzX2N1cnJlbmN5GAQgAygJEiIKGm1p",
-                    "bl90aW1lX2JldHdlZW5fY2xhaW1zX21zGAUgASgDEhsKE2RhaWx5X2JvbnVz",
-                    "X2VuYWJsZWQYBiABKAgSJAocZGFpbHlfZGVmZW5kZXJfYm9udXNfZW5hYmxl",
-                    "ZBgHIAEoCCKUAQoOSWFwSXRlbURpc3BsYXkSCwoDc2t1GAEgASgJEi4KCGNh",
-                    "dGVnb3J5GAIgASgOMhwuQWxsRW51bS5Ib2xvSWFwSXRlbUNhdGVnb3J5EhIK",
-                    "CnNvcnRfb3JkZXIYAyABKAUSIQoIaXRlbV9pZHMYBCADKA4yDy5BbGxFbnVt",
-                    "Lkl0ZW1JZBIOCgZjb3VudHMYBSADKAUirgEKEUVuY291bnRlclNldHRpbmdz",
-                    "EhwKFHNwaW5fYm9udXNfdGhyZXNob2xkGAEgASgCEiEKGWV4Y2VsbGVudF90",
-                    "aHJvd190aHJlc2hvbGQYAiABKAISHQoVZ3JlYXRfdGhyb3dfdGhyZXNob2xk",
-                    "GAMgASgCEhwKFG5pY2VfdGhyb3dfdGhyZXNob2xkGAQgASgCEhsKE21pbGVz",
-                    "dG9uZV90aHJlc2hvbGQYBSABKAUixgMKEUd5bUJhdHRsZVNldHRpbmdzEhYK",
-                    "DmVuZXJneV9wZXJfc2VjGAEgASgCEhkKEWRvZGdlX2VuZXJneV9jb3N0GAIg",
-                    "ASgCEhgKEHJldGFyZ2V0X3NlY29uZHMYAyABKAISHQoVZW5lbXlfYXR0YWNr",
-                    "X2ludGVydmFsGAQgASgCEh4KFmF0dGFja19zZXJ2ZXJfaW50ZXJ2YWwYBSAB",
-                    "KAISHgoWcm91bmRfZHVyYXRpb25fc2Vjb25kcxgGIAEoAhIjChtib251c190",
-                    "aW1lX3Blcl9hbGx5X3NlY29uZHMYByABKAISJAocbWF4aW11bV9hdHRhY2tl",
-                    "cnNfcGVyX2JhdHRsZRgIIAEoBRIpCiFzYW1lX3R5cGVfYXR0YWNrX2JvbnVz",
-                    "X211bHRpcGxpZXIYCSABKAISFgoObWF4aW11bV9lbmVyZ3kYCiABKAUSJAoc",
-                    "ZW5lcmd5X2RlbHRhX3Blcl9oZWFsdGhfbG9zdBgLIAEoAhIZChFkb2RnZV9k",
-                    "dXJhdGlvbl9tcxgMIAEoBRIcChRtaW5pbXVtX3BsYXllcl9sZXZlbBgNIAEo",
-                    "BRIYChBzd2FwX2R1cmF0aW9uX21zGA4gASgFIncKEEd5bUxldmVsU2V0dGlu",
-                    "Z3MSGwoTcmVxdWlyZWRfZXhwZXJpZW5jZRgBIAMoBRIUCgxsZWFkZXJfc2xv",
-                    "dHMYAiADKAUSFQoNdHJhaW5lcl9zbG90cxgDIAMoBRIZChFzZWFyY2hfcm9s",
-                    "bF9ib251cxgEIAMoBSKdAQoTUGxheWVyTGV2ZWxTZXR0aW5ncxIQCghyYW5r",
-                    "X251bRgBIAMoBRIbChNyZXF1aXJlZF9leHBlcmllbmNlGAIgAygFEhUKDWNw",
-                    "X211bHRpcGxpZXIYAyADKAISHAoUbWF4X2VnZ19wbGF5ZXJfbGV2ZWwYBCAB",
-                    "KAUSIgoabWF4X2VuY291bnRlcl9wbGF5ZXJfbGV2ZWwYBSABKAUixQMKDkNh",
-                    "bWVyYVNldHRpbmdzEhMKC25leHRfY2FtZXJhGAEgASgJEjMKDWludGVycG9s",
-                    "YXRpb24YAiADKA4yHC5BbGxFbnVtLkNhbWVyYUludGVycG9sYXRpb24SKgoL",
-                    "dGFyZ2V0X3R5cGUYAyADKA4yFS5BbGxFbnVtLkNhbWVyYVRhcmdldBIVCg1l",
-                    "YXNlX2luX3NwZWVkGAQgAygCEhYKDmVhc3Rfb3V0X3NwZWVkGAUgAygCEhgK",
-                    "EGR1cmF0aW9uX3NlY29uZHMYBiADKAISFAoMd2FpdF9zZWNvbmRzGAcgAygC",
-                    "EhoKEnRyYW5zaXRpb25fc2Vjb25kcxgIIAMoAhIUCgxhbmdsZV9kZWdyZWUY",
-                    "CSADKAISGwoTYW5nbGVfb2Zmc2V0X2RlZ3JlZRgKIAMoAhIUCgxwaXRjaF9k",
-                    "ZWdyZWUYCyADKAISGwoTcGl0Y2hfb2Zmc2V0X2RlZ3JlZRgMIAMoAhITCgty",
-                    "b2xsX2RlZ3JlZRgNIAMoAhIXCg9kaXN0YW5jZV9tZXRlcnMYDiADKAISFgoO",
-                    "aGVpZ2h0X3BlcmNlbnQYDyADKAISFgoOdmVydF9jdHJfcmF0aW8YECADKAIi",
-                    "XAoNQmFkZ2VTZXR0aW5ncxImCgpiYWRnZV90eXBlGAEgASgOMhIuQWxsRW51",
-                    "bS5CYWRnZVR5cGUSEgoKYmFkZ2VfcmFuaxgCIAEoBRIPCgd0YXJnZXRzGAMg",
-                    "AygFIlkKFVR5cGVFZmZlY3RpdmVTZXR0aW5ncxIVCg1hdHRhY2tfc2NhbGFy",
-                    "GAEgAygCEikKC2F0dGFja190eXBlGAIgASgOMhQuQWxsRW51bS5Qb2tlbW9u",
-                    "VHlwZSIoChRNb3ZlU2VxdWVuY2VTZXR0aW5ncxIQCghzZXF1ZW5jZRgBIAMo",
-                    "CSKnAwoMTW92ZVNldHRpbmdzEjEKC21vdmVtZW50X2lkGAEgASgOMhwuQWxs",
-                    "RW51bS5Qb2tlbW9uTW92ZW1lbnRUeXBlEhQKDGFuaW1hdGlvbl9pZBgCIAEo",
-                    "BRIqCgxwb2tlbW9uX3R5cGUYAyABKA4yFC5BbGxFbnVtLlBva2Vtb25UeXBl",
-                    "Eg0KBXBvd2VyGAQgASgCEhcKD2FjY3VyYWN5X2NoYW5jZRgFIAEoAhIXCg9j",
-                    "cml0aWNhbF9jaGFuY2UYBiABKAISEwoLaGVhbF9zY2FsYXIYByABKAISGwoT",
-                    "c3RhbWluYV9sb3NzX3NjYWxhchgIIAEoAhIZChF0cmFpbmVyX2xldmVsX21p",
-                    "bhgJIAEoBRIZChF0cmFpbmVyX2xldmVsX21heBgKIAEoBRIQCgh2ZnhfbmFt",
-                    "ZRgLIAEoCRITCgtkdXJhdGlvbl9tcxgMIAEoBRIeChZkYW1hZ2Vfd2luZG93",
-                    "X3N0YXJ0X21zGA0gASgFEhwKFGRhbWFnZV93aW5kb3dfZW5kX21zGA4gASgF",
-                    "EhQKDGVuZXJneV9kZWx0YRgPIAEoBSK+BgoPUG9rZW1vblNldHRpbmdzEiYK",
-                    "CnBva2Vtb25faWQYASABKA4yEi5BbGxFbnVtLlBva2Vtb25JZBITCgttb2Rl",
-                    "bF9zY2FsZRgDIAEoAhIiCgR0eXBlGAQgASgOMhQuQWxsRW51bS5Qb2tlbW9u",
-                    "VHlwZRIkCgZ0eXBlXzIYBSABKA4yFC5BbGxFbnVtLlBva2Vtb25UeXBlEkMK",
-                    "BmNhbWVyYRgGIAEoCzIzLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVk",
-                    "Q29kZS5DYW1lcmFBdHRyaWJ1dGVzEkkKCWVuY291bnRlchgHIAEoCzI2LlBv",
-                    "a2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5FbmNvdW50ZXJBdHRy",
-                    "aWJ1dGVzEkEKBXN0YXRzGAggASgLMjIuUG9rZW1vbkdvLlJvY2tldEFQSS5H",
-                    "ZW5lcmF0ZWRDb2RlLlN0YXRzQXR0cmlidXRlcxIpCgtxdWlja19tb3ZlcxgJ",
-                    "IAMoDjIULkFsbEVudW0uUG9rZW1vbk1vdmUSLQoPY2luZW1hdGljX21vdmVz",
-                    "GAogAygOMhQuQWxsRW51bS5Qb2tlbW9uTW92ZRIWCg5hbmltYXRpb25fdGlt",
-                    "ZRgLIAMoAhIpCg1ldm9sdXRpb25faWRzGAwgAygOMhIuQWxsRW51bS5Qb2tl",
-                    "bW9uSWQSFgoOZXZvbHV0aW9uX3BpcHMYDSABKAUSJAoFY2xhc3MYDiABKA4y",
-                    "FS5BbGxFbnVtLlBva2Vtb25DbGFzcxIYChBwb2tlZGV4X2hlaWdodF9tGA8g",
-                    "ASgCEhkKEXBva2VkZXhfd2VpZ2h0X2tnGBAgASgCEi0KEXBhcmVudF9wb2tl",
-                    "bW9uX2lkGBEgASgOMhIuQWxsRW51bS5Qb2tlbW9uSWQSFgoOaGVpZ2h0X3N0",
-                    "ZF9kZXYYEiABKAISFgoOd2VpZ2h0X3N0ZF9kZXYYEyABKAISHAoUa21fZGlz",
-                    "dGFuY2VfdG9faGF0Y2gYFCABKAISKwoJZmFtaWx5X2lkGBUgASgOMhguQWxs",
-                    "RW51bS5Qb2tlbW9uRmFtaWx5SWQSFwoPY2FuZHlfdG9fZXZvbHZlGBYgASgF",
-                    "IpcBChBDYW1lcmFBdHRyaWJ1dGVzEhUKDWRpc2tfcmFkaXVzX20YASABKAIS",
-                    "GQoRY3lsaW5kZXJfcmFkaXVzX20YAiABKAISGQoRY3lsaW5kZXJfaGVpZ2h0",
-                    "X20YAyABKAISGQoRY3lsaW5kZXJfZ3JvdW5kX20YBCABKAISGwoTc2hvdWxk",
-                    "ZXJfbW9kZV9zY2FsZRgFIAEoAiKdAgoTRW5jb3VudGVyQXR0cmlidXRlcxIZ",
-                    "ChFiYXNlX2NhcHR1cmVfcmF0ZRgBIAEoAhIWCg5iYXNlX2ZsZWVfcmF0ZRgC",
-                    "IAEoAhIaChJjb2xsaXNpb25fcmFkaXVzX20YAyABKAISGgoSY29sbGlzaW9u",
-                    "X2hlaWdodF9tGAQgASgCEh8KF2NvbGxpc2lvbl9oZWFkX3JhZGl1c19tGAUg",
-                    "ASgCEjMKDW1vdmVtZW50X3R5cGUYBiABKA4yHC5BbGxFbnVtLlBva2Vtb25N",
-                    "b3ZlbWVudFR5cGUSGAoQbW92ZW1lbnRfdGltZXJfcxgHIAEoAhITCgtqdW1w",
-                    "X3RpbWVfcxgIIAEoAhIWCg5hdHRhY2tfdGltZXJfcxgJIAEoAiJuCg9TdGF0",
-                    "c0F0dHJpYnV0ZXMSFAoMYmFzZV9zdGFtaW5hGAEgASgFEhMKC2Jhc2VfYXR0",
-                    "YWNrGAIgASgFEhQKDGJhc2VfZGVmZW5zZRgDIAEoBRIaChJkb2RnZV9lbmVy",
-                    "Z3lfZGVsdGEYCCABKAUinAcKDEl0ZW1TZXR0aW5ncxIgCgdpdGVtX2lkGAEg",
-                    "ASgOMg8uQWxsRW51bS5JdGVtSWQSJAoJaXRlbV90eXBlGAIgASgOMhEuQWxs",
-                    "RW51bS5JdGVtVHlwZRInCghjYXRlZ29yeRgDIAEoDjIVLkFsbEVudW0uSXRl",
-                    "bUNhdGVnb3J5EhEKCWRyb3BfZnJlcRgEIAEoAhIaChJkcm9wX3RyYWluZXJf",
-                    "bGV2ZWwYBSABKAUSRwoIcG9rZWJhbGwYBiABKAsyNS5Qb2tlbW9uR28uUm9j",
-                    "a2V0QVBJLkdlbmVyYXRlZENvZGUuUG9rZWJhbGxBdHRyaWJ1dGVzEkMKBnBv",
-                    "dGlvbhgHIAEoCzIzLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29k",
-                    "ZS5Qb3Rpb25BdHRyaWJ1dGVzEkMKBnJldml2ZRgIIAEoCzIzLlBva2Vtb25H",
-                    "by5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5SZXZpdmVBdHRyaWJ1dGVzEkMK",
-                    "BmJhdHRsZRgJIAEoCzIzLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVk",
-                    "Q29kZS5CYXR0bGVBdHRyaWJ1dGVzEj8KBGZvb2QYCiABKAsyMS5Qb2tlbW9u",
-                    "R28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRm9vZEF0dHJpYnV0ZXMSWAoR",
-                    "aW52ZW50b3J5X3VwZ3JhZGUYCyABKAsyPS5Qb2tlbW9uR28uUm9ja2V0QVBJ",
-                    "LkdlbmVyYXRlZENvZGUuSW52ZW50b3J5VXBncmFkZUF0dHJpYnV0ZXMSTgoI",
-                    "eHBfYm9vc3QYDCABKAsyPC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUuRXhwZXJpZW5jZUJvb3N0QXR0cmlidXRlcxJFCgdpbmNlbnNlGA0g",
-                    "ASgLMjQuUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkluY2Vu",
-                    "c2VBdHRyaWJ1dGVzElAKDWVnZ19pbmN1YmF0b3IYDiABKAsyOS5Qb2tlbW9u",
-                    "R28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRWdnSW5jdWJhdG9yQXR0cmli",
-                    "dXRlcxJQCg1mb3J0X21vZGlmaWVyGA8gASgLMjkuUG9rZW1vbkdvLlJvY2tl",
-                    "dEFQSS5HZW5lcmF0ZWRDb2RlLkZvcnRNb2RpZmllckF0dHJpYnV0ZXMiJwoQ",
-                    "QmF0dGxlQXR0cmlidXRlcxITCgtzdGFfcGVyY2VudBgBIAEoAiJ2ChZFZ2dJ",
-                    "bmN1YmF0b3JBdHRyaWJ1dGVzEjEKDmluY3ViYXRvcl90eXBlGAEgASgOMhku",
-                    "QWxsRW51bS5FZ2dJbmN1YmF0b3JUeXBlEgwKBHVzZXMYAiABKAUSGwoTZGlz",
-                    "dGFuY2VfbXVsdGlwbGllchgDIAEoAiJNChlFeHBlcmllbmNlQm9vc3RBdHRy",
-                    "aWJ1dGVzEhUKDXhwX211bHRpcGxpZXIYASABKAISGQoRYm9vc3RfZHVyYXRp",
-                    "b25fbXMYAiABKAUibwoORm9vZEF0dHJpYnV0ZXMSKAoLaXRlbV9lZmZlY3QY",
-                    "ASADKA4yEy5BbGxFbnVtLkl0ZW1FZmZlY3QSGwoTaXRlbV9lZmZlY3RfcGVy",
-                    "Y2VudBgCIAMoAhIWCg5ncm93dGhfcGVyY2VudBgDIAEoAiJiChZGb3J0TW9k",
-                    "aWZpZXJBdHRyaWJ1dGVzEiEKGW1vZGlmaWVyX2xpZmV0aW1lX3NlY29uZHMY",
-                    "ASABKAUSJQoddHJveV9kaXNrX251bV9wb2tlbW9uX3NwYXduZWQYAiABKAUi",
-                    "yQIKEUluY2Vuc2VBdHRyaWJ1dGVzEiAKGGluY2Vuc2VfbGlmZXRpbWVfc2Vj",
-                    "b25kcxgBIAEoBRIqCgxwb2tlbW9uX3R5cGUYAiADKA4yFC5BbGxFbnVtLlBv",
-                    "a2Vtb25UeXBlEigKIHBva2Vtb25faW5jZW5zZV90eXBlX3Byb2JhYmlsaXR5",
-                    "GAMgASgCEjAKKHN0YW5kaW5nX3RpbWVfYmV0d2Vlbl9lbmNvdW50ZXJzX3Nl",
-                    "Y29uZHMYBCABKAUSLQolbW92aW5nX3RpbWVfYmV0d2Vlbl9lbmNvdW50ZXJf",
-                    "c2Vjb25kcxgFIAEoBRI1Ci1kaXN0YW5jZV9yZXF1aXJlZF9mb3Jfc2hvcnRl",
-                    "cl9pbnRlcnZhbF9tZXRlcnMYBiABKAUSJAoccG9rZW1vbl9hdHRyYWN0ZWRf",
-                    "bGVuZ3RoX3NlYxgHIAEoBSJtChpJbnZlbnRvcnlVcGdyYWRlQXR0cmlidXRl",
-                    "cxIaChJhZGRpdGlvbmFsX3N0b3JhZ2UYASABKAUSMwoMdXBncmFkZV90eXBl",
-                    "GAIgASgOMh0uQWxsRW51bS5JbnZlbnRvcnlVcGdyYWRlVHlwZSKMAQoSUG9r",
-                    "ZWJhbGxBdHRyaWJ1dGVzEigKC2l0ZW1fZWZmZWN0GAEgASgOMhMuQWxsRW51",
-                    "bS5JdGVtRWZmZWN0EhUKDWNhcHR1cmVfbXVsdGkYAiABKAISHAoUY2FwdHVy",
-                    "ZV9tdWx0aV9lZmZlY3QYAyABKAISFwoPaXRlbV9lZmZlY3RfbW9kGAQgASgC",
-                    "IjsKEFBvdGlvbkF0dHJpYnV0ZXMSEwoLc3RhX3BlcmNlbnQYASABKAISEgoK",
-                    "c3RhX2Ftb3VudBgCIAEoBSInChBSZXZpdmVBdHRyaWJ1dGVzEhMKC3N0YV9w",
-                    "ZXJjZW50GAEgASgCIiQKD1RyYW5zZmVyUG9rZW1vbhIRCglQb2tlbW9uSWQY",
-                    "ASABKAYiOgoSVHJhbnNmZXJQb2tlbW9uT3V0Eg4KBlN0YXR1cxgBIAEoBRIU",
-                    "CgxDYW5keUF3YXJkZWQYAiABKAUiIgoNRXZvbHZlUG9rZW1vbhIRCglQb2tl",
-                    "bW9uSWQYASABKAYikAEKEEV2b2x2ZVBva2Vtb25PdXQSDgoGUmVzdWx0GAEg",
-                    "ASgFEkIKDkV2b2x2ZWRQb2tlbW9uGAIgASgLMiouUG9rZW1vbkdvLlJvY2tl",
-                    "dEFQSS5HZW5lcmF0ZWRDb2RlLlBva2Vtb24SEgoKRXhwQXdhcmRlZBgDIAEo",
-                    "BRIUCgxDYW5keUF3YXJkZWQYBCABKAViBnByb3RvMw=="));
-            descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-                new pbr::FileDescriptor[] { global::AllEnum.AllEnumReflection.Descriptor, },
-                new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[]
-                {
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.GetPlayerResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GetPlayerResponse.Parser,
-                        new[] {"Unknown1", "Profile"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Profile),
-                        global::PokemonGo.RocketAPI.GeneratedCode.Profile.Parser,
-                        new[]
-                        {
-                            "CreationTime", "Username", "Team", "Tutorial", "Avatar", "PokeStorage", "ItemStorage",
-                            "DailyBonus", "Unknown12", "Unknown13", "Currency"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.DailyBonus),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DailyBonus.Parser,
-                        new[] {"NextCollectTimestampMs", "NextDefenderBonusCollectTimestampMs"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Currency),
-                        global::PokemonGo.RocketAPI.GeneratedCode.Currency.Parser, new[] {"Type", "Amount"}, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.AvatarDetails),
-                        global::PokemonGo.RocketAPI.GeneratedCode.AvatarDetails.Parser,
-                        new[] {"Unknown2", "Unknown3", "Unknown9", "Unknown10"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.DownloadSettingsRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DownloadSettingsRequest.Parser, new[] {"Hash"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.GetInventoryResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GetInventoryResponse.Parser,
-                        new[] {"Success", "InventoryDelta"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventoryDelta),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventoryDelta.Parser,
-                        new[] {"OriginalTimestampMs", "NewTimestampMs", "InventoryItems"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem.Parser,
-                        new[] {"ModifiedTimestampMs", "DeletedItemKey", "InventoryItemData"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventoryItemData),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventoryItemData.Parser,
-                        new[]
-                        {
-                            "Pokemon", "Item", "PokedexEntry", "PlayerStats", "PlayerCurrency", "PlayerCamera",
-                            "InventoryUpgrades", "AppliedItems", "EggIncubators", "PokemonFamily"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Pokemon),
-                        global::PokemonGo.RocketAPI.GeneratedCode.Pokemon.Parser,
-                        new[]
-                        {
-                            "Id", "PokemonType", "Cp", "Stamina", "StaminaMax", "Move1", "Move2", "DeployedFortId",
-                            "OwnerName", "IsEgg", "EggKmWalkedTarget", "EggKmWalkedStart", "Origin", "HeightM",
-                            "WeightKg", "IndividualAttack", "IndividualDefense", "IndividualStamina", "CpMultiplier",
-                            "Pokeball", "CapturedCellId", "BattlesAttacked", "BattlesDefended", "EggIncubatorId",
-                            "CreationTimeMs", "NumUpgrades", "AdditionalCpMultiplier", "Favorite", "Nickname",
-                            "FromFort"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Item),
-                        global::PokemonGo.RocketAPI.GeneratedCode.Item.Parser, new[] {"Item_", "Count", "Unseen"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PokedexEntry),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PokedexEntry.Parser,
-                        new[]
-                        {
-                            "PokedexEntryNumber", "TimesEncountered", "TimesCaptured", "EvolutionStonePieces",
-                            "EvolutionStones"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PlayerStats),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PlayerStats.Parser,
-                        new[]
-                        {
-                            "Level", "Experience", "PrevLevelXp", "NextLevelXp", "KmWalked", "PokemonsEncountered",
-                            "UniquePokedexEntries", "PokemonsCaptured", "Evolutions", "PokeStopVisits",
-                            "PokeballsThrown", "EggsHatched", "BigMagikarpCaught", "BattleAttackWon",
-                            "BattleAttackTotal", "BattleDefendedWon", "BattleTrainingWon", "BattleTrainingTotal",
-                            "PrestigeRaisedTotal", "PrestigeDroppedTotal", "PokemonDeployed", "PokemonCaughtByType",
-                            "SmallRattataCaught"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PlayerCurrency),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PlayerCurrency.Parser, new[] {"Gems"}, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PlayerCamera),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PlayerCamera.Parser, new[] {"IsDefaultCamera"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrades),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrades.Parser, new[] {"InventoryUpgrades_"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade.Parser,
-                        new[] {"Item", "UpgradeType", "AdditionalStorage"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.AppliedItems),
-                        global::PokemonGo.RocketAPI.GeneratedCode.AppliedItems.Parser, new[] {"Item"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.AppliedItem),
-                        global::PokemonGo.RocketAPI.GeneratedCode.AppliedItem.Parser,
-                        new[] {"ItemType", "ItemTypeCategory", "ExpireMs", "AppliedMs"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EggIncubators),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EggIncubators.Parser, new[] {"EggIncubator"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EggIncubator),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EggIncubator.Parser,
-                        new[]
-                        {
-                            "ItemId", "ItemType", "IncubatorType", "UsesRemaining", "PokemonId", "StartKmWalked",
-                            "TargetKmWalked"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PokemonFamily),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PokemonFamily.Parser, new[] {"FamilyId", "Candy"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.GetMapObjectsRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GetMapObjectsRequest.Parser,
-                        new[] {"CellId", "SinceTimestampMs", "Latitude", "Longitude"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.GetMapObjectsResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GetMapObjectsResponse.Parser,
-                        new[] {"MapCells", "Status"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.MapCell),
-                        global::PokemonGo.RocketAPI.GeneratedCode.MapCell.Parser,
-                        new[]
-                        {
-                            "S2CellId", "CurrentTimestampMs", "Forts", "SpawnPoints", "DeletedObjects", "IsTruncatedList",
-                            "FortSummaries", "DecimatedSpawnPoints", "WildPokemons", "CatchablePokemons",
-                            "NearbyPokemons"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortData),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortData.Parser,
-                        new[]
-                        {
-                            "Id", "LastModifiedTimestampMs", "Latitude", "Longitude", "Enabled", "Type", "OwnedByTeam",
-                            "GuardPokemonId", "GuardPokemonCp", "GymPoints", "IsInBattle", "CooldownCompleteTimestampMs",
-                            "Sponsor", "RenderingType", "ActiveFortModifier", "LureInfo"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortLureInfo),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortLureInfo.Parser,
-                        new[] {"FortId", "Unknown2", "ActivePokemonId", "LureExpiresTimestampMs"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint),
-                        global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint.Parser, new[] {"Latitude", "Longitude"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortSummary),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortSummary.Parser,
-                        new[] {"FortSummaryId", "LastModifiedTimestampMs", "Latitude", "Longitude"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon),
-                        global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon.Parser,
-                        new[]
-                        {
-                            "EncounterId", "LastModifiedTimestampMs", "Latitude", "Longitude", "SpawnpointId",
-                            "PokemonData", "TimeTillHiddenMs"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PokemonData),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PokemonData.Parser,
-                        new[]
-                        {
-                            "Id", "PokemonId", "Cp", "Stamina", "StaminaMax", "Move1", "Move2", "DeployedFortId",
-                            "OwnerName", "IsEgg", "EggKmWalkedTarget", "EggKmWalkedStart", "Origin", "HeightM",
-                            "WeightKg", "IndividualAttack", "IndividualDefense", "IndividualStamina", "CpMultiplier",
-                            "Pokeball", "CapturedCellId", "BattlesAttacked", "BattlesDefended", "EggIncubatorId",
-                            "CreationTimeMs", "NumUpgrades", "AdditionalCpMultiplier", "Favorite", "Nickname",
-                            "FromFort"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon),
-                        global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon.Parser,
-                        new[]
-                        {"SpawnpointId", "EncounterId", "PokemonId", "ExpirationTimestampMs", "Latitude", "Longitude"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon),
-                        global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon.Parser,
-                        new[] {"PokemonId", "DistanceInMeters", "EncounterId"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.DownloadSettingsResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DownloadSettingsResponse.Parser,
-                        new[] {"Error", "Hash", "Settings"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.GlobalSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GlobalSettings.Parser,
-                        new[]
-                        {"FortSettings", "MapSettings", "LevelSettings", "InventorySettings", "MinimumClientVersion"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortSettings.Parser,
-                        new[]
-                        {
-                            "InteractionRangeMeters", "MaxTotalDeployedPokemon", "MaxPlayerDeployedPokemon",
-                            "DeployStaminaMultiplier", "DeployAttackMultiplier", "FarInteractionRangeMeters"
-                        }, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.MapSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.MapSettings.Parser,
-                        new[]
-                        {
-                            "PokemonVisibleRange", "PokeNavRangeMeters", "EncounterRangeMeters",
-                            "GetMapObjectsMinRefreshSeconds", "GetMapObjectsMaxRefreshSeconds",
-                            "GetMapObjectsMinDistanceMeters", "GoogleMapsApiKey"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.LevelSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.LevelSettings.Parser,
-                        new[] {"TrainerCpModifier", "TrainerDifficultyModifier"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventorySettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventorySettings.Parser,
-                        new[] {"MaxPokemon", "MaxBagItems", "BasePokemon", "BaseBagItems", "BaseEggs"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.PlayerUpdateRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PlayerUpdateRequest.Parser,
-                        new[] {"Latitude", "Longitude"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.PlayerUpdateResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PlayerUpdateResponse.Parser,
-                        new[] {"WildPokemons", "Forts", "FortsNearby"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesRequest.Parser, null, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Parser,
-                        new[] {"Success", "ItemTemplates", "TimestampMs"}, null, null,
-                        new pbr::GeneratedClrTypeInfo[]
-                        {
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(
-                                    global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types.
-                                        ItemTemplate),
-                                global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types
-                                    .ItemTemplate.Parser,
-                                new[]
-                                {
-                                    "TemplateId", "PokemonSettings", "ItemSettings", "MoveSettings", "MoveSequenceSettings",
-                                    "TypeEffective", "BadgeSettings", "Camera", "PlayerLevel", "GymLevel",
-                                    "BattleSettings", "EncounterSettings", "IapItemDisplay", "IapSettings",
-                                    "PokemonUpgrades", "EquippedBadges"
-                                }, null, null, null)
-                        }),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.UseItemCaptureRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.UseItemCaptureRequest.Parser,
-                        new[] {"ItemId", "EncounterId", "SpawnPointGuid"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.UseItemCaptureResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.UseItemCaptureResponse.Parser,
-                        new[]
-                        {
-                            "Success", "ItemCaptureMult", "ItemFleeMult", "StopMovement", "StopAttack", "TargetMax",
-                            "TargetSlow"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonRequest.Parser, new[] {"PokemonId"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonResponse.Parser,
-                        new[] {"Result", "CandyAwarded"}, null,
-                        new[] {typeof(global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonResponse.Types.Result)},
-                        null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.GetHatchedEggsRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GetHatchedEggsRequest.Parser, null, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.GetHatchedEggsResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GetHatchedEggsResponse.Parser,
-                        new[] {"Success", "PokemonId", "ExperienceAwarded", "CandyAwarded", "StardustAwarded"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortSearchRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortSearchRequest.Parser,
-                        new[] {"FortId", "PlayerLatitude", "PlayerLongitude", "FortLatitude", "FortLongitude"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Parser,
-                        new[]
-                        {
-                            "Result", "ItemsAwarded", "GemsAwarded", "PokemonDataEgg", "ExperienceAwarded",
-                            "CooldownCompleteTimestampMs", "ChainHackSequenceNumber"
-                        }, null,
-                        new[] {typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.Result)},
-                        new pbr::GeneratedClrTypeInfo[]
-                        {
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward),
-                                global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward.Parser,
-                                new[] {"ItemId", "ItemCount"}, null, null, null)
-                        }),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortDetailsRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortDetailsRequest.Parser,
-                        new[] {"FortId", "Latitude", "Longitude"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortDetailsResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortDetailsResponse.Parser,
-                        new[]
-                        {
-                            "FortId", "TeamColor", "PokemonData", "Name", "ImageUrls", "Fp", "Stamina", "MaxStamina",
-                            "Type", "Latitude", "Longitude", "Description", "Modifiers"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortModifier),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortModifier.Parser,
-                        new[] {"ItemId", "ExpirationTimestampMs", "DeployerPlayerCodename"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EncounterRequest.Parser,
-                        new[] {"EncounterId", "SpawnpointId", "PlayerLatitude", "PlayerLongitude"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Parser,
-                        new[] {"WildPokemon", "Background", "Status", "CaptureProbability"}, null,
-                        new[]
-                        {
-                            typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Background),
-                            typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Status)
-                        }, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability.Parser,
-                        new[] {"PokeballType", "CaptureProbability_", "ReticleDifficultyScale"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterRequest.Parser,
-                        new[] {"EncounterId", "FortId", "PlayerLatitude", "PlayerLongitude"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterResponse.Parser,
-                        new[] {"Result", "PokemonData", "CaptureProbability"}, null,
-                        new[] {typeof(global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterResponse.Types.Result)},
-                        null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonRequest.Parser,
-                        new[]
-                        {
-                            "EncounterId", "Pokeball", "NormalizedReticleSize", "SpawnPointGuid", "HitPokemon",
-                            "SpinModifier", "NormalizedHitPosition"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Parser,
-                        new[] {"Status", "MissPercent", "CapturedPokemonId", "Scores"}, null,
-                        new[] {typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.CatchStatus)},
-                        null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CaptureScore),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CaptureScore.Parser,
-                        new[] {"ActivityType", "Xp", "Candy", "Stardust"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.CheckAwardedBadgesRequest),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CheckAwardedBadgesRequest.Parser, null, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.CheckAwardedBadgesResponse),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CheckAwardedBadgesResponse.Parser,
-                        new[] {"Success", "AwardedBadges", "AwardedBadgeLevels"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.EquippedBadgeSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EquippedBadgeSettings.Parser,
-                        new[] {"EquipBadgeCooldownMs", "CatchProbabilityBonus", "FleeProbabilityBonus"}, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.PokemonUpgradeSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PokemonUpgradeSettings.Parser,
-                        new[] {"UpgradesPerLevel", "AllowedLevelsAbovePlayer", "CandyCost", "StardustCost"}, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.IapSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.IapSettings.Parser,
-                        new[]
-                        {
-                            "DailyBonusCoins", "DailyDefenderBonusPerPokemon", "DailyDefenderBonusMaxDefenders",
-                            "DailyDefenderBonusCurrency", "MinTimeBetweenClaimsMs", "DailyBonusEnabled",
-                            "DailyDefenderBonusEnabled"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.IapItemDisplay),
-                        global::PokemonGo.RocketAPI.GeneratedCode.IapItemDisplay.Parser,
-                        new[] {"Sku", "Category", "SortOrder", "ItemIds", "Counts"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EncounterSettings.Parser,
-                        new[]
-                        {
-                            "SpinBonusThreshold", "ExcellentThrowThreshold", "GreatThrowThreshold", "NiceThrowThreshold",
-                            "MilestoneThreshold"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.GymBattleSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GymBattleSettings.Parser,
-                        new[]
-                        {
-                            "EnergyPerSec", "DodgeEnergyCost", "RetargetSeconds", "EnemyAttackInterval",
-                            "AttackServerInterval", "RoundDurationSeconds", "BonusTimePerAllySeconds",
-                            "MaximumAttackersPerBattle", "SameTypeAttackBonusMultiplier", "MaximumEnergy",
-                            "EnergyDeltaPerHealthLost", "DodgeDurationMs", "MinimumPlayerLevel", "SwapDurationMs"
-                        }, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.GymLevelSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.GymLevelSettings.Parser,
-                        new[] {"RequiredExperience", "LeaderSlots", "TrainerSlots", "SearchRollBonus"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.PlayerLevelSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PlayerLevelSettings.Parser,
-                        new[]
-                        {
-                            "RankNum", "RequiredExperience", "CpMultiplier", "MaxEggPlayerLevel", "MaxEncounterPlayerLevel"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CameraSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CameraSettings.Parser,
-                        new[]
-                        {
-                            "NextCamera", "Interpolation", "TargetType", "EaseInSpeed", "EastOutSpeed", "DurationSeconds",
-                            "WaitSeconds", "TransitionSeconds", "AngleDegree", "AngleOffsetDegree", "PitchDegree",
-                            "PitchOffsetDegree", "RollDegree", "DistanceMeters", "HeightPercent", "VertCtrRatio"
-                        }, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.BadgeSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.BadgeSettings.Parser,
-                        new[] {"BadgeType", "BadgeRank", "Targets"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.TypeEffectiveSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.TypeEffectiveSettings.Parser,
-                        new[] {"AttackScalar", "AttackType"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.MoveSequenceSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.MoveSequenceSettings.Parser, new[] {"Sequence"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.MoveSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.MoveSettings.Parser,
-                        new[]
-                        {
-                            "MovementId", "AnimationId", "PokemonType", "Power", "AccuracyChance", "CriticalChance",
-                            "HealScalar", "StaminaLossScalar", "TrainerLevelMin", "TrainerLevelMax", "VfxName",
-                            "DurationMs", "DamageWindowStartMs", "DamageWindowEndMs", "EnergyDelta"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PokemonSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PokemonSettings.Parser,
-                        new[]
-                        {
-                            "PokemonId", "ModelScale", "Type", "Type2", "Camera", "Encounter", "Stats", "QuickMoves",
-                            "CinematicMoves", "AnimationTime", "EvolutionIds", "EvolutionPips", "Class",
-                            "PokedexHeightM", "PokedexWeightKg", "ParentPokemonId", "HeightStdDev", "WeightStdDev",
-                            "KmDistanceToHatch", "FamilyId", "CandyToEvolve"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CameraAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.CameraAttributes.Parser,
-                        new[]
-                        {"DiskRadiusM", "CylinderRadiusM", "CylinderHeightM", "CylinderGroundM", "ShoulderModeScale"},
-                        null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EncounterAttributes.Parser,
-                        new[]
-                        {
-                            "BaseCaptureRate", "BaseFleeRate", "CollisionRadiusM", "CollisionHeightM",
-                            "CollisionHeadRadiusM", "MovementType", "MovementTimerS", "JumpTimeS", "AttackTimerS"
-                        }, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.StatsAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.StatsAttributes.Parser,
-                        new[] {"BaseStamina", "BaseAttack", "BaseDefense", "DodgeEnergyDelta"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.ItemSettings),
-                        global::PokemonGo.RocketAPI.GeneratedCode.ItemSettings.Parser,
-                        new[]
-                        {
-                            "ItemId", "ItemType", "Category", "DropFreq", "DropTrainerLevel", "Pokeball", "Potion",
-                            "Revive", "Battle", "Food", "InventoryUpgrade", "XpBoost", "Incense", "EggIncubator",
-                            "FortModifier"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.BattleAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.BattleAttributes.Parser, new[] {"StaPercent"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.EggIncubatorAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EggIncubatorAttributes.Parser,
-                        new[] {"IncubatorType", "Uses", "DistanceMultiplier"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.ExperienceBoostAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.ExperienceBoostAttributes.Parser,
-                        new[] {"XpMultiplier", "BoostDurationMs"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.FoodAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FoodAttributes.Parser,
-                        new[] {"ItemEffect", "ItemEffectPercent", "GrowthPercent"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.FortModifierAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.FortModifierAttributes.Parser,
-                        new[] {"ModifierLifetimeSeconds", "TroyDiskNumPokemonSpawned"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.IncenseAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.IncenseAttributes.Parser,
-                        new[]
-                        {
-                            "IncenseLifetimeSeconds", "PokemonType", "PokemonIncenseTypeProbability",
-                            "StandingTimeBetweenEncountersSeconds", "MovingTimeBetweenEncounterSeconds",
-                            "DistanceRequiredForShorterIntervalMeters", "PokemonAttractedLengthSec"
-                        }, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(
-                        typeof(global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgradeAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgradeAttributes.Parser,
-                        new[] {"AdditionalStorage", "UpgradeType"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PokeballAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PokeballAttributes.Parser,
-                        new[] {"ItemEffect", "CaptureMulti", "CaptureMultiEffect", "ItemEffectMod"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.PotionAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.PotionAttributes.Parser,
-                        new[] {"StaPercent", "StaAmount"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.ReviveAttributes),
-                        global::PokemonGo.RocketAPI.GeneratedCode.ReviveAttributes.Parser, new[] {"StaPercent"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.TransferPokemon),
-                        global::PokemonGo.RocketAPI.GeneratedCode.TransferPokemon.Parser, new[] {"PokemonId"}, null,
-                        null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.TransferPokemonOut),
-                        global::PokemonGo.RocketAPI.GeneratedCode.TransferPokemonOut.Parser,
-                        new[] {"Status", "CandyAwarded"}, null, null, null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EvolvePokemon),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EvolvePokemon.Parser, new[] {"PokemonId"}, null, null,
-                        null),
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EvolvePokemonOut),
-                        global::PokemonGo.RocketAPI.GeneratedCode.EvolvePokemonOut.Parser,
-                        new[] {"Result", "EvolvedPokemon", "ExpAwarded", "CandyAwarded"}, null, null, null)
-                }));
-        }
-
-        #endregion
-    }
-
-    #region Messages
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GetPlayerResponse : pb::IMessage<GetPlayerResponse>
-    {
-        /// <summary>Field number for the "unknown1" field.</summary>
-        public const int Unknown1FieldNumber = 1;
-
-        /// <summary>Field number for the "profile" field.</summary>
-        public const int ProfileFieldNumber = 2;
-
-        private static readonly pb::MessageParser<GetPlayerResponse> _parser =
-            new pb::MessageParser<GetPlayerResponse>(() => new GetPlayerResponse());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.Profile profile_;
-        private int unknown1_;
-
-        public GetPlayerResponse()
-        {
-            OnConstruction();
-        }
-
-        public GetPlayerResponse(GetPlayerResponse other) : this()
-        {
-            unknown1_ = other.unknown1_;
-            Profile = other.profile_ != null ? other.Profile.Clone() : null;
-        }
-
-        public static pb::MessageParser<GetPlayerResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[0]; }
-        }
-
-        public int Unknown1
-        {
-            get { return unknown1_; }
-            set { unknown1_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Profile Profile
-        {
-            get { return profile_; }
-            set { profile_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GetPlayerResponse Clone()
-        {
-            return new GetPlayerResponse(this);
-        }
-
-        public bool Equals(GetPlayerResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Unknown1 != other.Unknown1) return false;
-            if (!Equals(Profile, other.Profile)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Unknown1 != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Unknown1);
-            }
-            if (profile_ != null)
-            {
-                output.WriteRawTag(18);
-                output.WriteMessage(Profile);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Unknown1 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
-            }
-            if (profile_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Profile);
-            }
-            return size;
-        }
-
-        public void MergeFrom(GetPlayerResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Unknown1 != 0)
-            {
-                Unknown1 = other.Unknown1;
-            }
-            if (other.profile_ != null)
-            {
-                if (profile_ == null)
-                {
-                    profile_ = new global::PokemonGo.RocketAPI.GeneratedCode.Profile();
-                }
-                Profile.MergeFrom(other.Profile);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Unknown1 = input.ReadInt32();
-                            break;
-                        }
-                    case 18:
-                        {
-                            if (profile_ == null)
-                            {
-                                profile_ = new global::PokemonGo.RocketAPI.GeneratedCode.Profile();
-                            }
-                            input.ReadMessage(profile_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GetPlayerResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
-            if (profile_ != null) hash ^= Profile.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class Profile : pb::IMessage<Profile>
-    {
-        /// <summary>Field number for the "creation_time" field.</summary>
-        public const int CreationTimeFieldNumber = 1;
-
-        /// <summary>Field number for the "username" field.</summary>
-        public const int UsernameFieldNumber = 2;
-
-        /// <summary>Field number for the "team" field.</summary>
-        public const int TeamFieldNumber = 5;
-
-        /// <summary>Field number for the "tutorial" field.</summary>
-        public const int TutorialFieldNumber = 7;
-
-        /// <summary>Field number for the "avatar" field.</summary>
-        public const int AvatarFieldNumber = 8;
-
-        /// <summary>Field number for the "poke_storage" field.</summary>
-        public const int PokeStorageFieldNumber = 9;
-
-        /// <summary>Field number for the "item_storage" field.</summary>
-        public const int ItemStorageFieldNumber = 10;
-
-        /// <summary>Field number for the "daily_bonus" field.</summary>
-        public const int DailyBonusFieldNumber = 11;
-
-        /// <summary>Field number for the "unknown12" field.</summary>
-        public const int Unknown12FieldNumber = 12;
-
-        /// <summary>Field number for the "unknown13" field.</summary>
-        public const int Unknown13FieldNumber = 13;
-
-        /// <summary>Field number for the "currency" field.</summary>
-        public const int CurrencyFieldNumber = 14;
-
-        private static readonly pb::MessageParser<Profile> _parser = new pb::MessageParser<Profile>(() => new Profile());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.Currency>
-            _repeated_currency_codec
-                = pb::FieldCodec.ForMessage(114, global::PokemonGo.RocketAPI.GeneratedCode.Currency.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.Currency> currency_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.Currency>();
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.AvatarDetails avatar_;
-        private long creationTime_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.DailyBonus dailyBonus_;
-        private int itemStorage_;
-        private int pokeStorage_;
-        private global::AllEnum.TeamColor team_ = 0;
-        private pb::ByteString tutorial_ = pb::ByteString.Empty;
-        private pb::ByteString unknown12_ = pb::ByteString.Empty;
-        private pb::ByteString unknown13_ = pb::ByteString.Empty;
-        private string username_ = "";
-
-        public Profile()
-        {
-            OnConstruction();
-        }
-
-        public Profile(Profile other) : this()
-        {
-            creationTime_ = other.creationTime_;
-            username_ = other.username_;
-            team_ = other.team_;
-            tutorial_ = other.tutorial_;
-            Avatar = other.avatar_ != null ? other.Avatar.Clone() : null;
-            pokeStorage_ = other.pokeStorage_;
-            itemStorage_ = other.itemStorage_;
-            DailyBonus = other.dailyBonus_ != null ? other.DailyBonus.Clone() : null;
-            unknown12_ = other.unknown12_;
-            unknown13_ = other.unknown13_;
-            currency_ = other.currency_.Clone();
-        }
-
-        public static pb::MessageParser<Profile> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[1]; }
-        }
-
-        public long CreationTime
-        {
-            get { return creationTime_; }
-            set { creationTime_ = value; }
-        }
-
-        public string Username
-        {
-            get { return username_; }
-            set { username_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::AllEnum.TeamColor Team
-        {
-            get { return team_; }
-            set { team_ = value; }
-        }
-
-        public pb::ByteString Tutorial
-        {
-            get { return tutorial_; }
-            set { tutorial_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.AvatarDetails Avatar
-        {
-            get { return avatar_; }
-            set { avatar_ = value; }
-        }
-
-        public int PokeStorage
-        {
-            get { return pokeStorage_; }
-            set { pokeStorage_ = value; }
-        }
-
-        public int ItemStorage
-        {
-            get { return itemStorage_; }
-            set { itemStorage_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.DailyBonus DailyBonus
-        {
-            get { return dailyBonus_; }
-            set { dailyBonus_ = value; }
-        }
-
-        public pb::ByteString Unknown12
-        {
-            get { return unknown12_; }
-            set { unknown12_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public pb::ByteString Unknown13
-        {
-            get { return unknown13_; }
-            set { unknown13_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.Currency> Currency
-        {
-            get { return currency_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public Profile Clone()
-        {
-            return new Profile(this);
-        }
-
-        public bool Equals(Profile other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (CreationTime != other.CreationTime) return false;
-            if (Username != other.Username) return false;
-            if (Team != other.Team) return false;
-            if (Tutorial != other.Tutorial) return false;
-            if (!Equals(Avatar, other.Avatar)) return false;
-            if (PokeStorage != other.PokeStorage) return false;
-            if (ItemStorage != other.ItemStorage) return false;
-            if (!Equals(DailyBonus, other.DailyBonus)) return false;
-            if (Unknown12 != other.Unknown12) return false;
-            if (Unknown13 != other.Unknown13) return false;
-            if (!currency_.Equals(other.currency_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (CreationTime != 0L)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt64(CreationTime);
-            }
-            if (Username.Length != 0)
-            {
-                output.WriteRawTag(18);
-                output.WriteString(Username);
-            }
-            if (Team != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteEnum((int)Team);
-            }
-            if (Tutorial.Length != 0)
-            {
-                output.WriteRawTag(58);
-                output.WriteBytes(Tutorial);
-            }
-            if (avatar_ != null)
-            {
-                output.WriteRawTag(66);
-                output.WriteMessage(Avatar);
-            }
-            if (PokeStorage != 0)
-            {
-                output.WriteRawTag(72);
-                output.WriteInt32(PokeStorage);
-            }
-            if (ItemStorage != 0)
-            {
-                output.WriteRawTag(80);
-                output.WriteInt32(ItemStorage);
-            }
-            if (dailyBonus_ != null)
-            {
-                output.WriteRawTag(90);
-                output.WriteMessage(DailyBonus);
-            }
-            if (Unknown12.Length != 0)
-            {
-                output.WriteRawTag(98);
-                output.WriteBytes(Unknown12);
-            }
-            if (Unknown13.Length != 0)
-            {
-                output.WriteRawTag(106);
-                output.WriteBytes(Unknown13);
-            }
-            currency_.WriteTo(output, _repeated_currency_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (CreationTime != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(CreationTime);
-            }
-            if (Username.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Username);
-            }
-            if (Team != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Team);
-            }
-            if (Tutorial.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Tutorial);
-            }
-            if (avatar_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Avatar);
-            }
-            if (PokeStorage != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeStorage);
-            }
-            if (ItemStorage != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(ItemStorage);
-            }
-            if (dailyBonus_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(DailyBonus);
-            }
-            if (Unknown12.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown12);
-            }
-            if (Unknown13.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown13);
-            }
-            size += currency_.CalculateSize(_repeated_currency_codec);
-            return size;
-        }
-
-        public void MergeFrom(Profile other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.CreationTime != 0L)
-            {
-                CreationTime = other.CreationTime;
-            }
-            if (other.Username.Length != 0)
-            {
-                Username = other.Username;
-            }
-            if (other.Team != 0)
-            {
-                Team = other.Team;
-            }
-            if (other.Tutorial.Length != 0)
-            {
-                Tutorial = other.Tutorial;
-            }
-            if (other.avatar_ != null)
-            {
-                if (avatar_ == null)
-                {
-                    avatar_ = new global::PokemonGo.RocketAPI.GeneratedCode.AvatarDetails();
-                }
-                Avatar.MergeFrom(other.Avatar);
-            }
-            if (other.PokeStorage != 0)
-            {
-                PokeStorage = other.PokeStorage;
-            }
-            if (other.ItemStorage != 0)
-            {
-                ItemStorage = other.ItemStorage;
-            }
-            if (other.dailyBonus_ != null)
-            {
-                if (dailyBonus_ == null)
-                {
-                    dailyBonus_ = new global::PokemonGo.RocketAPI.GeneratedCode.DailyBonus();
-                }
-                DailyBonus.MergeFrom(other.DailyBonus);
-            }
-            if (other.Unknown12.Length != 0)
-            {
-                Unknown12 = other.Unknown12;
-            }
-            if (other.Unknown13.Length != 0)
-            {
-                Unknown13 = other.Unknown13;
-            }
-            currency_.Add(other.currency_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            CreationTime = input.ReadInt64();
-                            break;
-                        }
-                    case 18:
-                        {
-                            Username = input.ReadString();
-                            break;
-                        }
-                    case 40:
-                        {
-                            team_ = (global::AllEnum.TeamColor)input.ReadEnum();
-                            break;
-                        }
-                    case 58:
-                        {
-                            Tutorial = input.ReadBytes();
-                            break;
-                        }
-                    case 66:
-                        {
-                            if (avatar_ == null)
-                            {
-                                avatar_ = new global::PokemonGo.RocketAPI.GeneratedCode.AvatarDetails();
-                            }
-                            input.ReadMessage(avatar_);
-                            break;
-                        }
-                    case 72:
-                        {
-                            PokeStorage = input.ReadInt32();
-                            break;
-                        }
-                    case 80:
-                        {
-                            ItemStorage = input.ReadInt32();
-                            break;
-                        }
-                    case 90:
-                        {
-                            if (dailyBonus_ == null)
-                            {
-                                dailyBonus_ = new global::PokemonGo.RocketAPI.GeneratedCode.DailyBonus();
-                            }
-                            input.ReadMessage(dailyBonus_);
-                            break;
-                        }
-                    case 98:
-                        {
-                            Unknown12 = input.ReadBytes();
-                            break;
-                        }
-                    case 106:
-                        {
-                            Unknown13 = input.ReadBytes();
-                            break;
-                        }
-                    case 114:
-                        {
-                            currency_.AddEntriesFrom(input, _repeated_currency_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as Profile);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (CreationTime != 0L) hash ^= CreationTime.GetHashCode();
-            if (Username.Length != 0) hash ^= Username.GetHashCode();
-            if (Team != 0) hash ^= Team.GetHashCode();
-            if (Tutorial.Length != 0) hash ^= Tutorial.GetHashCode();
-            if (avatar_ != null) hash ^= Avatar.GetHashCode();
-            if (PokeStorage != 0) hash ^= PokeStorage.GetHashCode();
-            if (ItemStorage != 0) hash ^= ItemStorage.GetHashCode();
-            if (dailyBonus_ != null) hash ^= DailyBonus.GetHashCode();
-            if (Unknown12.Length != 0) hash ^= Unknown12.GetHashCode();
-            if (Unknown13.Length != 0) hash ^= Unknown13.GetHashCode();
-            hash ^= currency_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DailyBonus : pb::IMessage<DailyBonus>
-    {
-        /// <summary>Field number for the "NextCollectTimestampMs" field.</summary>
-        public const int NextCollectTimestampMsFieldNumber = 1;
-
-        /// <summary>Field number for the "NextDefenderBonusCollectTimestampMs" field.</summary>
-        public const int NextDefenderBonusCollectTimestampMsFieldNumber = 2;
-
-        private static readonly pb::MessageParser<DailyBonus> _parser =
-            new pb::MessageParser<DailyBonus>(() => new DailyBonus());
-
-        private long nextCollectTimestampMs_;
-        private long nextDefenderBonusCollectTimestampMs_;
-
-        public DailyBonus()
-        {
-            OnConstruction();
-        }
-
-        public DailyBonus(DailyBonus other) : this()
-        {
-            nextCollectTimestampMs_ = other.nextCollectTimestampMs_;
-            nextDefenderBonusCollectTimestampMs_ = other.nextDefenderBonusCollectTimestampMs_;
-        }
-
-        public static pb::MessageParser<DailyBonus> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[2]; }
-        }
-
-        public long NextCollectTimestampMs
-        {
-            get { return nextCollectTimestampMs_; }
-            set { nextCollectTimestampMs_ = value; }
-        }
-
-        public long NextDefenderBonusCollectTimestampMs
-        {
-            get { return nextDefenderBonusCollectTimestampMs_; }
-            set { nextDefenderBonusCollectTimestampMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DailyBonus Clone()
-        {
-            return new DailyBonus(this);
-        }
-
-        public bool Equals(DailyBonus other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (NextCollectTimestampMs != other.NextCollectTimestampMs) return false;
-            if (NextDefenderBonusCollectTimestampMs != other.NextDefenderBonusCollectTimestampMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (NextCollectTimestampMs != 0L)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt64(NextCollectTimestampMs);
-            }
-            if (NextDefenderBonusCollectTimestampMs != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(NextDefenderBonusCollectTimestampMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (NextCollectTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextCollectTimestampMs);
-            }
-            if (NextDefenderBonusCollectTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextDefenderBonusCollectTimestampMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(DailyBonus other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.NextCollectTimestampMs != 0L)
-            {
-                NextCollectTimestampMs = other.NextCollectTimestampMs;
-            }
-            if (other.NextDefenderBonusCollectTimestampMs != 0L)
-            {
-                NextDefenderBonusCollectTimestampMs = other.NextDefenderBonusCollectTimestampMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            NextCollectTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            NextDefenderBonusCollectTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DailyBonus);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (NextCollectTimestampMs != 0L) hash ^= NextCollectTimestampMs.GetHashCode();
-            if (NextDefenderBonusCollectTimestampMs != 0L) hash ^= NextDefenderBonusCollectTimestampMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class Currency : pb::IMessage<Currency>
-    {
-        /// <summary>Field number for the "type" field.</summary>
-        public const int TypeFieldNumber = 1;
-
-        /// <summary>Field number for the "amount" field.</summary>
-        public const int AmountFieldNumber = 2;
-
-        private static readonly pb::MessageParser<Currency> _parser =
-            new pb::MessageParser<Currency>(() => new Currency());
-
-        private int amount_;
-        private string type_ = "";
-
-        public Currency()
-        {
-            OnConstruction();
-        }
-
-        public Currency(Currency other) : this()
-        {
-            type_ = other.type_;
-            amount_ = other.amount_;
-        }
-
-        public static pb::MessageParser<Currency> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[3]; }
-        }
-
-        public string Type
-        {
-            get { return type_; }
-            set { type_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public int Amount
-        {
-            get { return amount_; }
-            set { amount_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public Currency Clone()
-        {
-            return new Currency(this);
-        }
-
-        public bool Equals(Currency other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Type != other.Type) return false;
-            if (Amount != other.Amount) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Type.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(Type);
-            }
-            if (Amount != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(Amount);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Type.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Type);
-            }
-            if (Amount != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Amount);
-            }
-            return size;
-        }
-
-        public void MergeFrom(Currency other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Type.Length != 0)
-            {
-                Type = other.Type;
-            }
-            if (other.Amount != 0)
-            {
-                Amount = other.Amount;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            Type = input.ReadString();
-                            break;
-                        }
-                    case 16:
-                        {
-                            Amount = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as Currency);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Type.Length != 0) hash ^= Type.GetHashCode();
-            if (Amount != 0) hash ^= Amount.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class AvatarDetails : pb::IMessage<AvatarDetails>
-    {
-        /// <summary>Field number for the "unknown2" field.</summary>
-        public const int Unknown2FieldNumber = 2;
-
-        /// <summary>Field number for the "unknown3" field.</summary>
-        public const int Unknown3FieldNumber = 3;
-
-        /// <summary>Field number for the "unknown9" field.</summary>
-        public const int Unknown9FieldNumber = 9;
-
-        /// <summary>Field number for the "unknown10" field.</summary>
-        public const int Unknown10FieldNumber = 10;
-
-        private static readonly pb::MessageParser<AvatarDetails> _parser =
-            new pb::MessageParser<AvatarDetails>(() => new AvatarDetails());
-
-        private int unknown10_;
-        private int unknown2_;
-        private int unknown3_;
-        private int unknown9_;
-
-        public AvatarDetails()
-        {
-            OnConstruction();
-        }
-
-        public AvatarDetails(AvatarDetails other) : this()
-        {
-            unknown2_ = other.unknown2_;
-            unknown3_ = other.unknown3_;
-            unknown9_ = other.unknown9_;
-            unknown10_ = other.unknown10_;
-        }
-
-        public static pb::MessageParser<AvatarDetails> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[4]; }
-        }
-
-        public int Unknown2
-        {
-            get { return unknown2_; }
-            set { unknown2_ = value; }
-        }
-
-        public int Unknown3
-        {
-            get { return unknown3_; }
-            set { unknown3_ = value; }
-        }
-
-        public int Unknown9
-        {
-            get { return unknown9_; }
-            set { unknown9_ = value; }
-        }
-
-        public int Unknown10
-        {
-            get { return unknown10_; }
-            set { unknown10_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public AvatarDetails Clone()
-        {
-            return new AvatarDetails(this);
-        }
-
-        public bool Equals(AvatarDetails other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Unknown2 != other.Unknown2) return false;
-            if (Unknown3 != other.Unknown3) return false;
-            if (Unknown9 != other.Unknown9) return false;
-            if (Unknown10 != other.Unknown10) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Unknown2 != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(Unknown2);
-            }
-            if (Unknown3 != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(Unknown3);
-            }
-            if (Unknown9 != 0)
-            {
-                output.WriteRawTag(72);
-                output.WriteInt32(Unknown9);
-            }
-            if (Unknown10 != 0)
-            {
-                output.WriteRawTag(80);
-                output.WriteInt32(Unknown10);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Unknown2 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown2);
-            }
-            if (Unknown3 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown3);
-            }
-            if (Unknown9 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown9);
-            }
-            if (Unknown10 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown10);
-            }
-            return size;
-        }
-
-        public void MergeFrom(AvatarDetails other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Unknown2 != 0)
-            {
-                Unknown2 = other.Unknown2;
-            }
-            if (other.Unknown3 != 0)
-            {
-                Unknown3 = other.Unknown3;
-            }
-            if (other.Unknown9 != 0)
-            {
-                Unknown9 = other.Unknown9;
-            }
-            if (other.Unknown10 != 0)
-            {
-                Unknown10 = other.Unknown10;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 16:
-                        {
-                            Unknown2 = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            Unknown3 = input.ReadInt32();
-                            break;
-                        }
-                    case 72:
-                        {
-                            Unknown9 = input.ReadInt32();
-                            break;
-                        }
-                    case 80:
-                        {
-                            Unknown10 = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as AvatarDetails);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Unknown2 != 0) hash ^= Unknown2.GetHashCode();
-            if (Unknown3 != 0) hash ^= Unknown3.GetHashCode();
-            if (Unknown9 != 0) hash ^= Unknown9.GetHashCode();
-            if (Unknown10 != 0) hash ^= Unknown10.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DownloadSettingsRequest : pb::IMessage<DownloadSettingsRequest>
-    {
-        /// <summary>Field number for the "hash" field.</summary>
-        public const int HashFieldNumber = 1;
-
-        private static readonly pb::MessageParser<DownloadSettingsRequest> _parser =
-            new pb::MessageParser<DownloadSettingsRequest>(() => new DownloadSettingsRequest());
-
-        private string hash_ = "";
-
-        public DownloadSettingsRequest()
-        {
-            OnConstruction();
-        }
-
-        public DownloadSettingsRequest(DownloadSettingsRequest other) : this()
-        {
-            hash_ = other.hash_;
-        }
-
-        public static pb::MessageParser<DownloadSettingsRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[5]; }
-        }
-
-        public string Hash
-        {
-            get { return hash_; }
-            set { hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DownloadSettingsRequest Clone()
-        {
-            return new DownloadSettingsRequest(this);
-        }
-
-        public bool Equals(DownloadSettingsRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Hash != other.Hash) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Hash.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(Hash);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Hash.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
-            }
-            return size;
-        }
-
-        public void MergeFrom(DownloadSettingsRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Hash.Length != 0)
-            {
-                Hash = other.Hash;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            Hash = input.ReadString();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DownloadSettingsRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Hash.Length != 0) hash ^= Hash.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GetInventoryResponse : pb::IMessage<GetInventoryResponse>
-    {
-        /// <summary>Field number for the "success" field.</summary>
-        public const int SuccessFieldNumber = 1;
-
-        /// <summary>Field number for the "inventory_delta" field.</summary>
-        public const int InventoryDeltaFieldNumber = 2;
-
-        private static readonly pb::MessageParser<GetInventoryResponse> _parser =
-            new pb::MessageParser<GetInventoryResponse>(() => new GetInventoryResponse());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.InventoryDelta inventoryDelta_;
-        private bool success_;
-
-        public GetInventoryResponse()
-        {
-            OnConstruction();
-        }
-
-        public GetInventoryResponse(GetInventoryResponse other) : this()
-        {
-            success_ = other.success_;
-            InventoryDelta = other.inventoryDelta_ != null ? other.InventoryDelta.Clone() : null;
-        }
-
-        public static pb::MessageParser<GetInventoryResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[6]; }
-        }
-
-        public bool Success
-        {
-            get { return success_; }
-            set { success_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.InventoryDelta InventoryDelta
-        {
-            get { return inventoryDelta_; }
-            set { inventoryDelta_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GetInventoryResponse Clone()
-        {
-            return new GetInventoryResponse(this);
-        }
-
-        public bool Equals(GetInventoryResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Success != other.Success) return false;
-            if (!Equals(InventoryDelta, other.InventoryDelta)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Success != false)
-            {
-                output.WriteRawTag(8);
-                output.WriteBool(Success);
-            }
-            if (inventoryDelta_ != null)
-            {
-                output.WriteRawTag(18);
-                output.WriteMessage(InventoryDelta);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Success != false)
-            {
-                size += 1 + 1;
-            }
-            if (inventoryDelta_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryDelta);
-            }
-            return size;
-        }
-
-        public void MergeFrom(GetInventoryResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Success != false)
-            {
-                Success = other.Success;
-            }
-            if (other.inventoryDelta_ != null)
-            {
-                if (inventoryDelta_ == null)
-                {
-                    inventoryDelta_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryDelta();
-                }
-                InventoryDelta.MergeFrom(other.InventoryDelta);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Success = input.ReadBool();
-                            break;
-                        }
-                    case 18:
-                        {
-                            if (inventoryDelta_ == null)
-                            {
-                                inventoryDelta_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryDelta();
-                            }
-                            input.ReadMessage(inventoryDelta_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GetInventoryResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Success != false) hash ^= Success.GetHashCode();
-            if (inventoryDelta_ != null) hash ^= InventoryDelta.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventoryDelta : pb::IMessage<InventoryDelta>
-    {
-        /// <summary>Field number for the "original_timestamp_ms" field.</summary>
-        public const int OriginalTimestampMsFieldNumber = 1;
-
-        /// <summary>Field number for the "new_timestamp_ms" field.</summary>
-        public const int NewTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "inventory_items" field.</summary>
-        public const int InventoryItemsFieldNumber = 3;
-
-        private static readonly pb::MessageParser<InventoryDelta> _parser =
-            new pb::MessageParser<InventoryDelta>(() => new InventoryDelta());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem>
-            _repeated_inventoryItems_codec
-                = pb::FieldCodec.ForMessage(26, global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem> inventoryItems_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem>();
-
-        private long newTimestampMs_;
-        private long originalTimestampMs_;
-
-        public InventoryDelta()
-        {
-            OnConstruction();
-        }
-
-        public InventoryDelta(InventoryDelta other) : this()
-        {
-            originalTimestampMs_ = other.originalTimestampMs_;
-            newTimestampMs_ = other.newTimestampMs_;
-            inventoryItems_ = other.inventoryItems_.Clone();
-        }
-
-        public static pb::MessageParser<InventoryDelta> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[7]; }
-        }
-
-        public long OriginalTimestampMs
-        {
-            get { return originalTimestampMs_; }
-            set { originalTimestampMs_ = value; }
-        }
-
-        public long NewTimestampMs
-        {
-            get { return newTimestampMs_; }
-            set { newTimestampMs_ = value; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.InventoryItem> InventoryItems
-        {
-            get { return inventoryItems_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventoryDelta Clone()
-        {
-            return new InventoryDelta(this);
-        }
-
-        public bool Equals(InventoryDelta other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (OriginalTimestampMs != other.OriginalTimestampMs) return false;
-            if (NewTimestampMs != other.NewTimestampMs) return false;
-            if (!inventoryItems_.Equals(other.inventoryItems_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (OriginalTimestampMs != 0L)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt64(OriginalTimestampMs);
-            }
-            if (NewTimestampMs != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(NewTimestampMs);
-            }
-            inventoryItems_.WriteTo(output, _repeated_inventoryItems_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (OriginalTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(OriginalTimestampMs);
-            }
-            if (NewTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(NewTimestampMs);
-            }
-            size += inventoryItems_.CalculateSize(_repeated_inventoryItems_codec);
-            return size;
-        }
-
-        public void MergeFrom(InventoryDelta other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.OriginalTimestampMs != 0L)
-            {
-                OriginalTimestampMs = other.OriginalTimestampMs;
-            }
-            if (other.NewTimestampMs != 0L)
-            {
-                NewTimestampMs = other.NewTimestampMs;
-            }
-            inventoryItems_.Add(other.inventoryItems_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            OriginalTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            NewTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 26:
-                        {
-                            inventoryItems_.AddEntriesFrom(input, _repeated_inventoryItems_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventoryDelta);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (OriginalTimestampMs != 0L) hash ^= OriginalTimestampMs.GetHashCode();
-            if (NewTimestampMs != 0L) hash ^= NewTimestampMs.GetHashCode();
-            hash ^= inventoryItems_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventoryItem : pb::IMessage<InventoryItem>
-    {
-        /// <summary>Field number for the "modified_timestamp_ms" field.</summary>
-        public const int ModifiedTimestampMsFieldNumber = 1;
-
-        /// <summary>Field number for the "deleted_item_key" field.</summary>
-        public const int DeletedItemKeyFieldNumber = 2;
-
-        /// <summary>Field number for the "inventory_item_data" field.</summary>
-        public const int InventoryItemDataFieldNumber = 3;
-
-        private static readonly pb::MessageParser<InventoryItem> _parser =
-            new pb::MessageParser<InventoryItem>(() => new InventoryItem());
-
-        private long deletedItemKey_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.InventoryItemData inventoryItemData_;
-        private long modifiedTimestampMs_;
-
-        public InventoryItem()
-        {
-            OnConstruction();
-        }
-
-        public InventoryItem(InventoryItem other) : this()
-        {
-            modifiedTimestampMs_ = other.modifiedTimestampMs_;
-            deletedItemKey_ = other.deletedItemKey_;
-            InventoryItemData = other.inventoryItemData_ != null ? other.InventoryItemData.Clone() : null;
-        }
-
-        public static pb::MessageParser<InventoryItem> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[8]; }
-        }
-
-        public long ModifiedTimestampMs
-        {
-            get { return modifiedTimestampMs_; }
-            set { modifiedTimestampMs_ = value; }
-        }
-
-        public long DeletedItemKey
-        {
-            get { return deletedItemKey_; }
-            set { deletedItemKey_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.InventoryItemData InventoryItemData
-        {
-            get { return inventoryItemData_; }
-            set { inventoryItemData_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventoryItem Clone()
-        {
-            return new InventoryItem(this);
-        }
-
-        public bool Equals(InventoryItem other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ModifiedTimestampMs != other.ModifiedTimestampMs) return false;
-            if (DeletedItemKey != other.DeletedItemKey) return false;
-            if (!Equals(InventoryItemData, other.InventoryItemData)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ModifiedTimestampMs != 0L)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt64(ModifiedTimestampMs);
-            }
-            if (DeletedItemKey != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(DeletedItemKey);
-            }
-            if (inventoryItemData_ != null)
-            {
-                output.WriteRawTag(26);
-                output.WriteMessage(InventoryItemData);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ModifiedTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(ModifiedTimestampMs);
-            }
-            if (DeletedItemKey != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(DeletedItemKey);
-            }
-            if (inventoryItemData_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryItemData);
-            }
-            return size;
-        }
-
-        public void MergeFrom(InventoryItem other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ModifiedTimestampMs != 0L)
-            {
-                ModifiedTimestampMs = other.ModifiedTimestampMs;
-            }
-            if (other.DeletedItemKey != 0L)
-            {
-                DeletedItemKey = other.DeletedItemKey;
-            }
-            if (other.inventoryItemData_ != null)
-            {
-                if (inventoryItemData_ == null)
-                {
-                    inventoryItemData_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryItemData();
-                }
-                InventoryItemData.MergeFrom(other.InventoryItemData);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            ModifiedTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            DeletedItemKey = input.ReadInt64();
-                            break;
-                        }
-                    case 26:
-                        {
-                            if (inventoryItemData_ == null)
-                            {
-                                inventoryItemData_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryItemData();
-                            }
-                            input.ReadMessage(inventoryItemData_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventoryItem);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ModifiedTimestampMs != 0L) hash ^= ModifiedTimestampMs.GetHashCode();
-            if (DeletedItemKey != 0L) hash ^= DeletedItemKey.GetHashCode();
-            if (inventoryItemData_ != null) hash ^= InventoryItemData.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventoryItemData : pb::IMessage<InventoryItemData>
-    {
-        /// <summary>Field number for the "pokemon" field.</summary>
-        public const int PokemonFieldNumber = 1;
-
-        /// <summary>Field number for the "item" field.</summary>
-        public const int ItemFieldNumber = 2;
-
-        /// <summary>Field number for the "pokedex_entry" field.</summary>
-        public const int PokedexEntryFieldNumber = 3;
-
-        /// <summary>Field number for the "player_stats" field.</summary>
-        public const int PlayerStatsFieldNumber = 4;
-
-        /// <summary>Field number for the "player_currency" field.</summary>
-        public const int PlayerCurrencyFieldNumber = 5;
-
-        /// <summary>Field number for the "player_camera" field.</summary>
-        public const int PlayerCameraFieldNumber = 6;
-
-        /// <summary>Field number for the "inventory_upgrades" field.</summary>
-        public const int InventoryUpgradesFieldNumber = 7;
-
-        /// <summary>Field number for the "applied_items" field.</summary>
-        public const int AppliedItemsFieldNumber = 8;
-
-        /// <summary>Field number for the "egg_incubators" field.</summary>
-        public const int EggIncubatorsFieldNumber = 9;
-
-        /// <summary>Field number for the "pokemon_family" field.</summary>
-        public const int PokemonFamilyFieldNumber = 10;
-
-        private static readonly pb::MessageParser<InventoryItemData> _parser =
-            new pb::MessageParser<InventoryItemData>(() => new InventoryItemData());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.AppliedItems appliedItems_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.EggIncubators eggIncubators_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrades inventoryUpgrades_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.Item item_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PlayerCamera playerCamera_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PlayerCurrency playerCurrency_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PlayerStats playerStats_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokedexEntry pokedexEntry_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokemonData pokemon_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokemonFamily pokemonFamily_;
-
-        public InventoryItemData()
-        {
-            OnConstruction();
-        }
-
-        public InventoryItemData(InventoryItemData other) : this()
-        {
-            Pokemon = other.pokemon_ != null ? other.Pokemon.Clone() : null;
-            Item = other.item_ != null ? other.Item.Clone() : null;
-            PokedexEntry = other.pokedexEntry_ != null ? other.PokedexEntry.Clone() : null;
-            PlayerStats = other.playerStats_ != null ? other.PlayerStats.Clone() : null;
-            PlayerCurrency = other.playerCurrency_ != null ? other.PlayerCurrency.Clone() : null;
-            PlayerCamera = other.playerCamera_ != null ? other.PlayerCamera.Clone() : null;
-            InventoryUpgrades = other.inventoryUpgrades_ != null ? other.InventoryUpgrades.Clone() : null;
-            AppliedItems = other.appliedItems_ != null ? other.AppliedItems.Clone() : null;
-            EggIncubators = other.eggIncubators_ != null ? other.EggIncubators.Clone() : null;
-            PokemonFamily = other.pokemonFamily_ != null ? other.PokemonFamily.Clone() : null;
-        }
-
-        public static pb::MessageParser<InventoryItemData> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[9]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokemonData Pokemon
-        {
-            get { return pokemon_; }
-            set { pokemon_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Item Item
-        {
-            get { return item_; }
-            set { item_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokedexEntry PokedexEntry
-        {
-            get { return pokedexEntry_; }
-            set { pokedexEntry_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PlayerStats PlayerStats
-        {
-            get { return playerStats_; }
-            set { playerStats_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PlayerCurrency PlayerCurrency
-        {
-            get { return playerCurrency_; }
-            set { playerCurrency_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PlayerCamera PlayerCamera
-        {
-            get { return playerCamera_; }
-            set { playerCamera_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrades InventoryUpgrades
-        {
-            get { return inventoryUpgrades_; }
-            set { inventoryUpgrades_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.AppliedItems AppliedItems
-        {
-            get { return appliedItems_; }
-            set { appliedItems_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.EggIncubators EggIncubators
-        {
-            get { return eggIncubators_; }
-            set { eggIncubators_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokemonFamily PokemonFamily
-        {
-            get { return pokemonFamily_; }
-            set { pokemonFamily_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventoryItemData Clone()
-        {
-            return new InventoryItemData(this);
-        }
-
-        public bool Equals(InventoryItemData other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!Equals(Pokemon, other.Pokemon)) return false;
-            if (!Equals(Item, other.Item)) return false;
-            if (!Equals(PokedexEntry, other.PokedexEntry)) return false;
-            if (!Equals(PlayerStats, other.PlayerStats)) return false;
-            if (!Equals(PlayerCurrency, other.PlayerCurrency)) return false;
-            if (!Equals(PlayerCamera, other.PlayerCamera)) return false;
-            if (!Equals(InventoryUpgrades, other.InventoryUpgrades)) return false;
-            if (!Equals(AppliedItems, other.AppliedItems)) return false;
-            if (!Equals(EggIncubators, other.EggIncubators)) return false;
-            if (!Equals(PokemonFamily, other.PokemonFamily)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (pokemon_ != null)
-            {
-                output.WriteRawTag(10);
-                output.WriteMessage(Pokemon);
-            }
-            if (item_ != null)
-            {
-                output.WriteRawTag(18);
-                output.WriteMessage(Item);
-            }
-            if (pokedexEntry_ != null)
-            {
-                output.WriteRawTag(26);
-                output.WriteMessage(PokedexEntry);
-            }
-            if (playerStats_ != null)
-            {
-                output.WriteRawTag(34);
-                output.WriteMessage(PlayerStats);
-            }
-            if (playerCurrency_ != null)
-            {
-                output.WriteRawTag(42);
-                output.WriteMessage(PlayerCurrency);
-            }
-            if (playerCamera_ != null)
-            {
-                output.WriteRawTag(50);
-                output.WriteMessage(PlayerCamera);
-            }
-            if (inventoryUpgrades_ != null)
-            {
-                output.WriteRawTag(58);
-                output.WriteMessage(InventoryUpgrades);
-            }
-            if (appliedItems_ != null)
-            {
-                output.WriteRawTag(66);
-                output.WriteMessage(AppliedItems);
-            }
-            if (eggIncubators_ != null)
-            {
-                output.WriteRawTag(74);
-                output.WriteMessage(EggIncubators);
-            }
-            if (pokemonFamily_ != null)
-            {
-                output.WriteRawTag(82);
-                output.WriteMessage(PokemonFamily);
-            }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public sealed partial class RecycleInventoryItem : pb::IMessage<RecycleInventoryItem>
-        {
-            private static readonly pb::MessageParser<RecycleInventoryItem> _parser = new pb::MessageParser<RecycleInventoryItem>(() => new RecycleInventoryItem());
-            public static pb::MessageParser<RecycleInventoryItem> Parser { get { return _parser; } }
-
-            public static pbr::MessageDescriptor Descriptor
-            {
-                get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[10]; }
-            }
-
-            pbr::MessageDescriptor pb::IMessage.Descriptor
-            {
-                get { return Descriptor; }
-            }
-
-            public RecycleInventoryItem()
-            {
-                OnConstruction();
-            }
-
-            partial void OnConstruction();
-
-            public RecycleInventoryItem(RecycleInventoryItem other) : this()
-            {
-                itemId_ = other.itemId_;
-                count_ = other.count_;
-            }
-
-            public RecycleInventoryItem Clone()
-            {
-                return new RecycleInventoryItem(this);
-            }
-
-            /// <summary>Field number for the "item_id" field.</summary>
-            public const int ItemIdFieldNumber = 1;
-            private global::AllEnum.ItemId itemId_ = 0;
-            public global::AllEnum.ItemId ItemId
-            {
-                get { return itemId_; }
-                set
-                {
-                    itemId_ = value;
-                }
-            }
-
-            /// <summary>Field number for the "count" field.</summary>
-            public const int CountFieldNumber = 2;
-            private int count_;
-            public int Count
-            {
-                get { return count_; }
-                set
-                {
-                    count_ = value;
-                }
-            }
-
-            public override bool Equals(object other)
-            {
-                return Equals(other as RecycleInventoryItem);
-            }
-
-            public bool Equals(RecycleInventoryItem other)
-            {
-                if (ReferenceEquals(other, null))
-                {
-                    return false;
-                }
-                if (ReferenceEquals(other, this))
-                {
-                    return true;
-                }
-                if (ItemId != other.ItemId) return false;
-                if (Count != other.Count) return false;
-                return true;
-            }
-
-            public override int GetHashCode()
-            {
-                int hash = 1;
-                if (ItemId != 0) hash ^= ItemId.GetHashCode();
-                if (Count != 0) hash ^= Count.GetHashCode();
-                return hash;
-            }
-
-            public override string ToString()
-            {
-                return pb::JsonFormatter.ToDiagnosticString(this);
-            }
-
-            public void WriteTo(pb::CodedOutputStream output)
-            {
-                if (ItemId != 0)
-                {
-                    output.WriteRawTag(8);
-                    output.WriteEnum((int)ItemId);
-                }
-                if (Count != 0)
-                {
-                    output.WriteRawTag(16);
-                    output.WriteInt32(Count);
-                }
-            }
-
-            public int CalculateSize()
-            {
-                int size = 0;
-                if (ItemId != 0)
-                {
-                    size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
-                }
-                if (Count != 0)
-                {
-                    size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
-                }
-                return size;
-            }
-
-            public void MergeFrom(RecycleInventoryItem other)
-            {
-                if (other == null)
-                {
-                    return;
-                }
-                if (other.ItemId != 0)
-                {
-                    ItemId = other.ItemId;
-                }
-                if (other.Count != 0)
-                {
-                    Count = other.Count;
-                }
-            }
-
-            public void MergeFrom(pb::CodedInputStream input)
-            {
-                uint tag;
-                while ((tag = input.ReadTag()) != 0)
-                {
-                    switch (tag)
-                    {
-                        default:
-                            input.SkipLastField();
-                            break;
-                        case 8:
-                            {
-                                itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
-                                break;
-                            }
-                        case 16:
-                            {
-                                Count = input.ReadInt32();
-                                break;
-                            }
-                    }
-                }
-            }
-
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (pokemon_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Pokemon);
-            }
-            if (item_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Item);
-            }
-            if (pokedexEntry_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokedexEntry);
-            }
-            if (playerStats_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerStats);
-            }
-            if (playerCurrency_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerCurrency);
-            }
-            if (playerCamera_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerCamera);
-            }
-            if (inventoryUpgrades_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryUpgrades);
-            }
-            if (appliedItems_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(AppliedItems);
-            }
-            if (eggIncubators_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubators);
-            }
-            if (pokemonFamily_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonFamily);
-            }
-            return size;
-        }
-
-        public void MergeFrom(InventoryItemData other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.pokemon_ != null)
-            {
-                if (pokemon_ == null)
-                {
-                    pokemon_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                }
-                Pokemon.MergeFrom(other.Pokemon);
-            }
-            if (other.item_ != null)
-            {
-                if (item_ == null)
-                {
-                    item_ = new global::PokemonGo.RocketAPI.GeneratedCode.Item();
-                }
-                Item.MergeFrom(other.Item);
-            }
-            if (other.pokedexEntry_ != null)
-            {
-                if (pokedexEntry_ == null)
-                {
-                    pokedexEntry_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokedexEntry();
-                }
-                PokedexEntry.MergeFrom(other.PokedexEntry);
-            }
-            if (other.playerStats_ != null)
-            {
-                if (playerStats_ == null)
-                {
-                    playerStats_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerStats();
-                }
-                PlayerStats.MergeFrom(other.PlayerStats);
-            }
-            if (other.playerCurrency_ != null)
-            {
-                if (playerCurrency_ == null)
-                {
-                    playerCurrency_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerCurrency();
-                }
-                PlayerCurrency.MergeFrom(other.PlayerCurrency);
-            }
-            if (other.playerCamera_ != null)
-            {
-                if (playerCamera_ == null)
-                {
-                    playerCamera_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerCamera();
-                }
-                PlayerCamera.MergeFrom(other.PlayerCamera);
-            }
-            if (other.inventoryUpgrades_ != null)
-            {
-                if (inventoryUpgrades_ == null)
-                {
-                    inventoryUpgrades_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrades();
-                }
-                InventoryUpgrades.MergeFrom(other.InventoryUpgrades);
-            }
-            if (other.appliedItems_ != null)
-            {
-                if (appliedItems_ == null)
-                {
-                    appliedItems_ = new global::PokemonGo.RocketAPI.GeneratedCode.AppliedItems();
-                }
-                AppliedItems.MergeFrom(other.AppliedItems);
-            }
-            if (other.eggIncubators_ != null)
-            {
-                if (eggIncubators_ == null)
-                {
-                    eggIncubators_ = new global::PokemonGo.RocketAPI.GeneratedCode.EggIncubators();
-                }
-                EggIncubators.MergeFrom(other.EggIncubators);
-            }
-            if (other.pokemonFamily_ != null)
-            {
-                if (pokemonFamily_ == null)
-                {
-                    pokemonFamily_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonFamily();
-                }
-                PokemonFamily.MergeFrom(other.PokemonFamily);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            if (pokemon_ == null)
-                            {
-                                pokemon_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                            }
-                            input.ReadMessage(pokemon_);
-                            break;
-                        }
-                    case 18:
-                        {
-                            if (item_ == null)
-                            {
-                                item_ = new global::PokemonGo.RocketAPI.GeneratedCode.Item();
-                            }
-                            input.ReadMessage(item_);
-                            break;
-                        }
-                    case 26:
-                        {
-                            if (pokedexEntry_ == null)
-                            {
-                                pokedexEntry_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokedexEntry();
-                            }
-                            input.ReadMessage(pokedexEntry_);
-                            break;
-                        }
-                    case 34:
-                        {
-                            if (playerStats_ == null)
-                            {
-                                playerStats_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerStats();
-                            }
-                            input.ReadMessage(playerStats_);
-                            break;
-                        }
-                    case 42:
-                        {
-                            if (playerCurrency_ == null)
-                            {
-                                playerCurrency_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerCurrency();
-                            }
-                            input.ReadMessage(playerCurrency_);
-                            break;
-                        }
-                    case 50:
-                        {
-                            if (playerCamera_ == null)
-                            {
-                                playerCamera_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerCamera();
-                            }
-                            input.ReadMessage(playerCamera_);
-                            break;
-                        }
-                    case 58:
-                        {
-                            if (inventoryUpgrades_ == null)
-                            {
-                                inventoryUpgrades_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrades();
-                            }
-                            input.ReadMessage(inventoryUpgrades_);
-                            break;
-                        }
-                    case 66:
-                        {
-                            if (appliedItems_ == null)
-                            {
-                                appliedItems_ = new global::PokemonGo.RocketAPI.GeneratedCode.AppliedItems();
-                            }
-                            input.ReadMessage(appliedItems_);
-                            break;
-                        }
-                    case 74:
-                        {
-                            if (eggIncubators_ == null)
-                            {
-                                eggIncubators_ = new global::PokemonGo.RocketAPI.GeneratedCode.EggIncubators();
-                            }
-                            input.ReadMessage(eggIncubators_);
-                            break;
-                        }
-                    case 82:
-                        {
-                            if (pokemonFamily_ == null)
-                            {
-                                pokemonFamily_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonFamily();
-                            }
-                            input.ReadMessage(pokemonFamily_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventoryItemData);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (pokemon_ != null) hash ^= Pokemon.GetHashCode();
-            if (item_ != null) hash ^= Item.GetHashCode();
-            if (pokedexEntry_ != null) hash ^= PokedexEntry.GetHashCode();
-            if (playerStats_ != null) hash ^= PlayerStats.GetHashCode();
-            if (playerCurrency_ != null) hash ^= PlayerCurrency.GetHashCode();
-            if (playerCamera_ != null) hash ^= PlayerCamera.GetHashCode();
-            if (inventoryUpgrades_ != null) hash ^= InventoryUpgrades.GetHashCode();
-            if (appliedItems_ != null) hash ^= AppliedItems.GetHashCode();
-            if (eggIncubators_ != null) hash ^= EggIncubators.GetHashCode();
-            if (pokemonFamily_ != null) hash ^= PokemonFamily.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class Pokemon : pb::IMessage<Pokemon>
-    {
-        /// <summary>Field number for the "id" field.</summary>
-        public const int IdFieldNumber = 1;
-
-        /// <summary>Field number for the "pokemon_type" field.</summary>
-        public const int PokemonTypeFieldNumber = 2;
-
-        /// <summary>Field number for the "cp" field.</summary>
-        public const int CpFieldNumber = 3;
-
-        /// <summary>Field number for the "stamina" field.</summary>
-        public const int StaminaFieldNumber = 4;
-
-        /// <summary>Field number for the "stamina_max" field.</summary>
-        public const int StaminaMaxFieldNumber = 5;
-
-        /// <summary>Field number for the "move_1" field.</summary>
-        public const int Move1FieldNumber = 6;
-
-        /// <summary>Field number for the "move_2" field.</summary>
-        public const int Move2FieldNumber = 7;
-
-        /// <summary>Field number for the "deployed_fort_id" field.</summary>
-        public const int DeployedFortIdFieldNumber = 8;
-
-        /// <summary>Field number for the "owner_name" field.</summary>
-        public const int OwnerNameFieldNumber = 9;
-
-        /// <summary>Field number for the "is_egg" field.</summary>
-        public const int IsEggFieldNumber = 10;
-
-        /// <summary>Field number for the "egg_km_walked_target" field.</summary>
-        public const int EggKmWalkedTargetFieldNumber = 11;
-
-        /// <summary>Field number for the "egg_km_walked_start" field.</summary>
-        public const int EggKmWalkedStartFieldNumber = 12;
-
-        /// <summary>Field number for the "origin" field.</summary>
-        public const int OriginFieldNumber = 14;
-
-        /// <summary>Field number for the "height_m" field.</summary>
-        public const int HeightMFieldNumber = 15;
-
-        /// <summary>Field number for the "weight_kg" field.</summary>
-        public const int WeightKgFieldNumber = 16;
-
-        /// <summary>Field number for the "individual_attack" field.</summary>
-        public const int IndividualAttackFieldNumber = 17;
-
-        /// <summary>Field number for the "individual_defense" field.</summary>
-        public const int IndividualDefenseFieldNumber = 18;
-
-        /// <summary>Field number for the "individual_stamina" field.</summary>
-        public const int IndividualStaminaFieldNumber = 19;
-
-        /// <summary>Field number for the "cp_multiplier" field.</summary>
-        public const int CpMultiplierFieldNumber = 20;
-
-        /// <summary>Field number for the "pokeball" field.</summary>
-        public const int PokeballFieldNumber = 21;
-
-        /// <summary>Field number for the "captured_cell_id" field.</summary>
-        public const int CapturedCellIdFieldNumber = 22;
-
-        /// <summary>Field number for the "battles_attacked" field.</summary>
-        public const int BattlesAttackedFieldNumber = 23;
-
-        /// <summary>Field number for the "battles_defended" field.</summary>
-        public const int BattlesDefendedFieldNumber = 24;
-
-        /// <summary>Field number for the "egg_incubator_id" field.</summary>
-        public const int EggIncubatorIdFieldNumber = 25;
-
-        /// <summary>Field number for the "creation_time_ms" field.</summary>
-        public const int CreationTimeMsFieldNumber = 26;
-
-        /// <summary>Field number for the "num_upgrades" field.</summary>
-        public const int NumUpgradesFieldNumber = 27;
-
-        /// <summary>Field number for the "additional_cp_multiplier" field.</summary>
-        public const int AdditionalCpMultiplierFieldNumber = 28;
-
-        /// <summary>Field number for the "favorite" field.</summary>
-        public const int FavoriteFieldNumber = 29;
-
-        /// <summary>Field number for the "nickname" field.</summary>
-        public const int NicknameFieldNumber = 30;
-
-        /// <summary>Field number for the "from_fort" field.</summary>
-        public const int FromFortFieldNumber = 31;
-
-        private static readonly pb::MessageParser<Pokemon> _parser = new pb::MessageParser<Pokemon>(() => new Pokemon());
-        private int additionalCpMultiplier_;
-        private int battlesAttacked_;
-        private int battlesDefended_;
-        private ulong capturedCellId_;
-        private int cp_;
-        private int cpMultiplier_;
-        private ulong creationTimeMs_;
-        private int deployedFortId_;
-        private int eggIncubatorId_;
-        private int eggKmWalkedStart_;
-        private int eggKmWalkedTarget_;
-        private int favorite_;
-        private int fromFort_;
-        private float heightM_;
-        private int id_;
-        private int individualAttack_;
-        private int individualDefense_;
-        private int individualStamina_;
-        private bool isEgg_;
-        private global::AllEnum.PokemonMove move1_ = 0;
-        private global::AllEnum.PokemonMove move2_ = 0;
-        private string nickname_ = "";
-        private int numUpgrades_;
-        private int origin_;
-        private string ownerName_ = "";
-        private int pokeball_;
-        private global::AllEnum.PokemonId pokemonType_ = 0;
-        private int stamina_;
-        private int staminaMax_;
-        private float weightKg_;
-
-        public Pokemon()
-        {
-            OnConstruction();
-        }
-
-        public Pokemon(Pokemon other) : this()
-        {
-            id_ = other.id_;
-            pokemonType_ = other.pokemonType_;
-            cp_ = other.cp_;
-            stamina_ = other.stamina_;
-            staminaMax_ = other.staminaMax_;
-            move1_ = other.move1_;
-            move2_ = other.move2_;
-            deployedFortId_ = other.deployedFortId_;
-            ownerName_ = other.ownerName_;
-            isEgg_ = other.isEgg_;
-            eggKmWalkedTarget_ = other.eggKmWalkedTarget_;
-            eggKmWalkedStart_ = other.eggKmWalkedStart_;
-            origin_ = other.origin_;
-            heightM_ = other.heightM_;
-            weightKg_ = other.weightKg_;
-            individualAttack_ = other.individualAttack_;
-            individualDefense_ = other.individualDefense_;
-            individualStamina_ = other.individualStamina_;
-            cpMultiplier_ = other.cpMultiplier_;
-            pokeball_ = other.pokeball_;
-            capturedCellId_ = other.capturedCellId_;
-            battlesAttacked_ = other.battlesAttacked_;
-            battlesDefended_ = other.battlesDefended_;
-            eggIncubatorId_ = other.eggIncubatorId_;
-            creationTimeMs_ = other.creationTimeMs_;
-            numUpgrades_ = other.numUpgrades_;
-            additionalCpMultiplier_ = other.additionalCpMultiplier_;
-            favorite_ = other.favorite_;
-            nickname_ = other.nickname_;
-            fromFort_ = other.fromFort_;
-        }
-
-        public static pb::MessageParser<Pokemon> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[10]; }
-        }
-
-        public int Id
-        {
-            get { return id_; }
-            set { id_ = value; }
-        }
-
-        public global::AllEnum.PokemonId PokemonType
-        {
-            get { return pokemonType_; }
-            set { pokemonType_ = value; }
-        }
-
-        public int Cp
-        {
-            get { return cp_; }
-            set { cp_ = value; }
-        }
-
-        public int Stamina
-        {
-            get { return stamina_; }
-            set { stamina_ = value; }
-        }
-
-        public int StaminaMax
-        {
-            get { return staminaMax_; }
-            set { staminaMax_ = value; }
-        }
-
-        public global::AllEnum.PokemonMove Move1
-        {
-            get { return move1_; }
-            set { move1_ = value; }
-        }
-
-        public global::AllEnum.PokemonMove Move2
-        {
-            get { return move2_; }
-            set { move2_ = value; }
-        }
-
-        public int DeployedFortId
-        {
-            get { return deployedFortId_; }
-            set { deployedFortId_ = value; }
-        }
-
-        public string OwnerName
-        {
-            get { return ownerName_; }
-            set { ownerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public bool IsEgg
-        {
-            get { return isEgg_; }
-            set { isEgg_ = value; }
-        }
-
-        public int EggKmWalkedTarget
-        {
-            get { return eggKmWalkedTarget_; }
-            set { eggKmWalkedTarget_ = value; }
-        }
-
-        public int EggKmWalkedStart
-        {
-            get { return eggKmWalkedStart_; }
-            set { eggKmWalkedStart_ = value; }
-        }
-
-        public int Origin
-        {
-            get { return origin_; }
-            set { origin_ = value; }
-        }
-
-        public float HeightM
-        {
-            get { return heightM_; }
-            set { heightM_ = value; }
-        }
-
-        public float WeightKg
-        {
-            get { return weightKg_; }
-            set { weightKg_ = value; }
-        }
-
-        public int IndividualAttack
-        {
-            get { return individualAttack_; }
-            set { individualAttack_ = value; }
-        }
-
-        public int IndividualDefense
-        {
-            get { return individualDefense_; }
-            set { individualDefense_ = value; }
-        }
-
-        public int IndividualStamina
-        {
-            get { return individualStamina_; }
-            set { individualStamina_ = value; }
-        }
-
-        public int CpMultiplier
-        {
-            get { return cpMultiplier_; }
-            set { cpMultiplier_ = value; }
-        }
-
-        public int Pokeball
-        {
-            get { return pokeball_; }
-            set { pokeball_ = value; }
-        }
-
-        public ulong CapturedCellId
-        {
-            get { return capturedCellId_; }
-            set { capturedCellId_ = value; }
-        }
-
-        public int BattlesAttacked
-        {
-            get { return battlesAttacked_; }
-            set { battlesAttacked_ = value; }
-        }
-
-        public int BattlesDefended
-        {
-            get { return battlesDefended_; }
-            set { battlesDefended_ = value; }
-        }
-
-        public int EggIncubatorId
-        {
-            get { return eggIncubatorId_; }
-            set { eggIncubatorId_ = value; }
-        }
-
-        public ulong CreationTimeMs
-        {
-            get { return creationTimeMs_; }
-            set { creationTimeMs_ = value; }
-        }
-
-        public int NumUpgrades
-        {
-            get { return numUpgrades_; }
-            set { numUpgrades_ = value; }
-        }
-
-        public int AdditionalCpMultiplier
-        {
-            get { return additionalCpMultiplier_; }
-            set { additionalCpMultiplier_ = value; }
-        }
-
-        public int Favorite
-        {
-            get { return favorite_; }
-            set { favorite_ = value; }
-        }
-
-        public string Nickname
-        {
-            get { return nickname_; }
-            set { nickname_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public int FromFort
-        {
-            get { return fromFort_; }
-            set { fromFort_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public Pokemon Clone()
-        {
-            return new Pokemon(this);
-        }
-
-        public bool Equals(Pokemon other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Id != other.Id) return false;
-            if (PokemonType != other.PokemonType) return false;
-            if (Cp != other.Cp) return false;
-            if (Stamina != other.Stamina) return false;
-            if (StaminaMax != other.StaminaMax) return false;
-            if (Move1 != other.Move1) return false;
-            if (Move2 != other.Move2) return false;
-            if (DeployedFortId != other.DeployedFortId) return false;
-            if (OwnerName != other.OwnerName) return false;
-            if (IsEgg != other.IsEgg) return false;
-            if (EggKmWalkedTarget != other.EggKmWalkedTarget) return false;
-            if (EggKmWalkedStart != other.EggKmWalkedStart) return false;
-            if (Origin != other.Origin) return false;
-            if (HeightM != other.HeightM) return false;
-            if (WeightKg != other.WeightKg) return false;
-            if (IndividualAttack != other.IndividualAttack) return false;
-            if (IndividualDefense != other.IndividualDefense) return false;
-            if (IndividualStamina != other.IndividualStamina) return false;
-            if (CpMultiplier != other.CpMultiplier) return false;
-            if (Pokeball != other.Pokeball) return false;
-            if (CapturedCellId != other.CapturedCellId) return false;
-            if (BattlesAttacked != other.BattlesAttacked) return false;
-            if (BattlesDefended != other.BattlesDefended) return false;
-            if (EggIncubatorId != other.EggIncubatorId) return false;
-            if (CreationTimeMs != other.CreationTimeMs) return false;
-            if (NumUpgrades != other.NumUpgrades) return false;
-            if (AdditionalCpMultiplier != other.AdditionalCpMultiplier) return false;
-            if (Favorite != other.Favorite) return false;
-            if (Nickname != other.Nickname) return false;
-            if (FromFort != other.FromFort) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Id != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Id);
-            }
-            if (PokemonType != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)PokemonType);
-            }
-            if (Cp != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(Cp);
-            }
-            if (Stamina != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(Stamina);
-            }
-            if (StaminaMax != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(StaminaMax);
-            }
-            if (Move1 != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteEnum((int)Move1);
-            }
-            if (Move2 != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteEnum((int)Move2);
-            }
-            if (DeployedFortId != 0)
-            {
-                output.WriteRawTag(64);
-                output.WriteInt32(DeployedFortId);
-            }
-            if (OwnerName.Length != 0)
-            {
-                output.WriteRawTag(74);
-                output.WriteString(OwnerName);
-            }
-            if (IsEgg != false)
-            {
-                output.WriteRawTag(80);
-                output.WriteBool(IsEgg);
-            }
-            if (EggKmWalkedTarget != 0)
-            {
-                output.WriteRawTag(88);
-                output.WriteInt32(EggKmWalkedTarget);
-            }
-            if (EggKmWalkedStart != 0)
-            {
-                output.WriteRawTag(96);
-                output.WriteInt32(EggKmWalkedStart);
-            }
-            if (Origin != 0)
-            {
-                output.WriteRawTag(112);
-                output.WriteInt32(Origin);
-            }
-            if (HeightM != 0F)
-            {
-                output.WriteRawTag(125);
-                output.WriteFloat(HeightM);
-            }
-            if (WeightKg != 0F)
-            {
-                output.WriteRawTag(133, 1);
-                output.WriteFloat(WeightKg);
-            }
-            if (IndividualAttack != 0)
-            {
-                output.WriteRawTag(136, 1);
-                output.WriteInt32(IndividualAttack);
-            }
-            if (IndividualDefense != 0)
-            {
-                output.WriteRawTag(144, 1);
-                output.WriteInt32(IndividualDefense);
-            }
-            if (IndividualStamina != 0)
-            {
-                output.WriteRawTag(152, 1);
-                output.WriteInt32(IndividualStamina);
-            }
-            if (CpMultiplier != 0)
-            {
-                output.WriteRawTag(160, 1);
-                output.WriteInt32(CpMultiplier);
-            }
-            if (Pokeball != 0)
-            {
-                output.WriteRawTag(168, 1);
-                output.WriteInt32(Pokeball);
-            }
-            if (CapturedCellId != 0UL)
-            {
-                output.WriteRawTag(176, 1);
-                output.WriteUInt64(CapturedCellId);
-            }
-            if (BattlesAttacked != 0)
-            {
-                output.WriteRawTag(184, 1);
-                output.WriteInt32(BattlesAttacked);
-            }
-            if (BattlesDefended != 0)
-            {
-                output.WriteRawTag(192, 1);
-                output.WriteInt32(BattlesDefended);
-            }
-            if (EggIncubatorId != 0)
-            {
-                output.WriteRawTag(200, 1);
-                output.WriteInt32(EggIncubatorId);
-            }
-            if (CreationTimeMs != 0UL)
-            {
-                output.WriteRawTag(208, 1);
-                output.WriteUInt64(CreationTimeMs);
-            }
-            if (NumUpgrades != 0)
-            {
-                output.WriteRawTag(216, 1);
-                output.WriteInt32(NumUpgrades);
-            }
-            if (AdditionalCpMultiplier != 0)
-            {
-                output.WriteRawTag(224, 1);
-                output.WriteInt32(AdditionalCpMultiplier);
-            }
-            if (Favorite != 0)
-            {
-                output.WriteRawTag(232, 1);
-                output.WriteInt32(Favorite);
-            }
-            if (Nickname.Length != 0)
-            {
-                output.WriteRawTag(242, 1);
-                output.WriteString(Nickname);
-            }
-            if (FromFort != 0)
-            {
-                output.WriteRawTag(248, 1);
-                output.WriteInt32(FromFort);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Id != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Id);
-            }
-            if (PokemonType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)PokemonType);
-            }
-            if (Cp != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Cp);
-            }
-            if (Stamina != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
-            }
-            if (StaminaMax != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaminaMax);
-            }
-            if (Move1 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Move1);
-            }
-            if (Move2 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Move2);
-            }
-            if (DeployedFortId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DeployedFortId);
-            }
-            if (OwnerName.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(OwnerName);
-            }
-            if (IsEgg != false)
-            {
-                size += 1 + 1;
-            }
-            if (EggKmWalkedTarget != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggKmWalkedTarget);
-            }
-            if (EggKmWalkedStart != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggKmWalkedStart);
-            }
-            if (Origin != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Origin);
-            }
-            if (HeightM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (WeightKg != 0F)
-            {
-                size += 2 + 4;
-            }
-            if (IndividualAttack != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualAttack);
-            }
-            if (IndividualDefense != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualDefense);
-            }
-            if (IndividualStamina != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualStamina);
-            }
-            if (CpMultiplier != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(CpMultiplier);
-            }
-            if (Pokeball != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(Pokeball);
-            }
-            if (CapturedCellId != 0UL)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CapturedCellId);
-            }
-            if (BattlesAttacked != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesAttacked);
-            }
-            if (BattlesDefended != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesDefended);
-            }
-            if (EggIncubatorId != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(EggIncubatorId);
-            }
-            if (CreationTimeMs != 0UL)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CreationTimeMs);
-            }
-            if (NumUpgrades != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(NumUpgrades);
-            }
-            if (AdditionalCpMultiplier != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(AdditionalCpMultiplier);
-            }
-            if (Favorite != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(Favorite);
-            }
-            if (Nickname.Length != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeStringSize(Nickname);
-            }
-            if (FromFort != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(FromFort);
-            }
-            return size;
-        }
-
-        public void MergeFrom(Pokemon other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Id != 0)
-            {
-                Id = other.Id;
-            }
-            if (other.PokemonType != 0)
-            {
-                PokemonType = other.PokemonType;
-            }
-            if (other.Cp != 0)
-            {
-                Cp = other.Cp;
-            }
-            if (other.Stamina != 0)
-            {
-                Stamina = other.Stamina;
-            }
-            if (other.StaminaMax != 0)
-            {
-                StaminaMax = other.StaminaMax;
-            }
-            if (other.Move1 != 0)
-            {
-                Move1 = other.Move1;
-            }
-            if (other.Move2 != 0)
-            {
-                Move2 = other.Move2;
-            }
-            if (other.DeployedFortId != 0)
-            {
-                DeployedFortId = other.DeployedFortId;
-            }
-            if (other.OwnerName.Length != 0)
-            {
-                OwnerName = other.OwnerName;
-            }
-            if (other.IsEgg != false)
-            {
-                IsEgg = other.IsEgg;
-            }
-            if (other.EggKmWalkedTarget != 0)
-            {
-                EggKmWalkedTarget = other.EggKmWalkedTarget;
-            }
-            if (other.EggKmWalkedStart != 0)
-            {
-                EggKmWalkedStart = other.EggKmWalkedStart;
-            }
-            if (other.Origin != 0)
-            {
-                Origin = other.Origin;
-            }
-            if (other.HeightM != 0F)
-            {
-                HeightM = other.HeightM;
-            }
-            if (other.WeightKg != 0F)
-            {
-                WeightKg = other.WeightKg;
-            }
-            if (other.IndividualAttack != 0)
-            {
-                IndividualAttack = other.IndividualAttack;
-            }
-            if (other.IndividualDefense != 0)
-            {
-                IndividualDefense = other.IndividualDefense;
-            }
-            if (other.IndividualStamina != 0)
-            {
-                IndividualStamina = other.IndividualStamina;
-            }
-            if (other.CpMultiplier != 0)
-            {
-                CpMultiplier = other.CpMultiplier;
-            }
-            if (other.Pokeball != 0)
-            {
-                Pokeball = other.Pokeball;
-            }
-            if (other.CapturedCellId != 0UL)
-            {
-                CapturedCellId = other.CapturedCellId;
-            }
-            if (other.BattlesAttacked != 0)
-            {
-                BattlesAttacked = other.BattlesAttacked;
-            }
-            if (other.BattlesDefended != 0)
-            {
-                BattlesDefended = other.BattlesDefended;
-            }
-            if (other.EggIncubatorId != 0)
-            {
-                EggIncubatorId = other.EggIncubatorId;
-            }
-            if (other.CreationTimeMs != 0UL)
-            {
-                CreationTimeMs = other.CreationTimeMs;
-            }
-            if (other.NumUpgrades != 0)
-            {
-                NumUpgrades = other.NumUpgrades;
-            }
-            if (other.AdditionalCpMultiplier != 0)
-            {
-                AdditionalCpMultiplier = other.AdditionalCpMultiplier;
-            }
-            if (other.Favorite != 0)
-            {
-                Favorite = other.Favorite;
-            }
-            if (other.Nickname.Length != 0)
-            {
-                Nickname = other.Nickname;
-            }
-            if (other.FromFort != 0)
-            {
-                FromFort = other.FromFort;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Id = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            pokemonType_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            Cp = input.ReadInt32();
-                            break;
-                        }
-                    case 32:
-                        {
-                            Stamina = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            StaminaMax = input.ReadInt32();
-                            break;
-                        }
-                    case 48:
-                        {
-                            move1_ = (global::AllEnum.PokemonMove)input.ReadEnum();
-                            break;
-                        }
-                    case 56:
-                        {
-                            move2_ = (global::AllEnum.PokemonMove)input.ReadEnum();
-                            break;
-                        }
-                    case 64:
-                        {
-                            DeployedFortId = input.ReadInt32();
-                            break;
-                        }
-                    case 74:
-                        {
-                            OwnerName = input.ReadString();
-                            break;
-                        }
-                    case 80:
-                        {
-                            IsEgg = input.ReadBool();
-                            break;
-                        }
-                    case 88:
-                        {
-                            EggKmWalkedTarget = input.ReadInt32();
-                            break;
-                        }
-                    case 96:
-                        {
-                            EggKmWalkedStart = input.ReadInt32();
-                            break;
-                        }
-                    case 112:
-                        {
-                            Origin = input.ReadInt32();
-                            break;
-                        }
-                    case 125:
-                        {
-                            HeightM = input.ReadFloat();
-                            break;
-                        }
-                    case 133:
-                        {
-                            WeightKg = input.ReadFloat();
-                            break;
-                        }
-                    case 136:
-                        {
-                            IndividualAttack = input.ReadInt32();
-                            break;
-                        }
-                    case 144:
-                        {
-                            IndividualDefense = input.ReadInt32();
-                            break;
-                        }
-                    case 152:
-                        {
-                            IndividualStamina = input.ReadInt32();
-                            break;
-                        }
-                    case 160:
-                        {
-                            CpMultiplier = input.ReadInt32();
-                            break;
-                        }
-                    case 168:
-                        {
-                            Pokeball = input.ReadInt32();
-                            break;
-                        }
-                    case 176:
-                        {
-                            CapturedCellId = input.ReadUInt64();
-                            break;
-                        }
-                    case 184:
-                        {
-                            BattlesAttacked = input.ReadInt32();
-                            break;
-                        }
-                    case 192:
-                        {
-                            BattlesDefended = input.ReadInt32();
-                            break;
-                        }
-                    case 200:
-                        {
-                            EggIncubatorId = input.ReadInt32();
-                            break;
-                        }
-                    case 208:
-                        {
-                            CreationTimeMs = input.ReadUInt64();
-                            break;
-                        }
-                    case 216:
-                        {
-                            NumUpgrades = input.ReadInt32();
-                            break;
-                        }
-                    case 224:
-                        {
-                            AdditionalCpMultiplier = input.ReadInt32();
-                            break;
-                        }
-                    case 232:
-                        {
-                            Favorite = input.ReadInt32();
-                            break;
-                        }
-                    case 242:
-                        {
-                            Nickname = input.ReadString();
-                            break;
-                        }
-                    case 248:
-                        {
-                            FromFort = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as Pokemon);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Id != 0) hash ^= Id.GetHashCode();
-            if (PokemonType != 0) hash ^= PokemonType.GetHashCode();
-            if (Cp != 0) hash ^= Cp.GetHashCode();
-            if (Stamina != 0) hash ^= Stamina.GetHashCode();
-            if (StaminaMax != 0) hash ^= StaminaMax.GetHashCode();
-            if (Move1 != 0) hash ^= Move1.GetHashCode();
-            if (Move2 != 0) hash ^= Move2.GetHashCode();
-            if (DeployedFortId != 0) hash ^= DeployedFortId.GetHashCode();
-            if (OwnerName.Length != 0) hash ^= OwnerName.GetHashCode();
-            if (IsEgg != false) hash ^= IsEgg.GetHashCode();
-            if (EggKmWalkedTarget != 0) hash ^= EggKmWalkedTarget.GetHashCode();
-            if (EggKmWalkedStart != 0) hash ^= EggKmWalkedStart.GetHashCode();
-            if (Origin != 0) hash ^= Origin.GetHashCode();
-            if (HeightM != 0F) hash ^= HeightM.GetHashCode();
-            if (WeightKg != 0F) hash ^= WeightKg.GetHashCode();
-            if (IndividualAttack != 0) hash ^= IndividualAttack.GetHashCode();
-            if (IndividualDefense != 0) hash ^= IndividualDefense.GetHashCode();
-            if (IndividualStamina != 0) hash ^= IndividualStamina.GetHashCode();
-            if (CpMultiplier != 0) hash ^= CpMultiplier.GetHashCode();
-            if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
-            if (CapturedCellId != 0UL) hash ^= CapturedCellId.GetHashCode();
-            if (BattlesAttacked != 0) hash ^= BattlesAttacked.GetHashCode();
-            if (BattlesDefended != 0) hash ^= BattlesDefended.GetHashCode();
-            if (EggIncubatorId != 0) hash ^= EggIncubatorId.GetHashCode();
-            if (CreationTimeMs != 0UL) hash ^= CreationTimeMs.GetHashCode();
-            if (NumUpgrades != 0) hash ^= NumUpgrades.GetHashCode();
-            if (AdditionalCpMultiplier != 0) hash ^= AdditionalCpMultiplier.GetHashCode();
-            if (Favorite != 0) hash ^= Favorite.GetHashCode();
-            if (Nickname.Length != 0) hash ^= Nickname.GetHashCode();
-            if (FromFort != 0) hash ^= FromFort.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class Item : pb::IMessage<Item>
-    {
-        /// <summary>Field number for the "item" field.</summary>
-        public const int Item_FieldNumber = 1;
-
-        /// <summary>Field number for the "count" field.</summary>
-        public const int CountFieldNumber = 2;
-
-        /// <summary>Field number for the "unseen" field.</summary>
-        public const int UnseenFieldNumber = 3;
-
-        private static readonly pb::MessageParser<Item> _parser = new pb::MessageParser<Item>(() => new Item());
-        private int count_;
-        private global::AllEnum.ItemType item_ = 0;
-        private bool unseen_;
-
-        public Item()
-        {
-            OnConstruction();
-        }
-
-        public Item(Item other) : this()
-        {
-            item_ = other.item_;
-            count_ = other.count_;
-            unseen_ = other.unseen_;
-        }
-
-        public static pb::MessageParser<Item> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[11]; }
-        }
-
-        public global::AllEnum.ItemType Item_
-        {
-            get { return item_; }
-            set { item_ = value; }
-        }
-
-        public int Count
-        {
-            get { return count_; }
-            set { count_ = value; }
-        }
-
-        public bool Unseen
-        {
-            get { return unseen_; }
-            set { unseen_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public Item Clone()
-        {
-            return new Item(this);
-        }
-
-        public bool Equals(Item other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Item_ != other.Item_) return false;
-            if (Count != other.Count) return false;
-            if (Unseen != other.Unseen) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Item_ != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)Item_);
-            }
-            if (Count != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(Count);
-            }
-            if (Unseen != false)
-            {
-                output.WriteRawTag(24);
-                output.WriteBool(Unseen);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Item_ != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Item_);
-            }
-            if (Count != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
-            }
-            if (Unseen != false)
-            {
-                size += 1 + 1;
-            }
-            return size;
-        }
-
-        public void MergeFrom(Item other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Item_ != 0)
-            {
-                Item_ = other.Item_;
-            }
-            if (other.Count != 0)
-            {
-                Count = other.Count;
-            }
-            if (other.Unseen != false)
-            {
-                Unseen = other.Unseen;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            item_ = (global::AllEnum.ItemType)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            Count = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            Unseen = input.ReadBool();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as Item);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Item_ != 0) hash ^= Item_.GetHashCode();
-            if (Count != 0) hash ^= Count.GetHashCode();
-            if (Unseen != false) hash ^= Unseen.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PokedexEntry : pb::IMessage<PokedexEntry>
-    {
-        /// <summary>Field number for the "pokedex_entry_number" field.</summary>
-        public const int PokedexEntryNumberFieldNumber = 1;
-
-        /// <summary>Field number for the "times_encountered" field.</summary>
-        public const int TimesEncounteredFieldNumber = 2;
-
-        /// <summary>Field number for the "times_captured" field.</summary>
-        public const int TimesCapturedFieldNumber = 3;
-
-        /// <summary>Field number for the "evolution_stone_pieces" field.</summary>
-        public const int EvolutionStonePiecesFieldNumber = 4;
-
-        /// <summary>Field number for the "evolution_stones" field.</summary>
-        public const int EvolutionStonesFieldNumber = 5;
-
-        private static readonly pb::MessageParser<PokedexEntry> _parser =
-            new pb::MessageParser<PokedexEntry>(() => new PokedexEntry());
-
-        private int evolutionStonePieces_;
-        private int evolutionStones_;
-        private int pokedexEntryNumber_;
-        private int timesCaptured_;
-        private int timesEncountered_;
-
-        public PokedexEntry()
-        {
-            OnConstruction();
-        }
-
-        public PokedexEntry(PokedexEntry other) : this()
-        {
-            pokedexEntryNumber_ = other.pokedexEntryNumber_;
-            timesEncountered_ = other.timesEncountered_;
-            timesCaptured_ = other.timesCaptured_;
-            evolutionStonePieces_ = other.evolutionStonePieces_;
-            evolutionStones_ = other.evolutionStones_;
-        }
-
-        public static pb::MessageParser<PokedexEntry> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[12]; }
-        }
-
-        public int PokedexEntryNumber
-        {
-            get { return pokedexEntryNumber_; }
-            set { pokedexEntryNumber_ = value; }
-        }
-
-        public int TimesEncountered
-        {
-            get { return timesEncountered_; }
-            set { timesEncountered_ = value; }
-        }
-
-        public int TimesCaptured
-        {
-            get { return timesCaptured_; }
-            set { timesCaptured_ = value; }
-        }
-
-        public int EvolutionStonePieces
-        {
-            get { return evolutionStonePieces_; }
-            set { evolutionStonePieces_ = value; }
-        }
-
-        public int EvolutionStones
-        {
-            get { return evolutionStones_; }
-            set { evolutionStones_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PokedexEntry Clone()
-        {
-            return new PokedexEntry(this);
-        }
-
-        public bool Equals(PokedexEntry other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokedexEntryNumber != other.PokedexEntryNumber) return false;
-            if (TimesEncountered != other.TimesEncountered) return false;
-            if (TimesCaptured != other.TimesCaptured) return false;
-            if (EvolutionStonePieces != other.EvolutionStonePieces) return false;
-            if (EvolutionStones != other.EvolutionStones) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokedexEntryNumber != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(PokedexEntryNumber);
-            }
-            if (TimesEncountered != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(TimesEncountered);
-            }
-            if (TimesCaptured != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(TimesCaptured);
-            }
-            if (EvolutionStonePieces != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(EvolutionStonePieces);
-            }
-            if (EvolutionStones != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(EvolutionStones);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokedexEntryNumber != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokedexEntryNumber);
-            }
-            if (TimesEncountered != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimesEncountered);
-            }
-            if (TimesCaptured != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimesCaptured);
-            }
-            if (EvolutionStonePieces != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionStonePieces);
-            }
-            if (EvolutionStones != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionStones);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PokedexEntry other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokedexEntryNumber != 0)
-            {
-                PokedexEntryNumber = other.PokedexEntryNumber;
-            }
-            if (other.TimesEncountered != 0)
-            {
-                TimesEncountered = other.TimesEncountered;
-            }
-            if (other.TimesCaptured != 0)
-            {
-                TimesCaptured = other.TimesCaptured;
-            }
-            if (other.EvolutionStonePieces != 0)
-            {
-                EvolutionStonePieces = other.EvolutionStonePieces;
-            }
-            if (other.EvolutionStones != 0)
-            {
-                EvolutionStones = other.EvolutionStones;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            PokedexEntryNumber = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            TimesEncountered = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            TimesCaptured = input.ReadInt32();
-                            break;
-                        }
-                    case 32:
-                        {
-                            EvolutionStonePieces = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            EvolutionStones = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PokedexEntry);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokedexEntryNumber != 0) hash ^= PokedexEntryNumber.GetHashCode();
-            if (TimesEncountered != 0) hash ^= TimesEncountered.GetHashCode();
-            if (TimesCaptured != 0) hash ^= TimesCaptured.GetHashCode();
-            if (EvolutionStonePieces != 0) hash ^= EvolutionStonePieces.GetHashCode();
-            if (EvolutionStones != 0) hash ^= EvolutionStones.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PlayerStats : pb::IMessage<PlayerStats>
-    {
-        /// <summary>Field number for the "level" field.</summary>
-        public const int LevelFieldNumber = 1;
-
-        /// <summary>Field number for the "experience" field.</summary>
-        public const int ExperienceFieldNumber = 2;
-
-        /// <summary>Field number for the "prev_level_xp" field.</summary>
-        public const int PrevLevelXpFieldNumber = 3;
-
-        /// <summary>Field number for the "next_level_xp" field.</summary>
-        public const int NextLevelXpFieldNumber = 4;
-
-        /// <summary>Field number for the "km_walked" field.</summary>
-        public const int KmWalkedFieldNumber = 5;
-
-        /// <summary>Field number for the "pokemons_encountered" field.</summary>
-        public const int PokemonsEncounteredFieldNumber = 6;
-
-        /// <summary>Field number for the "unique_pokedex_entries" field.</summary>
-        public const int UniquePokedexEntriesFieldNumber = 7;
-
-        /// <summary>Field number for the "pokemons_captured" field.</summary>
-        public const int PokemonsCapturedFieldNumber = 8;
-
-        /// <summary>Field number for the "evolutions" field.</summary>
-        public const int EvolutionsFieldNumber = 9;
-
-        /// <summary>Field number for the "poke_stop_visits" field.</summary>
-        public const int PokeStopVisitsFieldNumber = 10;
-
-        /// <summary>Field number for the "pokeballs_thrown" field.</summary>
-        public const int PokeballsThrownFieldNumber = 11;
-
-        /// <summary>Field number for the "eggs_hatched" field.</summary>
-        public const int EggsHatchedFieldNumber = 12;
-
-        /// <summary>Field number for the "big_magikarp_caught" field.</summary>
-        public const int BigMagikarpCaughtFieldNumber = 13;
-
-        /// <summary>Field number for the "battle_attack_won" field.</summary>
-        public const int BattleAttackWonFieldNumber = 14;
-
-        /// <summary>Field number for the "battle_attack_total" field.</summary>
-        public const int BattleAttackTotalFieldNumber = 15;
-
-        /// <summary>Field number for the "battle_defended_won" field.</summary>
-        public const int BattleDefendedWonFieldNumber = 16;
-
-        /// <summary>Field number for the "battle_training_won" field.</summary>
-        public const int BattleTrainingWonFieldNumber = 17;
-
-        /// <summary>Field number for the "battle_training_total" field.</summary>
-        public const int BattleTrainingTotalFieldNumber = 18;
-
-        /// <summary>Field number for the "prestige_raised_total" field.</summary>
-        public const int PrestigeRaisedTotalFieldNumber = 19;
-
-        /// <summary>Field number for the "prestige_dropped_total" field.</summary>
-        public const int PrestigeDroppedTotalFieldNumber = 20;
-
-        /// <summary>Field number for the "pokemon_deployed" field.</summary>
-        public const int PokemonDeployedFieldNumber = 21;
-
-        /// <summary>Field number for the "pokemon_caught_by_type" field.</summary>
-        public const int PokemonCaughtByTypeFieldNumber = 22;
-
-        /// <summary>Field number for the "small_rattata_caught" field.</summary>
-        public const int SmallRattataCaughtFieldNumber = 23;
-
-        private static readonly pb::MessageParser<PlayerStats> _parser =
-            new pb::MessageParser<PlayerStats>(() => new PlayerStats());
-
-        private int battleAttackTotal_;
-        private int battleAttackWon_;
-        private int battleDefendedWon_;
-        private int battleTrainingTotal_;
-        private int battleTrainingWon_;
-        private int bigMagikarpCaught_;
-        private int eggsHatched_;
-        private int evolutions_;
-        private long experience_;
-        private float kmWalked_;
-        private int level_;
-        private long nextLevelXp_;
-        private int pokeballsThrown_;
-        private pb::ByteString pokemonCaughtByType_ = pb::ByteString.Empty;
-        private int pokemonDeployed_;
-        private int pokemonsCaptured_;
-        private int pokemonsEncountered_;
-        private int pokeStopVisits_;
-        private int prestigeDroppedTotal_;
-        private int prestigeRaisedTotal_;
-        private long prevLevelXp_;
-        private int smallRattataCaught_;
-        private int uniquePokedexEntries_;
-
-        public PlayerStats()
-        {
-            OnConstruction();
-        }
-
-        public PlayerStats(PlayerStats other) : this()
-        {
-            level_ = other.level_;
-            experience_ = other.experience_;
-            prevLevelXp_ = other.prevLevelXp_;
-            nextLevelXp_ = other.nextLevelXp_;
-            kmWalked_ = other.kmWalked_;
-            pokemonsEncountered_ = other.pokemonsEncountered_;
-            uniquePokedexEntries_ = other.uniquePokedexEntries_;
-            pokemonsCaptured_ = other.pokemonsCaptured_;
-            evolutions_ = other.evolutions_;
-            pokeStopVisits_ = other.pokeStopVisits_;
-            pokeballsThrown_ = other.pokeballsThrown_;
-            eggsHatched_ = other.eggsHatched_;
-            bigMagikarpCaught_ = other.bigMagikarpCaught_;
-            battleAttackWon_ = other.battleAttackWon_;
-            battleAttackTotal_ = other.battleAttackTotal_;
-            battleDefendedWon_ = other.battleDefendedWon_;
-            battleTrainingWon_ = other.battleTrainingWon_;
-            battleTrainingTotal_ = other.battleTrainingTotal_;
-            prestigeRaisedTotal_ = other.prestigeRaisedTotal_;
-            prestigeDroppedTotal_ = other.prestigeDroppedTotal_;
-            pokemonDeployed_ = other.pokemonDeployed_;
-            pokemonCaughtByType_ = other.pokemonCaughtByType_;
-            smallRattataCaught_ = other.smallRattataCaught_;
-        }
-
-        public static pb::MessageParser<PlayerStats> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[13]; }
-        }
-
-        public int Level
-        {
-            get { return level_; }
-            set { level_ = value; }
-        }
-
-        public long Experience
-        {
-            get { return experience_; }
-            set { experience_ = value; }
-        }
-
-        public long PrevLevelXp
-        {
-            get { return prevLevelXp_; }
-            set { prevLevelXp_ = value; }
-        }
-
-        public long NextLevelXp
-        {
-            get { return nextLevelXp_; }
-            set { nextLevelXp_ = value; }
-        }
-
-        public float KmWalked
-        {
-            get { return kmWalked_; }
-            set { kmWalked_ = value; }
-        }
-
-        public int PokemonsEncountered
-        {
-            get { return pokemonsEncountered_; }
-            set { pokemonsEncountered_ = value; }
-        }
-
-        public int UniquePokedexEntries
-        {
-            get { return uniquePokedexEntries_; }
-            set { uniquePokedexEntries_ = value; }
-        }
-
-        public int PokemonsCaptured
-        {
-            get { return pokemonsCaptured_; }
-            set { pokemonsCaptured_ = value; }
-        }
-
-        public int Evolutions
-        {
-            get { return evolutions_; }
-            set { evolutions_ = value; }
-        }
-
-        public int PokeStopVisits
-        {
-            get { return pokeStopVisits_; }
-            set { pokeStopVisits_ = value; }
-        }
-
-        public int PokeballsThrown
-        {
-            get { return pokeballsThrown_; }
-            set { pokeballsThrown_ = value; }
-        }
-
-        public int EggsHatched
-        {
-            get { return eggsHatched_; }
-            set { eggsHatched_ = value; }
-        }
-
-        public int BigMagikarpCaught
-        {
-            get { return bigMagikarpCaught_; }
-            set { bigMagikarpCaught_ = value; }
-        }
-
-        public int BattleAttackWon
-        {
-            get { return battleAttackWon_; }
-            set { battleAttackWon_ = value; }
-        }
-
-        public int BattleAttackTotal
-        {
-            get { return battleAttackTotal_; }
-            set { battleAttackTotal_ = value; }
-        }
-
-        public int BattleDefendedWon
-        {
-            get { return battleDefendedWon_; }
-            set { battleDefendedWon_ = value; }
-        }
-
-        public int BattleTrainingWon
-        {
-            get { return battleTrainingWon_; }
-            set { battleTrainingWon_ = value; }
-        }
-
-        public int BattleTrainingTotal
-        {
-            get { return battleTrainingTotal_; }
-            set { battleTrainingTotal_ = value; }
-        }
-
-        public int PrestigeRaisedTotal
-        {
-            get { return prestigeRaisedTotal_; }
-            set { prestigeRaisedTotal_ = value; }
-        }
-
-        public int PrestigeDroppedTotal
-        {
-            get { return prestigeDroppedTotal_; }
-            set { prestigeDroppedTotal_ = value; }
-        }
-
-        public int PokemonDeployed
-        {
-            get { return pokemonDeployed_; }
-            set { pokemonDeployed_ = value; }
-        }
-
-        /// <summary>
-        ///     TODO: repeated PokemonType ??
-        /// </summary>
-        public pb::ByteString PokemonCaughtByType
-        {
-            get { return pokemonCaughtByType_; }
-            set { pokemonCaughtByType_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public int SmallRattataCaught
-        {
-            get { return smallRattataCaught_; }
-            set { smallRattataCaught_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PlayerStats Clone()
-        {
-            return new PlayerStats(this);
-        }
-
-        public bool Equals(PlayerStats other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Level != other.Level) return false;
-            if (Experience != other.Experience) return false;
-            if (PrevLevelXp != other.PrevLevelXp) return false;
-            if (NextLevelXp != other.NextLevelXp) return false;
-            if (KmWalked != other.KmWalked) return false;
-            if (PokemonsEncountered != other.PokemonsEncountered) return false;
-            if (UniquePokedexEntries != other.UniquePokedexEntries) return false;
-            if (PokemonsCaptured != other.PokemonsCaptured) return false;
-            if (Evolutions != other.Evolutions) return false;
-            if (PokeStopVisits != other.PokeStopVisits) return false;
-            if (PokeballsThrown != other.PokeballsThrown) return false;
-            if (EggsHatched != other.EggsHatched) return false;
-            if (BigMagikarpCaught != other.BigMagikarpCaught) return false;
-            if (BattleAttackWon != other.BattleAttackWon) return false;
-            if (BattleAttackTotal != other.BattleAttackTotal) return false;
-            if (BattleDefendedWon != other.BattleDefendedWon) return false;
-            if (BattleTrainingWon != other.BattleTrainingWon) return false;
-            if (BattleTrainingTotal != other.BattleTrainingTotal) return false;
-            if (PrestigeRaisedTotal != other.PrestigeRaisedTotal) return false;
-            if (PrestigeDroppedTotal != other.PrestigeDroppedTotal) return false;
-            if (PokemonDeployed != other.PokemonDeployed) return false;
-            if (PokemonCaughtByType != other.PokemonCaughtByType) return false;
-            if (SmallRattataCaught != other.SmallRattataCaught) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Level != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Level);
-            }
-            if (Experience != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(Experience);
-            }
-            if (PrevLevelXp != 0L)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt64(PrevLevelXp);
-            }
-            if (NextLevelXp != 0L)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt64(NextLevelXp);
-            }
-            if (KmWalked != 0F)
-            {
-                output.WriteRawTag(45);
-                output.WriteFloat(KmWalked);
-            }
-            if (PokemonsEncountered != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteInt32(PokemonsEncountered);
-            }
-            if (UniquePokedexEntries != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteInt32(UniquePokedexEntries);
-            }
-            if (PokemonsCaptured != 0)
-            {
-                output.WriteRawTag(64);
-                output.WriteInt32(PokemonsCaptured);
-            }
-            if (Evolutions != 0)
-            {
-                output.WriteRawTag(72);
-                output.WriteInt32(Evolutions);
-            }
-            if (PokeStopVisits != 0)
-            {
-                output.WriteRawTag(80);
-                output.WriteInt32(PokeStopVisits);
-            }
-            if (PokeballsThrown != 0)
-            {
-                output.WriteRawTag(88);
-                output.WriteInt32(PokeballsThrown);
-            }
-            if (EggsHatched != 0)
-            {
-                output.WriteRawTag(96);
-                output.WriteInt32(EggsHatched);
-            }
-            if (BigMagikarpCaught != 0)
-            {
-                output.WriteRawTag(104);
-                output.WriteInt32(BigMagikarpCaught);
-            }
-            if (BattleAttackWon != 0)
-            {
-                output.WriteRawTag(112);
-                output.WriteInt32(BattleAttackWon);
-            }
-            if (BattleAttackTotal != 0)
-            {
-                output.WriteRawTag(120);
-                output.WriteInt32(BattleAttackTotal);
-            }
-            if (BattleDefendedWon != 0)
-            {
-                output.WriteRawTag(128, 1);
-                output.WriteInt32(BattleDefendedWon);
-            }
-            if (BattleTrainingWon != 0)
-            {
-                output.WriteRawTag(136, 1);
-                output.WriteInt32(BattleTrainingWon);
-            }
-            if (BattleTrainingTotal != 0)
-            {
-                output.WriteRawTag(144, 1);
-                output.WriteInt32(BattleTrainingTotal);
-            }
-            if (PrestigeRaisedTotal != 0)
-            {
-                output.WriteRawTag(152, 1);
-                output.WriteInt32(PrestigeRaisedTotal);
-            }
-            if (PrestigeDroppedTotal != 0)
-            {
-                output.WriteRawTag(160, 1);
-                output.WriteInt32(PrestigeDroppedTotal);
-            }
-            if (PokemonDeployed != 0)
-            {
-                output.WriteRawTag(168, 1);
-                output.WriteInt32(PokemonDeployed);
-            }
-            if (PokemonCaughtByType.Length != 0)
-            {
-                output.WriteRawTag(178, 1);
-                output.WriteBytes(PokemonCaughtByType);
-            }
-            if (SmallRattataCaught != 0)
-            {
-                output.WriteRawTag(184, 1);
-                output.WriteInt32(SmallRattataCaught);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Level != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
-            }
-            if (Experience != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(Experience);
-            }
-            if (PrevLevelXp != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(PrevLevelXp);
-            }
-            if (NextLevelXp != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextLevelXp);
-            }
-            if (KmWalked != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (PokemonsEncountered != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsEncountered);
-            }
-            if (UniquePokedexEntries != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(UniquePokedexEntries);
-            }
-            if (PokemonsCaptured != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsCaptured);
-            }
-            if (Evolutions != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Evolutions);
-            }
-            if (PokeStopVisits != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeStopVisits);
-            }
-            if (PokeballsThrown != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeballsThrown);
-            }
-            if (EggsHatched != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggsHatched);
-            }
-            if (BigMagikarpCaught != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BigMagikarpCaught);
-            }
-            if (BattleAttackWon != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackWon);
-            }
-            if (BattleAttackTotal != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackTotal);
-            }
-            if (BattleDefendedWon != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleDefendedWon);
-            }
-            if (BattleTrainingWon != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingWon);
-            }
-            if (BattleTrainingTotal != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingTotal);
-            }
-            if (PrestigeRaisedTotal != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeRaisedTotal);
-            }
-            if (PrestigeDroppedTotal != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeDroppedTotal);
-            }
-            if (PokemonDeployed != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(PokemonDeployed);
-            }
-            if (PokemonCaughtByType.Length != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeBytesSize(PokemonCaughtByType);
-            }
-            if (SmallRattataCaught != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(SmallRattataCaught);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PlayerStats other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Level != 0)
-            {
-                Level = other.Level;
-            }
-            if (other.Experience != 0L)
-            {
-                Experience = other.Experience;
-            }
-            if (other.PrevLevelXp != 0L)
-            {
-                PrevLevelXp = other.PrevLevelXp;
-            }
-            if (other.NextLevelXp != 0L)
-            {
-                NextLevelXp = other.NextLevelXp;
-            }
-            if (other.KmWalked != 0F)
-            {
-                KmWalked = other.KmWalked;
-            }
-            if (other.PokemonsEncountered != 0)
-            {
-                PokemonsEncountered = other.PokemonsEncountered;
-            }
-            if (other.UniquePokedexEntries != 0)
-            {
-                UniquePokedexEntries = other.UniquePokedexEntries;
-            }
-            if (other.PokemonsCaptured != 0)
-            {
-                PokemonsCaptured = other.PokemonsCaptured;
-            }
-            if (other.Evolutions != 0)
-            {
-                Evolutions = other.Evolutions;
-            }
-            if (other.PokeStopVisits != 0)
-            {
-                PokeStopVisits = other.PokeStopVisits;
-            }
-            if (other.PokeballsThrown != 0)
-            {
-                PokeballsThrown = other.PokeballsThrown;
-            }
-            if (other.EggsHatched != 0)
-            {
-                EggsHatched = other.EggsHatched;
-            }
-            if (other.BigMagikarpCaught != 0)
-            {
-                BigMagikarpCaught = other.BigMagikarpCaught;
-            }
-            if (other.BattleAttackWon != 0)
-            {
-                BattleAttackWon = other.BattleAttackWon;
-            }
-            if (other.BattleAttackTotal != 0)
-            {
-                BattleAttackTotal = other.BattleAttackTotal;
-            }
-            if (other.BattleDefendedWon != 0)
-            {
-                BattleDefendedWon = other.BattleDefendedWon;
-            }
-            if (other.BattleTrainingWon != 0)
-            {
-                BattleTrainingWon = other.BattleTrainingWon;
-            }
-            if (other.BattleTrainingTotal != 0)
-            {
-                BattleTrainingTotal = other.BattleTrainingTotal;
-            }
-            if (other.PrestigeRaisedTotal != 0)
-            {
-                PrestigeRaisedTotal = other.PrestigeRaisedTotal;
-            }
-            if (other.PrestigeDroppedTotal != 0)
-            {
-                PrestigeDroppedTotal = other.PrestigeDroppedTotal;
-            }
-            if (other.PokemonDeployed != 0)
-            {
-                PokemonDeployed = other.PokemonDeployed;
-            }
-            if (other.PokemonCaughtByType.Length != 0)
-            {
-                PokemonCaughtByType = other.PokemonCaughtByType;
-            }
-            if (other.SmallRattataCaught != 0)
-            {
-                SmallRattataCaught = other.SmallRattataCaught;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Level = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            Experience = input.ReadInt64();
-                            break;
-                        }
-                    case 24:
-                        {
-                            PrevLevelXp = input.ReadInt64();
-                            break;
-                        }
-                    case 32:
-                        {
-                            NextLevelXp = input.ReadInt64();
-                            break;
-                        }
-                    case 45:
-                        {
-                            KmWalked = input.ReadFloat();
-                            break;
-                        }
-                    case 48:
-                        {
-                            PokemonsEncountered = input.ReadInt32();
-                            break;
-                        }
-                    case 56:
-                        {
-                            UniquePokedexEntries = input.ReadInt32();
-                            break;
-                        }
-                    case 64:
-                        {
-                            PokemonsCaptured = input.ReadInt32();
-                            break;
-                        }
-                    case 72:
-                        {
-                            Evolutions = input.ReadInt32();
-                            break;
-                        }
-                    case 80:
-                        {
-                            PokeStopVisits = input.ReadInt32();
-                            break;
-                        }
-                    case 88:
-                        {
-                            PokeballsThrown = input.ReadInt32();
-                            break;
-                        }
-                    case 96:
-                        {
-                            EggsHatched = input.ReadInt32();
-                            break;
-                        }
-                    case 104:
-                        {
-                            BigMagikarpCaught = input.ReadInt32();
-                            break;
-                        }
-                    case 112:
-                        {
-                            BattleAttackWon = input.ReadInt32();
-                            break;
-                        }
-                    case 120:
-                        {
-                            BattleAttackTotal = input.ReadInt32();
-                            break;
-                        }
-                    case 128:
-                        {
-                            BattleDefendedWon = input.ReadInt32();
-                            break;
-                        }
-                    case 136:
-                        {
-                            BattleTrainingWon = input.ReadInt32();
-                            break;
-                        }
-                    case 144:
-                        {
-                            BattleTrainingTotal = input.ReadInt32();
-                            break;
-                        }
-                    case 152:
-                        {
-                            PrestigeRaisedTotal = input.ReadInt32();
-                            break;
-                        }
-                    case 160:
-                        {
-                            PrestigeDroppedTotal = input.ReadInt32();
-                            break;
-                        }
-                    case 168:
-                        {
-                            PokemonDeployed = input.ReadInt32();
-                            break;
-                        }
-                    case 178:
-                        {
-                            PokemonCaughtByType = input.ReadBytes();
-                            break;
-                        }
-                    case 184:
-                        {
-                            SmallRattataCaught = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PlayerStats);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Level != 0) hash ^= Level.GetHashCode();
-            if (Experience != 0L) hash ^= Experience.GetHashCode();
-            if (PrevLevelXp != 0L) hash ^= PrevLevelXp.GetHashCode();
-            if (NextLevelXp != 0L) hash ^= NextLevelXp.GetHashCode();
-            if (KmWalked != 0F) hash ^= KmWalked.GetHashCode();
-            if (PokemonsEncountered != 0) hash ^= PokemonsEncountered.GetHashCode();
-            if (UniquePokedexEntries != 0) hash ^= UniquePokedexEntries.GetHashCode();
-            if (PokemonsCaptured != 0) hash ^= PokemonsCaptured.GetHashCode();
-            if (Evolutions != 0) hash ^= Evolutions.GetHashCode();
-            if (PokeStopVisits != 0) hash ^= PokeStopVisits.GetHashCode();
-            if (PokeballsThrown != 0) hash ^= PokeballsThrown.GetHashCode();
-            if (EggsHatched != 0) hash ^= EggsHatched.GetHashCode();
-            if (BigMagikarpCaught != 0) hash ^= BigMagikarpCaught.GetHashCode();
-            if (BattleAttackWon != 0) hash ^= BattleAttackWon.GetHashCode();
-            if (BattleAttackTotal != 0) hash ^= BattleAttackTotal.GetHashCode();
-            if (BattleDefendedWon != 0) hash ^= BattleDefendedWon.GetHashCode();
-            if (BattleTrainingWon != 0) hash ^= BattleTrainingWon.GetHashCode();
-            if (BattleTrainingTotal != 0) hash ^= BattleTrainingTotal.GetHashCode();
-            if (PrestigeRaisedTotal != 0) hash ^= PrestigeRaisedTotal.GetHashCode();
-            if (PrestigeDroppedTotal != 0) hash ^= PrestigeDroppedTotal.GetHashCode();
-            if (PokemonDeployed != 0) hash ^= PokemonDeployed.GetHashCode();
-            if (PokemonCaughtByType.Length != 0) hash ^= PokemonCaughtByType.GetHashCode();
-            if (SmallRattataCaught != 0) hash ^= SmallRattataCaught.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PlayerCurrency : pb::IMessage<PlayerCurrency>
-    {
-        /// <summary>Field number for the "gems" field.</summary>
-        public const int GemsFieldNumber = 1;
-
-        private static readonly pb::MessageParser<PlayerCurrency> _parser =
-            new pb::MessageParser<PlayerCurrency>(() => new PlayerCurrency());
-
-        private int gems_;
-
-        public PlayerCurrency()
-        {
-            OnConstruction();
-        }
-
-        public PlayerCurrency(PlayerCurrency other) : this()
-        {
-            gems_ = other.gems_;
-        }
-
-        public static pb::MessageParser<PlayerCurrency> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[14]; }
-        }
-
-        public int Gems
-        {
-            get { return gems_; }
-            set { gems_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PlayerCurrency Clone()
-        {
-            return new PlayerCurrency(this);
-        }
-
-        public bool Equals(PlayerCurrency other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Gems != other.Gems) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Gems != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Gems);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Gems != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Gems);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PlayerCurrency other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Gems != 0)
-            {
-                Gems = other.Gems;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Gems = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PlayerCurrency);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Gems != 0) hash ^= Gems.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PlayerCamera : pb::IMessage<PlayerCamera>
-    {
-        /// <summary>Field number for the "is_default_camera" field.</summary>
-        public const int IsDefaultCameraFieldNumber = 1;
-
-        private static readonly pb::MessageParser<PlayerCamera> _parser =
-            new pb::MessageParser<PlayerCamera>(() => new PlayerCamera());
-
-        private bool isDefaultCamera_;
-
-        public PlayerCamera()
-        {
-            OnConstruction();
-        }
-
-        public PlayerCamera(PlayerCamera other) : this()
-        {
-            isDefaultCamera_ = other.isDefaultCamera_;
-        }
-
-        public static pb::MessageParser<PlayerCamera> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[15]; }
-        }
-
-        public bool IsDefaultCamera
-        {
-            get { return isDefaultCamera_; }
-            set { isDefaultCamera_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PlayerCamera Clone()
-        {
-            return new PlayerCamera(this);
-        }
-
-        public bool Equals(PlayerCamera other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (IsDefaultCamera != other.IsDefaultCamera) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (IsDefaultCamera != false)
-            {
-                output.WriteRawTag(8);
-                output.WriteBool(IsDefaultCamera);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (IsDefaultCamera != false)
-            {
-                size += 1 + 1;
-            }
-            return size;
-        }
-
-        public void MergeFrom(PlayerCamera other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.IsDefaultCamera != false)
-            {
-                IsDefaultCamera = other.IsDefaultCamera;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            IsDefaultCamera = input.ReadBool();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PlayerCamera);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (IsDefaultCamera != false) hash ^= IsDefaultCamera.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventoryUpgrades : pb::IMessage<InventoryUpgrades>
-    {
-        /// <summary>Field number for the "inventory_upgrades" field.</summary>
-        public const int InventoryUpgrades_FieldNumber = 1;
-
-        private static readonly pb::MessageParser<InventoryUpgrades> _parser =
-            new pb::MessageParser<InventoryUpgrades>(() => new InventoryUpgrades());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade>
-            _repeated_inventoryUpgrades_codec
-                = pb::FieldCodec.ForMessage(10, global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade>
-            inventoryUpgrades_ = new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade>();
-
-        public InventoryUpgrades()
-        {
-            OnConstruction();
-        }
-
-        public InventoryUpgrades(InventoryUpgrades other) : this()
-        {
-            inventoryUpgrades_ = other.inventoryUpgrades_.Clone();
-        }
-
-        public static pb::MessageParser<InventoryUpgrades> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[16]; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgrade> InventoryUpgrades_
-        {
-            get { return inventoryUpgrades_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventoryUpgrades Clone()
-        {
-            return new InventoryUpgrades(this);
-        }
-
-        public bool Equals(InventoryUpgrades other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!inventoryUpgrades_.Equals(other.inventoryUpgrades_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            inventoryUpgrades_.WriteTo(output, _repeated_inventoryUpgrades_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += inventoryUpgrades_.CalculateSize(_repeated_inventoryUpgrades_codec);
-            return size;
-        }
-
-        public void MergeFrom(InventoryUpgrades other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            inventoryUpgrades_.Add(other.inventoryUpgrades_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            inventoryUpgrades_.AddEntriesFrom(input, _repeated_inventoryUpgrades_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventoryUpgrades);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= inventoryUpgrades_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventoryUpgrade : pb::IMessage<InventoryUpgrade>
-    {
-        /// <summary>Field number for the "item" field.</summary>
-        public const int ItemFieldNumber = 1;
-
-        /// <summary>Field number for the "upgrade_type" field.</summary>
-        public const int UpgradeTypeFieldNumber = 2;
-
-        /// <summary>Field number for the "additional_storage" field.</summary>
-        public const int AdditionalStorageFieldNumber = 3;
-
-        private static readonly pb::MessageParser<InventoryUpgrade> _parser =
-            new pb::MessageParser<InventoryUpgrade>(() => new InventoryUpgrade());
-
-        private int additionalStorage_;
-        private global::AllEnum.ItemType item_ = 0;
-        private global::AllEnum.InventoryUpgradeType upgradeType_ = 0;
-
-        public InventoryUpgrade()
-        {
-            OnConstruction();
-        }
-
-        public InventoryUpgrade(InventoryUpgrade other) : this()
-        {
-            item_ = other.item_;
-            upgradeType_ = other.upgradeType_;
-            additionalStorage_ = other.additionalStorage_;
-        }
-
-        public static pb::MessageParser<InventoryUpgrade> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[17]; }
-        }
-
-        public global::AllEnum.ItemType Item
-        {
-            get { return item_; }
-            set { item_ = value; }
-        }
-
-        public global::AllEnum.InventoryUpgradeType UpgradeType
-        {
-            get { return upgradeType_; }
-            set { upgradeType_ = value; }
-        }
-
-        public int AdditionalStorage
-        {
-            get { return additionalStorage_; }
-            set { additionalStorage_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventoryUpgrade Clone()
-        {
-            return new InventoryUpgrade(this);
-        }
-
-        public bool Equals(InventoryUpgrade other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Item != other.Item) return false;
-            if (UpgradeType != other.UpgradeType) return false;
-            if (AdditionalStorage != other.AdditionalStorage) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Item != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)Item);
-            }
-            if (UpgradeType != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)UpgradeType);
-            }
-            if (AdditionalStorage != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(AdditionalStorage);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Item != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Item);
-            }
-            if (UpgradeType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)UpgradeType);
-            }
-            if (AdditionalStorage != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(AdditionalStorage);
-            }
-            return size;
-        }
-
-        public void MergeFrom(InventoryUpgrade other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Item != 0)
-            {
-                Item = other.Item;
-            }
-            if (other.UpgradeType != 0)
-            {
-                UpgradeType = other.UpgradeType;
-            }
-            if (other.AdditionalStorage != 0)
-            {
-                AdditionalStorage = other.AdditionalStorage;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            item_ = (global::AllEnum.ItemType)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            upgradeType_ = (global::AllEnum.InventoryUpgradeType)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            AdditionalStorage = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventoryUpgrade);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Item != 0) hash ^= Item.GetHashCode();
-            if (UpgradeType != 0) hash ^= UpgradeType.GetHashCode();
-            if (AdditionalStorage != 0) hash ^= AdditionalStorage.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class AppliedItems : pb::IMessage<AppliedItems>
-    {
-        /// <summary>Field number for the "item" field.</summary>
-        public const int ItemFieldNumber = 4;
-
-        private static readonly pb::MessageParser<AppliedItems> _parser =
-            new pb::MessageParser<AppliedItems>(() => new AppliedItems());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.AppliedItem item_;
-
-        public AppliedItems()
-        {
-            OnConstruction();
-        }
-
-        public AppliedItems(AppliedItems other) : this()
-        {
-            Item = other.item_ != null ? other.Item.Clone() : null;
-        }
-
-        public static pb::MessageParser<AppliedItems> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[18]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.AppliedItem Item
-        {
-            get { return item_; }
-            set { item_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public AppliedItems Clone()
-        {
-            return new AppliedItems(this);
-        }
-
-        public bool Equals(AppliedItems other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!Equals(Item, other.Item)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (item_ != null)
-            {
-                output.WriteRawTag(34);
-                output.WriteMessage(Item);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (item_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Item);
-            }
-            return size;
-        }
-
-        public void MergeFrom(AppliedItems other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.item_ != null)
-            {
-                if (item_ == null)
-                {
-                    item_ = new global::PokemonGo.RocketAPI.GeneratedCode.AppliedItem();
-                }
-                Item.MergeFrom(other.Item);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 34:
-                        {
-                            if (item_ == null)
-                            {
-                                item_ = new global::PokemonGo.RocketAPI.GeneratedCode.AppliedItem();
-                            }
-                            input.ReadMessage(item_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as AppliedItems);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (item_ != null) hash ^= Item.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class AppliedItem : pb::IMessage<AppliedItem>
-    {
-        /// <summary>Field number for the "item_type" field.</summary>
-        public const int ItemTypeFieldNumber = 1;
-
-        /// <summary>Field number for the "item_type_category" field.</summary>
-        public const int ItemTypeCategoryFieldNumber = 2;
-
-        /// <summary>Field number for the "expire_ms" field.</summary>
-        public const int ExpireMsFieldNumber = 3;
-
-        /// <summary>Field number for the "applied_ms" field.</summary>
-        public const int AppliedMsFieldNumber = 4;
-
-        private static readonly pb::MessageParser<AppliedItem> _parser =
-            new pb::MessageParser<AppliedItem>(() => new AppliedItem());
-
-        private long appliedMs_;
-        private long expireMs_;
-        private global::AllEnum.ItemId itemType_ = 0;
-        private global::AllEnum.ItemType itemTypeCategory_ = 0;
-
-        public AppliedItem()
-        {
-            OnConstruction();
-        }
-
-        public AppliedItem(AppliedItem other) : this()
-        {
-            itemType_ = other.itemType_;
-            itemTypeCategory_ = other.itemTypeCategory_;
-            expireMs_ = other.expireMs_;
-            appliedMs_ = other.appliedMs_;
-        }
-
-        public static pb::MessageParser<AppliedItem> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[19]; }
-        }
-
-        public global::AllEnum.ItemId ItemType
-        {
-            get { return itemType_; }
-            set { itemType_ = value; }
-        }
-
-        public global::AllEnum.ItemType ItemTypeCategory
-        {
-            get { return itemTypeCategory_; }
-            set { itemTypeCategory_ = value; }
-        }
-
-        public long ExpireMs
-        {
-            get { return expireMs_; }
-            set { expireMs_ = value; }
-        }
-
-        public long AppliedMs
-        {
-            get { return appliedMs_; }
-            set { appliedMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public AppliedItem Clone()
-        {
-            return new AppliedItem(this);
-        }
-
-        public bool Equals(AppliedItem other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemType != other.ItemType) return false;
-            if (ItemTypeCategory != other.ItemTypeCategory) return false;
-            if (ExpireMs != other.ExpireMs) return false;
-            if (AppliedMs != other.AppliedMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemType != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)ItemType);
-            }
-            if (ItemTypeCategory != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)ItemTypeCategory);
-            }
-            if (ExpireMs != 0L)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt64(ExpireMs);
-            }
-            if (AppliedMs != 0L)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt64(AppliedMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemType);
-            }
-            if (ItemTypeCategory != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemTypeCategory);
-            }
-            if (ExpireMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpireMs);
-            }
-            if (AppliedMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(AppliedMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(AppliedItem other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemType != 0)
-            {
-                ItemType = other.ItemType;
-            }
-            if (other.ItemTypeCategory != 0)
-            {
-                ItemTypeCategory = other.ItemTypeCategory;
-            }
-            if (other.ExpireMs != 0L)
-            {
-                ExpireMs = other.ExpireMs;
-            }
-            if (other.AppliedMs != 0L)
-            {
-                AppliedMs = other.AppliedMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            itemType_ = (global::AllEnum.ItemId)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            itemTypeCategory_ = (global::AllEnum.ItemType)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            ExpireMs = input.ReadInt64();
-                            break;
-                        }
-                    case 32:
-                        {
-                            AppliedMs = input.ReadInt64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as AppliedItem);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemType != 0) hash ^= ItemType.GetHashCode();
-            if (ItemTypeCategory != 0) hash ^= ItemTypeCategory.GetHashCode();
-            if (ExpireMs != 0L) hash ^= ExpireMs.GetHashCode();
-            if (AppliedMs != 0L) hash ^= AppliedMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EggIncubators : pb::IMessage<EggIncubators>
-    {
-        /// <summary>Field number for the "egg_incubator" field.</summary>
-        public const int EggIncubatorFieldNumber = 1;
-
-        private static readonly pb::MessageParser<EggIncubators> _parser =
-            new pb::MessageParser<EggIncubators>(() => new EggIncubators());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.EggIncubator eggIncubator_;
-
-        public EggIncubators()
-        {
-            OnConstruction();
-        }
-
-        public EggIncubators(EggIncubators other) : this()
-        {
-            EggIncubator = other.eggIncubator_ != null ? other.EggIncubator.Clone() : null;
-        }
-
-        public static pb::MessageParser<EggIncubators> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[20]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.EggIncubator EggIncubator
-        {
-            get { return eggIncubator_; }
-            set { eggIncubator_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EggIncubators Clone()
-        {
-            return new EggIncubators(this);
-        }
-
-        public bool Equals(EggIncubators other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!Equals(EggIncubator, other.EggIncubator)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (eggIncubator_ != null)
-            {
-                output.WriteRawTag(10);
-                output.WriteMessage(EggIncubator);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (eggIncubator_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubator);
-            }
-            return size;
-        }
-
-        public void MergeFrom(EggIncubators other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.eggIncubator_ != null)
-            {
-                if (eggIncubator_ == null)
-                {
-                    eggIncubator_ = new global::PokemonGo.RocketAPI.GeneratedCode.EggIncubator();
-                }
-                EggIncubator.MergeFrom(other.EggIncubator);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            if (eggIncubator_ == null)
-                            {
-                                eggIncubator_ = new global::PokemonGo.RocketAPI.GeneratedCode.EggIncubator();
-                            }
-                            input.ReadMessage(eggIncubator_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EggIncubators);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (eggIncubator_ != null) hash ^= EggIncubator.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EggIncubator : pb::IMessage<EggIncubator>
-    {
-        /// <summary>Field number for the "item_id" field.</summary>
-        public const int ItemIdFieldNumber = 1;
-
-        /// <summary>Field number for the "item_type" field.</summary>
-        public const int ItemTypeFieldNumber = 2;
-
-        /// <summary>Field number for the "incubator_type" field.</summary>
-        public const int IncubatorTypeFieldNumber = 3;
-
-        /// <summary>Field number for the "uses_remaining" field.</summary>
-        public const int UsesRemainingFieldNumber = 4;
-
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 5;
-
-        /// <summary>Field number for the "start_km_walked" field.</summary>
-        public const int StartKmWalkedFieldNumber = 6;
-
-        /// <summary>Field number for the "target_km_walked" field.</summary>
-        public const int TargetKmWalkedFieldNumber = 7;
-
-        private static readonly pb::MessageParser<EggIncubator> _parser =
-            new pb::MessageParser<EggIncubator>(() => new EggIncubator());
-
-        private global::AllEnum.EggIncubatorType incubatorType_ = 0;
-        private string itemId_ = "";
-        private global::AllEnum.ItemType itemType_ = 0;
-        private long pokemonId_;
-        private double startKmWalked_;
-        private double targetKmWalked_;
-        private int usesRemaining_;
-
-        public EggIncubator()
-        {
-            OnConstruction();
-        }
-
-        public EggIncubator(EggIncubator other) : this()
-        {
-            itemId_ = other.itemId_;
-            itemType_ = other.itemType_;
-            incubatorType_ = other.incubatorType_;
-            usesRemaining_ = other.usesRemaining_;
-            pokemonId_ = other.pokemonId_;
-            startKmWalked_ = other.startKmWalked_;
-            targetKmWalked_ = other.targetKmWalked_;
-        }
-
-        public static pb::MessageParser<EggIncubator> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[21]; }
-        }
-
-        public string ItemId
-        {
-            get { return itemId_; }
-            set { itemId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::AllEnum.ItemType ItemType
-        {
-            get { return itemType_; }
-            set { itemType_ = value; }
-        }
-
-        public global::AllEnum.EggIncubatorType IncubatorType
-        {
-            get { return incubatorType_; }
-            set { incubatorType_ = value; }
-        }
-
-        public int UsesRemaining
-        {
-            get { return usesRemaining_; }
-            set { usesRemaining_ = value; }
-        }
-
-        /// <summary>
-        ///     TODO: Check if is PokemonType
-        /// </summary>
-        public long PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        public double StartKmWalked
-        {
-            get { return startKmWalked_; }
-            set { startKmWalked_ = value; }
-        }
-
-        public double TargetKmWalked
-        {
-            get { return targetKmWalked_; }
-            set { targetKmWalked_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EggIncubator Clone()
-        {
-            return new EggIncubator(this);
-        }
-
-        public bool Equals(EggIncubator other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemId != other.ItemId) return false;
-            if (ItemType != other.ItemType) return false;
-            if (IncubatorType != other.IncubatorType) return false;
-            if (UsesRemaining != other.UsesRemaining) return false;
-            if (PokemonId != other.PokemonId) return false;
-            if (StartKmWalked != other.StartKmWalked) return false;
-            if (TargetKmWalked != other.TargetKmWalked) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(ItemId);
-            }
-            if (ItemType != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)ItemType);
-            }
-            if (IncubatorType != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteEnum((int)IncubatorType);
-            }
-            if (UsesRemaining != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(UsesRemaining);
-            }
-            if (PokemonId != 0L)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt64(PokemonId);
-            }
-            if (StartKmWalked != 0D)
-            {
-                output.WriteRawTag(49);
-                output.WriteDouble(StartKmWalked);
-            }
-            if (TargetKmWalked != 0D)
-            {
-                output.WriteRawTag(57);
-                output.WriteDouble(TargetKmWalked);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(ItemId);
-            }
-            if (ItemType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemType);
-            }
-            if (IncubatorType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)IncubatorType);
-            }
-            if (UsesRemaining != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(UsesRemaining);
-            }
-            if (PokemonId != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(PokemonId);
-            }
-            if (StartKmWalked != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (TargetKmWalked != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(EggIncubator other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemId.Length != 0)
-            {
-                ItemId = other.ItemId;
-            }
-            if (other.ItemType != 0)
-            {
-                ItemType = other.ItemType;
-            }
-            if (other.IncubatorType != 0)
-            {
-                IncubatorType = other.IncubatorType;
-            }
-            if (other.UsesRemaining != 0)
-            {
-                UsesRemaining = other.UsesRemaining;
-            }
-            if (other.PokemonId != 0L)
-            {
-                PokemonId = other.PokemonId;
-            }
-            if (other.StartKmWalked != 0D)
-            {
-                StartKmWalked = other.StartKmWalked;
-            }
-            if (other.TargetKmWalked != 0D)
-            {
-                TargetKmWalked = other.TargetKmWalked;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            ItemId = input.ReadString();
-                            break;
-                        }
-                    case 16:
-                        {
-                            itemType_ = (global::AllEnum.ItemType)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            incubatorType_ = (global::AllEnum.EggIncubatorType)input.ReadEnum();
-                            break;
-                        }
-                    case 32:
-                        {
-                            UsesRemaining = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            PokemonId = input.ReadInt64();
-                            break;
-                        }
-                    case 49:
-                        {
-                            StartKmWalked = input.ReadDouble();
-                            break;
-                        }
-                    case 57:
-                        {
-                            TargetKmWalked = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EggIncubator);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemId.Length != 0) hash ^= ItemId.GetHashCode();
-            if (ItemType != 0) hash ^= ItemType.GetHashCode();
-            if (IncubatorType != 0) hash ^= IncubatorType.GetHashCode();
-            if (UsesRemaining != 0) hash ^= UsesRemaining.GetHashCode();
-            if (PokemonId != 0L) hash ^= PokemonId.GetHashCode();
-            if (StartKmWalked != 0D) hash ^= StartKmWalked.GetHashCode();
-            if (TargetKmWalked != 0D) hash ^= TargetKmWalked.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PokemonFamily : pb::IMessage<PokemonFamily>
-    {
-        /// <summary>Field number for the "family_id" field.</summary>
-        public const int FamilyIdFieldNumber = 1;
-
-        /// <summary>Field number for the "candy" field.</summary>
-        public const int CandyFieldNumber = 2;
-
-        private static readonly pb::MessageParser<PokemonFamily> _parser =
-            new pb::MessageParser<PokemonFamily>(() => new PokemonFamily());
-
-        private int candy_;
-        private global::AllEnum.PokemonFamilyId familyId_ = 0;
-
-        public PokemonFamily()
-        {
-            OnConstruction();
-        }
-
-        public PokemonFamily(PokemonFamily other) : this()
-        {
-            familyId_ = other.familyId_;
-            candy_ = other.candy_;
-        }
-
-        public static pb::MessageParser<PokemonFamily> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[22]; }
-        }
-
-        public global::AllEnum.PokemonFamilyId FamilyId
-        {
-            get { return familyId_; }
-            set { familyId_ = value; }
-        }
-
-        public int Candy
-        {
-            get { return candy_; }
-            set { candy_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PokemonFamily Clone()
-        {
-            return new PokemonFamily(this);
-        }
-
-        public bool Equals(PokemonFamily other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (FamilyId != other.FamilyId) return false;
-            if (Candy != other.Candy) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (FamilyId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)FamilyId);
-            }
-            if (Candy != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(Candy);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (FamilyId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)FamilyId);
-            }
-            if (Candy != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Candy);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PokemonFamily other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.FamilyId != 0)
-            {
-                FamilyId = other.FamilyId;
-            }
-            if (other.Candy != 0)
-            {
-                Candy = other.Candy;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            familyId_ = (global::AllEnum.PokemonFamilyId)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            Candy = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PokemonFamily);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (FamilyId != 0) hash ^= FamilyId.GetHashCode();
-            if (Candy != 0) hash ^= Candy.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GetMapObjectsRequest : pb::IMessage<GetMapObjectsRequest>
-    {
-        /// <summary>Field number for the "cell_id" field.</summary>
-        public const int CellIdFieldNumber = 1;
-
-        /// <summary>Field number for the "since_timestamp_ms" field.</summary>
-        public const int SinceTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 4;
-
-        private static readonly pb::MessageParser<GetMapObjectsRequest> _parser =
-            new pb::MessageParser<GetMapObjectsRequest>(() => new GetMapObjectsRequest());
-
-        private pb::ByteString cellId_ = pb::ByteString.Empty;
-        private double latitude_;
-        private double longitude_;
-        private pb::ByteString sinceTimestampMs_ = pb::ByteString.Empty;
-
-        public GetMapObjectsRequest()
-        {
-            OnConstruction();
-        }
-
-        public GetMapObjectsRequest(GetMapObjectsRequest other) : this()
-        {
-            cellId_ = other.cellId_;
-            sinceTimestampMs_ = other.sinceTimestampMs_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-        }
-
-        public static pb::MessageParser<GetMapObjectsRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[23]; }
-        }
-
-        public pb::ByteString CellId
-        {
-            get { return cellId_; }
-            set { cellId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public pb::ByteString SinceTimestampMs
-        {
-            get { return sinceTimestampMs_; }
-            set { sinceTimestampMs_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GetMapObjectsRequest Clone()
-        {
-            return new GetMapObjectsRequest(this);
-        }
-
-        public bool Equals(GetMapObjectsRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (CellId != other.CellId) return false;
-            if (SinceTimestampMs != other.SinceTimestampMs) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (CellId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteBytes(CellId);
-            }
-            if (SinceTimestampMs.Length != 0)
-            {
-                output.WriteRawTag(18);
-                output.WriteBytes(SinceTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(Longitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (CellId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeBytesSize(CellId);
-            }
-            if (SinceTimestampMs.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeBytesSize(SinceTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(GetMapObjectsRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.CellId.Length != 0)
-            {
-                CellId = other.CellId;
-            }
-            if (other.SinceTimestampMs.Length != 0)
-            {
-                SinceTimestampMs = other.SinceTimestampMs;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            CellId = input.ReadBytes();
-                            break;
-                        }
-                    case 18:
-                        {
-                            SinceTimestampMs = input.ReadBytes();
-                            break;
-                        }
-                    case 25:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 33:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GetMapObjectsRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (CellId.Length != 0) hash ^= CellId.GetHashCode();
-            if (SinceTimestampMs.Length != 0) hash ^= SinceTimestampMs.GetHashCode();
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GetMapObjectsResponse : pb::IMessage<GetMapObjectsResponse>
-    {
-        /// <summary>Field number for the "map_cells" field.</summary>
-        public const int MapCellsFieldNumber = 1;
-
-        /// <summary>Field number for the "status" field.</summary>
-        public const int StatusFieldNumber = 2;
-
-        private static readonly pb::MessageParser<GetMapObjectsResponse> _parser =
-            new pb::MessageParser<GetMapObjectsResponse>(() => new GetMapObjectsResponse());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.MapCell>
-            _repeated_mapCells_codec
-                = pb::FieldCodec.ForMessage(10, global::PokemonGo.RocketAPI.GeneratedCode.MapCell.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.MapCell> mapCells_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.MapCell>();
-
-        private global::AllEnum.MapObjectsStatus status_ = 0;
-
-        public GetMapObjectsResponse()
-        {
-            OnConstruction();
-        }
-
-        public GetMapObjectsResponse(GetMapObjectsResponse other) : this()
-        {
-            mapCells_ = other.mapCells_.Clone();
-            status_ = other.status_;
-        }
-
-        public static pb::MessageParser<GetMapObjectsResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[24]; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.MapCell> MapCells
-        {
-            get { return mapCells_; }
-        }
-
-        public global::AllEnum.MapObjectsStatus Status
-        {
-            get { return status_; }
-            set { status_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GetMapObjectsResponse Clone()
-        {
-            return new GetMapObjectsResponse(this);
-        }
-
-        public bool Equals(GetMapObjectsResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!mapCells_.Equals(other.mapCells_)) return false;
-            if (Status != other.Status) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            mapCells_.WriteTo(output, _repeated_mapCells_codec);
-            if (Status != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)Status);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += mapCells_.CalculateSize(_repeated_mapCells_codec);
-            if (Status != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Status);
-            }
-            return size;
-        }
-
-        public void MergeFrom(GetMapObjectsResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            mapCells_.Add(other.mapCells_);
-            if (other.Status != 0)
-            {
-                Status = other.Status;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            mapCells_.AddEntriesFrom(input, _repeated_mapCells_codec);
-                            break;
-                        }
-                    case 16:
-                        {
-                            status_ = (global::AllEnum.MapObjectsStatus)input.ReadEnum();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GetMapObjectsResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= mapCells_.GetHashCode();
-            if (Status != 0) hash ^= Status.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class MapCell : pb::IMessage<MapCell>
-    {
-        /// <summary>Field number for the "s2_cell_id" field.</summary>
-        public const int S2CellIdFieldNumber = 1;
-
-        /// <summary>Field number for the "current_timestamp_ms" field.</summary>
-        public const int CurrentTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "forts" field.</summary>
-        public const int FortsFieldNumber = 3;
-
-        /// <summary>Field number for the "spawn_points" field.</summary>
-        public const int SpawnPointsFieldNumber = 4;
-
-        /// <summary>Field number for the "deleted_objects" field.</summary>
-        public const int DeletedObjectsFieldNumber = 6;
-
-        /// <summary>Field number for the "is_truncated_list" field.</summary>
-        public const int IsTruncatedListFieldNumber = 7;
-
-        /// <summary>Field number for the "fort_summaries" field.</summary>
-        public const int FortSummariesFieldNumber = 8;
-
-        /// <summary>Field number for the "decimated_spawn_points" field.</summary>
-        public const int DecimatedSpawnPointsFieldNumber = 9;
-
-        /// <summary>Field number for the "wild_pokemons" field.</summary>
-        public const int WildPokemonsFieldNumber = 5;
-
-        /// <summary>Field number for the "catchable_pokemons" field.</summary>
-        public const int CatchablePokemonsFieldNumber = 10;
-
-        /// <summary>Field number for the "nearby_pokemons" field.</summary>
-        public const int NearbyPokemonsFieldNumber = 11;
-
-        private static readonly pb::MessageParser<MapCell> _parser = new pb::MessageParser<MapCell>(() => new MapCell());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.FortData> _repeated_forts_codec
-            = pb::FieldCodec.ForMessage(26, global::PokemonGo.RocketAPI.GeneratedCode.FortData.Parser);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint>
-            _repeated_spawnPoints_codec
-                = pb::FieldCodec.ForMessage(34, global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint.Parser);
-
-        private static readonly pb::FieldCodec<string> _repeated_deletedObjects_codec
-            = pb::FieldCodec.ForString(50);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.FortSummary>
-            _repeated_fortSummaries_codec
-                = pb::FieldCodec.ForMessage(66, global::PokemonGo.RocketAPI.GeneratedCode.FortSummary.Parser);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint>
-            _repeated_decimatedSpawnPoints_codec
-                = pb::FieldCodec.ForMessage(74, global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint.Parser);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon>
-            _repeated_wildPokemons_codec
-                = pb::FieldCodec.ForMessage(42, global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon.Parser);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon>
-            _repeated_catchablePokemons_codec
-                = pb::FieldCodec.ForMessage(82, global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon.Parser);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon>
-            _repeated_nearbyPokemons_codec
-                = pb::FieldCodec.ForMessage(90, global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon> catchablePokemons_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint> decimatedSpawnPoints_
-            = new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint>();
-
-        private readonly pbc::RepeatedField<string> deletedObjects_ = new pbc::RepeatedField<string>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortData> forts_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortData>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortSummary> fortSummaries_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortSummary>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon> nearbyPokemons_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint> spawnPoints_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon> wildPokemons_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon>();
-
-        private long currentTimestampMs_;
-        private bool isTruncatedList_;
-        private ulong s2CellId_;
-
-        public MapCell()
-        {
-            OnConstruction();
-        }
-
-        public MapCell(MapCell other) : this()
-        {
-            s2CellId_ = other.s2CellId_;
-            currentTimestampMs_ = other.currentTimestampMs_;
-            forts_ = other.forts_.Clone();
-            spawnPoints_ = other.spawnPoints_.Clone();
-            deletedObjects_ = other.deletedObjects_.Clone();
-            isTruncatedList_ = other.isTruncatedList_;
-            fortSummaries_ = other.fortSummaries_.Clone();
-            decimatedSpawnPoints_ = other.decimatedSpawnPoints_.Clone();
-            wildPokemons_ = other.wildPokemons_.Clone();
-            catchablePokemons_ = other.catchablePokemons_.Clone();
-            nearbyPokemons_ = other.nearbyPokemons_.Clone();
-        }
-
-        public static pb::MessageParser<MapCell> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[25]; }
-        }
-
-        /// <summary>
-        ///     S2 geographic area that the cell covers (http://s2map.com/)
-        ///     (https://code.google.com/archive/p/s2-geometry-library/)
-        /// </summary>
-        public ulong S2CellId
-        {
-            get { return s2CellId_; }
-            set { s2CellId_ = value; }
-        }
-
-        public long CurrentTimestampMs
-        {
-            get { return currentTimestampMs_; }
-            set { currentTimestampMs_ = value; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortData> Forts
-        {
-            get { return forts_; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint> SpawnPoints
-        {
-            get { return spawnPoints_; }
-        }
-
-        public pbc::RepeatedField<string> DeletedObjects
-        {
-            get { return deletedObjects_; }
-        }
-
-        public bool IsTruncatedList
-        {
-            get { return isTruncatedList_; }
-            set { isTruncatedList_ = value; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortSummary> FortSummaries
-        {
-            get { return fortSummaries_; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SpawnPoint> DecimatedSpawnPoints
-        {
-            get { return decimatedSpawnPoints_; }
-        }
-
-        /// <summary>
-        ///     Pokemon within 2 steps or less.
-        /// </summary>
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon> WildPokemons
-        {
-            get { return wildPokemons_; }
-        }
-
-        /// <summary>
-        ///     Pokemon within 1 step or none.
-        /// </summary>
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.MapPokemon> CatchablePokemons
-        {
-            get { return catchablePokemons_; }
-        }
-
-        /// <summary>
-        ///     Pokemon farther away than 2 steps, but still in the area.
-        /// </summary>
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.NearbyPokemon> NearbyPokemons
-        {
-            get { return nearbyPokemons_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public MapCell Clone()
-        {
-            return new MapCell(this);
-        }
-
-        public bool Equals(MapCell other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (S2CellId != other.S2CellId) return false;
-            if (CurrentTimestampMs != other.CurrentTimestampMs) return false;
-            if (!forts_.Equals(other.forts_)) return false;
-            if (!spawnPoints_.Equals(other.spawnPoints_)) return false;
-            if (!deletedObjects_.Equals(other.deletedObjects_)) return false;
-            if (IsTruncatedList != other.IsTruncatedList) return false;
-            if (!fortSummaries_.Equals(other.fortSummaries_)) return false;
-            if (!decimatedSpawnPoints_.Equals(other.decimatedSpawnPoints_)) return false;
-            if (!wildPokemons_.Equals(other.wildPokemons_)) return false;
-            if (!catchablePokemons_.Equals(other.catchablePokemons_)) return false;
-            if (!nearbyPokemons_.Equals(other.nearbyPokemons_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (S2CellId != 0UL)
-            {
-                output.WriteRawTag(8);
-                output.WriteUInt64(S2CellId);
-            }
-            if (CurrentTimestampMs != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(CurrentTimestampMs);
-            }
-            forts_.WriteTo(output, _repeated_forts_codec);
-            spawnPoints_.WriteTo(output, _repeated_spawnPoints_codec);
-            wildPokemons_.WriteTo(output, _repeated_wildPokemons_codec);
-            deletedObjects_.WriteTo(output, _repeated_deletedObjects_codec);
-            if (IsTruncatedList != false)
-            {
-                output.WriteRawTag(56);
-                output.WriteBool(IsTruncatedList);
-            }
-            fortSummaries_.WriteTo(output, _repeated_fortSummaries_codec);
-            decimatedSpawnPoints_.WriteTo(output, _repeated_decimatedSpawnPoints_codec);
-            catchablePokemons_.WriteTo(output, _repeated_catchablePokemons_codec);
-            nearbyPokemons_.WriteTo(output, _repeated_nearbyPokemons_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (S2CellId != 0UL)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeUInt64Size(S2CellId);
-            }
-            if (CurrentTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(CurrentTimestampMs);
-            }
-            size += forts_.CalculateSize(_repeated_forts_codec);
-            size += spawnPoints_.CalculateSize(_repeated_spawnPoints_codec);
-            size += deletedObjects_.CalculateSize(_repeated_deletedObjects_codec);
-            if (IsTruncatedList != false)
-            {
-                size += 1 + 1;
-            }
-            size += fortSummaries_.CalculateSize(_repeated_fortSummaries_codec);
-            size += decimatedSpawnPoints_.CalculateSize(_repeated_decimatedSpawnPoints_codec);
-            size += wildPokemons_.CalculateSize(_repeated_wildPokemons_codec);
-            size += catchablePokemons_.CalculateSize(_repeated_catchablePokemons_codec);
-            size += nearbyPokemons_.CalculateSize(_repeated_nearbyPokemons_codec);
-            return size;
-        }
-
-        public void MergeFrom(MapCell other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.S2CellId != 0UL)
-            {
-                S2CellId = other.S2CellId;
-            }
-            if (other.CurrentTimestampMs != 0L)
-            {
-                CurrentTimestampMs = other.CurrentTimestampMs;
-            }
-            forts_.Add(other.forts_);
-            spawnPoints_.Add(other.spawnPoints_);
-            deletedObjects_.Add(other.deletedObjects_);
-            if (other.IsTruncatedList != false)
-            {
-                IsTruncatedList = other.IsTruncatedList;
-            }
-            fortSummaries_.Add(other.fortSummaries_);
-            decimatedSpawnPoints_.Add(other.decimatedSpawnPoints_);
-            wildPokemons_.Add(other.wildPokemons_);
-            catchablePokemons_.Add(other.catchablePokemons_);
-            nearbyPokemons_.Add(other.nearbyPokemons_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            S2CellId = input.ReadUInt64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            CurrentTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 26:
-                        {
-                            forts_.AddEntriesFrom(input, _repeated_forts_codec);
-                            break;
-                        }
-                    case 34:
-                        {
-                            spawnPoints_.AddEntriesFrom(input, _repeated_spawnPoints_codec);
-                            break;
-                        }
-                    case 42:
-                        {
-                            wildPokemons_.AddEntriesFrom(input, _repeated_wildPokemons_codec);
-                            break;
-                        }
-                    case 50:
-                        {
-                            deletedObjects_.AddEntriesFrom(input, _repeated_deletedObjects_codec);
-                            break;
-                        }
-                    case 56:
-                        {
-                            IsTruncatedList = input.ReadBool();
-                            break;
-                        }
-                    case 66:
-                        {
-                            fortSummaries_.AddEntriesFrom(input, _repeated_fortSummaries_codec);
-                            break;
-                        }
-                    case 74:
-                        {
-                            decimatedSpawnPoints_.AddEntriesFrom(input, _repeated_decimatedSpawnPoints_codec);
-                            break;
-                        }
-                    case 82:
-                        {
-                            catchablePokemons_.AddEntriesFrom(input, _repeated_catchablePokemons_codec);
-                            break;
-                        }
-                    case 90:
-                        {
-                            nearbyPokemons_.AddEntriesFrom(input, _repeated_nearbyPokemons_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as MapCell);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (S2CellId != 0UL) hash ^= S2CellId.GetHashCode();
-            if (CurrentTimestampMs != 0L) hash ^= CurrentTimestampMs.GetHashCode();
-            hash ^= forts_.GetHashCode();
-            hash ^= spawnPoints_.GetHashCode();
-            hash ^= deletedObjects_.GetHashCode();
-            if (IsTruncatedList != false) hash ^= IsTruncatedList.GetHashCode();
-            hash ^= fortSummaries_.GetHashCode();
-            hash ^= decimatedSpawnPoints_.GetHashCode();
-            hash ^= wildPokemons_.GetHashCode();
-            hash ^= catchablePokemons_.GetHashCode();
-            hash ^= nearbyPokemons_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortData : pb::IMessage<FortData>
-    {
-        /// <summary>Field number for the "id" field.</summary>
-        public const int IdFieldNumber = 1;
-
-        /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
-        public const int LastModifiedTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 4;
-
-        /// <summary>Field number for the "enabled" field.</summary>
-        public const int EnabledFieldNumber = 8;
-
-        /// <summary>Field number for the "type" field.</summary>
-        public const int TypeFieldNumber = 9;
-
-        /// <summary>Field number for the "owned_by_team" field.</summary>
-        public const int OwnedByTeamFieldNumber = 5;
-
-        /// <summary>Field number for the "guard_pokemon_id" field.</summary>
-        public const int GuardPokemonIdFieldNumber = 6;
-
-        /// <summary>Field number for the "guard_pokemon_cp" field.</summary>
-        public const int GuardPokemonCpFieldNumber = 7;
-
-        /// <summary>Field number for the "gym_points" field.</summary>
-        public const int GymPointsFieldNumber = 10;
-
-        /// <summary>Field number for the "is_in_battle" field.</summary>
-        public const int IsInBattleFieldNumber = 11;
-
-        /// <summary>Field number for the "cooldown_complete_timestamp_ms" field.</summary>
-        public const int CooldownCompleteTimestampMsFieldNumber = 14;
-
-        /// <summary>Field number for the "sponsor" field.</summary>
-        public const int SponsorFieldNumber = 15;
-
-        /// <summary>Field number for the "rendering_type" field.</summary>
-        public const int RenderingTypeFieldNumber = 16;
-
-        /// <summary>Field number for the "active_fort_modifier" field.</summary>
-        public const int ActiveFortModifierFieldNumber = 12;
-
-        /// <summary>Field number for the "lure_info" field.</summary>
-        public const int LureInfoFieldNumber = 13;
-
-        private static readonly pb::MessageParser<FortData> _parser =
-            new pb::MessageParser<FortData>(() => new FortData());
-
-        private pb::ByteString activeFortModifier_ = pb::ByteString.Empty;
-        private long cooldownCompleteTimestampMs_;
-        private bool enabled_;
-        private int guardPokemonCp_;
-        private global::AllEnum.PokemonId guardPokemonId_ = 0;
-        private long gymPoints_;
-        private string id_ = "";
-        private bool isInBattle_;
-        private long lastModifiedTimestampMs_;
-        private double latitude_;
-        private double longitude_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.FortLureInfo lureInfo_;
-        private global::AllEnum.TeamColor ownedByTeam_ = 0;
-        private global::AllEnum.FortRenderingType renderingType_ = 0;
-        private global::AllEnum.FortSponsor sponsor_ = 0;
-        private global::AllEnum.FortType type_ = 0;
-
-        public FortData()
-        {
-            OnConstruction();
-        }
-
-        public FortData(FortData other) : this()
-        {
-            id_ = other.id_;
-            lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-            enabled_ = other.enabled_;
-            type_ = other.type_;
-            ownedByTeam_ = other.ownedByTeam_;
-            guardPokemonId_ = other.guardPokemonId_;
-            guardPokemonCp_ = other.guardPokemonCp_;
-            gymPoints_ = other.gymPoints_;
-            isInBattle_ = other.isInBattle_;
-            cooldownCompleteTimestampMs_ = other.cooldownCompleteTimestampMs_;
-            sponsor_ = other.sponsor_;
-            renderingType_ = other.renderingType_;
-            activeFortModifier_ = other.activeFortModifier_;
-            LureInfo = other.lureInfo_ != null ? other.LureInfo.Clone() : null;
-        }
-
-        public static pb::MessageParser<FortData> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[26]; }
-        }
-
-        public string Id
-        {
-            get { return id_; }
-            set { id_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public long LastModifiedTimestampMs
-        {
-            get { return lastModifiedTimestampMs_; }
-            set { lastModifiedTimestampMs_ = value; }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        public bool Enabled
-        {
-            get { return enabled_; }
-            set { enabled_ = value; }
-        }
-
-        public global::AllEnum.FortType Type
-        {
-            get { return type_; }
-            set { type_ = value; }
-        }
-
-        /// <summary>
-        ///     Team that owns the gym
-        /// </summary>
-        public global::AllEnum.TeamColor OwnedByTeam
-        {
-            get { return ownedByTeam_; }
-            set { ownedByTeam_ = value; }
-        }
-
-        /// <summary>
-        ///     Highest CP Pokemon at the gym
-        /// </summary>
-        public global::AllEnum.PokemonId GuardPokemonId
-        {
-            get { return guardPokemonId_; }
-            set { guardPokemonId_ = value; }
-        }
-
-        public int GuardPokemonCp
-        {
-            get { return guardPokemonCp_; }
-            set { guardPokemonCp_ = value; }
-        }
-
-        /// <summary>
-        ///     Prestigate / experience of the gym
-        /// </summary>
-        public long GymPoints
-        {
-            get { return gymPoints_; }
-            set { gymPoints_ = value; }
-        }
-
-        /// <summary>
-        ///     Whether someone is battling at the gym currently
-        /// </summary>
-        public bool IsInBattle
-        {
-            get { return isInBattle_; }
-            set { isInBattle_ = value; }
-        }
-
-        /// <summary>
-        ///     Timestamp when the pokestop can be activated again to get items / xp
-        /// </summary>
-        public long CooldownCompleteTimestampMs
-        {
-            get { return cooldownCompleteTimestampMs_; }
-            set { cooldownCompleteTimestampMs_ = value; }
-        }
-
-        public global::AllEnum.FortSponsor Sponsor
-        {
-            get { return sponsor_; }
-            set { sponsor_ = value; }
-        }
-
-        public global::AllEnum.FortRenderingType RenderingType
-        {
-            get { return renderingType_; }
-            set { renderingType_ = value; }
-        }
-
-        /// <summary>
-        ///     Might represent the type of item applied to the pokestop, right now only lures can be applied
-        /// </summary>
-        public pb::ByteString ActiveFortModifier
-        {
-            get { return activeFortModifier_; }
-            set { activeFortModifier_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.FortLureInfo LureInfo
-        {
-            get { return lureInfo_; }
-            set { lureInfo_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortData Clone()
-        {
-            return new FortData(this);
-        }
-
-        public bool Equals(FortData other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Id != other.Id) return false;
-            if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            if (Enabled != other.Enabled) return false;
-            if (Type != other.Type) return false;
-            if (OwnedByTeam != other.OwnedByTeam) return false;
-            if (GuardPokemonId != other.GuardPokemonId) return false;
-            if (GuardPokemonCp != other.GuardPokemonCp) return false;
-            if (GymPoints != other.GymPoints) return false;
-            if (IsInBattle != other.IsInBattle) return false;
-            if (CooldownCompleteTimestampMs != other.CooldownCompleteTimestampMs) return false;
-            if (Sponsor != other.Sponsor) return false;
-            if (RenderingType != other.RenderingType) return false;
-            if (ActiveFortModifier != other.ActiveFortModifier) return false;
-            if (!Equals(LureInfo, other.LureInfo)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Id.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(Id);
-            }
-            if (LastModifiedTimestampMs != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(LastModifiedTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(Longitude);
-            }
-            if (OwnedByTeam != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteEnum((int)OwnedByTeam);
-            }
-            if (GuardPokemonId != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteEnum((int)GuardPokemonId);
-            }
-            if (GuardPokemonCp != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteInt32(GuardPokemonCp);
-            }
-            if (Enabled != false)
-            {
-                output.WriteRawTag(64);
-                output.WriteBool(Enabled);
-            }
-            if (Type != 0)
-            {
-                output.WriteRawTag(72);
-                output.WriteEnum((int)Type);
-            }
-            if (GymPoints != 0L)
-            {
-                output.WriteRawTag(80);
-                output.WriteInt64(GymPoints);
-            }
-            if (IsInBattle != false)
-            {
-                output.WriteRawTag(88);
-                output.WriteBool(IsInBattle);
-            }
-            if (ActiveFortModifier.Length != 0)
-            {
-                output.WriteRawTag(98);
-                output.WriteBytes(ActiveFortModifier);
-            }
-            if (lureInfo_ != null)
-            {
-                output.WriteRawTag(106);
-                output.WriteMessage(LureInfo);
-            }
-            if (CooldownCompleteTimestampMs != 0L)
-            {
-                output.WriteRawTag(112);
-                output.WriteInt64(CooldownCompleteTimestampMs);
-            }
-            if (Sponsor != 0)
-            {
-                output.WriteRawTag(120);
-                output.WriteEnum((int)Sponsor);
-            }
-            if (RenderingType != 0)
-            {
-                output.WriteRawTag(128, 1);
-                output.WriteEnum((int)RenderingType);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Id.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
-            }
-            if (LastModifiedTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Enabled != false)
-            {
-                size += 1 + 1;
-            }
-            if (Type != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type);
-            }
-            if (OwnedByTeam != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)OwnedByTeam);
-            }
-            if (GuardPokemonId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)GuardPokemonId);
-            }
-            if (GuardPokemonCp != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(GuardPokemonCp);
-            }
-            if (GymPoints != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(GymPoints);
-            }
-            if (IsInBattle != false)
-            {
-                size += 1 + 1;
-            }
-            if (CooldownCompleteTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(CooldownCompleteTimestampMs);
-            }
-            if (Sponsor != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Sponsor);
-            }
-            if (RenderingType != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeEnumSize((int)RenderingType);
-            }
-            if (ActiveFortModifier.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeBytesSize(ActiveFortModifier);
-            }
-            if (lureInfo_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(LureInfo);
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortData other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Id.Length != 0)
-            {
-                Id = other.Id;
-            }
-            if (other.LastModifiedTimestampMs != 0L)
-            {
-                LastModifiedTimestampMs = other.LastModifiedTimestampMs;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-            if (other.Enabled != false)
-            {
-                Enabled = other.Enabled;
-            }
-            if (other.Type != 0)
-            {
-                Type = other.Type;
-            }
-            if (other.OwnedByTeam != 0)
-            {
-                OwnedByTeam = other.OwnedByTeam;
-            }
-            if (other.GuardPokemonId != 0)
-            {
-                GuardPokemonId = other.GuardPokemonId;
-            }
-            if (other.GuardPokemonCp != 0)
-            {
-                GuardPokemonCp = other.GuardPokemonCp;
-            }
-            if (other.GymPoints != 0L)
-            {
-                GymPoints = other.GymPoints;
-            }
-            if (other.IsInBattle != false)
-            {
-                IsInBattle = other.IsInBattle;
-            }
-            if (other.CooldownCompleteTimestampMs != 0L)
-            {
-                CooldownCompleteTimestampMs = other.CooldownCompleteTimestampMs;
-            }
-            if (other.Sponsor != 0)
-            {
-                Sponsor = other.Sponsor;
-            }
-            if (other.RenderingType != 0)
-            {
-                RenderingType = other.RenderingType;
-            }
-            if (other.ActiveFortModifier.Length != 0)
-            {
-                ActiveFortModifier = other.ActiveFortModifier;
-            }
-            if (other.lureInfo_ != null)
-            {
-                if (lureInfo_ == null)
-                {
-                    lureInfo_ = new global::PokemonGo.RocketAPI.GeneratedCode.FortLureInfo();
-                }
-                LureInfo.MergeFrom(other.LureInfo);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            Id = input.ReadString();
-                            break;
-                        }
-                    case 16:
-                        {
-                            LastModifiedTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 25:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 33:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                    case 40:
-                        {
-                            ownedByTeam_ = (global::AllEnum.TeamColor)input.ReadEnum();
-                            break;
-                        }
-                    case 48:
-                        {
-                            guardPokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 56:
-                        {
-                            GuardPokemonCp = input.ReadInt32();
-                            break;
-                        }
-                    case 64:
-                        {
-                            Enabled = input.ReadBool();
-                            break;
-                        }
-                    case 72:
-                        {
-                            type_ = (global::AllEnum.FortType)input.ReadEnum();
-                            break;
-                        }
-                    case 80:
-                        {
-                            GymPoints = input.ReadInt64();
-                            break;
-                        }
-                    case 88:
-                        {
-                            IsInBattle = input.ReadBool();
-                            break;
-                        }
-                    case 98:
-                        {
-                            ActiveFortModifier = input.ReadBytes();
-                            break;
-                        }
-                    case 106:
-                        {
-                            if (lureInfo_ == null)
-                            {
-                                lureInfo_ = new global::PokemonGo.RocketAPI.GeneratedCode.FortLureInfo();
-                            }
-                            input.ReadMessage(lureInfo_);
-                            break;
-                        }
-                    case 112:
-                        {
-                            CooldownCompleteTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 120:
-                        {
-                            sponsor_ = (global::AllEnum.FortSponsor)input.ReadEnum();
-                            break;
-                        }
-                    case 128:
-                        {
-                            renderingType_ = (global::AllEnum.FortRenderingType)input.ReadEnum();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortData);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Id.Length != 0) hash ^= Id.GetHashCode();
-            if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            if (Enabled != false) hash ^= Enabled.GetHashCode();
-            if (Type != 0) hash ^= Type.GetHashCode();
-            if (OwnedByTeam != 0) hash ^= OwnedByTeam.GetHashCode();
-            if (GuardPokemonId != 0) hash ^= GuardPokemonId.GetHashCode();
-            if (GuardPokemonCp != 0) hash ^= GuardPokemonCp.GetHashCode();
-            if (GymPoints != 0L) hash ^= GymPoints.GetHashCode();
-            if (IsInBattle != false) hash ^= IsInBattle.GetHashCode();
-            if (CooldownCompleteTimestampMs != 0L) hash ^= CooldownCompleteTimestampMs.GetHashCode();
-            if (Sponsor != 0) hash ^= Sponsor.GetHashCode();
-            if (RenderingType != 0) hash ^= RenderingType.GetHashCode();
-            if (ActiveFortModifier.Length != 0) hash ^= ActiveFortModifier.GetHashCode();
-            if (lureInfo_ != null) hash ^= LureInfo.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortLureInfo : pb::IMessage<FortLureInfo>
-    {
-        /// <summary>Field number for the "fort_id" field.</summary>
-        public const int FortIdFieldNumber = 1;
-
-        /// <summary>Field number for the "unknown2" field.</summary>
-        public const int Unknown2FieldNumber = 2;
-
-        /// <summary>Field number for the "active_pokemon_id" field.</summary>
-        public const int ActivePokemonIdFieldNumber = 3;
-
-        /// <summary>Field number for the "lure_expires_timestamp_ms" field.</summary>
-        public const int LureExpiresTimestampMsFieldNumber = 4;
-
-        private static readonly pb::MessageParser<FortLureInfo> _parser =
-            new pb::MessageParser<FortLureInfo>(() => new FortLureInfo());
-
-        private global::AllEnum.PokemonId activePokemonId_ = 0;
-        private string fortId_ = "";
-        private long lureExpiresTimestampMs_;
-        private double unknown2_;
-
-        public FortLureInfo()
-        {
-            OnConstruction();
-        }
-
-        public FortLureInfo(FortLureInfo other) : this()
-        {
-            fortId_ = other.fortId_;
-            unknown2_ = other.unknown2_;
-            activePokemonId_ = other.activePokemonId_;
-            lureExpiresTimestampMs_ = other.lureExpiresTimestampMs_;
-        }
-
-        public static pb::MessageParser<FortLureInfo> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[27]; }
-        }
-
-        public string FortId
-        {
-            get { return fortId_; }
-            set { fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public double Unknown2
-        {
-            get { return unknown2_; }
-            set { unknown2_ = value; }
-        }
-
-        public global::AllEnum.PokemonId ActivePokemonId
-        {
-            get { return activePokemonId_; }
-            set { activePokemonId_ = value; }
-        }
-
-        public long LureExpiresTimestampMs
-        {
-            get { return lureExpiresTimestampMs_; }
-            set { lureExpiresTimestampMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortLureInfo Clone()
-        {
-            return new FortLureInfo(this);
-        }
-
-        public bool Equals(FortLureInfo other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (FortId != other.FortId) return false;
-            if (Unknown2 != other.Unknown2) return false;
-            if (ActivePokemonId != other.ActivePokemonId) return false;
-            if (LureExpiresTimestampMs != other.LureExpiresTimestampMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (FortId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(FortId);
-            }
-            if (Unknown2 != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(Unknown2);
-            }
-            if (ActivePokemonId != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteEnum((int)ActivePokemonId);
-            }
-            if (LureExpiresTimestampMs != 0L)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt64(LureExpiresTimestampMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (FortId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
-            }
-            if (Unknown2 != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (ActivePokemonId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ActivePokemonId);
-            }
-            if (LureExpiresTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(LureExpiresTimestampMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortLureInfo other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.FortId.Length != 0)
-            {
-                FortId = other.FortId;
-            }
-            if (other.Unknown2 != 0D)
-            {
-                Unknown2 = other.Unknown2;
-            }
-            if (other.ActivePokemonId != 0)
-            {
-                ActivePokemonId = other.ActivePokemonId;
-            }
-            if (other.LureExpiresTimestampMs != 0L)
-            {
-                LureExpiresTimestampMs = other.LureExpiresTimestampMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            FortId = input.ReadString();
-                            break;
-                        }
-                    case 17:
-                        {
-                            Unknown2 = input.ReadDouble();
-                            break;
-                        }
-                    case 24:
-                        {
-                            activePokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 32:
-                        {
-                            LureExpiresTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortLureInfo);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (FortId.Length != 0) hash ^= FortId.GetHashCode();
-            if (Unknown2 != 0D) hash ^= Unknown2.GetHashCode();
-            if (ActivePokemonId != 0) hash ^= ActivePokemonId.GetHashCode();
-            if (LureExpiresTimestampMs != 0L) hash ^= LureExpiresTimestampMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class SpawnPoint : pb::IMessage<SpawnPoint>
-    {
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 2;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 3;
-
-        private static readonly pb::MessageParser<SpawnPoint> _parser =
-            new pb::MessageParser<SpawnPoint>(() => new SpawnPoint());
-
-        private double latitude_;
-        private double longitude_;
-
-        public SpawnPoint()
-        {
-            OnConstruction();
-        }
-
-        public SpawnPoint(SpawnPoint other) : this()
-        {
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-        }
-
-        public static pb::MessageParser<SpawnPoint> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[28]; }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public SpawnPoint Clone()
-        {
-            return new SpawnPoint(this);
-        }
-
-        public bool Equals(SpawnPoint other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(Longitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(SpawnPoint other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 17:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 25:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as SpawnPoint);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortSummary : pb::IMessage<FortSummary>
-    {
-        /// <summary>Field number for the "fort_summary_id" field.</summary>
-        public const int FortSummaryIdFieldNumber = 1;
-
-        /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
-        public const int LastModifiedTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 4;
-
-        private static readonly pb::MessageParser<FortSummary> _parser =
-            new pb::MessageParser<FortSummary>(() => new FortSummary());
-
-        private int fortSummaryId_;
-        private int lastModifiedTimestampMs_;
-        private int latitude_;
-        private int longitude_;
-
-        public FortSummary()
-        {
-            OnConstruction();
-        }
-
-        public FortSummary(FortSummary other) : this()
-        {
-            fortSummaryId_ = other.fortSummaryId_;
-            lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-        }
-
-        public static pb::MessageParser<FortSummary> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[29]; }
-        }
-
-        public int FortSummaryId
-        {
-            get { return fortSummaryId_; }
-            set { fortSummaryId_ = value; }
-        }
-
-        public int LastModifiedTimestampMs
-        {
-            get { return lastModifiedTimestampMs_; }
-            set { lastModifiedTimestampMs_ = value; }
-        }
-
-        public int Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public int Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortSummary Clone()
-        {
-            return new FortSummary(this);
-        }
-
-        public bool Equals(FortSummary other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (FortSummaryId != other.FortSummaryId) return false;
-            if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (FortSummaryId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(FortSummaryId);
-            }
-            if (LastModifiedTimestampMs != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(LastModifiedTimestampMs);
-            }
-            if (Latitude != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(Latitude);
-            }
-            if (Longitude != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(Longitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (FortSummaryId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(FortSummaryId);
-            }
-            if (LastModifiedTimestampMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(LastModifiedTimestampMs);
-            }
-            if (Latitude != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Latitude);
-            }
-            if (Longitude != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Longitude);
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortSummary other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.FortSummaryId != 0)
-            {
-                FortSummaryId = other.FortSummaryId;
-            }
-            if (other.LastModifiedTimestampMs != 0)
-            {
-                LastModifiedTimestampMs = other.LastModifiedTimestampMs;
-            }
-            if (other.Latitude != 0)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0)
-            {
-                Longitude = other.Longitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            FortSummaryId = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            LastModifiedTimestampMs = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            Latitude = input.ReadInt32();
-                            break;
-                        }
-                    case 32:
-                        {
-                            Longitude = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortSummary);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (FortSummaryId != 0) hash ^= FortSummaryId.GetHashCode();
-            if (LastModifiedTimestampMs != 0) hash ^= LastModifiedTimestampMs.GetHashCode();
-            if (Latitude != 0) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0) hash ^= Longitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class WildPokemon : pb::IMessage<WildPokemon>
-    {
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 1;
-
-        /// <summary>Field number for the "last_modified_timestamp_ms" field.</summary>
-        public const int LastModifiedTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 4;
-
-        /// <summary>Field number for the "spawnpoint_id" field.</summary>
-        public const int SpawnpointIdFieldNumber = 5;
-
-        /// <summary>Field number for the "pokemon_data" field.</summary>
-        public const int PokemonDataFieldNumber = 7;
-
-        /// <summary>Field number for the "time_till_hidden_ms" field.</summary>
-        public const int TimeTillHiddenMsFieldNumber = 11;
-
-        private static readonly pb::MessageParser<WildPokemon> _parser =
-            new pb::MessageParser<WildPokemon>(() => new WildPokemon());
-
-        private ulong encounterId_;
-        private long lastModifiedTimestampMs_;
-        private double latitude_;
-        private double longitude_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokemonData pokemonData_;
-        private string spawnpointId_ = "";
-        private int timeTillHiddenMs_;
-
-        public WildPokemon()
-        {
-            OnConstruction();
-        }
-
-        public WildPokemon(WildPokemon other) : this()
-        {
-            encounterId_ = other.encounterId_;
-            lastModifiedTimestampMs_ = other.lastModifiedTimestampMs_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-            spawnpointId_ = other.spawnpointId_;
-            PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
-            timeTillHiddenMs_ = other.timeTillHiddenMs_;
-        }
-
-        public static pb::MessageParser<WildPokemon> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[30]; }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        public long LastModifiedTimestampMs
-        {
-            get { return lastModifiedTimestampMs_; }
-            set { lastModifiedTimestampMs_ = value; }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        public string SpawnpointId
-        {
-            get { return spawnpointId_; }
-            set { spawnpointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokemonData PokemonData
-        {
-            get { return pokemonData_; }
-            set { pokemonData_ = value; }
-        }
-
-        public int TimeTillHiddenMs
-        {
-            get { return timeTillHiddenMs_; }
-            set { timeTillHiddenMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public WildPokemon Clone()
-        {
-            return new WildPokemon(this);
-        }
-
-        public bool Equals(WildPokemon other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (EncounterId != other.EncounterId) return false;
-            if (LastModifiedTimestampMs != other.LastModifiedTimestampMs) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            if (SpawnpointId != other.SpawnpointId) return false;
-            if (!Equals(PokemonData, other.PokemonData)) return false;
-            if (TimeTillHiddenMs != other.TimeTillHiddenMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(EncounterId);
-            }
-            if (LastModifiedTimestampMs != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(LastModifiedTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(Longitude);
-            }
-            if (SpawnpointId.Length != 0)
-            {
-                output.WriteRawTag(42);
-                output.WriteString(SpawnpointId);
-            }
-            if (pokemonData_ != null)
-            {
-                output.WriteRawTag(58);
-                output.WriteMessage(PokemonData);
-            }
-            if (TimeTillHiddenMs != 0)
-            {
-                output.WriteRawTag(88);
-                output.WriteInt32(TimeTillHiddenMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (LastModifiedTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(LastModifiedTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (SpawnpointId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnpointId);
-            }
-            if (pokemonData_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
-            }
-            if (TimeTillHiddenMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimeTillHiddenMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(WildPokemon other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-            if (other.LastModifiedTimestampMs != 0L)
-            {
-                LastModifiedTimestampMs = other.LastModifiedTimestampMs;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-            if (other.SpawnpointId.Length != 0)
-            {
-                SpawnpointId = other.SpawnpointId;
-            }
-            if (other.pokemonData_ != null)
-            {
-                if (pokemonData_ == null)
-                {
-                    pokemonData_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                }
-                PokemonData.MergeFrom(other.PokemonData);
-            }
-            if (other.TimeTillHiddenMs != 0)
-            {
-                TimeTillHiddenMs = other.TimeTillHiddenMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            LastModifiedTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 25:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 33:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                    case 42:
-                        {
-                            SpawnpointId = input.ReadString();
-                            break;
-                        }
-                    case 58:
-                        {
-                            if (pokemonData_ == null)
-                            {
-                                pokemonData_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                            }
-                            input.ReadMessage(pokemonData_);
-                            break;
-                        }
-                    case 88:
-                        {
-                            TimeTillHiddenMs = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as WildPokemon);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            if (LastModifiedTimestampMs != 0L) hash ^= LastModifiedTimestampMs.GetHashCode();
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            if (SpawnpointId.Length != 0) hash ^= SpawnpointId.GetHashCode();
-            if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
-            if (TimeTillHiddenMs != 0) hash ^= TimeTillHiddenMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PokemonData : pb::IMessage<PokemonData>
-    {
-        /// <summary>Field number for the "id" field.</summary>
-        public const int IdFieldNumber = 1;
-
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 2;
-
-        /// <summary>Field number for the "cp" field.</summary>
-        public const int CpFieldNumber = 3;
-
-        /// <summary>Field number for the "stamina" field.</summary>
-        public const int StaminaFieldNumber = 4;
-
-        /// <summary>Field number for the "stamina_max" field.</summary>
-        public const int StaminaMaxFieldNumber = 5;
-
-        /// <summary>Field number for the "move_1" field.</summary>
-        public const int Move1FieldNumber = 6;
-
-        /// <summary>Field number for the "move_2" field.</summary>
-        public const int Move2FieldNumber = 7;
-
-        /// <summary>Field number for the "deployed_fort_id" field.</summary>
-        public const int DeployedFortIdFieldNumber = 8;
-
-        /// <summary>Field number for the "owner_name" field.</summary>
-        public const int OwnerNameFieldNumber = 9;
-
-        /// <summary>Field number for the "is_egg" field.</summary>
-        public const int IsEggFieldNumber = 10;
-
-        /// <summary>Field number for the "egg_km_walked_target" field.</summary>
-        public const int EggKmWalkedTargetFieldNumber = 11;
-
-        /// <summary>Field number for the "egg_km_walked_start" field.</summary>
-        public const int EggKmWalkedStartFieldNumber = 12;
-
-        /// <summary>Field number for the "origin" field.</summary>
-        public const int OriginFieldNumber = 14;
-
-        /// <summary>Field number for the "height_m" field.</summary>
-        public const int HeightMFieldNumber = 15;
-
-        /// <summary>Field number for the "weight_kg" field.</summary>
-        public const int WeightKgFieldNumber = 16;
-
-        /// <summary>Field number for the "individual_attack" field.</summary>
-        public const int IndividualAttackFieldNumber = 17;
-
-        /// <summary>Field number for the "individual_defense" field.</summary>
-        public const int IndividualDefenseFieldNumber = 18;
-
-        /// <summary>Field number for the "individual_stamina" field.</summary>
-        public const int IndividualStaminaFieldNumber = 19;
-
-        /// <summary>Field number for the "cp_multiplier" field.</summary>
-        public const int CpMultiplierFieldNumber = 20;
-
-        /// <summary>Field number for the "pokeball" field.</summary>
-        public const int PokeballFieldNumber = 21;
-
-        /// <summary>Field number for the "captured_cell_id" field.</summary>
-        public const int CapturedCellIdFieldNumber = 22;
-
-        /// <summary>Field number for the "battles_attacked" field.</summary>
-        public const int BattlesAttackedFieldNumber = 23;
-
-        /// <summary>Field number for the "battles_defended" field.</summary>
-        public const int BattlesDefendedFieldNumber = 24;
-
-        /// <summary>Field number for the "egg_incubator_id" field.</summary>
-        public const int EggIncubatorIdFieldNumber = 25;
-
-        /// <summary>Field number for the "creation_time_ms" field.</summary>
-        public const int CreationTimeMsFieldNumber = 26;
-
-        /// <summary>Field number for the "num_upgrades" field.</summary>
-        public const int NumUpgradesFieldNumber = 27;
-
-        /// <summary>Field number for the "additional_cp_multiplier" field.</summary>
-        public const int AdditionalCpMultiplierFieldNumber = 28;
-
-        /// <summary>Field number for the "favorite" field.</summary>
-        public const int FavoriteFieldNumber = 29;
-
-        /// <summary>Field number for the "nickname" field.</summary>
-        public const int NicknameFieldNumber = 30;
-
-        /// <summary>Field number for the "from_fort" field.</summary>
-        public const int FromFortFieldNumber = 31;
-
-        private static readonly pb::MessageParser<PokemonData> _parser =
-            new pb::MessageParser<PokemonData>(() => new PokemonData());
-
-        private int additionalCpMultiplier_;
-        private int battlesAttacked_;
-        private int battlesDefended_;
-        private ulong capturedCellId_;
-        private int cp_;
-        private int cpMultiplier_;
-        private ulong creationTimeMs_;
-        private int deployedFortId_;
-        private int eggIncubatorId_;
-        private int eggKmWalkedStart_;
-        private int eggKmWalkedTarget_;
-        private int favorite_;
-        private int fromFort_;
-        private float heightM_;
-        private ulong id_;
-        private int individualAttack_;
-        private int individualDefense_;
-        private int individualStamina_;
-        private bool isEgg_;
-        private global::AllEnum.PokemonMove move1_ = 0;
-        private global::AllEnum.PokemonMove move2_ = 0;
-        private string nickname_ = "";
-        private int numUpgrades_;
-        private int origin_;
-        private string ownerName_ = "";
-        private int pokeball_;
-        private global::AllEnum.PokemonId pokemonId_ = 0;
-        private int stamina_;
-        private int staminaMax_;
-        private float weightKg_;
-
-        public PokemonData()
-        {
-            OnConstruction();
-        }
-
-        public PokemonData(PokemonData other) : this()
-        {
-            id_ = other.id_;
-            pokemonId_ = other.pokemonId_;
-            cp_ = other.cp_;
-            stamina_ = other.stamina_;
-            staminaMax_ = other.staminaMax_;
-            move1_ = other.move1_;
-            move2_ = other.move2_;
-            deployedFortId_ = other.deployedFortId_;
-            ownerName_ = other.ownerName_;
-            isEgg_ = other.isEgg_;
-            eggKmWalkedTarget_ = other.eggKmWalkedTarget_;
-            eggKmWalkedStart_ = other.eggKmWalkedStart_;
-            origin_ = other.origin_;
-            heightM_ = other.heightM_;
-            weightKg_ = other.weightKg_;
-            individualAttack_ = other.individualAttack_;
-            individualDefense_ = other.individualDefense_;
-            individualStamina_ = other.individualStamina_;
-            cpMultiplier_ = other.cpMultiplier_;
-            pokeball_ = other.pokeball_;
-            capturedCellId_ = other.capturedCellId_;
-            battlesAttacked_ = other.battlesAttacked_;
-            battlesDefended_ = other.battlesDefended_;
-            eggIncubatorId_ = other.eggIncubatorId_;
-            creationTimeMs_ = other.creationTimeMs_;
-            numUpgrades_ = other.numUpgrades_;
-            additionalCpMultiplier_ = other.additionalCpMultiplier_;
-            favorite_ = other.favorite_;
-            nickname_ = other.nickname_;
-            fromFort_ = other.fromFort_;
-        }
-
-        public static pb::MessageParser<PokemonData> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[31]; }
-        }
-
-        public ulong Id
-        {
-            get { return id_; }
-            set { id_ = value; }
-        }
-
-        public global::AllEnum.PokemonId PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        public int Cp
-        {
-            get { return cp_; }
-            set { cp_ = value; }
-        }
-
-        public int Stamina
-        {
-            get { return stamina_; }
-            set { stamina_ = value; }
-        }
-
-        public int StaminaMax
-        {
-            get { return staminaMax_; }
-            set { staminaMax_ = value; }
-        }
-
-        public global::AllEnum.PokemonMove Move1
-        {
-            get { return move1_; }
-            set { move1_ = value; }
-        }
-
-        public global::AllEnum.PokemonMove Move2
-        {
-            get { return move2_; }
-            set { move2_ = value; }
-        }
-
-        public int DeployedFortId
-        {
-            get { return deployedFortId_; }
-            set { deployedFortId_ = value; }
-        }
-
-        public string OwnerName
-        {
-            get { return ownerName_; }
-            set { ownerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public bool IsEgg
-        {
-            get { return isEgg_; }
-            set { isEgg_ = value; }
-        }
-
-        public int EggKmWalkedTarget
-        {
-            get { return eggKmWalkedTarget_; }
-            set { eggKmWalkedTarget_ = value; }
-        }
-
-        public int EggKmWalkedStart
-        {
-            get { return eggKmWalkedStart_; }
-            set { eggKmWalkedStart_ = value; }
-        }
-
-        public int Origin
-        {
-            get { return origin_; }
-            set { origin_ = value; }
-        }
-
-        public float HeightM
-        {
-            get { return heightM_; }
-            set { heightM_ = value; }
-        }
-
-        public float WeightKg
-        {
-            get { return weightKg_; }
-            set { weightKg_ = value; }
-        }
-
-        public int IndividualAttack
-        {
-            get { return individualAttack_; }
-            set { individualAttack_ = value; }
-        }
-
-        public int IndividualDefense
-        {
-            get { return individualDefense_; }
-            set { individualDefense_ = value; }
-        }
-
-        public int IndividualStamina
-        {
-            get { return individualStamina_; }
-            set { individualStamina_ = value; }
-        }
-
-        public int CpMultiplier
-        {
-            get { return cpMultiplier_; }
-            set { cpMultiplier_ = value; }
-        }
-
-        public int Pokeball
-        {
-            get { return pokeball_; }
-            set { pokeball_ = value; }
-        }
-
-        public ulong CapturedCellId
-        {
-            get { return capturedCellId_; }
-            set { capturedCellId_ = value; }
-        }
-
-        public int BattlesAttacked
-        {
-            get { return battlesAttacked_; }
-            set { battlesAttacked_ = value; }
-        }
-
-        public int BattlesDefended
-        {
-            get { return battlesDefended_; }
-            set { battlesDefended_ = value; }
-        }
-
-        public int EggIncubatorId
-        {
-            get { return eggIncubatorId_; }
-            set { eggIncubatorId_ = value; }
-        }
-
-        public ulong CreationTimeMs
-        {
-            get { return creationTimeMs_; }
-            set { creationTimeMs_ = value; }
-        }
-
-        public int NumUpgrades
-        {
-            get { return numUpgrades_; }
-            set { numUpgrades_ = value; }
-        }
-
-        public int AdditionalCpMultiplier
-        {
-            get { return additionalCpMultiplier_; }
-            set { additionalCpMultiplier_ = value; }
-        }
-
-        public int Favorite
-        {
-            get { return favorite_; }
-            set { favorite_ = value; }
-        }
-
-        public string Nickname
-        {
-            get { return nickname_; }
-            set { nickname_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public int FromFort
-        {
-            get { return fromFort_; }
-            set { fromFort_ = value; }
-        }
-
-        public float GetIV()
-        {
-            return ((float)(IndividualAttack + IndividualDefense + IndividualStamina) / (45.0f));
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PokemonData Clone()
-        {
-            return new PokemonData(this);
-        }
-
-        public bool Equals(PokemonData other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Id != other.Id) return false;
-            if (PokemonId != other.PokemonId) return false;
-            if (Cp != other.Cp) return false;
-            if (Stamina != other.Stamina) return false;
-            if (StaminaMax != other.StaminaMax) return false;
-            if (Move1 != other.Move1) return false;
-            if (Move2 != other.Move2) return false;
-            if (DeployedFortId != other.DeployedFortId) return false;
-            if (OwnerName != other.OwnerName) return false;
-            if (IsEgg != other.IsEgg) return false;
-            if (EggKmWalkedTarget != other.EggKmWalkedTarget) return false;
-            if (EggKmWalkedStart != other.EggKmWalkedStart) return false;
-            if (Origin != other.Origin) return false;
-            if (HeightM != other.HeightM) return false;
-            if (WeightKg != other.WeightKg) return false;
-            if (IndividualAttack != other.IndividualAttack) return false;
-            if (IndividualDefense != other.IndividualDefense) return false;
-            if (IndividualStamina != other.IndividualStamina) return false;
-            if (CpMultiplier != other.CpMultiplier) return false;
-            if (Pokeball != other.Pokeball) return false;
-            if (CapturedCellId != other.CapturedCellId) return false;
-            if (BattlesAttacked != other.BattlesAttacked) return false;
-            if (BattlesDefended != other.BattlesDefended) return false;
-            if (EggIncubatorId != other.EggIncubatorId) return false;
-            if (CreationTimeMs != other.CreationTimeMs) return false;
-            if (NumUpgrades != other.NumUpgrades) return false;
-            if (AdditionalCpMultiplier != other.AdditionalCpMultiplier) return false;
-            if (Favorite != other.Favorite) return false;
-            if (Nickname != other.Nickname) return false;
-            if (FromFort != other.FromFort) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Id != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(Id);
-            }
-            if (PokemonId != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)PokemonId);
-            }
-            if (Cp != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(Cp);
-            }
-            if (Stamina != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(Stamina);
-            }
-            if (StaminaMax != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(StaminaMax);
-            }
-            if (Move1 != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteEnum((int)Move1);
-            }
-            if (Move2 != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteEnum((int)Move2);
-            }
-            if (DeployedFortId != 0)
-            {
-                output.WriteRawTag(64);
-                output.WriteInt32(DeployedFortId);
-            }
-            if (OwnerName.Length != 0)
-            {
-                output.WriteRawTag(74);
-                output.WriteString(OwnerName);
-            }
-            if (IsEgg != false)
-            {
-                output.WriteRawTag(80);
-                output.WriteBool(IsEgg);
-            }
-            if (EggKmWalkedTarget != 0)
-            {
-                output.WriteRawTag(88);
-                output.WriteInt32(EggKmWalkedTarget);
-            }
-            if (EggKmWalkedStart != 0)
-            {
-                output.WriteRawTag(96);
-                output.WriteInt32(EggKmWalkedStart);
-            }
-            if (Origin != 0)
-            {
-                output.WriteRawTag(112);
-                output.WriteInt32(Origin);
-            }
-            if (HeightM != 0F)
-            {
-                output.WriteRawTag(125);
-                output.WriteFloat(HeightM);
-            }
-            if (WeightKg != 0F)
-            {
-                output.WriteRawTag(133, 1);
-                output.WriteFloat(WeightKg);
-            }
-            if (IndividualAttack != 0)
-            {
-                output.WriteRawTag(136, 1);
-                output.WriteInt32(IndividualAttack);
-            }
-            if (IndividualDefense != 0)
-            {
-                output.WriteRawTag(144, 1);
-                output.WriteInt32(IndividualDefense);
-            }
-            if (IndividualStamina != 0)
-            {
-                output.WriteRawTag(152, 1);
-                output.WriteInt32(IndividualStamina);
-            }
-            if (CpMultiplier != 0)
-            {
-                output.WriteRawTag(160, 1);
-                output.WriteInt32(CpMultiplier);
-            }
-            if (Pokeball != 0)
-            {
-                output.WriteRawTag(168, 1);
-                output.WriteInt32(Pokeball);
-            }
-            if (CapturedCellId != 0UL)
-            {
-                output.WriteRawTag(176, 1);
-                output.WriteUInt64(CapturedCellId);
-            }
-            if (BattlesAttacked != 0)
-            {
-                output.WriteRawTag(184, 1);
-                output.WriteInt32(BattlesAttacked);
-            }
-            if (BattlesDefended != 0)
-            {
-                output.WriteRawTag(192, 1);
-                output.WriteInt32(BattlesDefended);
-            }
-            if (EggIncubatorId != 0)
-            {
-                output.WriteRawTag(200, 1);
-                output.WriteInt32(EggIncubatorId);
-            }
-            if (CreationTimeMs != 0UL)
-            {
-                output.WriteRawTag(208, 1);
-                output.WriteUInt64(CreationTimeMs);
-            }
-            if (NumUpgrades != 0)
-            {
-                output.WriteRawTag(216, 1);
-                output.WriteInt32(NumUpgrades);
-            }
-            if (AdditionalCpMultiplier != 0)
-            {
-                output.WriteRawTag(224, 1);
-                output.WriteInt32(AdditionalCpMultiplier);
-            }
-            if (Favorite != 0)
-            {
-                output.WriteRawTag(232, 1);
-                output.WriteInt32(Favorite);
-            }
-            if (Nickname.Length != 0)
-            {
-                output.WriteRawTag(242, 1);
-                output.WriteString(Nickname);
-            }
-            if (FromFort != 0)
-            {
-                output.WriteRawTag(248, 1);
-                output.WriteInt32(FromFort);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Id != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (PokemonId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)PokemonId);
-            }
-            if (Cp != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Cp);
-            }
-            if (Stamina != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
-            }
-            if (StaminaMax != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaminaMax);
-            }
-            if (Move1 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Move1);
-            }
-            if (Move2 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Move2);
-            }
-            if (DeployedFortId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DeployedFortId);
-            }
-            if (OwnerName.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(OwnerName);
-            }
-            if (IsEgg != false)
-            {
-                size += 1 + 1;
-            }
-            if (EggKmWalkedTarget != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggKmWalkedTarget);
-            }
-            if (EggKmWalkedStart != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggKmWalkedStart);
-            }
-            if (Origin != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Origin);
-            }
-            if (HeightM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (WeightKg != 0F)
-            {
-                size += 2 + 4;
-            }
-            if (IndividualAttack != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualAttack);
-            }
-            if (IndividualDefense != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualDefense);
-            }
-            if (IndividualStamina != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(IndividualStamina);
-            }
-            if (CpMultiplier != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(CpMultiplier);
-            }
-            if (Pokeball != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(Pokeball);
-            }
-            if (CapturedCellId != 0UL)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CapturedCellId);
-            }
-            if (BattlesAttacked != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesAttacked);
-            }
-            if (BattlesDefended != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattlesDefended);
-            }
-            if (EggIncubatorId != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(EggIncubatorId);
-            }
-            if (CreationTimeMs != 0UL)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeUInt64Size(CreationTimeMs);
-            }
-            if (NumUpgrades != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(NumUpgrades);
-            }
-            if (AdditionalCpMultiplier != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(AdditionalCpMultiplier);
-            }
-            if (Favorite != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(Favorite);
-            }
-            if (Nickname.Length != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeStringSize(Nickname);
-            }
-            if (FromFort != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(FromFort);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PokemonData other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Id != 0UL)
-            {
-                Id = other.Id;
-            }
-            if (other.PokemonId != 0)
-            {
-                PokemonId = other.PokemonId;
-            }
-            if (other.Cp != 0)
-            {
-                Cp = other.Cp;
-            }
-            if (other.Stamina != 0)
-            {
-                Stamina = other.Stamina;
-            }
-            if (other.StaminaMax != 0)
-            {
-                StaminaMax = other.StaminaMax;
-            }
-            if (other.Move1 != 0)
-            {
-                Move1 = other.Move1;
-            }
-            if (other.Move2 != 0)
-            {
-                Move2 = other.Move2;
-            }
-            if (other.DeployedFortId != 0)
-            {
-                DeployedFortId = other.DeployedFortId;
-            }
-            if (other.OwnerName.Length != 0)
-            {
-                OwnerName = other.OwnerName;
-            }
-            if (other.IsEgg != false)
-            {
-                IsEgg = other.IsEgg;
-            }
-            if (other.EggKmWalkedTarget != 0)
-            {
-                EggKmWalkedTarget = other.EggKmWalkedTarget;
-            }
-            if (other.EggKmWalkedStart != 0)
-            {
-                EggKmWalkedStart = other.EggKmWalkedStart;
-            }
-            if (other.Origin != 0)
-            {
-                Origin = other.Origin;
-            }
-            if (other.HeightM != 0F)
-            {
-                HeightM = other.HeightM;
-            }
-            if (other.WeightKg != 0F)
-            {
-                WeightKg = other.WeightKg;
-            }
-            if (other.IndividualAttack != 0)
-            {
-                IndividualAttack = other.IndividualAttack;
-            }
-            if (other.IndividualDefense != 0)
-            {
-                IndividualDefense = other.IndividualDefense;
-            }
-            if (other.IndividualStamina != 0)
-            {
-                IndividualStamina = other.IndividualStamina;
-            }
-            if (other.CpMultiplier != 0)
-            {
-                CpMultiplier = other.CpMultiplier;
-            }
-            if (other.Pokeball != 0)
-            {
-                Pokeball = other.Pokeball;
-            }
-            if (other.CapturedCellId != 0UL)
-            {
-                CapturedCellId = other.CapturedCellId;
-            }
-            if (other.BattlesAttacked != 0)
-            {
-                BattlesAttacked = other.BattlesAttacked;
-            }
-            if (other.BattlesDefended != 0)
-            {
-                BattlesDefended = other.BattlesDefended;
-            }
-            if (other.EggIncubatorId != 0)
-            {
-                EggIncubatorId = other.EggIncubatorId;
-            }
-            if (other.CreationTimeMs != 0UL)
-            {
-                CreationTimeMs = other.CreationTimeMs;
-            }
-            if (other.NumUpgrades != 0)
-            {
-                NumUpgrades = other.NumUpgrades;
-            }
-            if (other.AdditionalCpMultiplier != 0)
-            {
-                AdditionalCpMultiplier = other.AdditionalCpMultiplier;
-            }
-            if (other.Favorite != 0)
-            {
-                Favorite = other.Favorite;
-            }
-            if (other.Nickname.Length != 0)
-            {
-                Nickname = other.Nickname;
-            }
-            if (other.FromFort != 0)
-            {
-                FromFort = other.FromFort;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            Id = input.ReadFixed64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            pokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            Cp = input.ReadInt32();
-                            break;
-                        }
-                    case 32:
-                        {
-                            Stamina = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            StaminaMax = input.ReadInt32();
-                            break;
-                        }
-                    case 48:
-                        {
-                            move1_ = (global::AllEnum.PokemonMove)input.ReadEnum();
-                            break;
-                        }
-                    case 56:
-                        {
-                            move2_ = (global::AllEnum.PokemonMove)input.ReadEnum();
-                            break;
-                        }
-                    case 64:
-                        {
-                            DeployedFortId = input.ReadInt32();
-                            break;
-                        }
-                    case 74:
-                        {
-                            OwnerName = input.ReadString();
-                            break;
-                        }
-                    case 80:
-                        {
-                            IsEgg = input.ReadBool();
-                            break;
-                        }
-                    case 88:
-                        {
-                            EggKmWalkedTarget = input.ReadInt32();
-                            break;
-                        }
-                    case 96:
-                        {
-                            EggKmWalkedStart = input.ReadInt32();
-                            break;
-                        }
-                    case 112:
-                        {
-                            Origin = input.ReadInt32();
-                            break;
-                        }
-                    case 125:
-                        {
-                            HeightM = input.ReadFloat();
-                            break;
-                        }
-                    case 133:
-                        {
-                            WeightKg = input.ReadFloat();
-                            break;
-                        }
-                    case 136:
-                        {
-                            IndividualAttack = input.ReadInt32();
-                            break;
-                        }
-                    case 144:
-                        {
-                            IndividualDefense = input.ReadInt32();
-                            break;
-                        }
-                    case 152:
-                        {
-                            IndividualStamina = input.ReadInt32();
-                            break;
-                        }
-                    case 160:
-                        {
-                            CpMultiplier = input.ReadInt32();
-                            break;
-                        }
-                    case 168:
-                        {
-                            Pokeball = input.ReadInt32();
-                            break;
-                        }
-                    case 176:
-                        {
-                            CapturedCellId = input.ReadUInt64();
-                            break;
-                        }
-                    case 184:
-                        {
-                            BattlesAttacked = input.ReadInt32();
-                            break;
-                        }
-                    case 192:
-                        {
-                            BattlesDefended = input.ReadInt32();
-                            break;
-                        }
-                    case 200:
-                        {
-                            EggIncubatorId = input.ReadInt32();
-                            break;
-                        }
-                    case 208:
-                        {
-                            CreationTimeMs = input.ReadUInt64();
-                            break;
-                        }
-                    case 216:
-                        {
-                            NumUpgrades = input.ReadInt32();
-                            break;
-                        }
-                    case 224:
-                        {
-                            AdditionalCpMultiplier = input.ReadInt32();
-                            break;
-                        }
-                    case 232:
-                        {
-                            Favorite = input.ReadInt32();
-                            break;
-                        }
-                    case 242:
-                        {
-                            Nickname = input.ReadString();
-                            break;
-                        }
-                    case 248:
-                        {
-                            FromFort = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PokemonData);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Id != 0UL) hash ^= Id.GetHashCode();
-            if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
-            if (Cp != 0) hash ^= Cp.GetHashCode();
-            if (Stamina != 0) hash ^= Stamina.GetHashCode();
-            if (StaminaMax != 0) hash ^= StaminaMax.GetHashCode();
-            if (Move1 != 0) hash ^= Move1.GetHashCode();
-            if (Move2 != 0) hash ^= Move2.GetHashCode();
-            if (DeployedFortId != 0) hash ^= DeployedFortId.GetHashCode();
-            if (OwnerName.Length != 0) hash ^= OwnerName.GetHashCode();
-            if (IsEgg != false) hash ^= IsEgg.GetHashCode();
-            if (EggKmWalkedTarget != 0) hash ^= EggKmWalkedTarget.GetHashCode();
-            if (EggKmWalkedStart != 0) hash ^= EggKmWalkedStart.GetHashCode();
-            if (Origin != 0) hash ^= Origin.GetHashCode();
-            if (HeightM != 0F) hash ^= HeightM.GetHashCode();
-            if (WeightKg != 0F) hash ^= WeightKg.GetHashCode();
-            if (IndividualAttack != 0) hash ^= IndividualAttack.GetHashCode();
-            if (IndividualDefense != 0) hash ^= IndividualDefense.GetHashCode();
-            if (IndividualStamina != 0) hash ^= IndividualStamina.GetHashCode();
-            if (CpMultiplier != 0) hash ^= CpMultiplier.GetHashCode();
-            if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
-            if (CapturedCellId != 0UL) hash ^= CapturedCellId.GetHashCode();
-            if (BattlesAttacked != 0) hash ^= BattlesAttacked.GetHashCode();
-            if (BattlesDefended != 0) hash ^= BattlesDefended.GetHashCode();
-            if (EggIncubatorId != 0) hash ^= EggIncubatorId.GetHashCode();
-            if (CreationTimeMs != 0UL) hash ^= CreationTimeMs.GetHashCode();
-            if (NumUpgrades != 0) hash ^= NumUpgrades.GetHashCode();
-            if (AdditionalCpMultiplier != 0) hash ^= AdditionalCpMultiplier.GetHashCode();
-            if (Favorite != 0) hash ^= Favorite.GetHashCode();
-            if (Nickname.Length != 0) hash ^= Nickname.GetHashCode();
-            if (FromFort != 0) hash ^= FromFort.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class MapPokemon : pb::IMessage<MapPokemon>
-    {
-        /// <summary>Field number for the "spawnpoint_id" field.</summary>
-        public const int SpawnpointIdFieldNumber = 1;
-
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 2;
-
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 3;
-
-        /// <summary>Field number for the "expiration_timestamp_ms" field.</summary>
-        public const int ExpirationTimestampMsFieldNumber = 4;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 5;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 6;
-
-        private static readonly pb::MessageParser<MapPokemon> _parser =
-            new pb::MessageParser<MapPokemon>(() => new MapPokemon());
-
-        private ulong encounterId_;
-        private long expirationTimestampMs_;
-        private double latitude_;
-        private double longitude_;
-        private global::AllEnum.PokemonId pokemonId_ = 0;
-        private string spawnpointId_ = "";
-
-        public MapPokemon()
-        {
-            OnConstruction();
-        }
-
-        public MapPokemon(MapPokemon other) : this()
-        {
-            spawnpointId_ = other.spawnpointId_;
-            encounterId_ = other.encounterId_;
-            pokemonId_ = other.pokemonId_;
-            expirationTimestampMs_ = other.expirationTimestampMs_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-        }
-
-        public static pb::MessageParser<MapPokemon> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[32]; }
-        }
-
-        public string SpawnpointId
-        {
-            get { return spawnpointId_; }
-            set { spawnpointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        public global::AllEnum.PokemonId PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        /// <summary>
-        ///     After this timestamp, the pokemon will be gone.
-        /// </summary>
-        public long ExpirationTimestampMs
-        {
-            get { return expirationTimestampMs_; }
-            set { expirationTimestampMs_ = value; }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public MapPokemon Clone()
-        {
-            return new MapPokemon(this);
-        }
-
-        public bool Equals(MapPokemon other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (SpawnpointId != other.SpawnpointId) return false;
-            if (EncounterId != other.EncounterId) return false;
-            if (PokemonId != other.PokemonId) return false;
-            if (ExpirationTimestampMs != other.ExpirationTimestampMs) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (SpawnpointId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(SpawnpointId);
-            }
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(17);
-                output.WriteFixed64(EncounterId);
-            }
-            if (PokemonId != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteEnum((int)PokemonId);
-            }
-            if (ExpirationTimestampMs != 0L)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt64(ExpirationTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(41);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(49);
-                output.WriteDouble(Longitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (SpawnpointId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnpointId);
-            }
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (PokemonId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)PokemonId);
-            }
-            if (ExpirationTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpirationTimestampMs);
-            }
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(MapPokemon other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.SpawnpointId.Length != 0)
-            {
-                SpawnpointId = other.SpawnpointId;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-            if (other.PokemonId != 0)
-            {
-                PokemonId = other.PokemonId;
-            }
-            if (other.ExpirationTimestampMs != 0L)
-            {
-                ExpirationTimestampMs = other.ExpirationTimestampMs;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            SpawnpointId = input.ReadString();
-                            break;
-                        }
-                    case 17:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                    case 24:
-                        {
-                            pokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 32:
-                        {
-                            ExpirationTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 41:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 49:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as MapPokemon);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (SpawnpointId.Length != 0) hash ^= SpawnpointId.GetHashCode();
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
-            if (ExpirationTimestampMs != 0L) hash ^= ExpirationTimestampMs.GetHashCode();
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class NearbyPokemon : pb::IMessage<NearbyPokemon>
-    {
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 1;
-
-        /// <summary>Field number for the "distance_in_meters" field.</summary>
-        public const int DistanceInMetersFieldNumber = 2;
-
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 3;
-
-        private static readonly pb::MessageParser<NearbyPokemon> _parser =
-            new pb::MessageParser<NearbyPokemon>(() => new NearbyPokemon());
-
-        private float distanceInMeters_;
-        private ulong encounterId_;
-        private global::AllEnum.PokemonId pokemonId_ = 0;
-
-        public NearbyPokemon()
-        {
-            OnConstruction();
-        }
-
-        public NearbyPokemon(NearbyPokemon other) : this()
-        {
-            pokemonId_ = other.pokemonId_;
-            distanceInMeters_ = other.distanceInMeters_;
-            encounterId_ = other.encounterId_;
-        }
-
-        public static pb::MessageParser<NearbyPokemon> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[33]; }
-        }
-
-        public global::AllEnum.PokemonId PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        public float DistanceInMeters
-        {
-            get { return distanceInMeters_; }
-            set { distanceInMeters_ = value; }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public NearbyPokemon Clone()
-        {
-            return new NearbyPokemon(this);
-        }
-
-        public bool Equals(NearbyPokemon other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokemonId != other.PokemonId) return false;
-            if (DistanceInMeters != other.DistanceInMeters) return false;
-            if (EncounterId != other.EncounterId) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokemonId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)PokemonId);
-            }
-            if (DistanceInMeters != 0F)
-            {
-                output.WriteRawTag(21);
-                output.WriteFloat(DistanceInMeters);
-            }
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(25);
-                output.WriteFixed64(EncounterId);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokemonId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)PokemonId);
-            }
-            if (DistanceInMeters != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(NearbyPokemon other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokemonId != 0)
-            {
-                PokemonId = other.PokemonId;
-            }
-            if (other.DistanceInMeters != 0F)
-            {
-                DistanceInMeters = other.DistanceInMeters;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            pokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 21:
-                        {
-                            DistanceInMeters = input.ReadFloat();
-                            break;
-                        }
-                    case 25:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as NearbyPokemon);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
-            if (DistanceInMeters != 0F) hash ^= DistanceInMeters.GetHashCode();
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DownloadSettingsResponse : pb::IMessage<DownloadSettingsResponse>
-    {
-        /// <summary>Field number for the "error" field.</summary>
-        public const int ErrorFieldNumber = 1;
-
-        /// <summary>Field number for the "hash" field.</summary>
-        public const int HashFieldNumber = 2;
-
-        /// <summary>Field number for the "settings" field.</summary>
-        public const int SettingsFieldNumber = 3;
-
-        private static readonly pb::MessageParser<DownloadSettingsResponse> _parser =
-            new pb::MessageParser<DownloadSettingsResponse>(() => new DownloadSettingsResponse());
-
-        private string error_ = "";
-        private string hash_ = "";
-        private global::PokemonGo.RocketAPI.GeneratedCode.GlobalSettings settings_;
-
-        public DownloadSettingsResponse()
-        {
-            OnConstruction();
-        }
-
-        public DownloadSettingsResponse(DownloadSettingsResponse other) : this()
-        {
-            error_ = other.error_;
-            hash_ = other.hash_;
-            Settings = other.settings_ != null ? other.Settings.Clone() : null;
-        }
-
-        public static pb::MessageParser<DownloadSettingsResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[34]; }
-        }
-
-        public string Error
-        {
-            get { return error_; }
-            set { error_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public string Hash
-        {
-            get { return hash_; }
-            set { hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.GlobalSettings Settings
-        {
-            get { return settings_; }
-            set { settings_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DownloadSettingsResponse Clone()
-        {
-            return new DownloadSettingsResponse(this);
-        }
-
-        public bool Equals(DownloadSettingsResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Error != other.Error) return false;
-            if (Hash != other.Hash) return false;
-            if (!Equals(Settings, other.Settings)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Error.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(Error);
-            }
-            if (Hash.Length != 0)
-            {
-                output.WriteRawTag(18);
-                output.WriteString(Hash);
-            }
-            if (settings_ != null)
-            {
-                output.WriteRawTag(26);
-                output.WriteMessage(Settings);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Error.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Error);
-            }
-            if (Hash.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
-            }
-            if (settings_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Settings);
-            }
-            return size;
-        }
-
-        public void MergeFrom(DownloadSettingsResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Error.Length != 0)
-            {
-                Error = other.Error;
-            }
-            if (other.Hash.Length != 0)
-            {
-                Hash = other.Hash;
-            }
-            if (other.settings_ != null)
-            {
-                if (settings_ == null)
-                {
-                    settings_ = new global::PokemonGo.RocketAPI.GeneratedCode.GlobalSettings();
-                }
-                Settings.MergeFrom(other.Settings);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            Error = input.ReadString();
-                            break;
-                        }
-                    case 18:
-                        {
-                            Hash = input.ReadString();
-                            break;
-                        }
-                    case 26:
-                        {
-                            if (settings_ == null)
-                            {
-                                settings_ = new global::PokemonGo.RocketAPI.GeneratedCode.GlobalSettings();
-                            }
-                            input.ReadMessage(settings_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DownloadSettingsResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Error.Length != 0) hash ^= Error.GetHashCode();
-            if (Hash.Length != 0) hash ^= Hash.GetHashCode();
-            if (settings_ != null) hash ^= Settings.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GlobalSettings : pb::IMessage<GlobalSettings>
-    {
-        /// <summary>Field number for the "fort_settings" field.</summary>
-        public const int FortSettingsFieldNumber = 2;
-
-        /// <summary>Field number for the "map_settings" field.</summary>
-        public const int MapSettingsFieldNumber = 3;
-
-        /// <summary>Field number for the "level_settings" field.</summary>
-        public const int LevelSettingsFieldNumber = 4;
-
-        /// <summary>Field number for the "inventory_settings" field.</summary>
-        public const int InventorySettingsFieldNumber = 5;
-
-        /// <summary>Field number for the "minimum_client_version" field.</summary>
-        public const int MinimumClientVersionFieldNumber = 6;
-
-        private static readonly pb::MessageParser<GlobalSettings> _parser =
-            new pb::MessageParser<GlobalSettings>(() => new GlobalSettings());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.FortSettings fortSettings_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.InventorySettings inventorySettings_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.LevelSettings levelSettings_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.MapSettings mapSettings_;
-        private string minimumClientVersion_ = "";
-
-        public GlobalSettings()
-        {
-            OnConstruction();
-        }
-
-        public GlobalSettings(GlobalSettings other) : this()
-        {
-            FortSettings = other.fortSettings_ != null ? other.FortSettings.Clone() : null;
-            MapSettings = other.mapSettings_ != null ? other.MapSettings.Clone() : null;
-            LevelSettings = other.levelSettings_ != null ? other.LevelSettings.Clone() : null;
-            InventorySettings = other.inventorySettings_ != null ? other.InventorySettings.Clone() : null;
-            minimumClientVersion_ = other.minimumClientVersion_;
-        }
-
-        public static pb::MessageParser<GlobalSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[35]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.FortSettings FortSettings
-        {
-            get { return fortSettings_; }
-            set { fortSettings_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.MapSettings MapSettings
-        {
-            get { return mapSettings_; }
-            set { mapSettings_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.LevelSettings LevelSettings
-        {
-            get { return levelSettings_; }
-            set { levelSettings_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.InventorySettings InventorySettings
-        {
-            get { return inventorySettings_; }
-            set { inventorySettings_ = value; }
-        }
-
-        public string MinimumClientVersion
-        {
-            get { return minimumClientVersion_; }
-            set { minimumClientVersion_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GlobalSettings Clone()
-        {
-            return new GlobalSettings(this);
-        }
-
-        public bool Equals(GlobalSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!Equals(FortSettings, other.FortSettings)) return false;
-            if (!Equals(MapSettings, other.MapSettings)) return false;
-            if (!Equals(LevelSettings, other.LevelSettings)) return false;
-            if (!Equals(InventorySettings, other.InventorySettings)) return false;
-            if (MinimumClientVersion != other.MinimumClientVersion) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (fortSettings_ != null)
-            {
-                output.WriteRawTag(18);
-                output.WriteMessage(FortSettings);
-            }
-            if (mapSettings_ != null)
-            {
-                output.WriteRawTag(26);
-                output.WriteMessage(MapSettings);
-            }
-            if (levelSettings_ != null)
-            {
-                output.WriteRawTag(34);
-                output.WriteMessage(LevelSettings);
-            }
-            if (inventorySettings_ != null)
-            {
-                output.WriteRawTag(42);
-                output.WriteMessage(InventorySettings);
-            }
-            if (MinimumClientVersion.Length != 0)
-            {
-                output.WriteRawTag(50);
-                output.WriteString(MinimumClientVersion);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (fortSettings_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortSettings);
-            }
-            if (mapSettings_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(MapSettings);
-            }
-            if (levelSettings_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelSettings);
-            }
-            if (inventorySettings_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventorySettings);
-            }
-            if (MinimumClientVersion.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(MinimumClientVersion);
-            }
-            return size;
-        }
-
-        public void MergeFrom(GlobalSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.fortSettings_ != null)
-            {
-                if (fortSettings_ == null)
-                {
-                    fortSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.FortSettings();
-                }
-                FortSettings.MergeFrom(other.FortSettings);
-            }
-            if (other.mapSettings_ != null)
-            {
-                if (mapSettings_ == null)
-                {
-                    mapSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.MapSettings();
-                }
-                MapSettings.MergeFrom(other.MapSettings);
-            }
-            if (other.levelSettings_ != null)
-            {
-                if (levelSettings_ == null)
-                {
-                    levelSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.LevelSettings();
-                }
-                LevelSettings.MergeFrom(other.LevelSettings);
-            }
-            if (other.inventorySettings_ != null)
-            {
-                if (inventorySettings_ == null)
-                {
-                    inventorySettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventorySettings();
-                }
-                InventorySettings.MergeFrom(other.InventorySettings);
-            }
-            if (other.MinimumClientVersion.Length != 0)
-            {
-                MinimumClientVersion = other.MinimumClientVersion;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 18:
-                        {
-                            if (fortSettings_ == null)
-                            {
-                                fortSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.FortSettings();
-                            }
-                            input.ReadMessage(fortSettings_);
-                            break;
-                        }
-                    case 26:
-                        {
-                            if (mapSettings_ == null)
-                            {
-                                mapSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.MapSettings();
-                            }
-                            input.ReadMessage(mapSettings_);
-                            break;
-                        }
-                    case 34:
-                        {
-                            if (levelSettings_ == null)
-                            {
-                                levelSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.LevelSettings();
-                            }
-                            input.ReadMessage(levelSettings_);
-                            break;
-                        }
-                    case 42:
-                        {
-                            if (inventorySettings_ == null)
-                            {
-                                inventorySettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventorySettings();
-                            }
-                            input.ReadMessage(inventorySettings_);
-                            break;
-                        }
-                    case 50:
-                        {
-                            MinimumClientVersion = input.ReadString();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GlobalSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (fortSettings_ != null) hash ^= FortSettings.GetHashCode();
-            if (mapSettings_ != null) hash ^= MapSettings.GetHashCode();
-            if (levelSettings_ != null) hash ^= LevelSettings.GetHashCode();
-            if (inventorySettings_ != null) hash ^= InventorySettings.GetHashCode();
-            if (MinimumClientVersion.Length != 0) hash ^= MinimumClientVersion.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortSettings : pb::IMessage<FortSettings>
-    {
-        /// <summary>Field number for the "interaction_range_meters" field.</summary>
-        public const int InteractionRangeMetersFieldNumber = 1;
-
-        /// <summary>Field number for the "max_total_deployed_pokemon" field.</summary>
-        public const int MaxTotalDeployedPokemonFieldNumber = 2;
-
-        /// <summary>Field number for the "max_player_deployed_pokemon" field.</summary>
-        public const int MaxPlayerDeployedPokemonFieldNumber = 3;
-
-        /// <summary>Field number for the "deploy_stamina_multiplier" field.</summary>
-        public const int DeployStaminaMultiplierFieldNumber = 4;
-
-        /// <summary>Field number for the "deploy_attack_multiplier" field.</summary>
-        public const int DeployAttackMultiplierFieldNumber = 5;
-
-        /// <summary>Field number for the "far_interaction_range_meters" field.</summary>
-        public const int FarInteractionRangeMetersFieldNumber = 6;
-
-        private static readonly pb::MessageParser<FortSettings> _parser =
-            new pb::MessageParser<FortSettings>(() => new FortSettings());
-
-        private double deployAttackMultiplier_;
-        private double deployStaminaMultiplier_;
-        private double farInteractionRangeMeters_;
-        private double interactionRangeMeters_;
-        private int maxPlayerDeployedPokemon_;
-        private int maxTotalDeployedPokemon_;
-
-        public FortSettings()
-        {
-            OnConstruction();
-        }
-
-        public FortSettings(FortSettings other) : this()
-        {
-            interactionRangeMeters_ = other.interactionRangeMeters_;
-            maxTotalDeployedPokemon_ = other.maxTotalDeployedPokemon_;
-            maxPlayerDeployedPokemon_ = other.maxPlayerDeployedPokemon_;
-            deployStaminaMultiplier_ = other.deployStaminaMultiplier_;
-            deployAttackMultiplier_ = other.deployAttackMultiplier_;
-            farInteractionRangeMeters_ = other.farInteractionRangeMeters_;
-        }
-
-        public static pb::MessageParser<FortSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[36]; }
-        }
-
-        public double InteractionRangeMeters
-        {
-            get { return interactionRangeMeters_; }
-            set { interactionRangeMeters_ = value; }
-        }
-
-        public int MaxTotalDeployedPokemon
-        {
-            get { return maxTotalDeployedPokemon_; }
-            set { maxTotalDeployedPokemon_ = value; }
-        }
-
-        public int MaxPlayerDeployedPokemon
-        {
-            get { return maxPlayerDeployedPokemon_; }
-            set { maxPlayerDeployedPokemon_ = value; }
-        }
-
-        public double DeployStaminaMultiplier
-        {
-            get { return deployStaminaMultiplier_; }
-            set { deployStaminaMultiplier_ = value; }
-        }
-
-        public double DeployAttackMultiplier
-        {
-            get { return deployAttackMultiplier_; }
-            set { deployAttackMultiplier_ = value; }
-        }
-
-        public double FarInteractionRangeMeters
-        {
-            get { return farInteractionRangeMeters_; }
-            set { farInteractionRangeMeters_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortSettings Clone()
-        {
-            return new FortSettings(this);
-        }
-
-        public bool Equals(FortSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (InteractionRangeMeters != other.InteractionRangeMeters) return false;
-            if (MaxTotalDeployedPokemon != other.MaxTotalDeployedPokemon) return false;
-            if (MaxPlayerDeployedPokemon != other.MaxPlayerDeployedPokemon) return false;
-            if (DeployStaminaMultiplier != other.DeployStaminaMultiplier) return false;
-            if (DeployAttackMultiplier != other.DeployAttackMultiplier) return false;
-            if (FarInteractionRangeMeters != other.FarInteractionRangeMeters) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (InteractionRangeMeters != 0D)
-            {
-                output.WriteRawTag(9);
-                output.WriteDouble(InteractionRangeMeters);
-            }
-            if (MaxTotalDeployedPokemon != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(MaxTotalDeployedPokemon);
-            }
-            if (MaxPlayerDeployedPokemon != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(MaxPlayerDeployedPokemon);
-            }
-            if (DeployStaminaMultiplier != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(DeployStaminaMultiplier);
-            }
-            if (DeployAttackMultiplier != 0D)
-            {
-                output.WriteRawTag(41);
-                output.WriteDouble(DeployAttackMultiplier);
-            }
-            if (FarInteractionRangeMeters != 0D)
-            {
-                output.WriteRawTag(49);
-                output.WriteDouble(FarInteractionRangeMeters);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (InteractionRangeMeters != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (MaxTotalDeployedPokemon != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxTotalDeployedPokemon);
-            }
-            if (MaxPlayerDeployedPokemon != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPlayerDeployedPokemon);
-            }
-            if (DeployStaminaMultiplier != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (DeployAttackMultiplier != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (FarInteractionRangeMeters != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.InteractionRangeMeters != 0D)
-            {
-                InteractionRangeMeters = other.InteractionRangeMeters;
-            }
-            if (other.MaxTotalDeployedPokemon != 0)
-            {
-                MaxTotalDeployedPokemon = other.MaxTotalDeployedPokemon;
-            }
-            if (other.MaxPlayerDeployedPokemon != 0)
-            {
-                MaxPlayerDeployedPokemon = other.MaxPlayerDeployedPokemon;
-            }
-            if (other.DeployStaminaMultiplier != 0D)
-            {
-                DeployStaminaMultiplier = other.DeployStaminaMultiplier;
-            }
-            if (other.DeployAttackMultiplier != 0D)
-            {
-                DeployAttackMultiplier = other.DeployAttackMultiplier;
-            }
-            if (other.FarInteractionRangeMeters != 0D)
-            {
-                FarInteractionRangeMeters = other.FarInteractionRangeMeters;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            InteractionRangeMeters = input.ReadDouble();
-                            break;
-                        }
-                    case 16:
-                        {
-                            MaxTotalDeployedPokemon = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            MaxPlayerDeployedPokemon = input.ReadInt32();
-                            break;
-                        }
-                    case 33:
-                        {
-                            DeployStaminaMultiplier = input.ReadDouble();
-                            break;
-                        }
-                    case 41:
-                        {
-                            DeployAttackMultiplier = input.ReadDouble();
-                            break;
-                        }
-                    case 49:
-                        {
-                            FarInteractionRangeMeters = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (InteractionRangeMeters != 0D) hash ^= InteractionRangeMeters.GetHashCode();
-            if (MaxTotalDeployedPokemon != 0) hash ^= MaxTotalDeployedPokemon.GetHashCode();
-            if (MaxPlayerDeployedPokemon != 0) hash ^= MaxPlayerDeployedPokemon.GetHashCode();
-            if (DeployStaminaMultiplier != 0D) hash ^= DeployStaminaMultiplier.GetHashCode();
-            if (DeployAttackMultiplier != 0D) hash ^= DeployAttackMultiplier.GetHashCode();
-            if (FarInteractionRangeMeters != 0D) hash ^= FarInteractionRangeMeters.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class MapSettings : pb::IMessage<MapSettings>
-    {
-        /// <summary>Field number for the "pokemon_visible_range" field.</summary>
-        public const int PokemonVisibleRangeFieldNumber = 1;
-
-        /// <summary>Field number for the "poke_nav_range_meters" field.</summary>
-        public const int PokeNavRangeMetersFieldNumber = 2;
-
-        /// <summary>Field number for the "encounter_range_meters" field.</summary>
-        public const int EncounterRangeMetersFieldNumber = 3;
-
-        /// <summary>Field number for the "get_map_objects_min_refresh_seconds" field.</summary>
-        public const int GetMapObjectsMinRefreshSecondsFieldNumber = 4;
-
-        /// <summary>Field number for the "get_map_objects_max_refresh_seconds" field.</summary>
-        public const int GetMapObjectsMaxRefreshSecondsFieldNumber = 5;
-
-        /// <summary>Field number for the "get_map_objects_min_distance_meters" field.</summary>
-        public const int GetMapObjectsMinDistanceMetersFieldNumber = 6;
-
-        /// <summary>Field number for the "google_maps_api_key" field.</summary>
-        public const int GoogleMapsApiKeyFieldNumber = 7;
-
-        private static readonly pb::MessageParser<MapSettings> _parser =
-            new pb::MessageParser<MapSettings>(() => new MapSettings());
-
-        private double encounterRangeMeters_;
-        private float getMapObjectsMaxRefreshSeconds_;
-        private float getMapObjectsMinDistanceMeters_;
-        private float getMapObjectsMinRefreshSeconds_;
-        private string googleMapsApiKey_ = "";
-        private double pokemonVisibleRange_;
-        private double pokeNavRangeMeters_;
-
-        public MapSettings()
-        {
-            OnConstruction();
-        }
-
-        public MapSettings(MapSettings other) : this()
-        {
-            pokemonVisibleRange_ = other.pokemonVisibleRange_;
-            pokeNavRangeMeters_ = other.pokeNavRangeMeters_;
-            encounterRangeMeters_ = other.encounterRangeMeters_;
-            getMapObjectsMinRefreshSeconds_ = other.getMapObjectsMinRefreshSeconds_;
-            getMapObjectsMaxRefreshSeconds_ = other.getMapObjectsMaxRefreshSeconds_;
-            getMapObjectsMinDistanceMeters_ = other.getMapObjectsMinDistanceMeters_;
-            googleMapsApiKey_ = other.googleMapsApiKey_;
-        }
-
-        public static pb::MessageParser<MapSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[37]; }
-        }
-
-        public double PokemonVisibleRange
-        {
-            get { return pokemonVisibleRange_; }
-            set { pokemonVisibleRange_ = value; }
-        }
-
-        public double PokeNavRangeMeters
-        {
-            get { return pokeNavRangeMeters_; }
-            set { pokeNavRangeMeters_ = value; }
-        }
-
-        public double EncounterRangeMeters
-        {
-            get { return encounterRangeMeters_; }
-            set { encounterRangeMeters_ = value; }
-        }
-
-        public float GetMapObjectsMinRefreshSeconds
-        {
-            get { return getMapObjectsMinRefreshSeconds_; }
-            set { getMapObjectsMinRefreshSeconds_ = value; }
-        }
-
-        public float GetMapObjectsMaxRefreshSeconds
-        {
-            get { return getMapObjectsMaxRefreshSeconds_; }
-            set { getMapObjectsMaxRefreshSeconds_ = value; }
-        }
-
-        public float GetMapObjectsMinDistanceMeters
-        {
-            get { return getMapObjectsMinDistanceMeters_; }
-            set { getMapObjectsMinDistanceMeters_ = value; }
-        }
-
-        public string GoogleMapsApiKey
-        {
-            get { return googleMapsApiKey_; }
-            set { googleMapsApiKey_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public MapSettings Clone()
-        {
-            return new MapSettings(this);
-        }
-
-        public bool Equals(MapSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokemonVisibleRange != other.PokemonVisibleRange) return false;
-            if (PokeNavRangeMeters != other.PokeNavRangeMeters) return false;
-            if (EncounterRangeMeters != other.EncounterRangeMeters) return false;
-            if (GetMapObjectsMinRefreshSeconds != other.GetMapObjectsMinRefreshSeconds) return false;
-            if (GetMapObjectsMaxRefreshSeconds != other.GetMapObjectsMaxRefreshSeconds) return false;
-            if (GetMapObjectsMinDistanceMeters != other.GetMapObjectsMinDistanceMeters) return false;
-            if (GoogleMapsApiKey != other.GoogleMapsApiKey) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokemonVisibleRange != 0D)
-            {
-                output.WriteRawTag(9);
-                output.WriteDouble(PokemonVisibleRange);
-            }
-            if (PokeNavRangeMeters != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(PokeNavRangeMeters);
-            }
-            if (EncounterRangeMeters != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(EncounterRangeMeters);
-            }
-            if (GetMapObjectsMinRefreshSeconds != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(GetMapObjectsMinRefreshSeconds);
-            }
-            if (GetMapObjectsMaxRefreshSeconds != 0F)
-            {
-                output.WriteRawTag(45);
-                output.WriteFloat(GetMapObjectsMaxRefreshSeconds);
-            }
-            if (GetMapObjectsMinDistanceMeters != 0F)
-            {
-                output.WriteRawTag(53);
-                output.WriteFloat(GetMapObjectsMinDistanceMeters);
-            }
-            if (GoogleMapsApiKey.Length != 0)
-            {
-                output.WriteRawTag(58);
-                output.WriteString(GoogleMapsApiKey);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokemonVisibleRange != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (PokeNavRangeMeters != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (EncounterRangeMeters != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (GetMapObjectsMinRefreshSeconds != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (GetMapObjectsMaxRefreshSeconds != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (GetMapObjectsMinDistanceMeters != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (GoogleMapsApiKey.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(GoogleMapsApiKey);
-            }
-            return size;
-        }
-
-        public void MergeFrom(MapSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokemonVisibleRange != 0D)
-            {
-                PokemonVisibleRange = other.PokemonVisibleRange;
-            }
-            if (other.PokeNavRangeMeters != 0D)
-            {
-                PokeNavRangeMeters = other.PokeNavRangeMeters;
-            }
-            if (other.EncounterRangeMeters != 0D)
-            {
-                EncounterRangeMeters = other.EncounterRangeMeters;
-            }
-            if (other.GetMapObjectsMinRefreshSeconds != 0F)
-            {
-                GetMapObjectsMinRefreshSeconds = other.GetMapObjectsMinRefreshSeconds;
-            }
-            if (other.GetMapObjectsMaxRefreshSeconds != 0F)
-            {
-                GetMapObjectsMaxRefreshSeconds = other.GetMapObjectsMaxRefreshSeconds;
-            }
-            if (other.GetMapObjectsMinDistanceMeters != 0F)
-            {
-                GetMapObjectsMinDistanceMeters = other.GetMapObjectsMinDistanceMeters;
-            }
-            if (other.GoogleMapsApiKey.Length != 0)
-            {
-                GoogleMapsApiKey = other.GoogleMapsApiKey;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            PokemonVisibleRange = input.ReadDouble();
-                            break;
-                        }
-                    case 17:
-                        {
-                            PokeNavRangeMeters = input.ReadDouble();
-                            break;
-                        }
-                    case 25:
-                        {
-                            EncounterRangeMeters = input.ReadDouble();
-                            break;
-                        }
-                    case 37:
-                        {
-                            GetMapObjectsMinRefreshSeconds = input.ReadFloat();
-                            break;
-                        }
-                    case 45:
-                        {
-                            GetMapObjectsMaxRefreshSeconds = input.ReadFloat();
-                            break;
-                        }
-                    case 53:
-                        {
-                            GetMapObjectsMinDistanceMeters = input.ReadFloat();
-                            break;
-                        }
-                    case 58:
-                        {
-                            GoogleMapsApiKey = input.ReadString();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as MapSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokemonVisibleRange != 0D) hash ^= PokemonVisibleRange.GetHashCode();
-            if (PokeNavRangeMeters != 0D) hash ^= PokeNavRangeMeters.GetHashCode();
-            if (EncounterRangeMeters != 0D) hash ^= EncounterRangeMeters.GetHashCode();
-            if (GetMapObjectsMinRefreshSeconds != 0F) hash ^= GetMapObjectsMinRefreshSeconds.GetHashCode();
-            if (GetMapObjectsMaxRefreshSeconds != 0F) hash ^= GetMapObjectsMaxRefreshSeconds.GetHashCode();
-            if (GetMapObjectsMinDistanceMeters != 0F) hash ^= GetMapObjectsMinDistanceMeters.GetHashCode();
-            if (GoogleMapsApiKey.Length != 0) hash ^= GoogleMapsApiKey.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class LevelSettings : pb::IMessage<LevelSettings>
-    {
-        /// <summary>Field number for the "trainer_cp_modifier" field.</summary>
-        public const int TrainerCpModifierFieldNumber = 2;
-
-        /// <summary>Field number for the "trainer_difficulty_modifier" field.</summary>
-        public const int TrainerDifficultyModifierFieldNumber = 3;
-
-        private static readonly pb::MessageParser<LevelSettings> _parser =
-            new pb::MessageParser<LevelSettings>(() => new LevelSettings());
-
-        private double trainerCpModifier_;
-        private double trainerDifficultyModifier_;
-
-        public LevelSettings()
-        {
-            OnConstruction();
-        }
-
-        public LevelSettings(LevelSettings other) : this()
-        {
-            trainerCpModifier_ = other.trainerCpModifier_;
-            trainerDifficultyModifier_ = other.trainerDifficultyModifier_;
-        }
-
-        public static pb::MessageParser<LevelSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[38]; }
-        }
-
-        public double TrainerCpModifier
-        {
-            get { return trainerCpModifier_; }
-            set { trainerCpModifier_ = value; }
-        }
-
-        public double TrainerDifficultyModifier
-        {
-            get { return trainerDifficultyModifier_; }
-            set { trainerDifficultyModifier_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public LevelSettings Clone()
-        {
-            return new LevelSettings(this);
-        }
-
-        public bool Equals(LevelSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (TrainerCpModifier != other.TrainerCpModifier) return false;
-            if (TrainerDifficultyModifier != other.TrainerDifficultyModifier) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (TrainerCpModifier != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(TrainerCpModifier);
-            }
-            if (TrainerDifficultyModifier != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(TrainerDifficultyModifier);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (TrainerCpModifier != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (TrainerDifficultyModifier != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(LevelSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.TrainerCpModifier != 0D)
-            {
-                TrainerCpModifier = other.TrainerCpModifier;
-            }
-            if (other.TrainerDifficultyModifier != 0D)
-            {
-                TrainerDifficultyModifier = other.TrainerDifficultyModifier;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 17:
-                        {
-                            TrainerCpModifier = input.ReadDouble();
-                            break;
-                        }
-                    case 25:
-                        {
-                            TrainerDifficultyModifier = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as LevelSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (TrainerCpModifier != 0D) hash ^= TrainerCpModifier.GetHashCode();
-            if (TrainerDifficultyModifier != 0D) hash ^= TrainerDifficultyModifier.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventorySettings : pb::IMessage<InventorySettings>
-    {
-        /// <summary>Field number for the "max_pokemon" field.</summary>
-        public const int MaxPokemonFieldNumber = 1;
-
-        /// <summary>Field number for the "max_bag_items" field.</summary>
-        public const int MaxBagItemsFieldNumber = 2;
-
-        /// <summary>Field number for the "base_pokemon" field.</summary>
-        public const int BasePokemonFieldNumber = 3;
-
-        /// <summary>Field number for the "base_bag_items" field.</summary>
-        public const int BaseBagItemsFieldNumber = 4;
-
-        /// <summary>Field number for the "base_eggs" field.</summary>
-        public const int BaseEggsFieldNumber = 5;
-
-        private static readonly pb::MessageParser<InventorySettings> _parser =
-            new pb::MessageParser<InventorySettings>(() => new InventorySettings());
-
-        private int baseBagItems_;
-        private int baseEggs_;
-        private int basePokemon_;
-        private int maxBagItems_;
-        private int maxPokemon_;
-
-        public InventorySettings()
-        {
-            OnConstruction();
-        }
-
-        public InventorySettings(InventorySettings other) : this()
-        {
-            maxPokemon_ = other.maxPokemon_;
-            maxBagItems_ = other.maxBagItems_;
-            basePokemon_ = other.basePokemon_;
-            baseBagItems_ = other.baseBagItems_;
-            baseEggs_ = other.baseEggs_;
-        }
-
-        public static pb::MessageParser<InventorySettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[39]; }
-        }
-
-        public int MaxPokemon
-        {
-            get { return maxPokemon_; }
-            set { maxPokemon_ = value; }
-        }
-
-        public int MaxBagItems
-        {
-            get { return maxBagItems_; }
-            set { maxBagItems_ = value; }
-        }
-
-        public int BasePokemon
-        {
-            get { return basePokemon_; }
-            set { basePokemon_ = value; }
-        }
-
-        public int BaseBagItems
-        {
-            get { return baseBagItems_; }
-            set { baseBagItems_ = value; }
-        }
-
-        public int BaseEggs
-        {
-            get { return baseEggs_; }
-            set { baseEggs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventorySettings Clone()
-        {
-            return new InventorySettings(this);
-        }
-
-        public bool Equals(InventorySettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (MaxPokemon != other.MaxPokemon) return false;
-            if (MaxBagItems != other.MaxBagItems) return false;
-            if (BasePokemon != other.BasePokemon) return false;
-            if (BaseBagItems != other.BaseBagItems) return false;
-            if (BaseEggs != other.BaseEggs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (MaxPokemon != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(MaxPokemon);
-            }
-            if (MaxBagItems != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(MaxBagItems);
-            }
-            if (BasePokemon != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(BasePokemon);
-            }
-            if (BaseBagItems != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(BaseBagItems);
-            }
-            if (BaseEggs != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(BaseEggs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (MaxPokemon != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPokemon);
-            }
-            if (MaxBagItems != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxBagItems);
-            }
-            if (BasePokemon != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BasePokemon);
-            }
-            if (BaseBagItems != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseBagItems);
-            }
-            if (BaseEggs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseEggs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(InventorySettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.MaxPokemon != 0)
-            {
-                MaxPokemon = other.MaxPokemon;
-            }
-            if (other.MaxBagItems != 0)
-            {
-                MaxBagItems = other.MaxBagItems;
-            }
-            if (other.BasePokemon != 0)
-            {
-                BasePokemon = other.BasePokemon;
-            }
-            if (other.BaseBagItems != 0)
-            {
-                BaseBagItems = other.BaseBagItems;
-            }
-            if (other.BaseEggs != 0)
-            {
-                BaseEggs = other.BaseEggs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            MaxPokemon = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            MaxBagItems = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            BasePokemon = input.ReadInt32();
-                            break;
-                        }
-                    case 32:
-                        {
-                            BaseBagItems = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            BaseEggs = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventorySettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (MaxPokemon != 0) hash ^= MaxPokemon.GetHashCode();
-            if (MaxBagItems != 0) hash ^= MaxBagItems.GetHashCode();
-            if (BasePokemon != 0) hash ^= BasePokemon.GetHashCode();
-            if (BaseBagItems != 0) hash ^= BaseBagItems.GetHashCode();
-            if (BaseEggs != 0) hash ^= BaseEggs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PlayerUpdateRequest : pb::IMessage<PlayerUpdateRequest>
-    {
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 1;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 2;
-
-        private static readonly pb::MessageParser<PlayerUpdateRequest> _parser =
-            new pb::MessageParser<PlayerUpdateRequest>(() => new PlayerUpdateRequest());
-
-        private double latitude_;
-        private double longitude_;
-
-        public PlayerUpdateRequest()
-        {
-            OnConstruction();
-        }
-
-        public PlayerUpdateRequest(PlayerUpdateRequest other) : this()
-        {
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-        }
-
-        public static pb::MessageParser<PlayerUpdateRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[40]; }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PlayerUpdateRequest Clone()
-        {
-            return new PlayerUpdateRequest(this);
-        }
-
-        public bool Equals(PlayerUpdateRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(9);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(Longitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(PlayerUpdateRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 17:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PlayerUpdateRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PlayerUpdateResponse : pb::IMessage<PlayerUpdateResponse>
-    {
-        /// <summary>Field number for the "wild_pokemons" field.</summary>
-        public const int WildPokemonsFieldNumber = 1;
-
-        /// <summary>Field number for the "forts" field.</summary>
-        public const int FortsFieldNumber = 2;
-
-        /// <summary>Field number for the "forts_nearby" field.</summary>
-        public const int FortsNearbyFieldNumber = 3;
-
-        private static readonly pb::MessageParser<PlayerUpdateResponse> _parser =
-            new pb::MessageParser<PlayerUpdateResponse>(() => new PlayerUpdateResponse());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon>
-            _repeated_wildPokemons_codec
-                = pb::FieldCodec.ForMessage(10, global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon.Parser);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.FortData> _repeated_forts_codec
-            = pb::FieldCodec.ForMessage(18, global::PokemonGo.RocketAPI.GeneratedCode.FortData.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortData> forts_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortData>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon> wildPokemons_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon>();
-
-        private int fortsNearby_;
-
-        public PlayerUpdateResponse()
-        {
-            OnConstruction();
-        }
-
-        public PlayerUpdateResponse(PlayerUpdateResponse other) : this()
-        {
-            wildPokemons_ = other.wildPokemons_.Clone();
-            forts_ = other.forts_.Clone();
-            fortsNearby_ = other.fortsNearby_;
-        }
-
-        public static pb::MessageParser<PlayerUpdateResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[41]; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon> WildPokemons
-        {
-            get { return wildPokemons_; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortData> Forts
-        {
-            get { return forts_; }
-        }
-
-        public int FortsNearby
-        {
-            get { return fortsNearby_; }
-            set { fortsNearby_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PlayerUpdateResponse Clone()
-        {
-            return new PlayerUpdateResponse(this);
-        }
-
-        public bool Equals(PlayerUpdateResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!wildPokemons_.Equals(other.wildPokemons_)) return false;
-            if (!forts_.Equals(other.forts_)) return false;
-            if (FortsNearby != other.FortsNearby) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            wildPokemons_.WriteTo(output, _repeated_wildPokemons_codec);
-            forts_.WriteTo(output, _repeated_forts_codec);
-            if (FortsNearby != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(FortsNearby);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += wildPokemons_.CalculateSize(_repeated_wildPokemons_codec);
-            size += forts_.CalculateSize(_repeated_forts_codec);
-            if (FortsNearby != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(FortsNearby);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PlayerUpdateResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            wildPokemons_.Add(other.wildPokemons_);
-            forts_.Add(other.forts_);
-            if (other.FortsNearby != 0)
-            {
-                FortsNearby = other.FortsNearby;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            wildPokemons_.AddEntriesFrom(input, _repeated_wildPokemons_codec);
-                            break;
-                        }
-                    case 18:
-                        {
-                            forts_.AddEntriesFrom(input, _repeated_forts_codec);
-                            break;
-                        }
-                    case 24:
-                        {
-                            FortsNearby = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PlayerUpdateResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= wildPokemons_.GetHashCode();
-            hash ^= forts_.GetHashCode();
-            if (FortsNearby != 0) hash ^= FortsNearby.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    /// <summary>
-    ///     No message needed.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DownloadItemTemplatesRequest : pb::IMessage<DownloadItemTemplatesRequest>
-    {
-        private static readonly pb::MessageParser<DownloadItemTemplatesRequest> _parser =
-            new pb::MessageParser<DownloadItemTemplatesRequest>(() => new DownloadItemTemplatesRequest());
-
-        public DownloadItemTemplatesRequest()
-        {
-            OnConstruction();
-        }
-
-        public DownloadItemTemplatesRequest(DownloadItemTemplatesRequest other) : this()
-        {
-        }
-
-        public static pb::MessageParser<DownloadItemTemplatesRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[42]; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DownloadItemTemplatesRequest Clone()
-        {
-            return new DownloadItemTemplatesRequest(this);
-        }
-
-        public bool Equals(DownloadItemTemplatesRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            return size;
-        }
-
-        public void MergeFrom(DownloadItemTemplatesRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DownloadItemTemplatesRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DownloadItemTemplatesResponse : pb::IMessage<DownloadItemTemplatesResponse>
-    {
-        /// <summary>Field number for the "success" field.</summary>
-        public const int SuccessFieldNumber = 1;
-
-        /// <summary>Field number for the "item_templates" field.</summary>
-        public const int ItemTemplatesFieldNumber = 2;
-
-        /// <summary>Field number for the "timestamp_ms" field.</summary>
-        public const int TimestampMsFieldNumber = 3;
-
-        private static readonly pb::MessageParser<DownloadItemTemplatesResponse> _parser =
-            new pb::MessageParser<DownloadItemTemplatesResponse>(() => new DownloadItemTemplatesResponse());
-
-        private static readonly
-            pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types.ItemTemplate>
-            _repeated_itemTemplates_codec
-                = pb::FieldCodec.ForMessage(18,
-                    global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types.ItemTemplate.Parser);
-
-        private readonly
-            pbc::RepeatedField
-                <global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types.ItemTemplate>
-            itemTemplates_ =
-                new pbc::RepeatedField
-                    <global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types.ItemTemplate>();
-
-        private bool success_;
-        private ulong timestampMs_;
-
-        public DownloadItemTemplatesResponse()
-        {
-            OnConstruction();
-        }
-
-        public DownloadItemTemplatesResponse(DownloadItemTemplatesResponse other) : this()
-        {
-            success_ = other.success_;
-            itemTemplates_ = other.itemTemplates_.Clone();
-            timestampMs_ = other.timestampMs_;
-        }
-
-        public static pb::MessageParser<DownloadItemTemplatesResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[43]; }
-        }
-
-        public bool Success
-        {
-            get { return success_; }
-            set { success_ = value; }
-        }
-
-        public
-            pbc::RepeatedField
-                <global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Types.ItemTemplate>
-            ItemTemplates
-        {
-            get { return itemTemplates_; }
-        }
-
-        public ulong TimestampMs
-        {
-            get { return timestampMs_; }
-            set { timestampMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DownloadItemTemplatesResponse Clone()
-        {
-            return new DownloadItemTemplatesResponse(this);
-        }
-
-        public bool Equals(DownloadItemTemplatesResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Success != other.Success) return false;
-            if (!itemTemplates_.Equals(other.itemTemplates_)) return false;
-            if (TimestampMs != other.TimestampMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Success != false)
-            {
-                output.WriteRawTag(8);
-                output.WriteBool(Success);
-            }
-            itemTemplates_.WriteTo(output, _repeated_itemTemplates_codec);
-            if (TimestampMs != 0UL)
-            {
-                output.WriteRawTag(24);
-                output.WriteUInt64(TimestampMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Success != false)
-            {
-                size += 1 + 1;
-            }
-            size += itemTemplates_.CalculateSize(_repeated_itemTemplates_codec);
-            if (TimestampMs != 0UL)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeUInt64Size(TimestampMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(DownloadItemTemplatesResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Success != false)
-            {
-                Success = other.Success;
-            }
-            itemTemplates_.Add(other.itemTemplates_);
-            if (other.TimestampMs != 0UL)
-            {
-                TimestampMs = other.TimestampMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Success = input.ReadBool();
-                            break;
-                        }
-                    case 18:
-                        {
-                            itemTemplates_.AddEntriesFrom(input, _repeated_itemTemplates_codec);
-                            break;
-                        }
-                    case 24:
-                        {
-                            TimestampMs = input.ReadUInt64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DownloadItemTemplatesResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Success != false) hash ^= Success.GetHashCode();
-            hash ^= itemTemplates_.GetHashCode();
-            if (TimestampMs != 0UL) hash ^= TimestampMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the DownloadItemTemplatesResponse message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class ItemTemplate : pb::IMessage<ItemTemplate>
-            {
-                /// <summary>Field number for the "template_id" field.</summary>
-                public const int TemplateIdFieldNumber = 1;
-
-                /// <summary>Field number for the "pokemon_settings" field.</summary>
-                public const int PokemonSettingsFieldNumber = 2;
-
-                /// <summary>Field number for the "item_settings" field.</summary>
-                public const int ItemSettingsFieldNumber = 3;
-
-                /// <summary>Field number for the "move_settings" field.</summary>
-                public const int MoveSettingsFieldNumber = 4;
-
-                /// <summary>Field number for the "move_sequence_settings" field.</summary>
-                public const int MoveSequenceSettingsFieldNumber = 5;
-
-                /// <summary>Field number for the "type_effective" field.</summary>
-                public const int TypeEffectiveFieldNumber = 8;
-
-                /// <summary>Field number for the "badge_settings" field.</summary>
-                public const int BadgeSettingsFieldNumber = 10;
-
-                /// <summary>Field number for the "camera" field.</summary>
-                public const int CameraFieldNumber = 11;
-
-                /// <summary>Field number for the "player_level" field.</summary>
-                public const int PlayerLevelFieldNumber = 12;
-
-                /// <summary>Field number for the "gym_level" field.</summary>
-                public const int GymLevelFieldNumber = 13;
-
-                /// <summary>Field number for the "battle_settings" field.</summary>
-                public const int BattleSettingsFieldNumber = 14;
-
-                /// <summary>Field number for the "encounter_settings" field.</summary>
-                public const int EncounterSettingsFieldNumber = 15;
-
-                /// <summary>Field number for the "iap_item_display" field.</summary>
-                public const int IapItemDisplayFieldNumber = 16;
-
-                /// <summary>Field number for the "iap_settings" field.</summary>
-                public const int IapSettingsFieldNumber = 17;
-
-                /// <summary>Field number for the "pokemon_upgrades" field.</summary>
-                public const int PokemonUpgradesFieldNumber = 18;
-
-                /// <summary>Field number for the "equipped_badges" field.</summary>
-                public const int EquippedBadgesFieldNumber = 19;
-
-                private static readonly pb::MessageParser<ItemTemplate> _parser =
-                    new pb::MessageParser<ItemTemplate>(() => new ItemTemplate());
-
-                private global::PokemonGo.RocketAPI.GeneratedCode.BadgeSettings badgeSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.GymBattleSettings battleSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.CameraSettings camera_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.EncounterSettings encounterSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.EquippedBadgeSettings equippedBadges_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.GymLevelSettings gymLevel_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.IapItemDisplay iapItemDisplay_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.IapSettings iapSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.ItemSettings itemSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.MoveSequenceSettings moveSequenceSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.MoveSettings moveSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.PlayerLevelSettings playerLevel_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.PokemonSettings pokemonSettings_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.PokemonUpgradeSettings pokemonUpgrades_;
-                private string templateId_ = "";
-                private global::PokemonGo.RocketAPI.GeneratedCode.TypeEffectiveSettings typeEffective_;
-
-                public ItemTemplate()
-                {
-                    OnConstruction();
-                }
-
-                public ItemTemplate(ItemTemplate other) : this()
-                {
-                    templateId_ = other.templateId_;
-                    PokemonSettings = other.pokemonSettings_ != null ? other.PokemonSettings.Clone() : null;
-                    ItemSettings = other.itemSettings_ != null ? other.ItemSettings.Clone() : null;
-                    MoveSettings = other.moveSettings_ != null ? other.MoveSettings.Clone() : null;
-                    MoveSequenceSettings = other.moveSequenceSettings_ != null
-                        ? other.MoveSequenceSettings.Clone()
-                        : null;
-                    TypeEffective = other.typeEffective_ != null ? other.TypeEffective.Clone() : null;
-                    BadgeSettings = other.badgeSettings_ != null ? other.BadgeSettings.Clone() : null;
-                    Camera = other.camera_ != null ? other.Camera.Clone() : null;
-                    PlayerLevel = other.playerLevel_ != null ? other.PlayerLevel.Clone() : null;
-                    GymLevel = other.gymLevel_ != null ? other.GymLevel.Clone() : null;
-                    BattleSettings = other.battleSettings_ != null ? other.BattleSettings.Clone() : null;
-                    EncounterSettings = other.encounterSettings_ != null ? other.EncounterSettings.Clone() : null;
-                    IapItemDisplay = other.iapItemDisplay_ != null ? other.IapItemDisplay.Clone() : null;
-                    IapSettings = other.iapSettings_ != null ? other.IapSettings.Clone() : null;
-                    PokemonUpgrades = other.pokemonUpgrades_ != null ? other.PokemonUpgrades.Clone() : null;
-                    EquippedBadges = other.equippedBadges_ != null ? other.EquippedBadges.Clone() : null;
-                }
-
-                public static pb::MessageParser<ItemTemplate> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get
-                    {
-                        return
-                            global::PokemonGo.RocketAPI.GeneratedCode.DownloadItemTemplatesResponse.Descriptor
-                                .NestedTypes[0];
-                    }
-                }
-
-                public string TemplateId
-                {
-                    get { return templateId_; }
-                    set { templateId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.PokemonSettings PokemonSettings
-                {
-                    get { return pokemonSettings_; }
-                    set { pokemonSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.ItemSettings ItemSettings
-                {
-                    get { return itemSettings_; }
-                    set { itemSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.MoveSettings MoveSettings
-                {
-                    get { return moveSettings_; }
-                    set { moveSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.MoveSequenceSettings MoveSequenceSettings
-                {
-                    get { return moveSequenceSettings_; }
-                    set { moveSequenceSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.TypeEffectiveSettings TypeEffective
-                {
-                    get { return typeEffective_; }
-                    set { typeEffective_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.BadgeSettings BadgeSettings
-                {
-                    get { return badgeSettings_; }
-                    set { badgeSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.CameraSettings Camera
-                {
-                    get { return camera_; }
-                    set { camera_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.PlayerLevelSettings PlayerLevel
-                {
-                    get { return playerLevel_; }
-                    set { playerLevel_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.GymLevelSettings GymLevel
-                {
-                    get { return gymLevel_; }
-                    set { gymLevel_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.GymBattleSettings BattleSettings
-                {
-                    get { return battleSettings_; }
-                    set { battleSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.EncounterSettings EncounterSettings
-                {
-                    get { return encounterSettings_; }
-                    set { encounterSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.IapItemDisplay IapItemDisplay
-                {
-                    get { return iapItemDisplay_; }
-                    set { iapItemDisplay_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.IapSettings IapSettings
-                {
-                    get { return iapSettings_; }
-                    set { iapSettings_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.PokemonUpgradeSettings PokemonUpgrades
-                {
-                    get { return pokemonUpgrades_; }
-                    set { pokemonUpgrades_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.EquippedBadgeSettings EquippedBadges
-                {
-                    get { return equippedBadges_; }
-                    set { equippedBadges_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public ItemTemplate Clone()
-                {
-                    return new ItemTemplate(this);
-                }
-
-                public bool Equals(ItemTemplate other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (TemplateId != other.TemplateId) return false;
-                    if (!Equals(PokemonSettings, other.PokemonSettings)) return false;
-                    if (!Equals(ItemSettings, other.ItemSettings)) return false;
-                    if (!Equals(MoveSettings, other.MoveSettings)) return false;
-                    if (!Equals(MoveSequenceSettings, other.MoveSequenceSettings)) return false;
-                    if (!Equals(TypeEffective, other.TypeEffective)) return false;
-                    if (!Equals(BadgeSettings, other.BadgeSettings)) return false;
-                    if (!Equals(Camera, other.Camera)) return false;
-                    if (!Equals(PlayerLevel, other.PlayerLevel)) return false;
-                    if (!Equals(GymLevel, other.GymLevel)) return false;
-                    if (!Equals(BattleSettings, other.BattleSettings)) return false;
-                    if (!Equals(EncounterSettings, other.EncounterSettings)) return false;
-                    if (!Equals(IapItemDisplay, other.IapItemDisplay)) return false;
-                    if (!Equals(IapSettings, other.IapSettings)) return false;
-                    if (!Equals(PokemonUpgrades, other.PokemonUpgrades)) return false;
-                    if (!Equals(EquippedBadges, other.EquippedBadges)) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (TemplateId.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteString(TemplateId);
-                    }
-                    if (pokemonSettings_ != null)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteMessage(PokemonSettings);
-                    }
-                    if (itemSettings_ != null)
-                    {
-                        output.WriteRawTag(26);
-                        output.WriteMessage(ItemSettings);
-                    }
-                    if (moveSettings_ != null)
-                    {
-                        output.WriteRawTag(34);
-                        output.WriteMessage(MoveSettings);
-                    }
-                    if (moveSequenceSettings_ != null)
-                    {
-                        output.WriteRawTag(42);
-                        output.WriteMessage(MoveSequenceSettings);
-                    }
-                    if (typeEffective_ != null)
-                    {
-                        output.WriteRawTag(66);
-                        output.WriteMessage(TypeEffective);
-                    }
-                    if (badgeSettings_ != null)
-                    {
-                        output.WriteRawTag(82);
-                        output.WriteMessage(BadgeSettings);
-                    }
-                    if (camera_ != null)
-                    {
-                        output.WriteRawTag(90);
-                        output.WriteMessage(Camera);
-                    }
-                    if (playerLevel_ != null)
-                    {
-                        output.WriteRawTag(98);
-                        output.WriteMessage(PlayerLevel);
-                    }
-                    if (gymLevel_ != null)
-                    {
-                        output.WriteRawTag(106);
-                        output.WriteMessage(GymLevel);
-                    }
-                    if (battleSettings_ != null)
-                    {
-                        output.WriteRawTag(114);
-                        output.WriteMessage(BattleSettings);
-                    }
-                    if (encounterSettings_ != null)
-                    {
-                        output.WriteRawTag(122);
-                        output.WriteMessage(EncounterSettings);
-                    }
-                    if (iapItemDisplay_ != null)
-                    {
-                        output.WriteRawTag(130, 1);
-                        output.WriteMessage(IapItemDisplay);
-                    }
-                    if (iapSettings_ != null)
-                    {
-                        output.WriteRawTag(138, 1);
-                        output.WriteMessage(IapSettings);
-                    }
-                    if (pokemonUpgrades_ != null)
-                    {
-                        output.WriteRawTag(146, 1);
-                        output.WriteMessage(PokemonUpgrades);
-                    }
-                    if (equippedBadges_ != null)
-                    {
-                        output.WriteRawTag(154, 1);
-                        output.WriteMessage(EquippedBadges);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (TemplateId.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeStringSize(TemplateId);
-                    }
-                    if (pokemonSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonSettings);
-                    }
-                    if (itemSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ItemSettings);
-                    }
-                    if (moveSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(MoveSettings);
-                    }
-                    if (moveSequenceSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(MoveSequenceSettings);
-                    }
-                    if (typeEffective_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeEffective);
-                    }
-                    if (badgeSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BadgeSettings);
-                    }
-                    if (camera_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Camera);
-                    }
-                    if (playerLevel_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerLevel);
-                    }
-                    if (gymLevel_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GymLevel);
-                    }
-                    if (battleSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(BattleSettings);
-                    }
-                    if (encounterSettings_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EncounterSettings);
-                    }
-                    if (iapItemDisplay_ != null)
-                    {
-                        size += 2 + pb::CodedOutputStream.ComputeMessageSize(IapItemDisplay);
-                    }
-                    if (iapSettings_ != null)
-                    {
-                        size += 2 + pb::CodedOutputStream.ComputeMessageSize(IapSettings);
-                    }
-                    if (pokemonUpgrades_ != null)
-                    {
-                        size += 2 + pb::CodedOutputStream.ComputeMessageSize(PokemonUpgrades);
-                    }
-                    if (equippedBadges_ != null)
-                    {
-                        size += 2 + pb::CodedOutputStream.ComputeMessageSize(EquippedBadges);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(ItemTemplate other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.TemplateId.Length != 0)
-                    {
-                        TemplateId = other.TemplateId;
-                    }
-                    if (other.pokemonSettings_ != null)
-                    {
-                        if (pokemonSettings_ == null)
-                        {
-                            pokemonSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonSettings();
-                        }
-                        PokemonSettings.MergeFrom(other.PokemonSettings);
-                    }
-                    if (other.itemSettings_ != null)
-                    {
-                        if (itemSettings_ == null)
-                        {
-                            itemSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.ItemSettings();
-                        }
-                        ItemSettings.MergeFrom(other.ItemSettings);
-                    }
-                    if (other.moveSettings_ != null)
-                    {
-                        if (moveSettings_ == null)
-                        {
-                            moveSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.MoveSettings();
-                        }
-                        MoveSettings.MergeFrom(other.MoveSettings);
-                    }
-                    if (other.moveSequenceSettings_ != null)
-                    {
-                        if (moveSequenceSettings_ == null)
-                        {
-                            moveSequenceSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.MoveSequenceSettings();
-                        }
-                        MoveSequenceSettings.MergeFrom(other.MoveSequenceSettings);
-                    }
-                    if (other.typeEffective_ != null)
-                    {
-                        if (typeEffective_ == null)
-                        {
-                            typeEffective_ = new global::PokemonGo.RocketAPI.GeneratedCode.TypeEffectiveSettings();
-                        }
-                        TypeEffective.MergeFrom(other.TypeEffective);
-                    }
-                    if (other.badgeSettings_ != null)
-                    {
-                        if (badgeSettings_ == null)
-                        {
-                            badgeSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.BadgeSettings();
-                        }
-                        BadgeSettings.MergeFrom(other.BadgeSettings);
-                    }
-                    if (other.camera_ != null)
-                    {
-                        if (camera_ == null)
-                        {
-                            camera_ = new global::PokemonGo.RocketAPI.GeneratedCode.CameraSettings();
-                        }
-                        Camera.MergeFrom(other.Camera);
-                    }
-                    if (other.playerLevel_ != null)
-                    {
-                        if (playerLevel_ == null)
-                        {
-                            playerLevel_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerLevelSettings();
-                        }
-                        PlayerLevel.MergeFrom(other.PlayerLevel);
-                    }
-                    if (other.gymLevel_ != null)
-                    {
-                        if (gymLevel_ == null)
-                        {
-                            gymLevel_ = new global::PokemonGo.RocketAPI.GeneratedCode.GymLevelSettings();
-                        }
-                        GymLevel.MergeFrom(other.GymLevel);
-                    }
-                    if (other.battleSettings_ != null)
-                    {
-                        if (battleSettings_ == null)
-                        {
-                            battleSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.GymBattleSettings();
-                        }
-                        BattleSettings.MergeFrom(other.BattleSettings);
-                    }
-                    if (other.encounterSettings_ != null)
-                    {
-                        if (encounterSettings_ == null)
-                        {
-                            encounterSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterSettings();
-                        }
-                        EncounterSettings.MergeFrom(other.EncounterSettings);
-                    }
-                    if (other.iapItemDisplay_ != null)
-                    {
-                        if (iapItemDisplay_ == null)
-                        {
-                            iapItemDisplay_ = new global::PokemonGo.RocketAPI.GeneratedCode.IapItemDisplay();
-                        }
-                        IapItemDisplay.MergeFrom(other.IapItemDisplay);
-                    }
-                    if (other.iapSettings_ != null)
-                    {
-                        if (iapSettings_ == null)
-                        {
-                            iapSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.IapSettings();
-                        }
-                        IapSettings.MergeFrom(other.IapSettings);
-                    }
-                    if (other.pokemonUpgrades_ != null)
-                    {
-                        if (pokemonUpgrades_ == null)
-                        {
-                            pokemonUpgrades_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonUpgradeSettings();
-                        }
-                        PokemonUpgrades.MergeFrom(other.PokemonUpgrades);
-                    }
-                    if (other.equippedBadges_ != null)
-                    {
-                        if (equippedBadges_ == null)
-                        {
-                            equippedBadges_ = new global::PokemonGo.RocketAPI.GeneratedCode.EquippedBadgeSettings();
-                        }
-                        EquippedBadges.MergeFrom(other.EquippedBadges);
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                                {
-                                    TemplateId = input.ReadString();
-                                    break;
-                                }
-                            case 18:
-                                {
-                                    if (pokemonSettings_ == null)
-                                    {
-                                        pokemonSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonSettings();
-                                    }
-                                    input.ReadMessage(pokemonSettings_);
-                                    break;
-                                }
-                            case 26:
-                                {
-                                    if (itemSettings_ == null)
-                                    {
-                                        itemSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.ItemSettings();
-                                    }
-                                    input.ReadMessage(itemSettings_);
-                                    break;
-                                }
-                            case 34:
-                                {
-                                    if (moveSettings_ == null)
-                                    {
-                                        moveSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.MoveSettings();
-                                    }
-                                    input.ReadMessage(moveSettings_);
-                                    break;
-                                }
-                            case 42:
-                                {
-                                    if (moveSequenceSettings_ == null)
-                                    {
-                                        moveSequenceSettings_ =
-                                            new global::PokemonGo.RocketAPI.GeneratedCode.MoveSequenceSettings();
-                                    }
-                                    input.ReadMessage(moveSequenceSettings_);
-                                    break;
-                                }
-                            case 66:
-                                {
-                                    if (typeEffective_ == null)
-                                    {
-                                        typeEffective_ =
-                                            new global::PokemonGo.RocketAPI.GeneratedCode.TypeEffectiveSettings();
-                                    }
-                                    input.ReadMessage(typeEffective_);
-                                    break;
-                                }
-                            case 82:
-                                {
-                                    if (badgeSettings_ == null)
-                                    {
-                                        badgeSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.BadgeSettings();
-                                    }
-                                    input.ReadMessage(badgeSettings_);
-                                    break;
-                                }
-                            case 90:
-                                {
-                                    if (camera_ == null)
-                                    {
-                                        camera_ = new global::PokemonGo.RocketAPI.GeneratedCode.CameraSettings();
-                                    }
-                                    input.ReadMessage(camera_);
-                                    break;
-                                }
-                            case 98:
-                                {
-                                    if (playerLevel_ == null)
-                                    {
-                                        playerLevel_ = new global::PokemonGo.RocketAPI.GeneratedCode.PlayerLevelSettings();
-                                    }
-                                    input.ReadMessage(playerLevel_);
-                                    break;
-                                }
-                            case 106:
-                                {
-                                    if (gymLevel_ == null)
-                                    {
-                                        gymLevel_ = new global::PokemonGo.RocketAPI.GeneratedCode.GymLevelSettings();
-                                    }
-                                    input.ReadMessage(gymLevel_);
-                                    break;
-                                }
-                            case 114:
-                                {
-                                    if (battleSettings_ == null)
-                                    {
-                                        battleSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.GymBattleSettings();
-                                    }
-                                    input.ReadMessage(battleSettings_);
-                                    break;
-                                }
-                            case 122:
-                                {
-                                    if (encounterSettings_ == null)
-                                    {
-                                        encounterSettings_ =
-                                            new global::PokemonGo.RocketAPI.GeneratedCode.EncounterSettings();
-                                    }
-                                    input.ReadMessage(encounterSettings_);
-                                    break;
-                                }
-                            case 130:
-                                {
-                                    if (iapItemDisplay_ == null)
-                                    {
-                                        iapItemDisplay_ = new global::PokemonGo.RocketAPI.GeneratedCode.IapItemDisplay();
-                                    }
-                                    input.ReadMessage(iapItemDisplay_);
-                                    break;
-                                }
-                            case 138:
-                                {
-                                    if (iapSettings_ == null)
-                                    {
-                                        iapSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.IapSettings();
-                                    }
-                                    input.ReadMessage(iapSettings_);
-                                    break;
-                                }
-                            case 146:
-                                {
-                                    if (pokemonUpgrades_ == null)
-                                    {
-                                        pokemonUpgrades_ =
-                                            new global::PokemonGo.RocketAPI.GeneratedCode.PokemonUpgradeSettings();
-                                    }
-                                    input.ReadMessage(pokemonUpgrades_);
-                                    break;
-                                }
-                            case 154:
-                                {
-                                    if (equippedBadges_ == null)
-                                    {
-                                        equippedBadges_ =
-                                            new global::PokemonGo.RocketAPI.GeneratedCode.EquippedBadgeSettings();
-                                    }
-                                    input.ReadMessage(equippedBadges_);
-                                    break;
-                                }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as ItemTemplate);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (TemplateId.Length != 0) hash ^= TemplateId.GetHashCode();
-                    if (pokemonSettings_ != null) hash ^= PokemonSettings.GetHashCode();
-                    if (itemSettings_ != null) hash ^= ItemSettings.GetHashCode();
-                    if (moveSettings_ != null) hash ^= MoveSettings.GetHashCode();
-                    if (moveSequenceSettings_ != null) hash ^= MoveSequenceSettings.GetHashCode();
-                    if (typeEffective_ != null) hash ^= TypeEffective.GetHashCode();
-                    if (badgeSettings_ != null) hash ^= BadgeSettings.GetHashCode();
-                    if (camera_ != null) hash ^= Camera.GetHashCode();
-                    if (playerLevel_ != null) hash ^= PlayerLevel.GetHashCode();
-                    if (gymLevel_ != null) hash ^= GymLevel.GetHashCode();
-                    if (battleSettings_ != null) hash ^= BattleSettings.GetHashCode();
-                    if (encounterSettings_ != null) hash ^= EncounterSettings.GetHashCode();
-                    if (iapItemDisplay_ != null) hash ^= IapItemDisplay.GetHashCode();
-                    if (iapSettings_ != null) hash ^= IapSettings.GetHashCode();
-                    if (pokemonUpgrades_ != null) hash ^= PokemonUpgrades.GetHashCode();
-                    if (equippedBadges_ != null) hash ^= EquippedBadges.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-        }
-
-        #endregion
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class UseItemCaptureRequest : pb::IMessage<UseItemCaptureRequest>
-    {
-        /// <summary>Field number for the "item_id" field.</summary>
-        public const int ItemIdFieldNumber = 1;
-
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 2;
-
-        /// <summary>Field number for the "spawn_point_guid" field.</summary>
-        public const int SpawnPointGuidFieldNumber = 3;
-
-        private static readonly pb::MessageParser<UseItemCaptureRequest> _parser =
-            new pb::MessageParser<UseItemCaptureRequest>(() => new UseItemCaptureRequest());
-
-        private ulong encounterId_;
-        private global::AllEnum.ItemId itemId_ = 0;
-        private string spawnPointGuid_ = "";
-
-        public UseItemCaptureRequest()
-        {
-            OnConstruction();
-        }
-
-        public UseItemCaptureRequest(UseItemCaptureRequest other) : this()
-        {
-            itemId_ = other.itemId_;
-            encounterId_ = other.encounterId_;
-            spawnPointGuid_ = other.spawnPointGuid_;
-        }
-
-        public static pb::MessageParser<UseItemCaptureRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[44]; }
-        }
-
-        public global::AllEnum.ItemId ItemId
-        {
-            get { return itemId_; }
-            set { itemId_ = value; }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        public string SpawnPointGuid
-        {
-            get { return spawnPointGuid_; }
-            set { spawnPointGuid_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public UseItemCaptureRequest Clone()
-        {
-            return new UseItemCaptureRequest(this);
-        }
-
-        public bool Equals(UseItemCaptureRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemId != other.ItemId) return false;
-            if (EncounterId != other.EncounterId) return false;
-            if (SpawnPointGuid != other.SpawnPointGuid) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)ItemId);
-            }
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(17);
-                output.WriteFixed64(EncounterId);
-            }
-            if (SpawnPointGuid.Length != 0)
-            {
-                output.WriteRawTag(26);
-                output.WriteString(SpawnPointGuid);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
-            }
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (SpawnPointGuid.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointGuid);
-            }
-            return size;
-        }
-
-        public void MergeFrom(UseItemCaptureRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemId != 0)
-            {
-                ItemId = other.ItemId;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-            if (other.SpawnPointGuid.Length != 0)
-            {
-                SpawnPointGuid = other.SpawnPointGuid;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
-                            break;
-                        }
-                    case 17:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                    case 26:
-                        {
-                            SpawnPointGuid = input.ReadString();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as UseItemCaptureRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemId != 0) hash ^= ItemId.GetHashCode();
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            if (SpawnPointGuid.Length != 0) hash ^= SpawnPointGuid.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class UseItemRequest : pb::IMessage<UseItemRequest>
-    {
-        /// <summary>Field number for the "item_id" field.</summary>
-        public const int ItemIdFieldNumber = 1;
-
-        private static readonly pb::MessageParser<UseItemRequest> _parser =
-            new pb::MessageParser<UseItemRequest>(() => new UseItemRequest());
-
-        private global::AllEnum.ItemId itemId_ = 0;
-
-        public UseItemRequest()
-        {
-            OnConstruction();
-        }
-
-        public UseItemRequest(UseItemRequest other) : this()
-        {
-            itemId_ = other.itemId_;
-        }
-
-        public static pb::MessageParser<UseItemRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[44]; }
-        }
-
-        public global::AllEnum.ItemId ItemId
-        {
-            get { return itemId_; }
-            set { itemId_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public UseItemRequest Clone()
-        {
-            return new UseItemRequest(this);
-        }
-
-        public bool Equals(UseItemRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemId != other.ItemId) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)ItemId);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
-            }
-            return size;
-        }
-
-        public void MergeFrom(UseItemRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemId != 0)
-            {
-                ItemId = other.ItemId;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as UseItemRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemId != 0) hash ^= ItemId.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class UseItemCaptureResponse : pb::IMessage<UseItemCaptureResponse>
-    {
-        /// <summary>Field number for the "success" field.</summary>
-        public const int SuccessFieldNumber = 1;
-
-        /// <summary>Field number for the "item_capture_mult" field.</summary>
-        public const int ItemCaptureMultFieldNumber = 2;
-
-        /// <summary>Field number for the "item_flee_mult" field.</summary>
-        public const int ItemFleeMultFieldNumber = 3;
-
-        /// <summary>Field number for the "stop_movement" field.</summary>
-        public const int StopMovementFieldNumber = 4;
-
-        /// <summary>Field number for the "stop_attack" field.</summary>
-        public const int StopAttackFieldNumber = 5;
-
-        /// <summary>Field number for the "target_max" field.</summary>
-        public const int TargetMaxFieldNumber = 6;
-
-        /// <summary>Field number for the "target_slow" field.</summary>
-        public const int TargetSlowFieldNumber = 7;
-
-        private static readonly pb::MessageParser<UseItemCaptureResponse> _parser =
-            new pb::MessageParser<UseItemCaptureResponse>(() => new UseItemCaptureResponse());
-
-        private double itemCaptureMult_;
-        private double itemFleeMult_;
-        private bool stopAttack_;
-        private bool stopMovement_;
-        private bool success_;
-        private bool targetMax_;
-        private bool targetSlow_;
-
-        public UseItemCaptureResponse()
-        {
-            OnConstruction();
-        }
-
-        public UseItemCaptureResponse(UseItemCaptureResponse other) : this()
-        {
-            success_ = other.success_;
-            itemCaptureMult_ = other.itemCaptureMult_;
-            itemFleeMult_ = other.itemFleeMult_;
-            stopMovement_ = other.stopMovement_;
-            stopAttack_ = other.stopAttack_;
-            targetMax_ = other.targetMax_;
-            targetSlow_ = other.targetSlow_;
-        }
-
-        public static pb::MessageParser<UseItemCaptureResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[45]; }
-        }
-
-        public bool Success
-        {
-            get { return success_; }
-            set { success_ = value; }
-        }
-
-        public double ItemCaptureMult
-        {
-            get { return itemCaptureMult_; }
-            set { itemCaptureMult_ = value; }
-        }
-
-        public double ItemFleeMult
-        {
-            get { return itemFleeMult_; }
-            set { itemFleeMult_ = value; }
-        }
-
-        public bool StopMovement
-        {
-            get { return stopMovement_; }
-            set { stopMovement_ = value; }
-        }
-
-        public bool StopAttack
-        {
-            get { return stopAttack_; }
-            set { stopAttack_ = value; }
-        }
-
-        public bool TargetMax
-        {
-            get { return targetMax_; }
-            set { targetMax_ = value; }
-        }
-
-        public bool TargetSlow
-        {
-            get { return targetSlow_; }
-            set { targetSlow_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public UseItemCaptureResponse Clone()
-        {
-            return new UseItemCaptureResponse(this);
-        }
-
-        public bool Equals(UseItemCaptureResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Success != other.Success) return false;
-            if (ItemCaptureMult != other.ItemCaptureMult) return false;
-            if (ItemFleeMult != other.ItemFleeMult) return false;
-            if (StopMovement != other.StopMovement) return false;
-            if (StopAttack != other.StopAttack) return false;
-            if (TargetMax != other.TargetMax) return false;
-            if (TargetSlow != other.TargetSlow) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Success != false)
-            {
-                output.WriteRawTag(8);
-                output.WriteBool(Success);
-            }
-            if (ItemCaptureMult != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(ItemCaptureMult);
-            }
-            if (ItemFleeMult != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(ItemFleeMult);
-            }
-            if (StopMovement != false)
-            {
-                output.WriteRawTag(32);
-                output.WriteBool(StopMovement);
-            }
-            if (StopAttack != false)
-            {
-                output.WriteRawTag(40);
-                output.WriteBool(StopAttack);
-            }
-            if (TargetMax != false)
-            {
-                output.WriteRawTag(48);
-                output.WriteBool(TargetMax);
-            }
-            if (TargetSlow != false)
-            {
-                output.WriteRawTag(56);
-                output.WriteBool(TargetSlow);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Success != false)
-            {
-                size += 1 + 1;
-            }
-            if (ItemCaptureMult != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (ItemFleeMult != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (StopMovement != false)
-            {
-                size += 1 + 1;
-            }
-            if (StopAttack != false)
-            {
-                size += 1 + 1;
-            }
-            if (TargetMax != false)
-            {
-                size += 1 + 1;
-            }
-            if (TargetSlow != false)
-            {
-                size += 1 + 1;
-            }
-            return size;
-        }
-
-        public void MergeFrom(UseItemCaptureResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Success != false)
-            {
-                Success = other.Success;
-            }
-            if (other.ItemCaptureMult != 0D)
-            {
-                ItemCaptureMult = other.ItemCaptureMult;
-            }
-            if (other.ItemFleeMult != 0D)
-            {
-                ItemFleeMult = other.ItemFleeMult;
-            }
-            if (other.StopMovement != false)
-            {
-                StopMovement = other.StopMovement;
-            }
-            if (other.StopAttack != false)
-            {
-                StopAttack = other.StopAttack;
-            }
-            if (other.TargetMax != false)
-            {
-                TargetMax = other.TargetMax;
-            }
-            if (other.TargetSlow != false)
-            {
-                TargetSlow = other.TargetSlow;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Success = input.ReadBool();
-                            break;
-                        }
-                    case 17:
-                        {
-                            ItemCaptureMult = input.ReadDouble();
-                            break;
-                        }
-                    case 25:
-                        {
-                            ItemFleeMult = input.ReadDouble();
-                            break;
-                        }
-                    case 32:
-                        {
-                            StopMovement = input.ReadBool();
-                            break;
-                        }
-                    case 40:
-                        {
-                            StopAttack = input.ReadBool();
-                            break;
-                        }
-                    case 48:
-                        {
-                            TargetMax = input.ReadBool();
-                            break;
-                        }
-                    case 56:
-                        {
-                            TargetSlow = input.ReadBool();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as UseItemCaptureResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Success != false) hash ^= Success.GetHashCode();
-            if (ItemCaptureMult != 0D) hash ^= ItemCaptureMult.GetHashCode();
-            if (ItemFleeMult != 0D) hash ^= ItemFleeMult.GetHashCode();
-            if (StopMovement != false) hash ^= StopMovement.GetHashCode();
-            if (StopAttack != false) hash ^= StopAttack.GetHashCode();
-            if (TargetMax != false) hash ^= TargetMax.GetHashCode();
-            if (TargetSlow != false) hash ^= TargetSlow.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class ReleasePokemonRequest : pb::IMessage<ReleasePokemonRequest>
-    {
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 1;
-
-        private static readonly pb::MessageParser<ReleasePokemonRequest> _parser =
-            new pb::MessageParser<ReleasePokemonRequest>(() => new ReleasePokemonRequest());
-
-        private ulong pokemonId_;
-
-        public ReleasePokemonRequest()
-        {
-            OnConstruction();
-        }
-
-        public ReleasePokemonRequest(ReleasePokemonRequest other) : this()
-        {
-            pokemonId_ = other.pokemonId_;
-        }
-
-        public static pb::MessageParser<ReleasePokemonRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[46]; }
-        }
-
-        public ulong PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public ReleasePokemonRequest Clone()
-        {
-            return new ReleasePokemonRequest(this);
-        }
-
-        public bool Equals(ReleasePokemonRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokemonId != other.PokemonId) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokemonId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(PokemonId);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokemonId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(ReleasePokemonRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokemonId != 0UL)
-            {
-                PokemonId = other.PokemonId;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            PokemonId = input.ReadFixed64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as ReleasePokemonRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class ReleasePokemonResponse : pb::IMessage<ReleasePokemonResponse>
-    {
-        /// <summary>Field number for the "result" field.</summary>
-        public const int ResultFieldNumber = 1;
-
-        /// <summary>Field number for the "candy_awarded" field.</summary>
-        public const int CandyAwardedFieldNumber = 2;
-
-        private static readonly pb::MessageParser<ReleasePokemonResponse> _parser =
-            new pb::MessageParser<ReleasePokemonResponse>(() => new ReleasePokemonResponse());
-
-        private int candyAwarded_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonResponse.Types.Result result_ = 0;
-
-        public ReleasePokemonResponse()
-        {
-            OnConstruction();
-        }
-
-        public ReleasePokemonResponse(ReleasePokemonResponse other) : this()
-        {
-            result_ = other.result_;
-            candyAwarded_ = other.candyAwarded_;
-        }
-
-        public static pb::MessageParser<ReleasePokemonResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[47]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonResponse.Types.Result Result
-        {
-            get { return result_; }
-            set { result_ = value; }
-        }
-
-        public int CandyAwarded
-        {
-            get { return candyAwarded_; }
-            set { candyAwarded_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public ReleasePokemonResponse Clone()
-        {
-            return new ReleasePokemonResponse(this);
-        }
-
-        public bool Equals(ReleasePokemonResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Result != other.Result) return false;
-            if (CandyAwarded != other.CandyAwarded) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Result != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)Result);
-            }
-            if (CandyAwarded != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(CandyAwarded);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Result != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Result);
-            }
-            if (CandyAwarded != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
-            }
-            return size;
-        }
-
-        public void MergeFrom(ReleasePokemonResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Result != 0)
-            {
-                Result = other.Result;
-            }
-            if (other.CandyAwarded != 0)
-            {
-                CandyAwarded = other.CandyAwarded;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            result_ =
-                                (global::PokemonGo.RocketAPI.GeneratedCode.ReleasePokemonResponse.Types.Result)
-                                    input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            CandyAwarded = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as ReleasePokemonResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Result != 0) hash ^= Result.GetHashCode();
-            if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the ReleasePokemonResponse message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            public enum Result
-            {
-                [pbr::OriginalName("UNSET")]
-                Unset = 0,
-                [pbr::OriginalName("SUCCESS")]
-                Success = 1,
-                [pbr::OriginalName("POKEMON_DEPLOYED")]
-                PokemonDeployed = 2,
-                [pbr::OriginalName("FAILED")]
-                Failed = 3,
-                [pbr::OriginalName("ERROR_POKEMON_IS_EGG")]
-                ErrorPokemonIsEgg = 4,
-            }
-        }
-
-        #endregion
-    }
-
-    /// <summary>
-    ///     No message needed.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GetHatchedEggsRequest : pb::IMessage<GetHatchedEggsRequest>
-    {
-        private static readonly pb::MessageParser<GetHatchedEggsRequest> _parser =
-            new pb::MessageParser<GetHatchedEggsRequest>(() => new GetHatchedEggsRequest());
-
-        public GetHatchedEggsRequest()
-        {
-            OnConstruction();
-        }
-
-        public GetHatchedEggsRequest(GetHatchedEggsRequest other) : this()
-        {
-        }
-
-        public static pb::MessageParser<GetHatchedEggsRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[48]; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GetHatchedEggsRequest Clone()
-        {
-            return new GetHatchedEggsRequest(this);
-        }
-
-        public bool Equals(GetHatchedEggsRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            return size;
-        }
-
-        public void MergeFrom(GetHatchedEggsRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GetHatchedEggsRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    /// <summary>
-    ///     Confirm if this is correct, I think that it should be "repeated HatchedEgg hatched_eggs" or something like that.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GetHatchedEggsResponse : pb::IMessage<GetHatchedEggsResponse>
-    {
-        /// <summary>Field number for the "success" field.</summary>
-        public const int SuccessFieldNumber = 1;
-
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 2;
-
-        /// <summary>Field number for the "experience_awarded" field.</summary>
-        public const int ExperienceAwardedFieldNumber = 3;
-
-        /// <summary>Field number for the "candy_awarded" field.</summary>
-        public const int CandyAwardedFieldNumber = 4;
-
-        /// <summary>Field number for the "stardust_awarded" field.</summary>
-        public const int StardustAwardedFieldNumber = 5;
-
-        private static readonly pb::MessageParser<GetHatchedEggsResponse> _parser =
-            new pb::MessageParser<GetHatchedEggsResponse>(() => new GetHatchedEggsResponse());
-
-        private static readonly pb::FieldCodec<ulong> _repeated_pokemonId_codec
-            = pb::FieldCodec.ForUInt64(18);
-
-        private static readonly pb::FieldCodec<int> _repeated_experienceAwarded_codec
-            = pb::FieldCodec.ForInt32(26);
-
-        private static readonly pb::FieldCodec<int> _repeated_candyAwarded_codec
-            = pb::FieldCodec.ForInt32(34);
-
-        private static readonly pb::FieldCodec<int> _repeated_stardustAwarded_codec
-            = pb::FieldCodec.ForInt32(42);
-
-        private readonly pbc::RepeatedField<int> candyAwarded_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> experienceAwarded_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<ulong> pokemonId_ = new pbc::RepeatedField<ulong>();
-        private readonly pbc::RepeatedField<int> stardustAwarded_ = new pbc::RepeatedField<int>();
-        private bool success_;
-
-        public GetHatchedEggsResponse()
-        {
-            OnConstruction();
-        }
-
-        public GetHatchedEggsResponse(GetHatchedEggsResponse other) : this()
-        {
-            success_ = other.success_;
-            pokemonId_ = other.pokemonId_.Clone();
-            experienceAwarded_ = other.experienceAwarded_.Clone();
-            candyAwarded_ = other.candyAwarded_.Clone();
-            stardustAwarded_ = other.stardustAwarded_.Clone();
-        }
-
-        public static pb::MessageParser<GetHatchedEggsResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[49]; }
-        }
-
-        public bool Success
-        {
-            get { return success_; }
-            set { success_ = value; }
-        }
-
-        /// <summary>
-        ///     Might be POGOProtos.Enums.Pokemon
-        /// </summary>
-        public pbc::RepeatedField<ulong> PokemonId
-        {
-            get { return pokemonId_; }
-        }
-
-        public pbc::RepeatedField<int> ExperienceAwarded
-        {
-            get { return experienceAwarded_; }
-        }
-
-        public pbc::RepeatedField<int> CandyAwarded
-        {
-            get { return candyAwarded_; }
-        }
-
-        public pbc::RepeatedField<int> StardustAwarded
-        {
-            get { return stardustAwarded_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GetHatchedEggsResponse Clone()
-        {
-            return new GetHatchedEggsResponse(this);
-        }
-
-        public bool Equals(GetHatchedEggsResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Success != other.Success) return false;
-            if (!pokemonId_.Equals(other.pokemonId_)) return false;
-            if (!experienceAwarded_.Equals(other.experienceAwarded_)) return false;
-            if (!candyAwarded_.Equals(other.candyAwarded_)) return false;
-            if (!stardustAwarded_.Equals(other.stardustAwarded_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Success != false)
-            {
-                output.WriteRawTag(8);
-                output.WriteBool(Success);
-            }
-            pokemonId_.WriteTo(output, _repeated_pokemonId_codec);
-            experienceAwarded_.WriteTo(output, _repeated_experienceAwarded_codec);
-            candyAwarded_.WriteTo(output, _repeated_candyAwarded_codec);
-            stardustAwarded_.WriteTo(output, _repeated_stardustAwarded_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Success != false)
-            {
-                size += 1 + 1;
-            }
-            size += pokemonId_.CalculateSize(_repeated_pokemonId_codec);
-            size += experienceAwarded_.CalculateSize(_repeated_experienceAwarded_codec);
-            size += candyAwarded_.CalculateSize(_repeated_candyAwarded_codec);
-            size += stardustAwarded_.CalculateSize(_repeated_stardustAwarded_codec);
-            return size;
-        }
-
-        public void MergeFrom(GetHatchedEggsResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Success != false)
-            {
-                Success = other.Success;
-            }
-            pokemonId_.Add(other.pokemonId_);
-            experienceAwarded_.Add(other.experienceAwarded_);
-            candyAwarded_.Add(other.candyAwarded_);
-            stardustAwarded_.Add(other.stardustAwarded_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Success = input.ReadBool();
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            pokemonId_.AddEntriesFrom(input, _repeated_pokemonId_codec);
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            experienceAwarded_.AddEntriesFrom(input, _repeated_experienceAwarded_codec);
-                            break;
-                        }
-                    case 34:
-                    case 32:
-                        {
-                            candyAwarded_.AddEntriesFrom(input, _repeated_candyAwarded_codec);
-                            break;
-                        }
-                    case 42:
-                    case 40:
-                        {
-                            stardustAwarded_.AddEntriesFrom(input, _repeated_stardustAwarded_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GetHatchedEggsResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Success != false) hash ^= Success.GetHashCode();
-            hash ^= pokemonId_.GetHashCode();
-            hash ^= experienceAwarded_.GetHashCode();
-            hash ^= candyAwarded_.GetHashCode();
-            hash ^= stardustAwarded_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortSearchRequest : pb::IMessage<FortSearchRequest>
-    {
-        /// <summary>Field number for the "fort_id" field.</summary>
-        public const int FortIdFieldNumber = 1;
-
-        /// <summary>Field number for the "player_latitude" field.</summary>
-        public const int PlayerLatitudeFieldNumber = 2;
-
-        /// <summary>Field number for the "player_longitude" field.</summary>
-        public const int PlayerLongitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "fort_latitude" field.</summary>
-        public const int FortLatitudeFieldNumber = 4;
-
-        /// <summary>Field number for the "fort_longitude" field.</summary>
-        public const int FortLongitudeFieldNumber = 5;
-
-        private static readonly pb::MessageParser<FortSearchRequest> _parser =
-            new pb::MessageParser<FortSearchRequest>(() => new FortSearchRequest());
-
-        private string fortId_ = "";
-        private double fortLatitude_;
-        private double fortLongitude_;
-        private double playerLatitude_;
-        private double playerLongitude_;
-
-        public FortSearchRequest()
-        {
-            OnConstruction();
-        }
-
-        public FortSearchRequest(FortSearchRequest other) : this()
-        {
-            fortId_ = other.fortId_;
-            playerLatitude_ = other.playerLatitude_;
-            playerLongitude_ = other.playerLongitude_;
-            fortLatitude_ = other.fortLatitude_;
-            fortLongitude_ = other.fortLongitude_;
-        }
-
-        public static pb::MessageParser<FortSearchRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[50]; }
-        }
-
-        public string FortId
-        {
-            get { return fortId_; }
-            set { fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public double PlayerLatitude
-        {
-            get { return playerLatitude_; }
-            set { playerLatitude_ = value; }
-        }
-
-        public double PlayerLongitude
-        {
-            get { return playerLongitude_; }
-            set { playerLongitude_ = value; }
-        }
-
-        public double FortLatitude
-        {
-            get { return fortLatitude_; }
-            set { fortLatitude_ = value; }
-        }
-
-        public double FortLongitude
-        {
-            get { return fortLongitude_; }
-            set { fortLongitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortSearchRequest Clone()
-        {
-            return new FortSearchRequest(this);
-        }
-
-        public bool Equals(FortSearchRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (FortId != other.FortId) return false;
-            if (PlayerLatitude != other.PlayerLatitude) return false;
-            if (PlayerLongitude != other.PlayerLongitude) return false;
-            if (FortLatitude != other.FortLatitude) return false;
-            if (FortLongitude != other.FortLongitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (FortId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(FortId);
-            }
-            if (PlayerLatitude != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(PlayerLatitude);
-            }
-            if (PlayerLongitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(PlayerLongitude);
-            }
-            if (FortLatitude != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(FortLatitude);
-            }
-            if (FortLongitude != 0D)
-            {
-                output.WriteRawTag(41);
-                output.WriteDouble(FortLongitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (FortId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
-            }
-            if (PlayerLatitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (PlayerLongitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (FortLatitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (FortLongitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortSearchRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.FortId.Length != 0)
-            {
-                FortId = other.FortId;
-            }
-            if (other.PlayerLatitude != 0D)
-            {
-                PlayerLatitude = other.PlayerLatitude;
-            }
-            if (other.PlayerLongitude != 0D)
-            {
-                PlayerLongitude = other.PlayerLongitude;
-            }
-            if (other.FortLatitude != 0D)
-            {
-                FortLatitude = other.FortLatitude;
-            }
-            if (other.FortLongitude != 0D)
-            {
-                FortLongitude = other.FortLongitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            FortId = input.ReadString();
-                            break;
-                        }
-                    case 17:
-                        {
-                            PlayerLatitude = input.ReadDouble();
-                            break;
-                        }
-                    case 25:
-                        {
-                            PlayerLongitude = input.ReadDouble();
-                            break;
-                        }
-                    case 33:
-                        {
-                            FortLatitude = input.ReadDouble();
-                            break;
-                        }
-                    case 41:
-                        {
-                            FortLongitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortSearchRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (FortId.Length != 0) hash ^= FortId.GetHashCode();
-            if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
-            if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
-            if (FortLatitude != 0D) hash ^= FortLatitude.GetHashCode();
-            if (FortLongitude != 0D) hash ^= FortLongitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortSearchResponse : pb::IMessage<FortSearchResponse>
-    {
-        /// <summary>Field number for the "result" field.</summary>
-        public const int ResultFieldNumber = 1;
-
-        /// <summary>Field number for the "items_awarded" field.</summary>
-        public const int ItemsAwardedFieldNumber = 2;
-
-        /// <summary>Field number for the "gems_awarded" field.</summary>
-        public const int GemsAwardedFieldNumber = 3;
-
-        /// <summary>Field number for the "pokemon_data_egg" field.</summary>
-        public const int PokemonDataEggFieldNumber = 4;
-
-        /// <summary>Field number for the "experience_awarded" field.</summary>
-        public const int ExperienceAwardedFieldNumber = 5;
-
-        /// <summary>Field number for the "cooldown_complete_timestamp_ms" field.</summary>
-        public const int CooldownCompleteTimestampMsFieldNumber = 6;
-
-        /// <summary>Field number for the "chain_hack_sequence_number" field.</summary>
-        public const int ChainHackSequenceNumberFieldNumber = 7;
-
-        private static readonly pb::MessageParser<FortSearchResponse> _parser =
-            new pb::MessageParser<FortSearchResponse>(() => new FortSearchResponse());
-
-        private static readonly
-            pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward>
-            _repeated_itemsAwarded_codec
-                = pb::FieldCodec.ForMessage(18,
-                    global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward.Parser);
-
-        private readonly
-            pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward>
-            itemsAwarded_ =
-                new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward>();
-
-        private int chainHackSequenceNumber_;
-        private long cooldownCompleteTimestampMs_;
-        private int experienceAwarded_;
-        private int gemsAwarded_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokemonData pokemonDataEgg_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.Result result_ = 0;
-
-        public FortSearchResponse()
-        {
-            OnConstruction();
-        }
-
-        public FortSearchResponse(FortSearchResponse other) : this()
-        {
-            result_ = other.result_;
-            itemsAwarded_ = other.itemsAwarded_.Clone();
-            gemsAwarded_ = other.gemsAwarded_;
-            PokemonDataEgg = other.pokemonDataEgg_ != null ? other.PokemonDataEgg.Clone() : null;
-            experienceAwarded_ = other.experienceAwarded_;
-            cooldownCompleteTimestampMs_ = other.cooldownCompleteTimestampMs_;
-            chainHackSequenceNumber_ = other.chainHackSequenceNumber_;
-        }
-
-        public static pb::MessageParser<FortSearchResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[51]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.Result Result
-        {
-            get { return result_; }
-            set { result_ = value; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.ItemAward>
-            ItemsAwarded
-        {
-            get { return itemsAwarded_; }
-        }
-
-        public int GemsAwarded
-        {
-            get { return gemsAwarded_; }
-            set { gemsAwarded_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokemonData PokemonDataEgg
-        {
-            get { return pokemonDataEgg_; }
-            set { pokemonDataEgg_ = value; }
-        }
-
-        public int ExperienceAwarded
-        {
-            get { return experienceAwarded_; }
-            set { experienceAwarded_ = value; }
-        }
-
-        public long CooldownCompleteTimestampMs
-        {
-            get { return cooldownCompleteTimestampMs_; }
-            set { cooldownCompleteTimestampMs_ = value; }
-        }
-
-        public int ChainHackSequenceNumber
-        {
-            get { return chainHackSequenceNumber_; }
-            set { chainHackSequenceNumber_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortSearchResponse Clone()
-        {
-            return new FortSearchResponse(this);
-        }
-
-        public bool Equals(FortSearchResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Result != other.Result) return false;
-            if (!itemsAwarded_.Equals(other.itemsAwarded_)) return false;
-            if (GemsAwarded != other.GemsAwarded) return false;
-            if (!Equals(PokemonDataEgg, other.PokemonDataEgg)) return false;
-            if (ExperienceAwarded != other.ExperienceAwarded) return false;
-            if (CooldownCompleteTimestampMs != other.CooldownCompleteTimestampMs) return false;
-            if (ChainHackSequenceNumber != other.ChainHackSequenceNumber) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Result != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)Result);
-            }
-            itemsAwarded_.WriteTo(output, _repeated_itemsAwarded_codec);
-            if (GemsAwarded != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(GemsAwarded);
-            }
-            if (pokemonDataEgg_ != null)
-            {
-                output.WriteRawTag(34);
-                output.WriteMessage(PokemonDataEgg);
-            }
-            if (ExperienceAwarded != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(ExperienceAwarded);
-            }
-            if (CooldownCompleteTimestampMs != 0L)
-            {
-                output.WriteRawTag(48);
-                output.WriteInt64(CooldownCompleteTimestampMs);
-            }
-            if (ChainHackSequenceNumber != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteInt32(ChainHackSequenceNumber);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Result != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Result);
-            }
-            size += itemsAwarded_.CalculateSize(_repeated_itemsAwarded_codec);
-            if (GemsAwarded != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(GemsAwarded);
-            }
-            if (pokemonDataEgg_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonDataEgg);
-            }
-            if (ExperienceAwarded != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(ExperienceAwarded);
-            }
-            if (CooldownCompleteTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(CooldownCompleteTimestampMs);
-            }
-            if (ChainHackSequenceNumber != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(ChainHackSequenceNumber);
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortSearchResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Result != 0)
-            {
-                Result = other.Result;
-            }
-            itemsAwarded_.Add(other.itemsAwarded_);
-            if (other.GemsAwarded != 0)
-            {
-                GemsAwarded = other.GemsAwarded;
-            }
-            if (other.pokemonDataEgg_ != null)
-            {
-                if (pokemonDataEgg_ == null)
-                {
-                    pokemonDataEgg_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                }
-                PokemonDataEgg.MergeFrom(other.PokemonDataEgg);
-            }
-            if (other.ExperienceAwarded != 0)
-            {
-                ExperienceAwarded = other.ExperienceAwarded;
-            }
-            if (other.CooldownCompleteTimestampMs != 0L)
-            {
-                CooldownCompleteTimestampMs = other.CooldownCompleteTimestampMs;
-            }
-            if (other.ChainHackSequenceNumber != 0)
-            {
-                ChainHackSequenceNumber = other.ChainHackSequenceNumber;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            result_ =
-                                (global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Types.Result)input.ReadEnum();
-                            break;
-                        }
-                    case 18:
-                        {
-                            itemsAwarded_.AddEntriesFrom(input, _repeated_itemsAwarded_codec);
-                            break;
-                        }
-                    case 24:
-                        {
-                            GemsAwarded = input.ReadInt32();
-                            break;
-                        }
-                    case 34:
-                        {
-                            if (pokemonDataEgg_ == null)
-                            {
-                                pokemonDataEgg_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                            }
-                            input.ReadMessage(pokemonDataEgg_);
-                            break;
-                        }
-                    case 40:
-                        {
-                            ExperienceAwarded = input.ReadInt32();
-                            break;
-                        }
-                    case 48:
-                        {
-                            CooldownCompleteTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 56:
-                        {
-                            ChainHackSequenceNumber = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortSearchResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Result != 0) hash ^= Result.GetHashCode();
-            hash ^= itemsAwarded_.GetHashCode();
-            if (GemsAwarded != 0) hash ^= GemsAwarded.GetHashCode();
-            if (pokemonDataEgg_ != null) hash ^= PokemonDataEgg.GetHashCode();
-            if (ExperienceAwarded != 0) hash ^= ExperienceAwarded.GetHashCode();
-            if (CooldownCompleteTimestampMs != 0L) hash ^= CooldownCompleteTimestampMs.GetHashCode();
-            if (ChainHackSequenceNumber != 0) hash ^= ChainHackSequenceNumber.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the FortSearchResponse message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            public enum Result
-            {
-                [pbr::OriginalName("NO_RESULT_SET")]
-                NoResultSet = 0,
-                [pbr::OriginalName("SUCCESS")]
-                Success = 1,
-                [pbr::OriginalName("OUT_OF_RANGE")]
-                OutOfRange = 2,
-                [pbr::OriginalName("IN_COOLDOWN_PERIOD")]
-                InCooldownPeriod = 3,
-                [pbr::OriginalName("INVENTORY_FULL")]
-                InventoryFull = 4,
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class ItemAward : pb::IMessage<ItemAward>
-            {
-                /// <summary>Field number for the "item_id" field.</summary>
-                public const int ItemIdFieldNumber = 1;
-
-                /// <summary>Field number for the "item_count" field.</summary>
-                public const int ItemCountFieldNumber = 2;
-
-                private static readonly pb::MessageParser<ItemAward> _parser =
-                    new pb::MessageParser<ItemAward>(() => new ItemAward());
-
-                private int itemCount_;
-                private global::AllEnum.ItemId itemId_ = 0;
-
-                public ItemAward()
-                {
-                    OnConstruction();
-                }
-
-                public ItemAward(ItemAward other) : this()
-                {
-                    itemId_ = other.itemId_;
-                    itemCount_ = other.itemCount_;
-                }
-
-                public static pb::MessageParser<ItemAward> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get
-                    {
-                        return global::PokemonGo.RocketAPI.GeneratedCode.FortSearchResponse.Descriptor.NestedTypes[0];
-                    }
-                }
-
-                public global::AllEnum.ItemId ItemId
-                {
-                    get { return itemId_; }
-                    set { itemId_ = value; }
-                }
-
-                public int ItemCount
-                {
-                    get { return itemCount_; }
-                    set { itemCount_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public ItemAward Clone()
-                {
-                    return new ItemAward(this);
-                }
-
-                public bool Equals(ItemAward other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (ItemId != other.ItemId) return false;
-                    if (ItemCount != other.ItemCount) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (ItemId != 0)
-                    {
-                        output.WriteRawTag(8);
-                        output.WriteEnum((int)ItemId);
-                    }
-                    if (ItemCount != 0)
-                    {
-                        output.WriteRawTag(16);
-                        output.WriteInt32(ItemCount);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (ItemId != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
-                    }
-                    if (ItemCount != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt32Size(ItemCount);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(ItemAward other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.ItemId != 0)
-                    {
-                        ItemId = other.ItemId;
-                    }
-                    if (other.ItemCount != 0)
-                    {
-                        ItemCount = other.ItemCount;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 8:
-                                {
-                                    itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
-                                    break;
-                                }
-                            case 16:
-                                {
-                                    ItemCount = input.ReadInt32();
-                                    break;
-                                }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as ItemAward);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (ItemId != 0) hash ^= ItemId.GetHashCode();
-                    if (ItemCount != 0) hash ^= ItemCount.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-        }
-
-        #endregion
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortDetailsRequest : pb::IMessage<FortDetailsRequest>
-    {
-        /// <summary>Field number for the "fort_id" field.</summary>
-        public const int FortIdFieldNumber = 1;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 2;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 3;
-
-        private static readonly pb::MessageParser<FortDetailsRequest> _parser =
-            new pb::MessageParser<FortDetailsRequest>(() => new FortDetailsRequest());
-
-        private string fortId_ = "";
-        private double latitude_;
-        private double longitude_;
-
-        public FortDetailsRequest()
-        {
-            OnConstruction();
-        }
-
-        public FortDetailsRequest(FortDetailsRequest other) : this()
-        {
-            fortId_ = other.fortId_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-        }
-
-        public static pb::MessageParser<FortDetailsRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[52]; }
-        }
-
-        public string FortId
-        {
-            get { return fortId_; }
-            set { fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortDetailsRequest Clone()
-        {
-            return new FortDetailsRequest(this);
-        }
-
-        public bool Equals(FortDetailsRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (FortId != other.FortId) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (FortId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(FortId);
-            }
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(Longitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (FortId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
-            }
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortDetailsRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.FortId.Length != 0)
-            {
-                FortId = other.FortId;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            FortId = input.ReadString();
-                            break;
-                        }
-                    case 17:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 25:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortDetailsRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (FortId.Length != 0) hash ^= FortId.GetHashCode();
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortDetailsResponse : pb::IMessage<FortDetailsResponse>
-    {
-        /// <summary>Field number for the "fort_id" field.</summary>
-        public const int FortIdFieldNumber = 1;
-
-        /// <summary>Field number for the "team_color" field.</summary>
-        public const int TeamColorFieldNumber = 2;
-
-        /// <summary>Field number for the "pokemon_data" field.</summary>
-        public const int PokemonDataFieldNumber = 3;
-
-        /// <summary>Field number for the "name" field.</summary>
-        public const int NameFieldNumber = 4;
-
-        /// <summary>Field number for the "image_urls" field.</summary>
-        public const int ImageUrlsFieldNumber = 5;
-
-        /// <summary>Field number for the "fp" field.</summary>
-        public const int FpFieldNumber = 6;
-
-        /// <summary>Field number for the "stamina" field.</summary>
-        public const int StaminaFieldNumber = 7;
-
-        /// <summary>Field number for the "max_stamina" field.</summary>
-        public const int MaxStaminaFieldNumber = 8;
-
-        /// <summary>Field number for the "type" field.</summary>
-        public const int TypeFieldNumber = 9;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 10;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 11;
-
-        /// <summary>Field number for the "description" field.</summary>
-        public const int DescriptionFieldNumber = 12;
-
-        /// <summary>Field number for the "modifiers" field.</summary>
-        public const int ModifiersFieldNumber = 13;
-
-        private static readonly pb::MessageParser<FortDetailsResponse> _parser =
-            new pb::MessageParser<FortDetailsResponse>(() => new FortDetailsResponse());
-
-        private static readonly pb::FieldCodec<string> _repeated_imageUrls_codec
-            = pb::FieldCodec.ForString(42);
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.FortModifier>
-            _repeated_modifiers_codec
-                = pb::FieldCodec.ForMessage(106, global::PokemonGo.RocketAPI.GeneratedCode.FortModifier.Parser);
-
-        private readonly pbc::RepeatedField<string> imageUrls_ = new pbc::RepeatedField<string>();
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortModifier> modifiers_ =
-            new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortModifier>();
-
-        private string description_ = "";
-        private string fortId_ = "";
-        private int fp_;
-        private double latitude_;
-        private double longitude_;
-        private int maxStamina_;
-        private string name_ = "";
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokemonData pokemonData_;
-        private int stamina_;
-        private global::AllEnum.TeamColor teamColor_ = 0;
-        private global::AllEnum.FortType type_ = 0;
-
-        public FortDetailsResponse()
-        {
-            OnConstruction();
-        }
-
-        public FortDetailsResponse(FortDetailsResponse other) : this()
-        {
-            fortId_ = other.fortId_;
-            teamColor_ = other.teamColor_;
-            PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
-            name_ = other.name_;
-            imageUrls_ = other.imageUrls_.Clone();
-            fp_ = other.fp_;
-            stamina_ = other.stamina_;
-            maxStamina_ = other.maxStamina_;
-            type_ = other.type_;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-            description_ = other.description_;
-            modifiers_ = other.modifiers_.Clone();
-        }
-
-        public static pb::MessageParser<FortDetailsResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[53]; }
-        }
-
-        public string FortId
-        {
-            get { return fortId_; }
-            set { fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::AllEnum.TeamColor TeamColor
-        {
-            get { return teamColor_; }
-            set { teamColor_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokemonData PokemonData
-        {
-            get { return pokemonData_; }
-            set { pokemonData_ = value; }
-        }
-
-        public string Name
-        {
-            get { return name_; }
-            set { name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public pbc::RepeatedField<string> ImageUrls
-        {
-            get { return imageUrls_; }
-        }
-
-        public int Fp
-        {
-            get { return fp_; }
-            set { fp_ = value; }
-        }
-
-        public int Stamina
-        {
-            get { return stamina_; }
-            set { stamina_ = value; }
-        }
-
-        public int MaxStamina
-        {
-            get { return maxStamina_; }
-            set { maxStamina_ = value; }
-        }
-
-        public global::AllEnum.FortType Type
-        {
-            get { return type_; }
-            set { type_ = value; }
-        }
-
-        public double Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public double Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        public string Description
-        {
-            get { return description_; }
-            set { description_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.FortModifier> Modifiers
-        {
-            get { return modifiers_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortDetailsResponse Clone()
-        {
-            return new FortDetailsResponse(this);
-        }
-
-        public bool Equals(FortDetailsResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (FortId != other.FortId) return false;
-            if (TeamColor != other.TeamColor) return false;
-            if (!Equals(PokemonData, other.PokemonData)) return false;
-            if (Name != other.Name) return false;
-            if (!imageUrls_.Equals(other.imageUrls_)) return false;
-            if (Fp != other.Fp) return false;
-            if (Stamina != other.Stamina) return false;
-            if (MaxStamina != other.MaxStamina) return false;
-            if (Type != other.Type) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            if (Description != other.Description) return false;
-            if (!modifiers_.Equals(other.modifiers_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (FortId.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(FortId);
-            }
-            if (TeamColor != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)TeamColor);
-            }
-            if (pokemonData_ != null)
-            {
-                output.WriteRawTag(26);
-                output.WriteMessage(PokemonData);
-            }
-            if (Name.Length != 0)
-            {
-                output.WriteRawTag(34);
-                output.WriteString(Name);
-            }
-            imageUrls_.WriteTo(output, _repeated_imageUrls_codec);
-            if (Fp != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteInt32(Fp);
-            }
-            if (Stamina != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteInt32(Stamina);
-            }
-            if (MaxStamina != 0)
-            {
-                output.WriteRawTag(64);
-                output.WriteInt32(MaxStamina);
-            }
-            if (Type != 0)
-            {
-                output.WriteRawTag(72);
-                output.WriteEnum((int)Type);
-            }
-            if (Latitude != 0D)
-            {
-                output.WriteRawTag(81);
-                output.WriteDouble(Latitude);
-            }
-            if (Longitude != 0D)
-            {
-                output.WriteRawTag(89);
-                output.WriteDouble(Longitude);
-            }
-            if (Description.Length != 0)
-            {
-                output.WriteRawTag(98);
-                output.WriteString(Description);
-            }
-            modifiers_.WriteTo(output, _repeated_modifiers_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (FortId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
-            }
-            if (TeamColor != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)TeamColor);
-            }
-            if (pokemonData_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
-            }
-            if (Name.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
-            }
-            size += imageUrls_.CalculateSize(_repeated_imageUrls_codec);
-            if (Fp != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Fp);
-            }
-            if (Stamina != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Stamina);
-            }
-            if (MaxStamina != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxStamina);
-            }
-            if (Type != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type);
-            }
-            if (Latitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (Description.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Description);
-            }
-            size += modifiers_.CalculateSize(_repeated_modifiers_codec);
-            return size;
-        }
-
-        public void MergeFrom(FortDetailsResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.FortId.Length != 0)
-            {
-                FortId = other.FortId;
-            }
-            if (other.TeamColor != 0)
-            {
-                TeamColor = other.TeamColor;
-            }
-            if (other.pokemonData_ != null)
-            {
-                if (pokemonData_ == null)
-                {
-                    pokemonData_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                }
-                PokemonData.MergeFrom(other.PokemonData);
-            }
-            if (other.Name.Length != 0)
-            {
-                Name = other.Name;
-            }
-            imageUrls_.Add(other.imageUrls_);
-            if (other.Fp != 0)
-            {
-                Fp = other.Fp;
-            }
-            if (other.Stamina != 0)
-            {
-                Stamina = other.Stamina;
-            }
-            if (other.MaxStamina != 0)
-            {
-                MaxStamina = other.MaxStamina;
-            }
-            if (other.Type != 0)
-            {
-                Type = other.Type;
-            }
-            if (other.Latitude != 0D)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0D)
-            {
-                Longitude = other.Longitude;
-            }
-            if (other.Description.Length != 0)
-            {
-                Description = other.Description;
-            }
-            modifiers_.Add(other.modifiers_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            FortId = input.ReadString();
-                            break;
-                        }
-                    case 16:
-                        {
-                            teamColor_ = (global::AllEnum.TeamColor)input.ReadEnum();
-                            break;
-                        }
-                    case 26:
-                        {
-                            if (pokemonData_ == null)
-                            {
-                                pokemonData_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                            }
-                            input.ReadMessage(pokemonData_);
-                            break;
-                        }
-                    case 34:
-                        {
-                            Name = input.ReadString();
-                            break;
-                        }
-                    case 42:
-                        {
-                            imageUrls_.AddEntriesFrom(input, _repeated_imageUrls_codec);
-                            break;
-                        }
-                    case 48:
-                        {
-                            Fp = input.ReadInt32();
-                            break;
-                        }
-                    case 56:
-                        {
-                            Stamina = input.ReadInt32();
-                            break;
-                        }
-                    case 64:
-                        {
-                            MaxStamina = input.ReadInt32();
-                            break;
-                        }
-                    case 72:
-                        {
-                            type_ = (global::AllEnum.FortType)input.ReadEnum();
-                            break;
-                        }
-                    case 81:
-                        {
-                            Latitude = input.ReadDouble();
-                            break;
-                        }
-                    case 89:
-                        {
-                            Longitude = input.ReadDouble();
-                            break;
-                        }
-                    case 98:
-                        {
-                            Description = input.ReadString();
-                            break;
-                        }
-                    case 106:
-                        {
-                            modifiers_.AddEntriesFrom(input, _repeated_modifiers_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortDetailsResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (FortId.Length != 0) hash ^= FortId.GetHashCode();
-            if (TeamColor != 0) hash ^= TeamColor.GetHashCode();
-            if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
-            if (Name.Length != 0) hash ^= Name.GetHashCode();
-            hash ^= imageUrls_.GetHashCode();
-            if (Fp != 0) hash ^= Fp.GetHashCode();
-            if (Stamina != 0) hash ^= Stamina.GetHashCode();
-            if (MaxStamina != 0) hash ^= MaxStamina.GetHashCode();
-            if (Type != 0) hash ^= Type.GetHashCode();
-            if (Latitude != 0D) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0D) hash ^= Longitude.GetHashCode();
-            if (Description.Length != 0) hash ^= Description.GetHashCode();
-            hash ^= modifiers_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortModifier : pb::IMessage<FortModifier>
-    {
-        /// <summary>Field number for the "item_id" field.</summary>
-        public const int ItemIdFieldNumber = 1;
-
-        /// <summary>Field number for the "expiration_timestamp_ms" field.</summary>
-        public const int ExpirationTimestampMsFieldNumber = 2;
-
-        /// <summary>Field number for the "deployer_player_codename" field.</summary>
-        public const int DeployerPlayerCodenameFieldNumber = 3;
-
-        private static readonly pb::MessageParser<FortModifier> _parser =
-            new pb::MessageParser<FortModifier>(() => new FortModifier());
-
-        private string deployerPlayerCodename_ = "";
-        private long expirationTimestampMs_;
-        private global::AllEnum.ItemId itemId_ = 0;
-
-        public FortModifier()
-        {
-            OnConstruction();
-        }
-
-        public FortModifier(FortModifier other) : this()
-        {
-            itemId_ = other.itemId_;
-            expirationTimestampMs_ = other.expirationTimestampMs_;
-            deployerPlayerCodename_ = other.deployerPlayerCodename_;
-        }
-
-        public static pb::MessageParser<FortModifier> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[54]; }
-        }
-
-        public global::AllEnum.ItemId ItemId
-        {
-            get { return itemId_; }
-            set { itemId_ = value; }
-        }
-
-        public long ExpirationTimestampMs
-        {
-            get { return expirationTimestampMs_; }
-            set { expirationTimestampMs_ = value; }
-        }
-
-        public string DeployerPlayerCodename
-        {
-            get { return deployerPlayerCodename_; }
-            set { deployerPlayerCodename_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortModifier Clone()
-        {
-            return new FortModifier(this);
-        }
-
-        public bool Equals(FortModifier other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemId != other.ItemId) return false;
-            if (ExpirationTimestampMs != other.ExpirationTimestampMs) return false;
-            if (DeployerPlayerCodename != other.DeployerPlayerCodename) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)ItemId);
-            }
-            if (ExpirationTimestampMs != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(ExpirationTimestampMs);
-            }
-            if (DeployerPlayerCodename.Length != 0)
-            {
-                output.WriteRawTag(26);
-                output.WriteString(DeployerPlayerCodename);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
-            }
-            if (ExpirationTimestampMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(ExpirationTimestampMs);
-            }
-            if (DeployerPlayerCodename.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(DeployerPlayerCodename);
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortModifier other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemId != 0)
-            {
-                ItemId = other.ItemId;
-            }
-            if (other.ExpirationTimestampMs != 0L)
-            {
-                ExpirationTimestampMs = other.ExpirationTimestampMs;
-            }
-            if (other.DeployerPlayerCodename.Length != 0)
-            {
-                DeployerPlayerCodename = other.DeployerPlayerCodename;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            ExpirationTimestampMs = input.ReadInt64();
-                            break;
-                        }
-                    case 26:
-                        {
-                            DeployerPlayerCodename = input.ReadString();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortModifier);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemId != 0) hash ^= ItemId.GetHashCode();
-            if (ExpirationTimestampMs != 0L) hash ^= ExpirationTimestampMs.GetHashCode();
-            if (DeployerPlayerCodename.Length != 0) hash ^= DeployerPlayerCodename.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EncounterRequest : pb::IMessage<EncounterRequest>
-    {
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 1;
-
-        /// <summary>Field number for the "spawnpoint_id" field.</summary>
-        public const int SpawnpointIdFieldNumber = 2;
-
-        /// <summary>Field number for the "player_latitude" field.</summary>
-        public const int PlayerLatitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "player_longitude" field.</summary>
-        public const int PlayerLongitudeFieldNumber = 4;
-
-        private static readonly pb::MessageParser<EncounterRequest> _parser =
-            new pb::MessageParser<EncounterRequest>(() => new EncounterRequest());
-
-        private ulong encounterId_;
-        private double playerLatitude_;
-        private double playerLongitude_;
-        private string spawnpointId_ = "";
-
-        public EncounterRequest()
-        {
-            OnConstruction();
-        }
-
-        public EncounterRequest(EncounterRequest other) : this()
-        {
-            encounterId_ = other.encounterId_;
-            spawnpointId_ = other.spawnpointId_;
-            playerLatitude_ = other.playerLatitude_;
-            playerLongitude_ = other.playerLongitude_;
-        }
-
-        public static pb::MessageParser<EncounterRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[55]; }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        public string SpawnpointId
-        {
-            get { return spawnpointId_; }
-            set { spawnpointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public double PlayerLatitude
-        {
-            get { return playerLatitude_; }
-            set { playerLatitude_ = value; }
-        }
-
-        public double PlayerLongitude
-        {
-            get { return playerLongitude_; }
-            set { playerLongitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EncounterRequest Clone()
-        {
-            return new EncounterRequest(this);
-        }
-
-        public bool Equals(EncounterRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (EncounterId != other.EncounterId) return false;
-            if (SpawnpointId != other.SpawnpointId) return false;
-            if (PlayerLatitude != other.PlayerLatitude) return false;
-            if (PlayerLongitude != other.PlayerLongitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(EncounterId);
-            }
-            if (SpawnpointId.Length != 0)
-            {
-                output.WriteRawTag(18);
-                output.WriteString(SpawnpointId);
-            }
-            if (PlayerLatitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(PlayerLatitude);
-            }
-            if (PlayerLongitude != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(PlayerLongitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (SpawnpointId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnpointId);
-            }
-            if (PlayerLatitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (PlayerLongitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(EncounterRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-            if (other.SpawnpointId.Length != 0)
-            {
-                SpawnpointId = other.SpawnpointId;
-            }
-            if (other.PlayerLatitude != 0D)
-            {
-                PlayerLatitude = other.PlayerLatitude;
-            }
-            if (other.PlayerLongitude != 0D)
-            {
-                PlayerLongitude = other.PlayerLongitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                    case 18:
-                        {
-                            SpawnpointId = input.ReadString();
-                            break;
-                        }
-                    case 25:
-                        {
-                            PlayerLatitude = input.ReadDouble();
-                            break;
-                        }
-                    case 33:
-                        {
-                            PlayerLongitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EncounterRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            if (SpawnpointId.Length != 0) hash ^= SpawnpointId.GetHashCode();
-            if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
-            if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EncounterResponse : pb::IMessage<EncounterResponse>
-    {
-        /// <summary>Field number for the "wild_pokemon" field.</summary>
-        public const int WildPokemonFieldNumber = 1;
-
-        /// <summary>Field number for the "background" field.</summary>
-        public const int BackgroundFieldNumber = 2;
-
-        /// <summary>Field number for the "status" field.</summary>
-        public const int StatusFieldNumber = 3;
-
-        /// <summary>Field number for the "capture_probability" field.</summary>
-        public const int CaptureProbabilityFieldNumber = 4;
-
-        private static readonly pb::MessageParser<EncounterResponse> _parser =
-            new pb::MessageParser<EncounterResponse>(() => new EncounterResponse());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Background background_ = 0;
-        private global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability captureProbability_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Status status_ = 0;
-        private global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon wildPokemon_;
-
-        public EncounterResponse()
-        {
-            OnConstruction();
-        }
-
-        public EncounterResponse(EncounterResponse other) : this()
-        {
-            WildPokemon = other.wildPokemon_ != null ? other.WildPokemon.Clone() : null;
-            background_ = other.background_;
-            status_ = other.status_;
-            CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
-        }
-
-        public static pb::MessageParser<EncounterResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[56]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon WildPokemon
-        {
-            get { return wildPokemon_; }
-            set { wildPokemon_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Background Background
-        {
-            get { return background_; }
-            set { background_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Status Status
-        {
-            get { return status_; }
-            set { status_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability CaptureProbability
-        {
-            get { return captureProbability_; }
-            set { captureProbability_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EncounterResponse Clone()
-        {
-            return new EncounterResponse(this);
-        }
-
-        public bool Equals(EncounterResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!Equals(WildPokemon, other.WildPokemon)) return false;
-            if (Background != other.Background) return false;
-            if (Status != other.Status) return false;
-            if (!Equals(CaptureProbability, other.CaptureProbability)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (wildPokemon_ != null)
-            {
-                output.WriteRawTag(10);
-                output.WriteMessage(WildPokemon);
-            }
-            if (Background != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)Background);
-            }
-            if (Status != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteEnum((int)Status);
-            }
-            if (captureProbability_ != null)
-            {
-                output.WriteRawTag(34);
-                output.WriteMessage(CaptureProbability);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (wildPokemon_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(WildPokemon);
-            }
-            if (Background != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Background);
-            }
-            if (Status != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Status);
-            }
-            if (captureProbability_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
-            }
-            return size;
-        }
-
-        public void MergeFrom(EncounterResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.wildPokemon_ != null)
-            {
-                if (wildPokemon_ == null)
-                {
-                    wildPokemon_ = new global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon();
-                }
-                WildPokemon.MergeFrom(other.WildPokemon);
-            }
-            if (other.Background != 0)
-            {
-                Background = other.Background;
-            }
-            if (other.Status != 0)
-            {
-                Status = other.Status;
-            }
-            if (other.captureProbability_ != null)
-            {
-                if (captureProbability_ == null)
-                {
-                    captureProbability_ = new global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability();
-                }
-                CaptureProbability.MergeFrom(other.CaptureProbability);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            if (wildPokemon_ == null)
-                            {
-                                wildPokemon_ = new global::PokemonGo.RocketAPI.GeneratedCode.WildPokemon();
-                            }
-                            input.ReadMessage(wildPokemon_);
-                            break;
-                        }
-                    case 16:
-                        {
-                            background_ =
-                                (global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Background)
-                                    input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            status_ =
-                                (global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Status)input.ReadEnum();
-                            break;
-                        }
-                    case 34:
-                        {
-                            if (captureProbability_ == null)
-                            {
-                                captureProbability_ = new global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability();
-                            }
-                            input.ReadMessage(captureProbability_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EncounterResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (wildPokemon_ != null) hash ^= WildPokemon.GetHashCode();
-            if (Background != 0) hash ^= Background.GetHashCode();
-            if (Status != 0) hash ^= Status.GetHashCode();
-            if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the EncounterResponse message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            public enum Background
-            {
-                [pbr::OriginalName("PARK")]
-                Park = 0,
-                [pbr::OriginalName("DESERT")]
-                Desert = 1,
-            }
-
-            public enum Status
-            {
-                [pbr::OriginalName("ENCOUNTER_ERROR")]
-                EncounterError = 0,
-                [pbr::OriginalName("ENCOUNTER_SUCCESS")]
-                EncounterSuccess = 1,
-                [pbr::OriginalName("ENCOUNTER_NOT_FOUND")]
-                EncounterNotFound = 2,
-                [pbr::OriginalName("ENCOUNTER_CLOSED")]
-                EncounterClosed = 3,
-                [pbr::OriginalName("ENCOUNTER_POKEMON_FLED")]
-                EncounterPokemonFled = 4,
-                [pbr::OriginalName("ENCOUNTER_NOT_IN_RANGE")]
-                EncounterNotInRange = 5,
-                [pbr::OriginalName("ENCOUNTER_ALREADY_HAPPENED")]
-                EncounterAlreadyHappened = 6,
-                [pbr::OriginalName("POKEMON_INVENTORY_FULL")]
-                PokemonInventoryFull = 7,
-            }
-        }
-
-        #endregion
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CaptureProbability : pb::IMessage<CaptureProbability>
-    {
-        /// <summary>Field number for the "pokeball_type" field.</summary>
-        public const int PokeballTypeFieldNumber = 1;
-
-        /// <summary>Field number for the "capture_probability" field.</summary>
-        public const int CaptureProbability_FieldNumber = 2;
-
-        /// <summary>Field number for the "reticle_difficulty_scale" field.</summary>
-        public const int ReticleDifficultyScaleFieldNumber = 12;
-
-        private static readonly pb::MessageParser<CaptureProbability> _parser =
-            new pb::MessageParser<CaptureProbability>(() => new CaptureProbability());
-
-        private static readonly pb::FieldCodec<global::AllEnum.ItemId> _repeated_pokeballType_codec
-            = pb::FieldCodec.ForEnum(10, x => (int)x, x => (global::AllEnum.ItemId)x);
-
-        private static readonly pb::FieldCodec<float> _repeated_captureProbability_codec
-            = pb::FieldCodec.ForFloat(18);
-
-        private readonly pbc::RepeatedField<float> captureProbability_ = new pbc::RepeatedField<float>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.ItemId> pokeballType_ =
-            new pbc::RepeatedField<global::AllEnum.ItemId>();
-
-        private double reticleDifficultyScale_;
-
-        public CaptureProbability()
-        {
-            OnConstruction();
-        }
-
-        public CaptureProbability(CaptureProbability other) : this()
-        {
-            pokeballType_ = other.pokeballType_.Clone();
-            captureProbability_ = other.captureProbability_.Clone();
-            reticleDifficultyScale_ = other.reticleDifficultyScale_;
-        }
-
-        public static pb::MessageParser<CaptureProbability> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[57]; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.ItemId> PokeballType
-        {
-            get { return pokeballType_; }
-        }
-
-        public pbc::RepeatedField<float> CaptureProbability_
-        {
-            get { return captureProbability_; }
-        }
-
-        public double ReticleDifficultyScale
-        {
-            get { return reticleDifficultyScale_; }
-            set { reticleDifficultyScale_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CaptureProbability Clone()
-        {
-            return new CaptureProbability(this);
-        }
-
-        public bool Equals(CaptureProbability other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!pokeballType_.Equals(other.pokeballType_)) return false;
-            if (!captureProbability_.Equals(other.captureProbability_)) return false;
-            if (ReticleDifficultyScale != other.ReticleDifficultyScale) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            pokeballType_.WriteTo(output, _repeated_pokeballType_codec);
-            captureProbability_.WriteTo(output, _repeated_captureProbability_codec);
-            if (ReticleDifficultyScale != 0D)
-            {
-                output.WriteRawTag(97);
-                output.WriteDouble(ReticleDifficultyScale);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += pokeballType_.CalculateSize(_repeated_pokeballType_codec);
-            size += captureProbability_.CalculateSize(_repeated_captureProbability_codec);
-            if (ReticleDifficultyScale != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(CaptureProbability other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            pokeballType_.Add(other.pokeballType_);
-            captureProbability_.Add(other.captureProbability_);
-            if (other.ReticleDifficultyScale != 0D)
-            {
-                ReticleDifficultyScale = other.ReticleDifficultyScale;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                    case 8:
-                        {
-                            pokeballType_.AddEntriesFrom(input, _repeated_pokeballType_codec);
-                            break;
-                        }
-                    case 18:
-                    case 21:
-                        {
-                            captureProbability_.AddEntriesFrom(input, _repeated_captureProbability_codec);
-                            break;
-                        }
-                    case 97:
-                        {
-                            ReticleDifficultyScale = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CaptureProbability);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= pokeballType_.GetHashCode();
-            hash ^= captureProbability_.GetHashCode();
-            if (ReticleDifficultyScale != 0D) hash ^= ReticleDifficultyScale.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DiskEncounterRequest : pb::IMessage<DiskEncounterRequest>
-    {
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 1;
-
-        /// <summary>Field number for the "fort_id" field.</summary>
-        public const int FortIdFieldNumber = 2;
-
-        /// <summary>Field number for the "player_latitude" field.</summary>
-        public const int PlayerLatitudeFieldNumber = 3;
-
-        /// <summary>Field number for the "player_longitude" field.</summary>
-        public const int PlayerLongitudeFieldNumber = 4;
-
-        private static readonly pb::MessageParser<DiskEncounterRequest> _parser =
-            new pb::MessageParser<DiskEncounterRequest>(() => new DiskEncounterRequest());
-
-        private ulong encounterId_;
-        private string fortId_ = "";
-        private double playerLatitude_;
-        private double playerLongitude_;
-
-        public DiskEncounterRequest()
-        {
-            OnConstruction();
-        }
-
-        public DiskEncounterRequest(DiskEncounterRequest other) : this()
-        {
-            encounterId_ = other.encounterId_;
-            fortId_ = other.fortId_;
-            playerLatitude_ = other.playerLatitude_;
-            playerLongitude_ = other.playerLongitude_;
-        }
-
-        public static pb::MessageParser<DiskEncounterRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[58]; }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        public string FortId
-        {
-            get { return fortId_; }
-            set { fortId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public double PlayerLatitude
-        {
-            get { return playerLatitude_; }
-            set { playerLatitude_ = value; }
-        }
-
-        public double PlayerLongitude
-        {
-            get { return playerLongitude_; }
-            set { playerLongitude_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DiskEncounterRequest Clone()
-        {
-            return new DiskEncounterRequest(this);
-        }
-
-        public bool Equals(DiskEncounterRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (EncounterId != other.EncounterId) return false;
-            if (FortId != other.FortId) return false;
-            if (PlayerLatitude != other.PlayerLatitude) return false;
-            if (PlayerLongitude != other.PlayerLongitude) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(EncounterId);
-            }
-            if (FortId.Length != 0)
-            {
-                output.WriteRawTag(18);
-                output.WriteString(FortId);
-            }
-            if (PlayerLatitude != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(PlayerLatitude);
-            }
-            if (PlayerLongitude != 0D)
-            {
-                output.WriteRawTag(33);
-                output.WriteDouble(PlayerLongitude);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (FortId.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(FortId);
-            }
-            if (PlayerLatitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (PlayerLongitude != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(DiskEncounterRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-            if (other.FortId.Length != 0)
-            {
-                FortId = other.FortId;
-            }
-            if (other.PlayerLatitude != 0D)
-            {
-                PlayerLatitude = other.PlayerLatitude;
-            }
-            if (other.PlayerLongitude != 0D)
-            {
-                PlayerLongitude = other.PlayerLongitude;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                    case 18:
-                        {
-                            FortId = input.ReadString();
-                            break;
-                        }
-                    case 25:
-                        {
-                            PlayerLatitude = input.ReadDouble();
-                            break;
-                        }
-                    case 33:
-                        {
-                            PlayerLongitude = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DiskEncounterRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            if (FortId.Length != 0) hash ^= FortId.GetHashCode();
-            if (PlayerLatitude != 0D) hash ^= PlayerLatitude.GetHashCode();
-            if (PlayerLongitude != 0D) hash ^= PlayerLongitude.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class DiskEncounterResponse : pb::IMessage<DiskEncounterResponse>
-    {
-        /// <summary>Field number for the "result" field.</summary>
-        public const int ResultFieldNumber = 1;
-
-        /// <summary>Field number for the "pokemon_data" field.</summary>
-        public const int PokemonDataFieldNumber = 2;
-
-        /// <summary>Field number for the "capture_probability" field.</summary>
-        public const int CaptureProbabilityFieldNumber = 3;
-
-        private static readonly pb::MessageParser<DiskEncounterResponse> _parser =
-            new pb::MessageParser<DiskEncounterResponse>(() => new DiskEncounterResponse());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability captureProbability_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokemonData pokemonData_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterResponse.Types.Result result_ = 0;
-
-        public DiskEncounterResponse()
-        {
-            OnConstruction();
-        }
-
-        public DiskEncounterResponse(DiskEncounterResponse other) : this()
-        {
-            result_ = other.result_;
-            PokemonData = other.pokemonData_ != null ? other.PokemonData.Clone() : null;
-            CaptureProbability = other.captureProbability_ != null ? other.CaptureProbability.Clone() : null;
-        }
-
-        public static pb::MessageParser<DiskEncounterResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[59]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterResponse.Types.Result Result
-        {
-            get { return result_; }
-            set { result_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokemonData PokemonData
-        {
-            get { return pokemonData_; }
-            set { pokemonData_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability CaptureProbability
-        {
-            get { return captureProbability_; }
-            set { captureProbability_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public DiskEncounterResponse Clone()
-        {
-            return new DiskEncounterResponse(this);
-        }
-
-        public bool Equals(DiskEncounterResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Result != other.Result) return false;
-            if (!Equals(PokemonData, other.PokemonData)) return false;
-            if (!Equals(CaptureProbability, other.CaptureProbability)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Result != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)Result);
-            }
-            if (pokemonData_ != null)
-            {
-                output.WriteRawTag(18);
-                output.WriteMessage(PokemonData);
-            }
-            if (captureProbability_ != null)
-            {
-                output.WriteRawTag(26);
-                output.WriteMessage(CaptureProbability);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Result != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Result);
-            }
-            if (pokemonData_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(PokemonData);
-            }
-            if (captureProbability_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(CaptureProbability);
-            }
-            return size;
-        }
-
-        public void MergeFrom(DiskEncounterResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Result != 0)
-            {
-                Result = other.Result;
-            }
-            if (other.pokemonData_ != null)
-            {
-                if (pokemonData_ == null)
-                {
-                    pokemonData_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                }
-                PokemonData.MergeFrom(other.PokemonData);
-            }
-            if (other.captureProbability_ != null)
-            {
-                if (captureProbability_ == null)
-                {
-                    captureProbability_ = new global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability();
-                }
-                CaptureProbability.MergeFrom(other.CaptureProbability);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            result_ =
-                                (global::PokemonGo.RocketAPI.GeneratedCode.DiskEncounterResponse.Types.Result)
-                                    input.ReadEnum();
-                            break;
-                        }
-                    case 18:
-                        {
-                            if (pokemonData_ == null)
-                            {
-                                pokemonData_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokemonData();
-                            }
-                            input.ReadMessage(pokemonData_);
-                            break;
-                        }
-                    case 26:
-                        {
-                            if (captureProbability_ == null)
-                            {
-                                captureProbability_ = new global::PokemonGo.RocketAPI.GeneratedCode.CaptureProbability();
-                            }
-                            input.ReadMessage(captureProbability_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as DiskEncounterResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Result != 0) hash ^= Result.GetHashCode();
-            if (pokemonData_ != null) hash ^= PokemonData.GetHashCode();
-            if (captureProbability_ != null) hash ^= CaptureProbability.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the DiskEncounterResponse message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            public enum Result
-            {
-                [pbr::OriginalName("UNKNOWN")]
-                Unknown = 0,
-                [pbr::OriginalName("SUCCESS")]
-                Success = 1,
-                [pbr::OriginalName("NOT_AVAILABLE")]
-                NotAvailable = 2,
-                [pbr::OriginalName("NOT_IN_RANGE")]
-                NotInRange = 3,
-                [pbr::OriginalName("ENCOUNTER_ALREADY_FINISHED")]
-                EncounterAlreadyFinished = 4,
-                [pbr::OriginalName("POKEMON_INVENTORY_FULL")]
-                PokemonInventoryFull = 5,
-            }
-        }
-
-        #endregion
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CatchPokemonRequest : pb::IMessage<CatchPokemonRequest>
-    {
-        /// <summary>Field number for the "encounter_id" field.</summary>
-        public const int EncounterIdFieldNumber = 1;
-
-        /// <summary>Field number for the "pokeball" field.</summary>
-        public const int PokeballFieldNumber = 2;
-
-        /// <summary>Field number for the "normalized_reticle_size" field.</summary>
-        public const int NormalizedReticleSizeFieldNumber = 3;
-
-        /// <summary>Field number for the "spawn_point_guid" field.</summary>
-        public const int SpawnPointGuidFieldNumber = 4;
-
-        /// <summary>Field number for the "hit_pokemon" field.</summary>
-        public const int HitPokemonFieldNumber = 5;
-
-        /// <summary>Field number for the "spin_modifier" field.</summary>
-        public const int SpinModifierFieldNumber = 6;
-
-        /// <summary>Field number for the "NormalizedHitPosition" field.</summary>
-        public const int NormalizedHitPositionFieldNumber = 7;
-
-        private static readonly pb::MessageParser<CatchPokemonRequest> _parser =
-            new pb::MessageParser<CatchPokemonRequest>(() => new CatchPokemonRequest());
-
-        private ulong encounterId_;
-        private bool hitPokemon_;
-        private double normalizedHitPosition_;
-        private double normalizedReticleSize_;
-        private int pokeball_;
-        private string spawnPointGuid_ = "";
-        private double spinModifier_;
-
-        public CatchPokemonRequest()
-        {
-            OnConstruction();
-        }
-
-        public CatchPokemonRequest(CatchPokemonRequest other) : this()
-        {
-            encounterId_ = other.encounterId_;
-            pokeball_ = other.pokeball_;
-            normalizedReticleSize_ = other.normalizedReticleSize_;
-            spawnPointGuid_ = other.spawnPointGuid_;
-            hitPokemon_ = other.hitPokemon_;
-            spinModifier_ = other.spinModifier_;
-            normalizedHitPosition_ = other.normalizedHitPosition_;
-        }
-
-        public static pb::MessageParser<CatchPokemonRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[60]; }
-        }
-
-        public ulong EncounterId
-        {
-            get { return encounterId_; }
-            set { encounterId_ = value; }
-        }
-
-        public int Pokeball
-        {
-            get { return pokeball_; }
-            set { pokeball_ = value; }
-        }
-
-        public double NormalizedReticleSize
-        {
-            get { return normalizedReticleSize_; }
-            set { normalizedReticleSize_ = value; }
-        }
-
-        public string SpawnPointGuid
-        {
-            get { return spawnPointGuid_; }
-            set { spawnPointGuid_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public bool HitPokemon
-        {
-            get { return hitPokemon_; }
-            set { hitPokemon_ = value; }
-        }
-
-        public double SpinModifier
-        {
-            get { return spinModifier_; }
-            set { spinModifier_ = value; }
-        }
-
-        public double NormalizedHitPosition
-        {
-            get { return normalizedHitPosition_; }
-            set { normalizedHitPosition_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CatchPokemonRequest Clone()
-        {
-            return new CatchPokemonRequest(this);
-        }
-
-        public bool Equals(CatchPokemonRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (EncounterId != other.EncounterId) return false;
-            if (Pokeball != other.Pokeball) return false;
-            if (NormalizedReticleSize != other.NormalizedReticleSize) return false;
-            if (SpawnPointGuid != other.SpawnPointGuid) return false;
-            if (HitPokemon != other.HitPokemon) return false;
-            if (SpinModifier != other.SpinModifier) return false;
-            if (NormalizedHitPosition != other.NormalizedHitPosition) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (EncounterId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(EncounterId);
-            }
-            if (Pokeball != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(Pokeball);
-            }
-            if (NormalizedReticleSize != 0D)
-            {
-                output.WriteRawTag(25);
-                output.WriteDouble(NormalizedReticleSize);
-            }
-            if (SpawnPointGuid.Length != 0)
-            {
-                output.WriteRawTag(34);
-                output.WriteString(SpawnPointGuid);
-            }
-            if (HitPokemon != false)
-            {
-                output.WriteRawTag(40);
-                output.WriteBool(HitPokemon);
-            }
-            if (SpinModifier != 0D)
-            {
-                output.WriteRawTag(49);
-                output.WriteDouble(SpinModifier);
-            }
-            if (NormalizedHitPosition != 0D)
-            {
-                output.WriteRawTag(57);
-                output.WriteDouble(NormalizedHitPosition);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (EncounterId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (Pokeball != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Pokeball);
-            }
-            if (NormalizedReticleSize != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (SpawnPointGuid.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointGuid);
-            }
-            if (HitPokemon != false)
-            {
-                size += 1 + 1;
-            }
-            if (SpinModifier != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (NormalizedHitPosition != 0D)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(CatchPokemonRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.EncounterId != 0UL)
-            {
-                EncounterId = other.EncounterId;
-            }
-            if (other.Pokeball != 0)
-            {
-                Pokeball = other.Pokeball;
-            }
-            if (other.NormalizedReticleSize != 0D)
-            {
-                NormalizedReticleSize = other.NormalizedReticleSize;
-            }
-            if (other.SpawnPointGuid.Length != 0)
-            {
-                SpawnPointGuid = other.SpawnPointGuid;
-            }
-            if (other.HitPokemon != false)
-            {
-                HitPokemon = other.HitPokemon;
-            }
-            if (other.SpinModifier != 0D)
-            {
-                SpinModifier = other.SpinModifier;
-            }
-            if (other.NormalizedHitPosition != 0D)
-            {
-                NormalizedHitPosition = other.NormalizedHitPosition;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            EncounterId = input.ReadFixed64();
-                            break;
-                        }
-                    case 16:
-                        {
-                            Pokeball = input.ReadInt32();
-                            break;
-                        }
-                    case 25:
-                        {
-                            NormalizedReticleSize = input.ReadDouble();
-                            break;
-                        }
-                    case 34:
-                        {
-                            SpawnPointGuid = input.ReadString();
-                            break;
-                        }
-                    case 40:
-                        {
-                            HitPokemon = input.ReadBool();
-                            break;
-                        }
-                    case 49:
-                        {
-                            SpinModifier = input.ReadDouble();
-                            break;
-                        }
-                    case 57:
-                        {
-                            NormalizedHitPosition = input.ReadDouble();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CatchPokemonRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-            if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
-            if (NormalizedReticleSize != 0D) hash ^= NormalizedReticleSize.GetHashCode();
-            if (SpawnPointGuid.Length != 0) hash ^= SpawnPointGuid.GetHashCode();
-            if (HitPokemon != false) hash ^= HitPokemon.GetHashCode();
-            if (SpinModifier != 0D) hash ^= SpinModifier.GetHashCode();
-            if (NormalizedHitPosition != 0D) hash ^= NormalizedHitPosition.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CatchPokemonResponse : pb::IMessage<CatchPokemonResponse>
-    {
-        /// <summary>Field number for the "status" field.</summary>
-        public const int StatusFieldNumber = 1;
-
-        /// <summary>Field number for the "miss_percent" field.</summary>
-        public const int MissPercentFieldNumber = 2;
-
-        /// <summary>Field number for the "captured_pokemon_id" field.</summary>
-        public const int CapturedPokemonIdFieldNumber = 3;
-
-        /// <summary>Field number for the "scores" field.</summary>
-        public const int ScoresFieldNumber = 4;
-
-        private static readonly pb::MessageParser<CatchPokemonResponse> _parser =
-            new pb::MessageParser<CatchPokemonResponse>(() => new CatchPokemonResponse());
-
-        private ulong capturedPokemonId_;
-        private double missPercent_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.CaptureScore scores_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.CatchStatus status_ = 0;
-
-        public CatchPokemonResponse()
-        {
-            OnConstruction();
-        }
-
-        public CatchPokemonResponse(CatchPokemonResponse other) : this()
-        {
-            status_ = other.status_;
-            missPercent_ = other.missPercent_;
-            capturedPokemonId_ = other.capturedPokemonId_;
-            Scores = other.scores_ != null ? other.Scores.Clone() : null;
-        }
-
-        public static pb::MessageParser<CatchPokemonResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[61]; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.CatchStatus Status
-        {
-            get { return status_; }
-            set { status_ = value; }
-        }
-
-        public double MissPercent
-        {
-            get { return missPercent_; }
-            set { missPercent_ = value; }
-        }
-
-        public ulong CapturedPokemonId
-        {
-            get { return capturedPokemonId_; }
-            set { capturedPokemonId_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.CaptureScore Scores
-        {
-            get { return scores_; }
-            set { scores_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CatchPokemonResponse Clone()
-        {
-            return new CatchPokemonResponse(this);
-        }
-
-        public bool Equals(CatchPokemonResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Status != other.Status) return false;
-            if (MissPercent != other.MissPercent) return false;
-            if (CapturedPokemonId != other.CapturedPokemonId) return false;
-            if (!Equals(Scores, other.Scores)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Status != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)Status);
-            }
-            if (MissPercent != 0D)
-            {
-                output.WriteRawTag(17);
-                output.WriteDouble(MissPercent);
-            }
-            if (CapturedPokemonId != 0UL)
-            {
-                output.WriteRawTag(24);
-                output.WriteUInt64(CapturedPokemonId);
-            }
-            if (scores_ != null)
-            {
-                output.WriteRawTag(34);
-                output.WriteMessage(Scores);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Status != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Status);
-            }
-            if (MissPercent != 0D)
-            {
-                size += 1 + 8;
-            }
-            if (CapturedPokemonId != 0UL)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeUInt64Size(CapturedPokemonId);
-            }
-            if (scores_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Scores);
-            }
-            return size;
-        }
-
-        public void MergeFrom(CatchPokemonResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Status != 0)
-            {
-                Status = other.Status;
-            }
-            if (other.MissPercent != 0D)
-            {
-                MissPercent = other.MissPercent;
-            }
-            if (other.CapturedPokemonId != 0UL)
-            {
-                CapturedPokemonId = other.CapturedPokemonId;
-            }
-            if (other.scores_ != null)
-            {
-                if (scores_ == null)
-                {
-                    scores_ = new global::PokemonGo.RocketAPI.GeneratedCode.CaptureScore();
-                }
-                Scores.MergeFrom(other.Scores);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            status_ =
-                                (global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.CatchStatus)
-                                    input.ReadEnum();
-                            break;
-                        }
-                    case 17:
-                        {
-                            MissPercent = input.ReadDouble();
-                            break;
-                        }
-                    case 24:
-                        {
-                            CapturedPokemonId = input.ReadUInt64();
-                            break;
-                        }
-                    case 34:
-                        {
-                            if (scores_ == null)
-                            {
-                                scores_ = new global::PokemonGo.RocketAPI.GeneratedCode.CaptureScore();
-                            }
-                            input.ReadMessage(scores_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CatchPokemonResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Status != 0) hash ^= Status.GetHashCode();
-            if (MissPercent != 0D) hash ^= MissPercent.GetHashCode();
-            if (CapturedPokemonId != 0UL) hash ^= CapturedPokemonId.GetHashCode();
-            if (scores_ != null) hash ^= Scores.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the CatchPokemonResponse message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            public enum CatchStatus
-            {
-                [pbr::OriginalName("CATCH_ERROR")]
-                CatchError = 0,
-                [pbr::OriginalName("CATCH_SUCCESS")]
-                CatchSuccess = 1,
-                [pbr::OriginalName("CATCH_ESCAPE")]
-                CatchEscape = 2,
-                [pbr::OriginalName("CATCH_FLEE")]
-                CatchFlee = 3,
-                [pbr::OriginalName("CATCH_MISSED")]
-                CatchMissed = 4,
-            }
-        }
-
-        #endregion
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CaptureScore : pb::IMessage<CaptureScore>
-    {
-        /// <summary>Field number for the "activity_type" field.</summary>
-        public const int ActivityTypeFieldNumber = 1;
-
-        /// <summary>Field number for the "xp" field.</summary>
-        public const int XpFieldNumber = 2;
-
-        /// <summary>Field number for the "candy" field.</summary>
-        public const int CandyFieldNumber = 3;
-
-        /// <summary>Field number for the "stardust" field.</summary>
-        public const int StardustFieldNumber = 4;
-
-        private static readonly pb::MessageParser<CaptureScore> _parser =
-            new pb::MessageParser<CaptureScore>(() => new CaptureScore());
-
-        private static readonly pb::FieldCodec<global::AllEnum.ActivityType> _repeated_activityType_codec
-            = pb::FieldCodec.ForEnum(10, x => (int)x, x => (global::AllEnum.ActivityType)x);
-
-        private static readonly pb::FieldCodec<int> _repeated_xp_codec
-            = pb::FieldCodec.ForInt32(18);
-
-        private static readonly pb::FieldCodec<int> _repeated_candy_codec
-            = pb::FieldCodec.ForInt32(26);
-
-        private static readonly pb::FieldCodec<int> _repeated_stardust_codec
-            = pb::FieldCodec.ForInt32(34);
-
-        private readonly pbc::RepeatedField<global::AllEnum.ActivityType> activityType_ =
-            new pbc::RepeatedField<global::AllEnum.ActivityType>();
-
-        private readonly pbc::RepeatedField<int> candy_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> stardust_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> xp_ = new pbc::RepeatedField<int>();
-
-        public CaptureScore()
-        {
-            OnConstruction();
-        }
-
-        public CaptureScore(CaptureScore other) : this()
-        {
-            activityType_ = other.activityType_.Clone();
-            xp_ = other.xp_.Clone();
-            candy_ = other.candy_.Clone();
-            stardust_ = other.stardust_.Clone();
-        }
-
-        public static pb::MessageParser<CaptureScore> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[62]; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.ActivityType> ActivityType
-        {
-            get { return activityType_; }
-        }
-
-        public pbc::RepeatedField<int> Xp
-        {
-            get { return xp_; }
-        }
-
-        public pbc::RepeatedField<int> Candy
-        {
-            get { return candy_; }
-        }
-
-        public pbc::RepeatedField<int> Stardust
-        {
-            get { return stardust_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CaptureScore Clone()
-        {
-            return new CaptureScore(this);
-        }
-
-        public bool Equals(CaptureScore other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!activityType_.Equals(other.activityType_)) return false;
-            if (!xp_.Equals(other.xp_)) return false;
-            if (!candy_.Equals(other.candy_)) return false;
-            if (!stardust_.Equals(other.stardust_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            activityType_.WriteTo(output, _repeated_activityType_codec);
-            xp_.WriteTo(output, _repeated_xp_codec);
-            candy_.WriteTo(output, _repeated_candy_codec);
-            stardust_.WriteTo(output, _repeated_stardust_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += activityType_.CalculateSize(_repeated_activityType_codec);
-            size += xp_.CalculateSize(_repeated_xp_codec);
-            size += candy_.CalculateSize(_repeated_candy_codec);
-            size += stardust_.CalculateSize(_repeated_stardust_codec);
-            return size;
-        }
-
-        public void MergeFrom(CaptureScore other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            activityType_.Add(other.activityType_);
-            xp_.Add(other.xp_);
-            candy_.Add(other.candy_);
-            stardust_.Add(other.stardust_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                    case 8:
-                        {
-                            activityType_.AddEntriesFrom(input, _repeated_activityType_codec);
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            xp_.AddEntriesFrom(input, _repeated_xp_codec);
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            candy_.AddEntriesFrom(input, _repeated_candy_codec);
-                            break;
-                        }
-                    case 34:
-                    case 32:
-                        {
-                            stardust_.AddEntriesFrom(input, _repeated_stardust_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CaptureScore);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= activityType_.GetHashCode();
-            hash ^= xp_.GetHashCode();
-            hash ^= candy_.GetHashCode();
-            hash ^= stardust_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    /// <summary>
-    ///     No message needed.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CheckAwardedBadgesRequest : pb::IMessage<CheckAwardedBadgesRequest>
-    {
-        private static readonly pb::MessageParser<CheckAwardedBadgesRequest> _parser =
-            new pb::MessageParser<CheckAwardedBadgesRequest>(() => new CheckAwardedBadgesRequest());
-
-        public CheckAwardedBadgesRequest()
-        {
-            OnConstruction();
-        }
-
-        public CheckAwardedBadgesRequest(CheckAwardedBadgesRequest other) : this()
-        {
-        }
-
-        public static pb::MessageParser<CheckAwardedBadgesRequest> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[63]; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CheckAwardedBadgesRequest Clone()
-        {
-            return new CheckAwardedBadgesRequest(this);
-        }
-
-        public bool Equals(CheckAwardedBadgesRequest other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            return size;
-        }
-
-        public void MergeFrom(CheckAwardedBadgesRequest other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CheckAwardedBadgesRequest);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    /// <summary>
-    ///     Confirm if this is correct, I think that it should be "repeated AwardedBadge awarded_badges" or something like
-    ///     that.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CheckAwardedBadgesResponse : pb::IMessage<CheckAwardedBadgesResponse>
-    {
-        /// <summary>Field number for the "success" field.</summary>
-        public const int SuccessFieldNumber = 1;
-
-        /// <summary>Field number for the "awarded_badges" field.</summary>
-        public const int AwardedBadgesFieldNumber = 2;
-
-        /// <summary>Field number for the "awarded_badge_levels" field.</summary>
-        public const int AwardedBadgeLevelsFieldNumber = 3;
-
-        private static readonly pb::MessageParser<CheckAwardedBadgesResponse> _parser =
-            new pb::MessageParser<CheckAwardedBadgesResponse>(() => new CheckAwardedBadgesResponse());
-
-        private static readonly pb::FieldCodec<global::AllEnum.BadgeType> _repeated_awardedBadges_codec
-            = pb::FieldCodec.ForEnum(18, x => (int)x, x => (global::AllEnum.BadgeType)x);
-
-        private static readonly pb::FieldCodec<int> _repeated_awardedBadgeLevels_codec
-            = pb::FieldCodec.ForInt32(26);
-
-        private readonly pbc::RepeatedField<int> awardedBadgeLevels_ = new pbc::RepeatedField<int>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.BadgeType> awardedBadges_ =
-            new pbc::RepeatedField<global::AllEnum.BadgeType>();
-
-        private bool success_;
-
-        public CheckAwardedBadgesResponse()
-        {
-            OnConstruction();
-        }
-
-        public CheckAwardedBadgesResponse(CheckAwardedBadgesResponse other) : this()
-        {
-            success_ = other.success_;
-            awardedBadges_ = other.awardedBadges_.Clone();
-            awardedBadgeLevels_ = other.awardedBadgeLevels_.Clone();
-        }
-
-        public static pb::MessageParser<CheckAwardedBadgesResponse> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[64]; }
-        }
-
-        public bool Success
-        {
-            get { return success_; }
-            set { success_ = value; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.BadgeType> AwardedBadges
-        {
-            get { return awardedBadges_; }
-        }
-
-        public pbc::RepeatedField<int> AwardedBadgeLevels
-        {
-            get { return awardedBadgeLevels_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CheckAwardedBadgesResponse Clone()
-        {
-            return new CheckAwardedBadgesResponse(this);
-        }
-
-        public bool Equals(CheckAwardedBadgesResponse other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Success != other.Success) return false;
-            if (!awardedBadges_.Equals(other.awardedBadges_)) return false;
-            if (!awardedBadgeLevels_.Equals(other.awardedBadgeLevels_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Success != false)
-            {
-                output.WriteRawTag(8);
-                output.WriteBool(Success);
-            }
-            awardedBadges_.WriteTo(output, _repeated_awardedBadges_codec);
-            awardedBadgeLevels_.WriteTo(output, _repeated_awardedBadgeLevels_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Success != false)
-            {
-                size += 1 + 1;
-            }
-            size += awardedBadges_.CalculateSize(_repeated_awardedBadges_codec);
-            size += awardedBadgeLevels_.CalculateSize(_repeated_awardedBadgeLevels_codec);
-            return size;
-        }
-
-        public void MergeFrom(CheckAwardedBadgesResponse other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Success != false)
-            {
-                Success = other.Success;
-            }
-            awardedBadges_.Add(other.awardedBadges_);
-            awardedBadgeLevels_.Add(other.awardedBadgeLevels_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Success = input.ReadBool();
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            awardedBadges_.AddEntriesFrom(input, _repeated_awardedBadges_codec);
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            awardedBadgeLevels_.AddEntriesFrom(input, _repeated_awardedBadgeLevels_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CheckAwardedBadgesResponse);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Success != false) hash ^= Success.GetHashCode();
-            hash ^= awardedBadges_.GetHashCode();
-            hash ^= awardedBadgeLevels_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EquippedBadgeSettings : pb::IMessage<EquippedBadgeSettings>
-    {
-        /// <summary>Field number for the "equip_badge_cooldown_ms" field.</summary>
-        public const int EquipBadgeCooldownMsFieldNumber = 1;
-
-        /// <summary>Field number for the "catch_probability_bonus" field.</summary>
-        public const int CatchProbabilityBonusFieldNumber = 2;
-
-        /// <summary>Field number for the "flee_probability_bonus" field.</summary>
-        public const int FleeProbabilityBonusFieldNumber = 3;
-
-        private static readonly pb::MessageParser<EquippedBadgeSettings> _parser =
-            new pb::MessageParser<EquippedBadgeSettings>(() => new EquippedBadgeSettings());
-
-        private static readonly pb::FieldCodec<float> _repeated_catchProbabilityBonus_codec
-            = pb::FieldCodec.ForFloat(18);
-
-        private static readonly pb::FieldCodec<float> _repeated_fleeProbabilityBonus_codec
-            = pb::FieldCodec.ForFloat(26);
-
-        private readonly pbc::RepeatedField<float> catchProbabilityBonus_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> fleeProbabilityBonus_ = new pbc::RepeatedField<float>();
-        private long equipBadgeCooldownMs_;
-
-        public EquippedBadgeSettings()
-        {
-            OnConstruction();
-        }
-
-        public EquippedBadgeSettings(EquippedBadgeSettings other) : this()
-        {
-            equipBadgeCooldownMs_ = other.equipBadgeCooldownMs_;
-            catchProbabilityBonus_ = other.catchProbabilityBonus_.Clone();
-            fleeProbabilityBonus_ = other.fleeProbabilityBonus_.Clone();
-        }
-
-        public static pb::MessageParser<EquippedBadgeSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[65]; }
-        }
-
-        public long EquipBadgeCooldownMs
-        {
-            get { return equipBadgeCooldownMs_; }
-            set { equipBadgeCooldownMs_ = value; }
-        }
-
-        public pbc::RepeatedField<float> CatchProbabilityBonus
-        {
-            get { return catchProbabilityBonus_; }
-        }
-
-        public pbc::RepeatedField<float> FleeProbabilityBonus
-        {
-            get { return fleeProbabilityBonus_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EquippedBadgeSettings Clone()
-        {
-            return new EquippedBadgeSettings(this);
-        }
-
-        public bool Equals(EquippedBadgeSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (EquipBadgeCooldownMs != other.EquipBadgeCooldownMs) return false;
-            if (!catchProbabilityBonus_.Equals(other.catchProbabilityBonus_)) return false;
-            if (!fleeProbabilityBonus_.Equals(other.fleeProbabilityBonus_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (EquipBadgeCooldownMs != 0L)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt64(EquipBadgeCooldownMs);
-            }
-            catchProbabilityBonus_.WriteTo(output, _repeated_catchProbabilityBonus_codec);
-            fleeProbabilityBonus_.WriteTo(output, _repeated_fleeProbabilityBonus_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (EquipBadgeCooldownMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(EquipBadgeCooldownMs);
-            }
-            size += catchProbabilityBonus_.CalculateSize(_repeated_catchProbabilityBonus_codec);
-            size += fleeProbabilityBonus_.CalculateSize(_repeated_fleeProbabilityBonus_codec);
-            return size;
-        }
-
-        public void MergeFrom(EquippedBadgeSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.EquipBadgeCooldownMs != 0L)
-            {
-                EquipBadgeCooldownMs = other.EquipBadgeCooldownMs;
-            }
-            catchProbabilityBonus_.Add(other.catchProbabilityBonus_);
-            fleeProbabilityBonus_.Add(other.fleeProbabilityBonus_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            EquipBadgeCooldownMs = input.ReadInt64();
-                            break;
-                        }
-                    case 18:
-                    case 21:
-                        {
-                            catchProbabilityBonus_.AddEntriesFrom(input, _repeated_catchProbabilityBonus_codec);
-                            break;
-                        }
-                    case 26:
-                    case 29:
-                        {
-                            fleeProbabilityBonus_.AddEntriesFrom(input, _repeated_fleeProbabilityBonus_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EquippedBadgeSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (EquipBadgeCooldownMs != 0L) hash ^= EquipBadgeCooldownMs.GetHashCode();
-            hash ^= catchProbabilityBonus_.GetHashCode();
-            hash ^= fleeProbabilityBonus_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PokemonUpgradeSettings : pb::IMessage<PokemonUpgradeSettings>
-    {
-        /// <summary>Field number for the "upgrades_per_level" field.</summary>
-        public const int UpgradesPerLevelFieldNumber = 1;
-
-        /// <summary>Field number for the "allowed_levels_above_player" field.</summary>
-        public const int AllowedLevelsAbovePlayerFieldNumber = 2;
-
-        /// <summary>Field number for the "candy_cost" field.</summary>
-        public const int CandyCostFieldNumber = 3;
-
-        /// <summary>Field number for the "stardust_cost" field.</summary>
-        public const int StardustCostFieldNumber = 4;
-
-        private static readonly pb::MessageParser<PokemonUpgradeSettings> _parser =
-            new pb::MessageParser<PokemonUpgradeSettings>(() => new PokemonUpgradeSettings());
-
-        private static readonly pb::FieldCodec<int> _repeated_candyCost_codec
-            = pb::FieldCodec.ForInt32(26);
-
-        private static readonly pb::FieldCodec<int> _repeated_stardustCost_codec
-            = pb::FieldCodec.ForInt32(34);
-
-        private readonly pbc::RepeatedField<int> candyCost_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> stardustCost_ = new pbc::RepeatedField<int>();
-        private int allowedLevelsAbovePlayer_;
-        private int upgradesPerLevel_;
-
-        public PokemonUpgradeSettings()
-        {
-            OnConstruction();
-        }
-
-        public PokemonUpgradeSettings(PokemonUpgradeSettings other) : this()
-        {
-            upgradesPerLevel_ = other.upgradesPerLevel_;
-            allowedLevelsAbovePlayer_ = other.allowedLevelsAbovePlayer_;
-            candyCost_ = other.candyCost_.Clone();
-            stardustCost_ = other.stardustCost_.Clone();
-        }
-
-        public static pb::MessageParser<PokemonUpgradeSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[66]; }
-        }
-
-        public int UpgradesPerLevel
-        {
-            get { return upgradesPerLevel_; }
-            set { upgradesPerLevel_ = value; }
-        }
-
-        public int AllowedLevelsAbovePlayer
-        {
-            get { return allowedLevelsAbovePlayer_; }
-            set { allowedLevelsAbovePlayer_ = value; }
-        }
-
-        public pbc::RepeatedField<int> CandyCost
-        {
-            get { return candyCost_; }
-        }
-
-        public pbc::RepeatedField<int> StardustCost
-        {
-            get { return stardustCost_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PokemonUpgradeSettings Clone()
-        {
-            return new PokemonUpgradeSettings(this);
-        }
-
-        public bool Equals(PokemonUpgradeSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (UpgradesPerLevel != other.UpgradesPerLevel) return false;
-            if (AllowedLevelsAbovePlayer != other.AllowedLevelsAbovePlayer) return false;
-            if (!candyCost_.Equals(other.candyCost_)) return false;
-            if (!stardustCost_.Equals(other.stardustCost_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (UpgradesPerLevel != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(UpgradesPerLevel);
-            }
-            if (AllowedLevelsAbovePlayer != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(AllowedLevelsAbovePlayer);
-            }
-            candyCost_.WriteTo(output, _repeated_candyCost_codec);
-            stardustCost_.WriteTo(output, _repeated_stardustCost_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (UpgradesPerLevel != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(UpgradesPerLevel);
-            }
-            if (AllowedLevelsAbovePlayer != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(AllowedLevelsAbovePlayer);
-            }
-            size += candyCost_.CalculateSize(_repeated_candyCost_codec);
-            size += stardustCost_.CalculateSize(_repeated_stardustCost_codec);
-            return size;
-        }
-
-        public void MergeFrom(PokemonUpgradeSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.UpgradesPerLevel != 0)
-            {
-                UpgradesPerLevel = other.UpgradesPerLevel;
-            }
-            if (other.AllowedLevelsAbovePlayer != 0)
-            {
-                AllowedLevelsAbovePlayer = other.AllowedLevelsAbovePlayer;
-            }
-            candyCost_.Add(other.candyCost_);
-            stardustCost_.Add(other.stardustCost_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            UpgradesPerLevel = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            AllowedLevelsAbovePlayer = input.ReadInt32();
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            candyCost_.AddEntriesFrom(input, _repeated_candyCost_codec);
-                            break;
-                        }
-                    case 34:
-                    case 32:
-                        {
-                            stardustCost_.AddEntriesFrom(input, _repeated_stardustCost_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PokemonUpgradeSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (UpgradesPerLevel != 0) hash ^= UpgradesPerLevel.GetHashCode();
-            if (AllowedLevelsAbovePlayer != 0) hash ^= AllowedLevelsAbovePlayer.GetHashCode();
-            hash ^= candyCost_.GetHashCode();
-            hash ^= stardustCost_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class IapSettings : pb::IMessage<IapSettings>
-    {
-        /// <summary>Field number for the "daily_bonus_coins" field.</summary>
-        public const int DailyBonusCoinsFieldNumber = 1;
-
-        /// <summary>Field number for the "daily_defender_bonus_per_pokemon" field.</summary>
-        public const int DailyDefenderBonusPerPokemonFieldNumber = 2;
-
-        /// <summary>Field number for the "daily_defender_bonus_max_defenders" field.</summary>
-        public const int DailyDefenderBonusMaxDefendersFieldNumber = 3;
-
-        /// <summary>Field number for the "daily_defender_bonus_currency" field.</summary>
-        public const int DailyDefenderBonusCurrencyFieldNumber = 4;
-
-        /// <summary>Field number for the "min_time_between_claims_ms" field.</summary>
-        public const int MinTimeBetweenClaimsMsFieldNumber = 5;
-
-        /// <summary>Field number for the "daily_bonus_enabled" field.</summary>
-        public const int DailyBonusEnabledFieldNumber = 6;
-
-        /// <summary>Field number for the "daily_defender_bonus_enabled" field.</summary>
-        public const int DailyDefenderBonusEnabledFieldNumber = 7;
-
-        private static readonly pb::MessageParser<IapSettings> _parser =
-            new pb::MessageParser<IapSettings>(() => new IapSettings());
-
-        private static readonly pb::FieldCodec<int> _repeated_dailyDefenderBonusPerPokemon_codec
-            = pb::FieldCodec.ForInt32(18);
-
-        private static readonly pb::FieldCodec<string> _repeated_dailyDefenderBonusCurrency_codec
-            = pb::FieldCodec.ForString(34);
-
-        private readonly pbc::RepeatedField<string> dailyDefenderBonusCurrency_ = new pbc::RepeatedField<string>();
-        private readonly pbc::RepeatedField<int> dailyDefenderBonusPerPokemon_ = new pbc::RepeatedField<int>();
-        private int dailyBonusCoins_;
-        private bool dailyBonusEnabled_;
-        private bool dailyDefenderBonusEnabled_;
-        private int dailyDefenderBonusMaxDefenders_;
-        private long minTimeBetweenClaimsMs_;
-
-        public IapSettings()
-        {
-            OnConstruction();
-        }
-
-        public IapSettings(IapSettings other) : this()
-        {
-            dailyBonusCoins_ = other.dailyBonusCoins_;
-            dailyDefenderBonusPerPokemon_ = other.dailyDefenderBonusPerPokemon_.Clone();
-            dailyDefenderBonusMaxDefenders_ = other.dailyDefenderBonusMaxDefenders_;
-            dailyDefenderBonusCurrency_ = other.dailyDefenderBonusCurrency_.Clone();
-            minTimeBetweenClaimsMs_ = other.minTimeBetweenClaimsMs_;
-            dailyBonusEnabled_ = other.dailyBonusEnabled_;
-            dailyDefenderBonusEnabled_ = other.dailyDefenderBonusEnabled_;
-        }
-
-        public static pb::MessageParser<IapSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[67]; }
-        }
-
-        public int DailyBonusCoins
-        {
-            get { return dailyBonusCoins_; }
-            set { dailyBonusCoins_ = value; }
-        }
-
-        public pbc::RepeatedField<int> DailyDefenderBonusPerPokemon
-        {
-            get { return dailyDefenderBonusPerPokemon_; }
-        }
-
-        public int DailyDefenderBonusMaxDefenders
-        {
-            get { return dailyDefenderBonusMaxDefenders_; }
-            set { dailyDefenderBonusMaxDefenders_ = value; }
-        }
-
-        public pbc::RepeatedField<string> DailyDefenderBonusCurrency
-        {
-            get { return dailyDefenderBonusCurrency_; }
-        }
-
-        public long MinTimeBetweenClaimsMs
-        {
-            get { return minTimeBetweenClaimsMs_; }
-            set { minTimeBetweenClaimsMs_ = value; }
-        }
-
-        public bool DailyBonusEnabled
-        {
-            get { return dailyBonusEnabled_; }
-            set { dailyBonusEnabled_ = value; }
-        }
-
-        public bool DailyDefenderBonusEnabled
-        {
-            get { return dailyDefenderBonusEnabled_; }
-            set { dailyDefenderBonusEnabled_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public IapSettings Clone()
-        {
-            return new IapSettings(this);
-        }
-
-        public bool Equals(IapSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (DailyBonusCoins != other.DailyBonusCoins) return false;
-            if (!dailyDefenderBonusPerPokemon_.Equals(other.dailyDefenderBonusPerPokemon_)) return false;
-            if (DailyDefenderBonusMaxDefenders != other.DailyDefenderBonusMaxDefenders) return false;
-            if (!dailyDefenderBonusCurrency_.Equals(other.dailyDefenderBonusCurrency_)) return false;
-            if (MinTimeBetweenClaimsMs != other.MinTimeBetweenClaimsMs) return false;
-            if (DailyBonusEnabled != other.DailyBonusEnabled) return false;
-            if (DailyDefenderBonusEnabled != other.DailyDefenderBonusEnabled) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (DailyBonusCoins != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(DailyBonusCoins);
-            }
-            dailyDefenderBonusPerPokemon_.WriteTo(output, _repeated_dailyDefenderBonusPerPokemon_codec);
-            if (DailyDefenderBonusMaxDefenders != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(DailyDefenderBonusMaxDefenders);
-            }
-            dailyDefenderBonusCurrency_.WriteTo(output, _repeated_dailyDefenderBonusCurrency_codec);
-            if (MinTimeBetweenClaimsMs != 0L)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt64(MinTimeBetweenClaimsMs);
-            }
-            if (DailyBonusEnabled != false)
-            {
-                output.WriteRawTag(48);
-                output.WriteBool(DailyBonusEnabled);
-            }
-            if (DailyDefenderBonusEnabled != false)
-            {
-                output.WriteRawTag(56);
-                output.WriteBool(DailyDefenderBonusEnabled);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (DailyBonusCoins != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DailyBonusCoins);
-            }
-            size += dailyDefenderBonusPerPokemon_.CalculateSize(_repeated_dailyDefenderBonusPerPokemon_codec);
-            if (DailyDefenderBonusMaxDefenders != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DailyDefenderBonusMaxDefenders);
-            }
-            size += dailyDefenderBonusCurrency_.CalculateSize(_repeated_dailyDefenderBonusCurrency_codec);
-            if (MinTimeBetweenClaimsMs != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(MinTimeBetweenClaimsMs);
-            }
-            if (DailyBonusEnabled != false)
-            {
-                size += 1 + 1;
-            }
-            if (DailyDefenderBonusEnabled != false)
-            {
-                size += 1 + 1;
-            }
-            return size;
-        }
-
-        public void MergeFrom(IapSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.DailyBonusCoins != 0)
-            {
-                DailyBonusCoins = other.DailyBonusCoins;
-            }
-            dailyDefenderBonusPerPokemon_.Add(other.dailyDefenderBonusPerPokemon_);
-            if (other.DailyDefenderBonusMaxDefenders != 0)
-            {
-                DailyDefenderBonusMaxDefenders = other.DailyDefenderBonusMaxDefenders;
-            }
-            dailyDefenderBonusCurrency_.Add(other.dailyDefenderBonusCurrency_);
-            if (other.MinTimeBetweenClaimsMs != 0L)
-            {
-                MinTimeBetweenClaimsMs = other.MinTimeBetweenClaimsMs;
-            }
-            if (other.DailyBonusEnabled != false)
-            {
-                DailyBonusEnabled = other.DailyBonusEnabled;
-            }
-            if (other.DailyDefenderBonusEnabled != false)
-            {
-                DailyDefenderBonusEnabled = other.DailyDefenderBonusEnabled;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            DailyBonusCoins = input.ReadInt32();
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            dailyDefenderBonusPerPokemon_.AddEntriesFrom(input, _repeated_dailyDefenderBonusPerPokemon_codec);
-                            break;
-                        }
-                    case 24:
-                        {
-                            DailyDefenderBonusMaxDefenders = input.ReadInt32();
-                            break;
-                        }
-                    case 34:
-                        {
-                            dailyDefenderBonusCurrency_.AddEntriesFrom(input, _repeated_dailyDefenderBonusCurrency_codec);
-                            break;
-                        }
-                    case 40:
-                        {
-                            MinTimeBetweenClaimsMs = input.ReadInt64();
-                            break;
-                        }
-                    case 48:
-                        {
-                            DailyBonusEnabled = input.ReadBool();
-                            break;
-                        }
-                    case 56:
-                        {
-                            DailyDefenderBonusEnabled = input.ReadBool();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as IapSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (DailyBonusCoins != 0) hash ^= DailyBonusCoins.GetHashCode();
-            hash ^= dailyDefenderBonusPerPokemon_.GetHashCode();
-            if (DailyDefenderBonusMaxDefenders != 0) hash ^= DailyDefenderBonusMaxDefenders.GetHashCode();
-            hash ^= dailyDefenderBonusCurrency_.GetHashCode();
-            if (MinTimeBetweenClaimsMs != 0L) hash ^= MinTimeBetweenClaimsMs.GetHashCode();
-            if (DailyBonusEnabled != false) hash ^= DailyBonusEnabled.GetHashCode();
-            if (DailyDefenderBonusEnabled != false) hash ^= DailyDefenderBonusEnabled.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class IapItemDisplay : pb::IMessage<IapItemDisplay>
-    {
-        /// <summary>Field number for the "sku" field.</summary>
-        public const int SkuFieldNumber = 1;
-
-        /// <summary>Field number for the "category" field.</summary>
-        public const int CategoryFieldNumber = 2;
-
-        /// <summary>Field number for the "sort_order" field.</summary>
-        public const int SortOrderFieldNumber = 3;
-
-        /// <summary>Field number for the "item_ids" field.</summary>
-        public const int ItemIdsFieldNumber = 4;
-
-        /// <summary>Field number for the "counts" field.</summary>
-        public const int CountsFieldNumber = 5;
-
-        private static readonly pb::MessageParser<IapItemDisplay> _parser =
-            new pb::MessageParser<IapItemDisplay>(() => new IapItemDisplay());
-
-        private static readonly pb::FieldCodec<global::AllEnum.ItemId> _repeated_itemIds_codec
-            = pb::FieldCodec.ForEnum(34, x => (int)x, x => (global::AllEnum.ItemId)x);
-
-        private static readonly pb::FieldCodec<int> _repeated_counts_codec
-            = pb::FieldCodec.ForInt32(42);
-
-        private readonly pbc::RepeatedField<int> counts_ = new pbc::RepeatedField<int>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.ItemId> itemIds_ =
-            new pbc::RepeatedField<global::AllEnum.ItemId>();
-
-        private global::AllEnum.HoloIapItemCategory category_ = 0;
-        private string sku_ = "";
-        private int sortOrder_;
-
-        public IapItemDisplay()
-        {
-            OnConstruction();
-        }
-
-        public IapItemDisplay(IapItemDisplay other) : this()
-        {
-            sku_ = other.sku_;
-            category_ = other.category_;
-            sortOrder_ = other.sortOrder_;
-            itemIds_ = other.itemIds_.Clone();
-            counts_ = other.counts_.Clone();
-        }
-
-        public static pb::MessageParser<IapItemDisplay> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[68]; }
-        }
-
-        public string Sku
-        {
-            get { return sku_; }
-            set { sku_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::AllEnum.HoloIapItemCategory Category
-        {
-            get { return category_; }
-            set { category_ = value; }
-        }
-
-        public int SortOrder
-        {
-            get { return sortOrder_; }
-            set { sortOrder_ = value; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.ItemId> ItemIds
-        {
-            get { return itemIds_; }
-        }
-
-        public pbc::RepeatedField<int> Counts
-        {
-            get { return counts_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public IapItemDisplay Clone()
-        {
-            return new IapItemDisplay(this);
-        }
-
-        public bool Equals(IapItemDisplay other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Sku != other.Sku) return false;
-            if (Category != other.Category) return false;
-            if (SortOrder != other.SortOrder) return false;
-            if (!itemIds_.Equals(other.itemIds_)) return false;
-            if (!counts_.Equals(other.counts_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Sku.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(Sku);
-            }
-            if (Category != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)Category);
-            }
-            if (SortOrder != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(SortOrder);
-            }
-            itemIds_.WriteTo(output, _repeated_itemIds_codec);
-            counts_.WriteTo(output, _repeated_counts_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Sku.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(Sku);
-            }
-            if (Category != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Category);
-            }
-            if (SortOrder != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(SortOrder);
-            }
-            size += itemIds_.CalculateSize(_repeated_itemIds_codec);
-            size += counts_.CalculateSize(_repeated_counts_codec);
-            return size;
-        }
-
-        public void MergeFrom(IapItemDisplay other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Sku.Length != 0)
-            {
-                Sku = other.Sku;
-            }
-            if (other.Category != 0)
-            {
-                Category = other.Category;
-            }
-            if (other.SortOrder != 0)
-            {
-                SortOrder = other.SortOrder;
-            }
-            itemIds_.Add(other.itemIds_);
-            counts_.Add(other.counts_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            Sku = input.ReadString();
-                            break;
-                        }
-                    case 16:
-                        {
-                            category_ = (global::AllEnum.HoloIapItemCategory)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            SortOrder = input.ReadInt32();
-                            break;
-                        }
-                    case 34:
-                    case 32:
-                        {
-                            itemIds_.AddEntriesFrom(input, _repeated_itemIds_codec);
-                            break;
-                        }
-                    case 42:
-                    case 40:
-                        {
-                            counts_.AddEntriesFrom(input, _repeated_counts_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as IapItemDisplay);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Sku.Length != 0) hash ^= Sku.GetHashCode();
-            if (Category != 0) hash ^= Category.GetHashCode();
-            if (SortOrder != 0) hash ^= SortOrder.GetHashCode();
-            hash ^= itemIds_.GetHashCode();
-            hash ^= counts_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EncounterSettings : pb::IMessage<EncounterSettings>
-    {
-        /// <summary>Field number for the "spin_bonus_threshold" field.</summary>
-        public const int SpinBonusThresholdFieldNumber = 1;
-
-        /// <summary>Field number for the "excellent_throw_threshold" field.</summary>
-        public const int ExcellentThrowThresholdFieldNumber = 2;
-
-        /// <summary>Field number for the "great_throw_threshold" field.</summary>
-        public const int GreatThrowThresholdFieldNumber = 3;
-
-        /// <summary>Field number for the "nice_throw_threshold" field.</summary>
-        public const int NiceThrowThresholdFieldNumber = 4;
-
-        /// <summary>Field number for the "milestone_threshold" field.</summary>
-        public const int MilestoneThresholdFieldNumber = 5;
-
-        private static readonly pb::MessageParser<EncounterSettings> _parser =
-            new pb::MessageParser<EncounterSettings>(() => new EncounterSettings());
-
-        private float excellentThrowThreshold_;
-        private float greatThrowThreshold_;
-        private int milestoneThreshold_;
-        private float niceThrowThreshold_;
-        private float spinBonusThreshold_;
-
-        public EncounterSettings()
-        {
-            OnConstruction();
-        }
-
-        public EncounterSettings(EncounterSettings other) : this()
-        {
-            spinBonusThreshold_ = other.spinBonusThreshold_;
-            excellentThrowThreshold_ = other.excellentThrowThreshold_;
-            greatThrowThreshold_ = other.greatThrowThreshold_;
-            niceThrowThreshold_ = other.niceThrowThreshold_;
-            milestoneThreshold_ = other.milestoneThreshold_;
-        }
-
-        public static pb::MessageParser<EncounterSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[69]; }
-        }
-
-        public float SpinBonusThreshold
-        {
-            get { return spinBonusThreshold_; }
-            set { spinBonusThreshold_ = value; }
-        }
-
-        public float ExcellentThrowThreshold
-        {
-            get { return excellentThrowThreshold_; }
-            set { excellentThrowThreshold_ = value; }
-        }
-
-        public float GreatThrowThreshold
-        {
-            get { return greatThrowThreshold_; }
-            set { greatThrowThreshold_ = value; }
-        }
-
-        public float NiceThrowThreshold
-        {
-            get { return niceThrowThreshold_; }
-            set { niceThrowThreshold_ = value; }
-        }
-
-        public int MilestoneThreshold
-        {
-            get { return milestoneThreshold_; }
-            set { milestoneThreshold_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EncounterSettings Clone()
-        {
-            return new EncounterSettings(this);
-        }
-
-        public bool Equals(EncounterSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (SpinBonusThreshold != other.SpinBonusThreshold) return false;
-            if (ExcellentThrowThreshold != other.ExcellentThrowThreshold) return false;
-            if (GreatThrowThreshold != other.GreatThrowThreshold) return false;
-            if (NiceThrowThreshold != other.NiceThrowThreshold) return false;
-            if (MilestoneThreshold != other.MilestoneThreshold) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (SpinBonusThreshold != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(SpinBonusThreshold);
-            }
-            if (ExcellentThrowThreshold != 0F)
-            {
-                output.WriteRawTag(21);
-                output.WriteFloat(ExcellentThrowThreshold);
-            }
-            if (GreatThrowThreshold != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(GreatThrowThreshold);
-            }
-            if (NiceThrowThreshold != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(NiceThrowThreshold);
-            }
-            if (MilestoneThreshold != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(MilestoneThreshold);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (SpinBonusThreshold != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (ExcellentThrowThreshold != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (GreatThrowThreshold != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (NiceThrowThreshold != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (MilestoneThreshold != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MilestoneThreshold);
-            }
-            return size;
-        }
-
-        public void MergeFrom(EncounterSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.SpinBonusThreshold != 0F)
-            {
-                SpinBonusThreshold = other.SpinBonusThreshold;
-            }
-            if (other.ExcellentThrowThreshold != 0F)
-            {
-                ExcellentThrowThreshold = other.ExcellentThrowThreshold;
-            }
-            if (other.GreatThrowThreshold != 0F)
-            {
-                GreatThrowThreshold = other.GreatThrowThreshold;
-            }
-            if (other.NiceThrowThreshold != 0F)
-            {
-                NiceThrowThreshold = other.NiceThrowThreshold;
-            }
-            if (other.MilestoneThreshold != 0)
-            {
-                MilestoneThreshold = other.MilestoneThreshold;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            SpinBonusThreshold = input.ReadFloat();
-                            break;
-                        }
-                    case 21:
-                        {
-                            ExcellentThrowThreshold = input.ReadFloat();
-                            break;
-                        }
-                    case 29:
-                        {
-                            GreatThrowThreshold = input.ReadFloat();
-                            break;
-                        }
-                    case 37:
-                        {
-                            NiceThrowThreshold = input.ReadFloat();
-                            break;
-                        }
-                    case 40:
-                        {
-                            MilestoneThreshold = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EncounterSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (SpinBonusThreshold != 0F) hash ^= SpinBonusThreshold.GetHashCode();
-            if (ExcellentThrowThreshold != 0F) hash ^= ExcellentThrowThreshold.GetHashCode();
-            if (GreatThrowThreshold != 0F) hash ^= GreatThrowThreshold.GetHashCode();
-            if (NiceThrowThreshold != 0F) hash ^= NiceThrowThreshold.GetHashCode();
-            if (MilestoneThreshold != 0) hash ^= MilestoneThreshold.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GymBattleSettings : pb::IMessage<GymBattleSettings>
-    {
-        /// <summary>Field number for the "energy_per_sec" field.</summary>
-        public const int EnergyPerSecFieldNumber = 1;
-
-        /// <summary>Field number for the "dodge_energy_cost" field.</summary>
-        public const int DodgeEnergyCostFieldNumber = 2;
-
-        /// <summary>Field number for the "retarget_seconds" field.</summary>
-        public const int RetargetSecondsFieldNumber = 3;
-
-        /// <summary>Field number for the "enemy_attack_interval" field.</summary>
-        public const int EnemyAttackIntervalFieldNumber = 4;
-
-        /// <summary>Field number for the "attack_server_interval" field.</summary>
-        public const int AttackServerIntervalFieldNumber = 5;
-
-        /// <summary>Field number for the "round_duration_seconds" field.</summary>
-        public const int RoundDurationSecondsFieldNumber = 6;
-
-        /// <summary>Field number for the "bonus_time_per_ally_seconds" field.</summary>
-        public const int BonusTimePerAllySecondsFieldNumber = 7;
-
-        /// <summary>Field number for the "maximum_attackers_per_battle" field.</summary>
-        public const int MaximumAttackersPerBattleFieldNumber = 8;
-
-        /// <summary>Field number for the "same_type_attack_bonus_multiplier" field.</summary>
-        public const int SameTypeAttackBonusMultiplierFieldNumber = 9;
-
-        /// <summary>Field number for the "maximum_energy" field.</summary>
-        public const int MaximumEnergyFieldNumber = 10;
-
-        /// <summary>Field number for the "energy_delta_per_health_lost" field.</summary>
-        public const int EnergyDeltaPerHealthLostFieldNumber = 11;
-
-        /// <summary>Field number for the "dodge_duration_ms" field.</summary>
-        public const int DodgeDurationMsFieldNumber = 12;
-
-        /// <summary>Field number for the "minimum_player_level" field.</summary>
-        public const int MinimumPlayerLevelFieldNumber = 13;
-
-        /// <summary>Field number for the "swap_duration_ms" field.</summary>
-        public const int SwapDurationMsFieldNumber = 14;
-
-        private static readonly pb::MessageParser<GymBattleSettings> _parser =
-            new pb::MessageParser<GymBattleSettings>(() => new GymBattleSettings());
-
-        private float attackServerInterval_;
-        private float bonusTimePerAllySeconds_;
-        private int dodgeDurationMs_;
-        private float dodgeEnergyCost_;
-        private float enemyAttackInterval_;
-        private float energyDeltaPerHealthLost_;
-        private float energyPerSec_;
-        private int maximumAttackersPerBattle_;
-        private int maximumEnergy_;
-        private int minimumPlayerLevel_;
-        private float retargetSeconds_;
-        private float roundDurationSeconds_;
-        private float sameTypeAttackBonusMultiplier_;
-        private int swapDurationMs_;
-
-        public GymBattleSettings()
-        {
-            OnConstruction();
-        }
-
-        public GymBattleSettings(GymBattleSettings other) : this()
-        {
-            energyPerSec_ = other.energyPerSec_;
-            dodgeEnergyCost_ = other.dodgeEnergyCost_;
-            retargetSeconds_ = other.retargetSeconds_;
-            enemyAttackInterval_ = other.enemyAttackInterval_;
-            attackServerInterval_ = other.attackServerInterval_;
-            roundDurationSeconds_ = other.roundDurationSeconds_;
-            bonusTimePerAllySeconds_ = other.bonusTimePerAllySeconds_;
-            maximumAttackersPerBattle_ = other.maximumAttackersPerBattle_;
-            sameTypeAttackBonusMultiplier_ = other.sameTypeAttackBonusMultiplier_;
-            maximumEnergy_ = other.maximumEnergy_;
-            energyDeltaPerHealthLost_ = other.energyDeltaPerHealthLost_;
-            dodgeDurationMs_ = other.dodgeDurationMs_;
-            minimumPlayerLevel_ = other.minimumPlayerLevel_;
-            swapDurationMs_ = other.swapDurationMs_;
-        }
-
-        public static pb::MessageParser<GymBattleSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[70]; }
-        }
-
-        public float EnergyPerSec
-        {
-            get { return energyPerSec_; }
-            set { energyPerSec_ = value; }
-        }
-
-        public float DodgeEnergyCost
-        {
-            get { return dodgeEnergyCost_; }
-            set { dodgeEnergyCost_ = value; }
-        }
-
-        public float RetargetSeconds
-        {
-            get { return retargetSeconds_; }
-            set { retargetSeconds_ = value; }
-        }
-
-        public float EnemyAttackInterval
-        {
-            get { return enemyAttackInterval_; }
-            set { enemyAttackInterval_ = value; }
-        }
-
-        public float AttackServerInterval
-        {
-            get { return attackServerInterval_; }
-            set { attackServerInterval_ = value; }
-        }
-
-        public float RoundDurationSeconds
-        {
-            get { return roundDurationSeconds_; }
-            set { roundDurationSeconds_ = value; }
-        }
-
-        public float BonusTimePerAllySeconds
-        {
-            get { return bonusTimePerAllySeconds_; }
-            set { bonusTimePerAllySeconds_ = value; }
-        }
-
-        public int MaximumAttackersPerBattle
-        {
-            get { return maximumAttackersPerBattle_; }
-            set { maximumAttackersPerBattle_ = value; }
-        }
-
-        public float SameTypeAttackBonusMultiplier
-        {
-            get { return sameTypeAttackBonusMultiplier_; }
-            set { sameTypeAttackBonusMultiplier_ = value; }
-        }
-
-        public int MaximumEnergy
-        {
-            get { return maximumEnergy_; }
-            set { maximumEnergy_ = value; }
-        }
-
-        public float EnergyDeltaPerHealthLost
-        {
-            get { return energyDeltaPerHealthLost_; }
-            set { energyDeltaPerHealthLost_ = value; }
-        }
-
-        public int DodgeDurationMs
-        {
-            get { return dodgeDurationMs_; }
-            set { dodgeDurationMs_ = value; }
-        }
-
-        public int MinimumPlayerLevel
-        {
-            get { return minimumPlayerLevel_; }
-            set { minimumPlayerLevel_ = value; }
-        }
-
-        public int SwapDurationMs
-        {
-            get { return swapDurationMs_; }
-            set { swapDurationMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GymBattleSettings Clone()
-        {
-            return new GymBattleSettings(this);
-        }
-
-        public bool Equals(GymBattleSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (EnergyPerSec != other.EnergyPerSec) return false;
-            if (DodgeEnergyCost != other.DodgeEnergyCost) return false;
-            if (RetargetSeconds != other.RetargetSeconds) return false;
-            if (EnemyAttackInterval != other.EnemyAttackInterval) return false;
-            if (AttackServerInterval != other.AttackServerInterval) return false;
-            if (RoundDurationSeconds != other.RoundDurationSeconds) return false;
-            if (BonusTimePerAllySeconds != other.BonusTimePerAllySeconds) return false;
-            if (MaximumAttackersPerBattle != other.MaximumAttackersPerBattle) return false;
-            if (SameTypeAttackBonusMultiplier != other.SameTypeAttackBonusMultiplier) return false;
-            if (MaximumEnergy != other.MaximumEnergy) return false;
-            if (EnergyDeltaPerHealthLost != other.EnergyDeltaPerHealthLost) return false;
-            if (DodgeDurationMs != other.DodgeDurationMs) return false;
-            if (MinimumPlayerLevel != other.MinimumPlayerLevel) return false;
-            if (SwapDurationMs != other.SwapDurationMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (EnergyPerSec != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(EnergyPerSec);
-            }
-            if (DodgeEnergyCost != 0F)
-            {
-                output.WriteRawTag(21);
-                output.WriteFloat(DodgeEnergyCost);
-            }
-            if (RetargetSeconds != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(RetargetSeconds);
-            }
-            if (EnemyAttackInterval != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(EnemyAttackInterval);
-            }
-            if (AttackServerInterval != 0F)
-            {
-                output.WriteRawTag(45);
-                output.WriteFloat(AttackServerInterval);
-            }
-            if (RoundDurationSeconds != 0F)
-            {
-                output.WriteRawTag(53);
-                output.WriteFloat(RoundDurationSeconds);
-            }
-            if (BonusTimePerAllySeconds != 0F)
-            {
-                output.WriteRawTag(61);
-                output.WriteFloat(BonusTimePerAllySeconds);
-            }
-            if (MaximumAttackersPerBattle != 0)
-            {
-                output.WriteRawTag(64);
-                output.WriteInt32(MaximumAttackersPerBattle);
-            }
-            if (SameTypeAttackBonusMultiplier != 0F)
-            {
-                output.WriteRawTag(77);
-                output.WriteFloat(SameTypeAttackBonusMultiplier);
-            }
-            if (MaximumEnergy != 0)
-            {
-                output.WriteRawTag(80);
-                output.WriteInt32(MaximumEnergy);
-            }
-            if (EnergyDeltaPerHealthLost != 0F)
-            {
-                output.WriteRawTag(93);
-                output.WriteFloat(EnergyDeltaPerHealthLost);
-            }
-            if (DodgeDurationMs != 0)
-            {
-                output.WriteRawTag(96);
-                output.WriteInt32(DodgeDurationMs);
-            }
-            if (MinimumPlayerLevel != 0)
-            {
-                output.WriteRawTag(104);
-                output.WriteInt32(MinimumPlayerLevel);
-            }
-            if (SwapDurationMs != 0)
-            {
-                output.WriteRawTag(112);
-                output.WriteInt32(SwapDurationMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (EnergyPerSec != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (DodgeEnergyCost != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (RetargetSeconds != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (EnemyAttackInterval != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (AttackServerInterval != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (RoundDurationSeconds != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (BonusTimePerAllySeconds != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (MaximumAttackersPerBattle != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaximumAttackersPerBattle);
-            }
-            if (SameTypeAttackBonusMultiplier != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (MaximumEnergy != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaximumEnergy);
-            }
-            if (EnergyDeltaPerHealthLost != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (DodgeDurationMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DodgeDurationMs);
-            }
-            if (MinimumPlayerLevel != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MinimumPlayerLevel);
-            }
-            if (SwapDurationMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(SwapDurationMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(GymBattleSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.EnergyPerSec != 0F)
-            {
-                EnergyPerSec = other.EnergyPerSec;
-            }
-            if (other.DodgeEnergyCost != 0F)
-            {
-                DodgeEnergyCost = other.DodgeEnergyCost;
-            }
-            if (other.RetargetSeconds != 0F)
-            {
-                RetargetSeconds = other.RetargetSeconds;
-            }
-            if (other.EnemyAttackInterval != 0F)
-            {
-                EnemyAttackInterval = other.EnemyAttackInterval;
-            }
-            if (other.AttackServerInterval != 0F)
-            {
-                AttackServerInterval = other.AttackServerInterval;
-            }
-            if (other.RoundDurationSeconds != 0F)
-            {
-                RoundDurationSeconds = other.RoundDurationSeconds;
-            }
-            if (other.BonusTimePerAllySeconds != 0F)
-            {
-                BonusTimePerAllySeconds = other.BonusTimePerAllySeconds;
-            }
-            if (other.MaximumAttackersPerBattle != 0)
-            {
-                MaximumAttackersPerBattle = other.MaximumAttackersPerBattle;
-            }
-            if (other.SameTypeAttackBonusMultiplier != 0F)
-            {
-                SameTypeAttackBonusMultiplier = other.SameTypeAttackBonusMultiplier;
-            }
-            if (other.MaximumEnergy != 0)
-            {
-                MaximumEnergy = other.MaximumEnergy;
-            }
-            if (other.EnergyDeltaPerHealthLost != 0F)
-            {
-                EnergyDeltaPerHealthLost = other.EnergyDeltaPerHealthLost;
-            }
-            if (other.DodgeDurationMs != 0)
-            {
-                DodgeDurationMs = other.DodgeDurationMs;
-            }
-            if (other.MinimumPlayerLevel != 0)
-            {
-                MinimumPlayerLevel = other.MinimumPlayerLevel;
-            }
-            if (other.SwapDurationMs != 0)
-            {
-                SwapDurationMs = other.SwapDurationMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            EnergyPerSec = input.ReadFloat();
-                            break;
-                        }
-                    case 21:
-                        {
-                            DodgeEnergyCost = input.ReadFloat();
-                            break;
-                        }
-                    case 29:
-                        {
-                            RetargetSeconds = input.ReadFloat();
-                            break;
-                        }
-                    case 37:
-                        {
-                            EnemyAttackInterval = input.ReadFloat();
-                            break;
-                        }
-                    case 45:
-                        {
-                            AttackServerInterval = input.ReadFloat();
-                            break;
-                        }
-                    case 53:
-                        {
-                            RoundDurationSeconds = input.ReadFloat();
-                            break;
-                        }
-                    case 61:
-                        {
-                            BonusTimePerAllySeconds = input.ReadFloat();
-                            break;
-                        }
-                    case 64:
-                        {
-                            MaximumAttackersPerBattle = input.ReadInt32();
-                            break;
-                        }
-                    case 77:
-                        {
-                            SameTypeAttackBonusMultiplier = input.ReadFloat();
-                            break;
-                        }
-                    case 80:
-                        {
-                            MaximumEnergy = input.ReadInt32();
-                            break;
-                        }
-                    case 93:
-                        {
-                            EnergyDeltaPerHealthLost = input.ReadFloat();
-                            break;
-                        }
-                    case 96:
-                        {
-                            DodgeDurationMs = input.ReadInt32();
-                            break;
-                        }
-                    case 104:
-                        {
-                            MinimumPlayerLevel = input.ReadInt32();
-                            break;
-                        }
-                    case 112:
-                        {
-                            SwapDurationMs = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GymBattleSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (EnergyPerSec != 0F) hash ^= EnergyPerSec.GetHashCode();
-            if (DodgeEnergyCost != 0F) hash ^= DodgeEnergyCost.GetHashCode();
-            if (RetargetSeconds != 0F) hash ^= RetargetSeconds.GetHashCode();
-            if (EnemyAttackInterval != 0F) hash ^= EnemyAttackInterval.GetHashCode();
-            if (AttackServerInterval != 0F) hash ^= AttackServerInterval.GetHashCode();
-            if (RoundDurationSeconds != 0F) hash ^= RoundDurationSeconds.GetHashCode();
-            if (BonusTimePerAllySeconds != 0F) hash ^= BonusTimePerAllySeconds.GetHashCode();
-            if (MaximumAttackersPerBattle != 0) hash ^= MaximumAttackersPerBattle.GetHashCode();
-            if (SameTypeAttackBonusMultiplier != 0F) hash ^= SameTypeAttackBonusMultiplier.GetHashCode();
-            if (MaximumEnergy != 0) hash ^= MaximumEnergy.GetHashCode();
-            if (EnergyDeltaPerHealthLost != 0F) hash ^= EnergyDeltaPerHealthLost.GetHashCode();
-            if (DodgeDurationMs != 0) hash ^= DodgeDurationMs.GetHashCode();
-            if (MinimumPlayerLevel != 0) hash ^= MinimumPlayerLevel.GetHashCode();
-            if (SwapDurationMs != 0) hash ^= SwapDurationMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class GymLevelSettings : pb::IMessage<GymLevelSettings>
-    {
-        /// <summary>Field number for the "required_experience" field.</summary>
-        public const int RequiredExperienceFieldNumber = 1;
-
-        /// <summary>Field number for the "leader_slots" field.</summary>
-        public const int LeaderSlotsFieldNumber = 2;
-
-        /// <summary>Field number for the "trainer_slots" field.</summary>
-        public const int TrainerSlotsFieldNumber = 3;
-
-        /// <summary>Field number for the "search_roll_bonus" field.</summary>
-        public const int SearchRollBonusFieldNumber = 4;
-
-        private static readonly pb::MessageParser<GymLevelSettings> _parser =
-            new pb::MessageParser<GymLevelSettings>(() => new GymLevelSettings());
-
-        private static readonly pb::FieldCodec<int> _repeated_requiredExperience_codec
-            = pb::FieldCodec.ForInt32(10);
-
-        private static readonly pb::FieldCodec<int> _repeated_leaderSlots_codec
-            = pb::FieldCodec.ForInt32(18);
-
-        private static readonly pb::FieldCodec<int> _repeated_trainerSlots_codec
-            = pb::FieldCodec.ForInt32(26);
-
-        private static readonly pb::FieldCodec<int> _repeated_searchRollBonus_codec
-            = pb::FieldCodec.ForInt32(34);
-
-        private readonly pbc::RepeatedField<int> leaderSlots_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> requiredExperience_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> searchRollBonus_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> trainerSlots_ = new pbc::RepeatedField<int>();
-
-        public GymLevelSettings()
-        {
-            OnConstruction();
-        }
-
-        public GymLevelSettings(GymLevelSettings other) : this()
-        {
-            requiredExperience_ = other.requiredExperience_.Clone();
-            leaderSlots_ = other.leaderSlots_.Clone();
-            trainerSlots_ = other.trainerSlots_.Clone();
-            searchRollBonus_ = other.searchRollBonus_.Clone();
-        }
-
-        public static pb::MessageParser<GymLevelSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[71]; }
-        }
-
-        public pbc::RepeatedField<int> RequiredExperience
-        {
-            get { return requiredExperience_; }
-        }
-
-        public pbc::RepeatedField<int> LeaderSlots
-        {
-            get { return leaderSlots_; }
-        }
-
-        public pbc::RepeatedField<int> TrainerSlots
-        {
-            get { return trainerSlots_; }
-        }
-
-        public pbc::RepeatedField<int> SearchRollBonus
-        {
-            get { return searchRollBonus_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public GymLevelSettings Clone()
-        {
-            return new GymLevelSettings(this);
-        }
-
-        public bool Equals(GymLevelSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!requiredExperience_.Equals(other.requiredExperience_)) return false;
-            if (!leaderSlots_.Equals(other.leaderSlots_)) return false;
-            if (!trainerSlots_.Equals(other.trainerSlots_)) return false;
-            if (!searchRollBonus_.Equals(other.searchRollBonus_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            requiredExperience_.WriteTo(output, _repeated_requiredExperience_codec);
-            leaderSlots_.WriteTo(output, _repeated_leaderSlots_codec);
-            trainerSlots_.WriteTo(output, _repeated_trainerSlots_codec);
-            searchRollBonus_.WriteTo(output, _repeated_searchRollBonus_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += requiredExperience_.CalculateSize(_repeated_requiredExperience_codec);
-            size += leaderSlots_.CalculateSize(_repeated_leaderSlots_codec);
-            size += trainerSlots_.CalculateSize(_repeated_trainerSlots_codec);
-            size += searchRollBonus_.CalculateSize(_repeated_searchRollBonus_codec);
-            return size;
-        }
-
-        public void MergeFrom(GymLevelSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            requiredExperience_.Add(other.requiredExperience_);
-            leaderSlots_.Add(other.leaderSlots_);
-            trainerSlots_.Add(other.trainerSlots_);
-            searchRollBonus_.Add(other.searchRollBonus_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                    case 8:
-                        {
-                            requiredExperience_.AddEntriesFrom(input, _repeated_requiredExperience_codec);
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            leaderSlots_.AddEntriesFrom(input, _repeated_leaderSlots_codec);
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            trainerSlots_.AddEntriesFrom(input, _repeated_trainerSlots_codec);
-                            break;
-                        }
-                    case 34:
-                    case 32:
-                        {
-                            searchRollBonus_.AddEntriesFrom(input, _repeated_searchRollBonus_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as GymLevelSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= requiredExperience_.GetHashCode();
-            hash ^= leaderSlots_.GetHashCode();
-            hash ^= trainerSlots_.GetHashCode();
-            hash ^= searchRollBonus_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PlayerLevelSettings : pb::IMessage<PlayerLevelSettings>
-    {
-        /// <summary>Field number for the "rank_num" field.</summary>
-        public const int RankNumFieldNumber = 1;
-
-        /// <summary>Field number for the "required_experience" field.</summary>
-        public const int RequiredExperienceFieldNumber = 2;
-
-        /// <summary>Field number for the "cp_multiplier" field.</summary>
-        public const int CpMultiplierFieldNumber = 3;
-
-        /// <summary>Field number for the "max_egg_player_level" field.</summary>
-        public const int MaxEggPlayerLevelFieldNumber = 4;
-
-        /// <summary>Field number for the "max_encounter_player_level" field.</summary>
-        public const int MaxEncounterPlayerLevelFieldNumber = 5;
-
-        private static readonly pb::MessageParser<PlayerLevelSettings> _parser =
-            new pb::MessageParser<PlayerLevelSettings>(() => new PlayerLevelSettings());
-
-        private static readonly pb::FieldCodec<int> _repeated_rankNum_codec
-            = pb::FieldCodec.ForInt32(10);
-
-        private static readonly pb::FieldCodec<int> _repeated_requiredExperience_codec
-            = pb::FieldCodec.ForInt32(18);
-
-        private static readonly pb::FieldCodec<float> _repeated_cpMultiplier_codec
-            = pb::FieldCodec.ForFloat(26);
-
-        private readonly pbc::RepeatedField<float> cpMultiplier_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<int> rankNum_ = new pbc::RepeatedField<int>();
-        private readonly pbc::RepeatedField<int> requiredExperience_ = new pbc::RepeatedField<int>();
-        private int maxEggPlayerLevel_;
-        private int maxEncounterPlayerLevel_;
-
-        public PlayerLevelSettings()
-        {
-            OnConstruction();
-        }
-
-        public PlayerLevelSettings(PlayerLevelSettings other) : this()
-        {
-            rankNum_ = other.rankNum_.Clone();
-            requiredExperience_ = other.requiredExperience_.Clone();
-            cpMultiplier_ = other.cpMultiplier_.Clone();
-            maxEggPlayerLevel_ = other.maxEggPlayerLevel_;
-            maxEncounterPlayerLevel_ = other.maxEncounterPlayerLevel_;
-        }
-
-        public static pb::MessageParser<PlayerLevelSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[72]; }
-        }
-
-        public pbc::RepeatedField<int> RankNum
-        {
-            get { return rankNum_; }
-        }
-
-        public pbc::RepeatedField<int> RequiredExperience
-        {
-            get { return requiredExperience_; }
-        }
-
-        public pbc::RepeatedField<float> CpMultiplier
-        {
-            get { return cpMultiplier_; }
-        }
-
-        public int MaxEggPlayerLevel
-        {
-            get { return maxEggPlayerLevel_; }
-            set { maxEggPlayerLevel_ = value; }
-        }
-
-        public int MaxEncounterPlayerLevel
-        {
-            get { return maxEncounterPlayerLevel_; }
-            set { maxEncounterPlayerLevel_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PlayerLevelSettings Clone()
-        {
-            return new PlayerLevelSettings(this);
-        }
-
-        public bool Equals(PlayerLevelSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!rankNum_.Equals(other.rankNum_)) return false;
-            if (!requiredExperience_.Equals(other.requiredExperience_)) return false;
-            if (!cpMultiplier_.Equals(other.cpMultiplier_)) return false;
-            if (MaxEggPlayerLevel != other.MaxEggPlayerLevel) return false;
-            if (MaxEncounterPlayerLevel != other.MaxEncounterPlayerLevel) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            rankNum_.WriteTo(output, _repeated_rankNum_codec);
-            requiredExperience_.WriteTo(output, _repeated_requiredExperience_codec);
-            cpMultiplier_.WriteTo(output, _repeated_cpMultiplier_codec);
-            if (MaxEggPlayerLevel != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(MaxEggPlayerLevel);
-            }
-            if (MaxEncounterPlayerLevel != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(MaxEncounterPlayerLevel);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += rankNum_.CalculateSize(_repeated_rankNum_codec);
-            size += requiredExperience_.CalculateSize(_repeated_requiredExperience_codec);
-            size += cpMultiplier_.CalculateSize(_repeated_cpMultiplier_codec);
-            if (MaxEggPlayerLevel != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxEggPlayerLevel);
-            }
-            if (MaxEncounterPlayerLevel != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxEncounterPlayerLevel);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PlayerLevelSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            rankNum_.Add(other.rankNum_);
-            requiredExperience_.Add(other.requiredExperience_);
-            cpMultiplier_.Add(other.cpMultiplier_);
-            if (other.MaxEggPlayerLevel != 0)
-            {
-                MaxEggPlayerLevel = other.MaxEggPlayerLevel;
-            }
-            if (other.MaxEncounterPlayerLevel != 0)
-            {
-                MaxEncounterPlayerLevel = other.MaxEncounterPlayerLevel;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                    case 8:
-                        {
-                            rankNum_.AddEntriesFrom(input, _repeated_rankNum_codec);
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            requiredExperience_.AddEntriesFrom(input, _repeated_requiredExperience_codec);
-                            break;
-                        }
-                    case 26:
-                    case 29:
-                        {
-                            cpMultiplier_.AddEntriesFrom(input, _repeated_cpMultiplier_codec);
-                            break;
-                        }
-                    case 32:
-                        {
-                            MaxEggPlayerLevel = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            MaxEncounterPlayerLevel = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PlayerLevelSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= rankNum_.GetHashCode();
-            hash ^= requiredExperience_.GetHashCode();
-            hash ^= cpMultiplier_.GetHashCode();
-            if (MaxEggPlayerLevel != 0) hash ^= MaxEggPlayerLevel.GetHashCode();
-            if (MaxEncounterPlayerLevel != 0) hash ^= MaxEncounterPlayerLevel.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CameraSettings : pb::IMessage<CameraSettings>
-    {
-        /// <summary>Field number for the "next_camera" field.</summary>
-        public const int NextCameraFieldNumber = 1;
-
-        /// <summary>Field number for the "interpolation" field.</summary>
-        public const int InterpolationFieldNumber = 2;
-
-        /// <summary>Field number for the "target_type" field.</summary>
-        public const int TargetTypeFieldNumber = 3;
-
-        /// <summary>Field number for the "ease_in_speed" field.</summary>
-        public const int EaseInSpeedFieldNumber = 4;
-
-        /// <summary>Field number for the "east_out_speed" field.</summary>
-        public const int EastOutSpeedFieldNumber = 5;
-
-        /// <summary>Field number for the "duration_seconds" field.</summary>
-        public const int DurationSecondsFieldNumber = 6;
-
-        /// <summary>Field number for the "wait_seconds" field.</summary>
-        public const int WaitSecondsFieldNumber = 7;
-
-        /// <summary>Field number for the "transition_seconds" field.</summary>
-        public const int TransitionSecondsFieldNumber = 8;
-
-        /// <summary>Field number for the "angle_degree" field.</summary>
-        public const int AngleDegreeFieldNumber = 9;
-
-        /// <summary>Field number for the "angle_offset_degree" field.</summary>
-        public const int AngleOffsetDegreeFieldNumber = 10;
-
-        /// <summary>Field number for the "pitch_degree" field.</summary>
-        public const int PitchDegreeFieldNumber = 11;
-
-        /// <summary>Field number for the "pitch_offset_degree" field.</summary>
-        public const int PitchOffsetDegreeFieldNumber = 12;
-
-        /// <summary>Field number for the "roll_degree" field.</summary>
-        public const int RollDegreeFieldNumber = 13;
-
-        /// <summary>Field number for the "distance_meters" field.</summary>
-        public const int DistanceMetersFieldNumber = 14;
-
-        /// <summary>Field number for the "height_percent" field.</summary>
-        public const int HeightPercentFieldNumber = 15;
-
-        /// <summary>Field number for the "vert_ctr_ratio" field.</summary>
-        public const int VertCtrRatioFieldNumber = 16;
-
-        private static readonly pb::MessageParser<CameraSettings> _parser =
-            new pb::MessageParser<CameraSettings>(() => new CameraSettings());
-
-        private static readonly pb::FieldCodec<global::AllEnum.CameraInterpolation> _repeated_interpolation_codec
-            = pb::FieldCodec.ForEnum(18, x => (int)x, x => (global::AllEnum.CameraInterpolation)x);
-
-        private static readonly pb::FieldCodec<global::AllEnum.CameraTarget> _repeated_targetType_codec
-            = pb::FieldCodec.ForEnum(26, x => (int)x, x => (global::AllEnum.CameraTarget)x);
-
-        private static readonly pb::FieldCodec<float> _repeated_easeInSpeed_codec
-            = pb::FieldCodec.ForFloat(34);
-
-        private static readonly pb::FieldCodec<float> _repeated_eastOutSpeed_codec
-            = pb::FieldCodec.ForFloat(42);
-
-        private static readonly pb::FieldCodec<float> _repeated_durationSeconds_codec
-            = pb::FieldCodec.ForFloat(50);
-
-        private static readonly pb::FieldCodec<float> _repeated_waitSeconds_codec
-            = pb::FieldCodec.ForFloat(58);
-
-        private static readonly pb::FieldCodec<float> _repeated_transitionSeconds_codec
-            = pb::FieldCodec.ForFloat(66);
-
-        private static readonly pb::FieldCodec<float> _repeated_angleDegree_codec
-            = pb::FieldCodec.ForFloat(74);
-
-        private static readonly pb::FieldCodec<float> _repeated_angleOffsetDegree_codec
-            = pb::FieldCodec.ForFloat(82);
-
-        private static readonly pb::FieldCodec<float> _repeated_pitchDegree_codec
-            = pb::FieldCodec.ForFloat(90);
-
-        private static readonly pb::FieldCodec<float> _repeated_pitchOffsetDegree_codec
-            = pb::FieldCodec.ForFloat(98);
-
-        private static readonly pb::FieldCodec<float> _repeated_rollDegree_codec
-            = pb::FieldCodec.ForFloat(106);
-
-        private static readonly pb::FieldCodec<float> _repeated_distanceMeters_codec
-            = pb::FieldCodec.ForFloat(114);
-
-        private static readonly pb::FieldCodec<float> _repeated_heightPercent_codec
-            = pb::FieldCodec.ForFloat(122);
-
-        private static readonly pb::FieldCodec<float> _repeated_vertCtrRatio_codec
-            = pb::FieldCodec.ForFloat(130);
-
-        private readonly pbc::RepeatedField<float> angleDegree_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> angleOffsetDegree_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> distanceMeters_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> durationSeconds_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> easeInSpeed_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> eastOutSpeed_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> heightPercent_ = new pbc::RepeatedField<float>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.CameraInterpolation> interpolation_ =
-            new pbc::RepeatedField<global::AllEnum.CameraInterpolation>();
-
-        private readonly pbc::RepeatedField<float> pitchDegree_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> pitchOffsetDegree_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> rollDegree_ = new pbc::RepeatedField<float>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.CameraTarget> targetType_ =
-            new pbc::RepeatedField<global::AllEnum.CameraTarget>();
-
-        private readonly pbc::RepeatedField<float> transitionSeconds_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> vertCtrRatio_ = new pbc::RepeatedField<float>();
-        private readonly pbc::RepeatedField<float> waitSeconds_ = new pbc::RepeatedField<float>();
-        private string nextCamera_ = "";
-
-        public CameraSettings()
-        {
-            OnConstruction();
-        }
-
-        public CameraSettings(CameraSettings other) : this()
-        {
-            nextCamera_ = other.nextCamera_;
-            interpolation_ = other.interpolation_.Clone();
-            targetType_ = other.targetType_.Clone();
-            easeInSpeed_ = other.easeInSpeed_.Clone();
-            eastOutSpeed_ = other.eastOutSpeed_.Clone();
-            durationSeconds_ = other.durationSeconds_.Clone();
-            waitSeconds_ = other.waitSeconds_.Clone();
-            transitionSeconds_ = other.transitionSeconds_.Clone();
-            angleDegree_ = other.angleDegree_.Clone();
-            angleOffsetDegree_ = other.angleOffsetDegree_.Clone();
-            pitchDegree_ = other.pitchDegree_.Clone();
-            pitchOffsetDegree_ = other.pitchOffsetDegree_.Clone();
-            rollDegree_ = other.rollDegree_.Clone();
-            distanceMeters_ = other.distanceMeters_.Clone();
-            heightPercent_ = other.heightPercent_.Clone();
-            vertCtrRatio_ = other.vertCtrRatio_.Clone();
-        }
-
-        public static pb::MessageParser<CameraSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[73]; }
-        }
-
-        public string NextCamera
-        {
-            get { return nextCamera_; }
-            set { nextCamera_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.CameraInterpolation> Interpolation
-        {
-            get { return interpolation_; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.CameraTarget> TargetType
-        {
-            get { return targetType_; }
-        }
-
-        public pbc::RepeatedField<float> EaseInSpeed
-        {
-            get { return easeInSpeed_; }
-        }
-
-        public pbc::RepeatedField<float> EastOutSpeed
-        {
-            get { return eastOutSpeed_; }
-        }
-
-        public pbc::RepeatedField<float> DurationSeconds
-        {
-            get { return durationSeconds_; }
-        }
-
-        public pbc::RepeatedField<float> WaitSeconds
-        {
-            get { return waitSeconds_; }
-        }
-
-        public pbc::RepeatedField<float> TransitionSeconds
-        {
-            get { return transitionSeconds_; }
-        }
-
-        public pbc::RepeatedField<float> AngleDegree
-        {
-            get { return angleDegree_; }
-        }
-
-        public pbc::RepeatedField<float> AngleOffsetDegree
-        {
-            get { return angleOffsetDegree_; }
-        }
-
-        public pbc::RepeatedField<float> PitchDegree
-        {
-            get { return pitchDegree_; }
-        }
-
-        public pbc::RepeatedField<float> PitchOffsetDegree
-        {
-            get { return pitchOffsetDegree_; }
-        }
-
-        public pbc::RepeatedField<float> RollDegree
-        {
-            get { return rollDegree_; }
-        }
-
-        public pbc::RepeatedField<float> DistanceMeters
-        {
-            get { return distanceMeters_; }
-        }
-
-        public pbc::RepeatedField<float> HeightPercent
-        {
-            get { return heightPercent_; }
-        }
-
-        public pbc::RepeatedField<float> VertCtrRatio
-        {
-            get { return vertCtrRatio_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CameraSettings Clone()
-        {
-            return new CameraSettings(this);
-        }
-
-        public bool Equals(CameraSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (NextCamera != other.NextCamera) return false;
-            if (!interpolation_.Equals(other.interpolation_)) return false;
-            if (!targetType_.Equals(other.targetType_)) return false;
-            if (!easeInSpeed_.Equals(other.easeInSpeed_)) return false;
-            if (!eastOutSpeed_.Equals(other.eastOutSpeed_)) return false;
-            if (!durationSeconds_.Equals(other.durationSeconds_)) return false;
-            if (!waitSeconds_.Equals(other.waitSeconds_)) return false;
-            if (!transitionSeconds_.Equals(other.transitionSeconds_)) return false;
-            if (!angleDegree_.Equals(other.angleDegree_)) return false;
-            if (!angleOffsetDegree_.Equals(other.angleOffsetDegree_)) return false;
-            if (!pitchDegree_.Equals(other.pitchDegree_)) return false;
-            if (!pitchOffsetDegree_.Equals(other.pitchOffsetDegree_)) return false;
-            if (!rollDegree_.Equals(other.rollDegree_)) return false;
-            if (!distanceMeters_.Equals(other.distanceMeters_)) return false;
-            if (!heightPercent_.Equals(other.heightPercent_)) return false;
-            if (!vertCtrRatio_.Equals(other.vertCtrRatio_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (NextCamera.Length != 0)
-            {
-                output.WriteRawTag(10);
-                output.WriteString(NextCamera);
-            }
-            interpolation_.WriteTo(output, _repeated_interpolation_codec);
-            targetType_.WriteTo(output, _repeated_targetType_codec);
-            easeInSpeed_.WriteTo(output, _repeated_easeInSpeed_codec);
-            eastOutSpeed_.WriteTo(output, _repeated_eastOutSpeed_codec);
-            durationSeconds_.WriteTo(output, _repeated_durationSeconds_codec);
-            waitSeconds_.WriteTo(output, _repeated_waitSeconds_codec);
-            transitionSeconds_.WriteTo(output, _repeated_transitionSeconds_codec);
-            angleDegree_.WriteTo(output, _repeated_angleDegree_codec);
-            angleOffsetDegree_.WriteTo(output, _repeated_angleOffsetDegree_codec);
-            pitchDegree_.WriteTo(output, _repeated_pitchDegree_codec);
-            pitchOffsetDegree_.WriteTo(output, _repeated_pitchOffsetDegree_codec);
-            rollDegree_.WriteTo(output, _repeated_rollDegree_codec);
-            distanceMeters_.WriteTo(output, _repeated_distanceMeters_codec);
-            heightPercent_.WriteTo(output, _repeated_heightPercent_codec);
-            vertCtrRatio_.WriteTo(output, _repeated_vertCtrRatio_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (NextCamera.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(NextCamera);
-            }
-            size += interpolation_.CalculateSize(_repeated_interpolation_codec);
-            size += targetType_.CalculateSize(_repeated_targetType_codec);
-            size += easeInSpeed_.CalculateSize(_repeated_easeInSpeed_codec);
-            size += eastOutSpeed_.CalculateSize(_repeated_eastOutSpeed_codec);
-            size += durationSeconds_.CalculateSize(_repeated_durationSeconds_codec);
-            size += waitSeconds_.CalculateSize(_repeated_waitSeconds_codec);
-            size += transitionSeconds_.CalculateSize(_repeated_transitionSeconds_codec);
-            size += angleDegree_.CalculateSize(_repeated_angleDegree_codec);
-            size += angleOffsetDegree_.CalculateSize(_repeated_angleOffsetDegree_codec);
-            size += pitchDegree_.CalculateSize(_repeated_pitchDegree_codec);
-            size += pitchOffsetDegree_.CalculateSize(_repeated_pitchOffsetDegree_codec);
-            size += rollDegree_.CalculateSize(_repeated_rollDegree_codec);
-            size += distanceMeters_.CalculateSize(_repeated_distanceMeters_codec);
-            size += heightPercent_.CalculateSize(_repeated_heightPercent_codec);
-            size += vertCtrRatio_.CalculateSize(_repeated_vertCtrRatio_codec);
-            return size;
-        }
-
-        public void MergeFrom(CameraSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.NextCamera.Length != 0)
-            {
-                NextCamera = other.NextCamera;
-            }
-            interpolation_.Add(other.interpolation_);
-            targetType_.Add(other.targetType_);
-            easeInSpeed_.Add(other.easeInSpeed_);
-            eastOutSpeed_.Add(other.eastOutSpeed_);
-            durationSeconds_.Add(other.durationSeconds_);
-            waitSeconds_.Add(other.waitSeconds_);
-            transitionSeconds_.Add(other.transitionSeconds_);
-            angleDegree_.Add(other.angleDegree_);
-            angleOffsetDegree_.Add(other.angleOffsetDegree_);
-            pitchDegree_.Add(other.pitchDegree_);
-            pitchOffsetDegree_.Add(other.pitchOffsetDegree_);
-            rollDegree_.Add(other.rollDegree_);
-            distanceMeters_.Add(other.distanceMeters_);
-            heightPercent_.Add(other.heightPercent_);
-            vertCtrRatio_.Add(other.vertCtrRatio_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            NextCamera = input.ReadString();
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            interpolation_.AddEntriesFrom(input, _repeated_interpolation_codec);
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            targetType_.AddEntriesFrom(input, _repeated_targetType_codec);
-                            break;
-                        }
-                    case 34:
-                    case 37:
-                        {
-                            easeInSpeed_.AddEntriesFrom(input, _repeated_easeInSpeed_codec);
-                            break;
-                        }
-                    case 42:
-                    case 45:
-                        {
-                            eastOutSpeed_.AddEntriesFrom(input, _repeated_eastOutSpeed_codec);
-                            break;
-                        }
-                    case 50:
-                    case 53:
-                        {
-                            durationSeconds_.AddEntriesFrom(input, _repeated_durationSeconds_codec);
-                            break;
-                        }
-                    case 58:
-                    case 61:
-                        {
-                            waitSeconds_.AddEntriesFrom(input, _repeated_waitSeconds_codec);
-                            break;
-                        }
-                    case 66:
-                    case 69:
-                        {
-                            transitionSeconds_.AddEntriesFrom(input, _repeated_transitionSeconds_codec);
-                            break;
-                        }
-                    case 74:
-                    case 77:
-                        {
-                            angleDegree_.AddEntriesFrom(input, _repeated_angleDegree_codec);
-                            break;
-                        }
-                    case 82:
-                    case 85:
-                        {
-                            angleOffsetDegree_.AddEntriesFrom(input, _repeated_angleOffsetDegree_codec);
-                            break;
-                        }
-                    case 90:
-                    case 93:
-                        {
-                            pitchDegree_.AddEntriesFrom(input, _repeated_pitchDegree_codec);
-                            break;
-                        }
-                    case 98:
-                    case 101:
-                        {
-                            pitchOffsetDegree_.AddEntriesFrom(input, _repeated_pitchOffsetDegree_codec);
-                            break;
-                        }
-                    case 106:
-                    case 109:
-                        {
-                            rollDegree_.AddEntriesFrom(input, _repeated_rollDegree_codec);
-                            break;
-                        }
-                    case 114:
-                    case 117:
-                        {
-                            distanceMeters_.AddEntriesFrom(input, _repeated_distanceMeters_codec);
-                            break;
-                        }
-                    case 122:
-                    case 125:
-                        {
-                            heightPercent_.AddEntriesFrom(input, _repeated_heightPercent_codec);
-                            break;
-                        }
-                    case 130:
-                    case 133:
-                        {
-                            vertCtrRatio_.AddEntriesFrom(input, _repeated_vertCtrRatio_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CameraSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (NextCamera.Length != 0) hash ^= NextCamera.GetHashCode();
-            hash ^= interpolation_.GetHashCode();
-            hash ^= targetType_.GetHashCode();
-            hash ^= easeInSpeed_.GetHashCode();
-            hash ^= eastOutSpeed_.GetHashCode();
-            hash ^= durationSeconds_.GetHashCode();
-            hash ^= waitSeconds_.GetHashCode();
-            hash ^= transitionSeconds_.GetHashCode();
-            hash ^= angleDegree_.GetHashCode();
-            hash ^= angleOffsetDegree_.GetHashCode();
-            hash ^= pitchDegree_.GetHashCode();
-            hash ^= pitchOffsetDegree_.GetHashCode();
-            hash ^= rollDegree_.GetHashCode();
-            hash ^= distanceMeters_.GetHashCode();
-            hash ^= heightPercent_.GetHashCode();
-            hash ^= vertCtrRatio_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class BadgeSettings : pb::IMessage<BadgeSettings>
-    {
-        /// <summary>Field number for the "badge_type" field.</summary>
-        public const int BadgeTypeFieldNumber = 1;
-
-        /// <summary>Field number for the "badge_rank" field.</summary>
-        public const int BadgeRankFieldNumber = 2;
-
-        /// <summary>Field number for the "targets" field.</summary>
-        public const int TargetsFieldNumber = 3;
-
-        private static readonly pb::MessageParser<BadgeSettings> _parser =
-            new pb::MessageParser<BadgeSettings>(() => new BadgeSettings());
-
-        private static readonly pb::FieldCodec<int> _repeated_targets_codec
-            = pb::FieldCodec.ForInt32(26);
-
-        private readonly pbc::RepeatedField<int> targets_ = new pbc::RepeatedField<int>();
-        private int badgeRank_;
-        private global::AllEnum.BadgeType badgeType_ = 0;
-
-        public BadgeSettings()
-        {
-            OnConstruction();
-        }
-
-        public BadgeSettings(BadgeSettings other) : this()
-        {
-            badgeType_ = other.badgeType_;
-            badgeRank_ = other.badgeRank_;
-            targets_ = other.targets_.Clone();
-        }
-
-        public static pb::MessageParser<BadgeSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[74]; }
-        }
-
-        public global::AllEnum.BadgeType BadgeType
-        {
-            get { return badgeType_; }
-            set { badgeType_ = value; }
-        }
-
-        public int BadgeRank
-        {
-            get { return badgeRank_; }
-            set { badgeRank_ = value; }
-        }
-
-        public pbc::RepeatedField<int> Targets
-        {
-            get { return targets_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public BadgeSettings Clone()
-        {
-            return new BadgeSettings(this);
-        }
-
-        public bool Equals(BadgeSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (BadgeType != other.BadgeType) return false;
-            if (BadgeRank != other.BadgeRank) return false;
-            if (!targets_.Equals(other.targets_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (BadgeType != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)BadgeType);
-            }
-            if (BadgeRank != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(BadgeRank);
-            }
-            targets_.WriteTo(output, _repeated_targets_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (BadgeType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)BadgeType);
-            }
-            if (BadgeRank != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BadgeRank);
-            }
-            size += targets_.CalculateSize(_repeated_targets_codec);
-            return size;
-        }
-
-        public void MergeFrom(BadgeSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.BadgeType != 0)
-            {
-                BadgeType = other.BadgeType;
-            }
-            if (other.BadgeRank != 0)
-            {
-                BadgeRank = other.BadgeRank;
-            }
-            targets_.Add(other.targets_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            badgeType_ = (global::AllEnum.BadgeType)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            BadgeRank = input.ReadInt32();
-                            break;
-                        }
-                    case 26:
-                    case 24:
-                        {
-                            targets_.AddEntriesFrom(input, _repeated_targets_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as BadgeSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (BadgeType != 0) hash ^= BadgeType.GetHashCode();
-            if (BadgeRank != 0) hash ^= BadgeRank.GetHashCode();
-            hash ^= targets_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class TypeEffectiveSettings : pb::IMessage<TypeEffectiveSettings>
-    {
-        /// <summary>Field number for the "attack_scalar" field.</summary>
-        public const int AttackScalarFieldNumber = 1;
-
-        /// <summary>Field number for the "attack_type" field.</summary>
-        public const int AttackTypeFieldNumber = 2;
-
-        private static readonly pb::MessageParser<TypeEffectiveSettings> _parser =
-            new pb::MessageParser<TypeEffectiveSettings>(() => new TypeEffectiveSettings());
-
-        private static readonly pb::FieldCodec<float> _repeated_attackScalar_codec
-            = pb::FieldCodec.ForFloat(10);
-
-        private readonly pbc::RepeatedField<float> attackScalar_ = new pbc::RepeatedField<float>();
-        private global::AllEnum.PokemonType attackType_ = 0;
-
-        public TypeEffectiveSettings()
-        {
-            OnConstruction();
-        }
-
-        public TypeEffectiveSettings(TypeEffectiveSettings other) : this()
-        {
-            attackScalar_ = other.attackScalar_.Clone();
-            attackType_ = other.attackType_;
-        }
-
-        public static pb::MessageParser<TypeEffectiveSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[75]; }
-        }
-
-        public pbc::RepeatedField<float> AttackScalar
-        {
-            get { return attackScalar_; }
-        }
-
-        public global::AllEnum.PokemonType AttackType
-        {
-            get { return attackType_; }
-            set { attackType_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public TypeEffectiveSettings Clone()
-        {
-            return new TypeEffectiveSettings(this);
-        }
-
-        public bool Equals(TypeEffectiveSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!attackScalar_.Equals(other.attackScalar_)) return false;
-            if (AttackType != other.AttackType) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            attackScalar_.WriteTo(output, _repeated_attackScalar_codec);
-            if (AttackType != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)AttackType);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += attackScalar_.CalculateSize(_repeated_attackScalar_codec);
-            if (AttackType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)AttackType);
-            }
-            return size;
-        }
-
-        public void MergeFrom(TypeEffectiveSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            attackScalar_.Add(other.attackScalar_);
-            if (other.AttackType != 0)
-            {
-                AttackType = other.AttackType;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                    case 13:
-                        {
-                            attackScalar_.AddEntriesFrom(input, _repeated_attackScalar_codec);
-                            break;
-                        }
-                    case 16:
-                        {
-                            attackType_ = (global::AllEnum.PokemonType)input.ReadEnum();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as TypeEffectiveSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= attackScalar_.GetHashCode();
-            if (AttackType != 0) hash ^= AttackType.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class MoveSequenceSettings : pb::IMessage<MoveSequenceSettings>
-    {
-        /// <summary>Field number for the "sequence" field.</summary>
-        public const int SequenceFieldNumber = 1;
-
-        private static readonly pb::MessageParser<MoveSequenceSettings> _parser =
-            new pb::MessageParser<MoveSequenceSettings>(() => new MoveSequenceSettings());
-
-        private static readonly pb::FieldCodec<string> _repeated_sequence_codec
-            = pb::FieldCodec.ForString(10);
-
-        private readonly pbc::RepeatedField<string> sequence_ = new pbc::RepeatedField<string>();
-
-        public MoveSequenceSettings()
-        {
-            OnConstruction();
-        }
-
-        public MoveSequenceSettings(MoveSequenceSettings other) : this()
-        {
-            sequence_ = other.sequence_.Clone();
-        }
-
-        public static pb::MessageParser<MoveSequenceSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[76]; }
-        }
-
-        public pbc::RepeatedField<string> Sequence
-        {
-            get { return sequence_; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public MoveSequenceSettings Clone()
-        {
-            return new MoveSequenceSettings(this);
-        }
-
-        public bool Equals(MoveSequenceSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!sequence_.Equals(other.sequence_)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            sequence_.WriteTo(output, _repeated_sequence_codec);
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += sequence_.CalculateSize(_repeated_sequence_codec);
-            return size;
-        }
-
-        public void MergeFrom(MoveSequenceSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            sequence_.Add(other.sequence_);
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                        {
-                            sequence_.AddEntriesFrom(input, _repeated_sequence_codec);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as MoveSequenceSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= sequence_.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class MoveSettings : pb::IMessage<MoveSettings>
-    {
-        /// <summary>Field number for the "movement_id" field.</summary>
-        public const int MovementIdFieldNumber = 1;
-
-        /// <summary>Field number for the "animation_id" field.</summary>
-        public const int AnimationIdFieldNumber = 2;
-
-        /// <summary>Field number for the "pokemon_type" field.</summary>
-        public const int PokemonTypeFieldNumber = 3;
-
-        /// <summary>Field number for the "power" field.</summary>
-        public const int PowerFieldNumber = 4;
-
-        /// <summary>Field number for the "accuracy_chance" field.</summary>
-        public const int AccuracyChanceFieldNumber = 5;
-
-        /// <summary>Field number for the "critical_chance" field.</summary>
-        public const int CriticalChanceFieldNumber = 6;
-
-        /// <summary>Field number for the "heal_scalar" field.</summary>
-        public const int HealScalarFieldNumber = 7;
-
-        /// <summary>Field number for the "stamina_loss_scalar" field.</summary>
-        public const int StaminaLossScalarFieldNumber = 8;
-
-        /// <summary>Field number for the "trainer_level_min" field.</summary>
-        public const int TrainerLevelMinFieldNumber = 9;
-
-        /// <summary>Field number for the "trainer_level_max" field.</summary>
-        public const int TrainerLevelMaxFieldNumber = 10;
-
-        /// <summary>Field number for the "vfx_name" field.</summary>
-        public const int VfxNameFieldNumber = 11;
-
-        /// <summary>Field number for the "duration_ms" field.</summary>
-        public const int DurationMsFieldNumber = 12;
-
-        /// <summary>Field number for the "damage_window_start_ms" field.</summary>
-        public const int DamageWindowStartMsFieldNumber = 13;
-
-        /// <summary>Field number for the "damage_window_end_ms" field.</summary>
-        public const int DamageWindowEndMsFieldNumber = 14;
-
-        /// <summary>Field number for the "energy_delta" field.</summary>
-        public const int EnergyDeltaFieldNumber = 15;
-
-        private static readonly pb::MessageParser<MoveSettings> _parser =
-            new pb::MessageParser<MoveSettings>(() => new MoveSettings());
-
-        private float accuracyChance_;
-        private int animationId_;
-        private float criticalChance_;
-        private int damageWindowEndMs_;
-        private int damageWindowStartMs_;
-        private int durationMs_;
-        private int energyDelta_;
-        private float healScalar_;
-        private global::AllEnum.PokemonMovementType movementId_ = 0;
-        private global::AllEnum.PokemonType pokemonType_ = 0;
-        private float power_;
-        private float staminaLossScalar_;
-        private int trainerLevelMax_;
-        private int trainerLevelMin_;
-        private string vfxName_ = "";
-
-        public MoveSettings()
-        {
-            OnConstruction();
-        }
-
-        public MoveSettings(MoveSettings other) : this()
-        {
-            movementId_ = other.movementId_;
-            animationId_ = other.animationId_;
-            pokemonType_ = other.pokemonType_;
-            power_ = other.power_;
-            accuracyChance_ = other.accuracyChance_;
-            criticalChance_ = other.criticalChance_;
-            healScalar_ = other.healScalar_;
-            staminaLossScalar_ = other.staminaLossScalar_;
-            trainerLevelMin_ = other.trainerLevelMin_;
-            trainerLevelMax_ = other.trainerLevelMax_;
-            vfxName_ = other.vfxName_;
-            durationMs_ = other.durationMs_;
-            damageWindowStartMs_ = other.damageWindowStartMs_;
-            damageWindowEndMs_ = other.damageWindowEndMs_;
-            energyDelta_ = other.energyDelta_;
-        }
-
-        public static pb::MessageParser<MoveSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[77]; }
-        }
-
-        public global::AllEnum.PokemonMovementType MovementId
-        {
-            get { return movementId_; }
-            set { movementId_ = value; }
-        }
-
-        public int AnimationId
-        {
-            get { return animationId_; }
-            set { animationId_ = value; }
-        }
-
-        public global::AllEnum.PokemonType PokemonType
-        {
-            get { return pokemonType_; }
-            set { pokemonType_ = value; }
-        }
-
-        public float Power
-        {
-            get { return power_; }
-            set { power_ = value; }
-        }
-
-        public float AccuracyChance
-        {
-            get { return accuracyChance_; }
-            set { accuracyChance_ = value; }
-        }
-
-        public float CriticalChance
-        {
-            get { return criticalChance_; }
-            set { criticalChance_ = value; }
-        }
-
-        public float HealScalar
-        {
-            get { return healScalar_; }
-            set { healScalar_ = value; }
-        }
-
-        public float StaminaLossScalar
-        {
-            get { return staminaLossScalar_; }
-            set { staminaLossScalar_ = value; }
-        }
-
-        public int TrainerLevelMin
-        {
-            get { return trainerLevelMin_; }
-            set { trainerLevelMin_ = value; }
-        }
-
-        public int TrainerLevelMax
-        {
-            get { return trainerLevelMax_; }
-            set { trainerLevelMax_ = value; }
-        }
-
-        public string VfxName
-        {
-            get { return vfxName_; }
-            set { vfxName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public int DurationMs
-        {
-            get { return durationMs_; }
-            set { durationMs_ = value; }
-        }
-
-        public int DamageWindowStartMs
-        {
-            get { return damageWindowStartMs_; }
-            set { damageWindowStartMs_ = value; }
-        }
-
-        public int DamageWindowEndMs
-        {
-            get { return damageWindowEndMs_; }
-            set { damageWindowEndMs_ = value; }
-        }
-
-        public int EnergyDelta
-        {
-            get { return energyDelta_; }
-            set { energyDelta_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public MoveSettings Clone()
-        {
-            return new MoveSettings(this);
-        }
-
-        public bool Equals(MoveSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (MovementId != other.MovementId) return false;
-            if (AnimationId != other.AnimationId) return false;
-            if (PokemonType != other.PokemonType) return false;
-            if (Power != other.Power) return false;
-            if (AccuracyChance != other.AccuracyChance) return false;
-            if (CriticalChance != other.CriticalChance) return false;
-            if (HealScalar != other.HealScalar) return false;
-            if (StaminaLossScalar != other.StaminaLossScalar) return false;
-            if (TrainerLevelMin != other.TrainerLevelMin) return false;
-            if (TrainerLevelMax != other.TrainerLevelMax) return false;
-            if (VfxName != other.VfxName) return false;
-            if (DurationMs != other.DurationMs) return false;
-            if (DamageWindowStartMs != other.DamageWindowStartMs) return false;
-            if (DamageWindowEndMs != other.DamageWindowEndMs) return false;
-            if (EnergyDelta != other.EnergyDelta) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (MovementId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)MovementId);
-            }
-            if (AnimationId != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(AnimationId);
-            }
-            if (PokemonType != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteEnum((int)PokemonType);
-            }
-            if (Power != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(Power);
-            }
-            if (AccuracyChance != 0F)
-            {
-                output.WriteRawTag(45);
-                output.WriteFloat(AccuracyChance);
-            }
-            if (CriticalChance != 0F)
-            {
-                output.WriteRawTag(53);
-                output.WriteFloat(CriticalChance);
-            }
-            if (HealScalar != 0F)
-            {
-                output.WriteRawTag(61);
-                output.WriteFloat(HealScalar);
-            }
-            if (StaminaLossScalar != 0F)
-            {
-                output.WriteRawTag(69);
-                output.WriteFloat(StaminaLossScalar);
-            }
-            if (TrainerLevelMin != 0)
-            {
-                output.WriteRawTag(72);
-                output.WriteInt32(TrainerLevelMin);
-            }
-            if (TrainerLevelMax != 0)
-            {
-                output.WriteRawTag(80);
-                output.WriteInt32(TrainerLevelMax);
-            }
-            if (VfxName.Length != 0)
-            {
-                output.WriteRawTag(90);
-                output.WriteString(VfxName);
-            }
-            if (DurationMs != 0)
-            {
-                output.WriteRawTag(96);
-                output.WriteInt32(DurationMs);
-            }
-            if (DamageWindowStartMs != 0)
-            {
-                output.WriteRawTag(104);
-                output.WriteInt32(DamageWindowStartMs);
-            }
-            if (DamageWindowEndMs != 0)
-            {
-                output.WriteRawTag(112);
-                output.WriteInt32(DamageWindowEndMs);
-            }
-            if (EnergyDelta != 0)
-            {
-                output.WriteRawTag(120);
-                output.WriteInt32(EnergyDelta);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (MovementId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)MovementId);
-            }
-            if (AnimationId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(AnimationId);
-            }
-            if (PokemonType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)PokemonType);
-            }
-            if (Power != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (AccuracyChance != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CriticalChance != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (HealScalar != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (StaminaLossScalar != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (TrainerLevelMin != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(TrainerLevelMin);
-            }
-            if (TrainerLevelMax != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(TrainerLevelMax);
-            }
-            if (VfxName.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(VfxName);
-            }
-            if (DurationMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DurationMs);
-            }
-            if (DamageWindowStartMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DamageWindowStartMs);
-            }
-            if (DamageWindowEndMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DamageWindowEndMs);
-            }
-            if (EnergyDelta != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EnergyDelta);
-            }
-            return size;
-        }
-
-        public void MergeFrom(MoveSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.MovementId != 0)
-            {
-                MovementId = other.MovementId;
-            }
-            if (other.AnimationId != 0)
-            {
-                AnimationId = other.AnimationId;
-            }
-            if (other.PokemonType != 0)
-            {
-                PokemonType = other.PokemonType;
-            }
-            if (other.Power != 0F)
-            {
-                Power = other.Power;
-            }
-            if (other.AccuracyChance != 0F)
-            {
-                AccuracyChance = other.AccuracyChance;
-            }
-            if (other.CriticalChance != 0F)
-            {
-                CriticalChance = other.CriticalChance;
-            }
-            if (other.HealScalar != 0F)
-            {
-                HealScalar = other.HealScalar;
-            }
-            if (other.StaminaLossScalar != 0F)
-            {
-                StaminaLossScalar = other.StaminaLossScalar;
-            }
-            if (other.TrainerLevelMin != 0)
-            {
-                TrainerLevelMin = other.TrainerLevelMin;
-            }
-            if (other.TrainerLevelMax != 0)
-            {
-                TrainerLevelMax = other.TrainerLevelMax;
-            }
-            if (other.VfxName.Length != 0)
-            {
-                VfxName = other.VfxName;
-            }
-            if (other.DurationMs != 0)
-            {
-                DurationMs = other.DurationMs;
-            }
-            if (other.DamageWindowStartMs != 0)
-            {
-                DamageWindowStartMs = other.DamageWindowStartMs;
-            }
-            if (other.DamageWindowEndMs != 0)
-            {
-                DamageWindowEndMs = other.DamageWindowEndMs;
-            }
-            if (other.EnergyDelta != 0)
-            {
-                EnergyDelta = other.EnergyDelta;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            movementId_ = (global::AllEnum.PokemonMovementType)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            AnimationId = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            pokemonType_ = (global::AllEnum.PokemonType)input.ReadEnum();
-                            break;
-                        }
-                    case 37:
-                        {
-                            Power = input.ReadFloat();
-                            break;
-                        }
-                    case 45:
-                        {
-                            AccuracyChance = input.ReadFloat();
-                            break;
-                        }
-                    case 53:
-                        {
-                            CriticalChance = input.ReadFloat();
-                            break;
-                        }
-                    case 61:
-                        {
-                            HealScalar = input.ReadFloat();
-                            break;
-                        }
-                    case 69:
-                        {
-                            StaminaLossScalar = input.ReadFloat();
-                            break;
-                        }
-                    case 72:
-                        {
-                            TrainerLevelMin = input.ReadInt32();
-                            break;
-                        }
-                    case 80:
-                        {
-                            TrainerLevelMax = input.ReadInt32();
-                            break;
-                        }
-                    case 90:
-                        {
-                            VfxName = input.ReadString();
-                            break;
-                        }
-                    case 96:
-                        {
-                            DurationMs = input.ReadInt32();
-                            break;
-                        }
-                    case 104:
-                        {
-                            DamageWindowStartMs = input.ReadInt32();
-                            break;
-                        }
-                    case 112:
-                        {
-                            DamageWindowEndMs = input.ReadInt32();
-                            break;
-                        }
-                    case 120:
-                        {
-                            EnergyDelta = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as MoveSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (MovementId != 0) hash ^= MovementId.GetHashCode();
-            if (AnimationId != 0) hash ^= AnimationId.GetHashCode();
-            if (PokemonType != 0) hash ^= PokemonType.GetHashCode();
-            if (Power != 0F) hash ^= Power.GetHashCode();
-            if (AccuracyChance != 0F) hash ^= AccuracyChance.GetHashCode();
-            if (CriticalChance != 0F) hash ^= CriticalChance.GetHashCode();
-            if (HealScalar != 0F) hash ^= HealScalar.GetHashCode();
-            if (StaminaLossScalar != 0F) hash ^= StaminaLossScalar.GetHashCode();
-            if (TrainerLevelMin != 0) hash ^= TrainerLevelMin.GetHashCode();
-            if (TrainerLevelMax != 0) hash ^= TrainerLevelMax.GetHashCode();
-            if (VfxName.Length != 0) hash ^= VfxName.GetHashCode();
-            if (DurationMs != 0) hash ^= DurationMs.GetHashCode();
-            if (DamageWindowStartMs != 0) hash ^= DamageWindowStartMs.GetHashCode();
-            if (DamageWindowEndMs != 0) hash ^= DamageWindowEndMs.GetHashCode();
-            if (EnergyDelta != 0) hash ^= EnergyDelta.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PokemonSettings : pb::IMessage<PokemonSettings>
-    {
-        /// <summary>Field number for the "pokemon_id" field.</summary>
-        public const int PokemonIdFieldNumber = 1;
-
-        /// <summary>Field number for the "model_scale" field.</summary>
-        public const int ModelScaleFieldNumber = 3;
-
-        /// <summary>Field number for the "type" field.</summary>
-        public const int TypeFieldNumber = 4;
-
-        /// <summary>Field number for the "type_2" field.</summary>
-        public const int Type2FieldNumber = 5;
-
-        /// <summary>Field number for the "camera" field.</summary>
-        public const int CameraFieldNumber = 6;
-
-        /// <summary>Field number for the "encounter" field.</summary>
-        public const int EncounterFieldNumber = 7;
-
-        /// <summary>Field number for the "stats" field.</summary>
-        public const int StatsFieldNumber = 8;
-
-        /// <summary>Field number for the "quick_moves" field.</summary>
-        public const int QuickMovesFieldNumber = 9;
-
-        /// <summary>Field number for the "cinematic_moves" field.</summary>
-        public const int CinematicMovesFieldNumber = 10;
-
-        /// <summary>Field number for the "animation_time" field.</summary>
-        public const int AnimationTimeFieldNumber = 11;
-
-        /// <summary>Field number for the "evolution_ids" field.</summary>
-        public const int EvolutionIdsFieldNumber = 12;
-
-        /// <summary>Field number for the "evolution_pips" field.</summary>
-        public const int EvolutionPipsFieldNumber = 13;
-
-        /// <summary>Field number for the "class" field.</summary>
-        public const int ClassFieldNumber = 14;
-
-        /// <summary>Field number for the "pokedex_height_m" field.</summary>
-        public const int PokedexHeightMFieldNumber = 15;
-
-        /// <summary>Field number for the "pokedex_weight_kg" field.</summary>
-        public const int PokedexWeightKgFieldNumber = 16;
-
-        /// <summary>Field number for the "parent_pokemon_id" field.</summary>
-        public const int ParentPokemonIdFieldNumber = 17;
-
-        /// <summary>Field number for the "height_std_dev" field.</summary>
-        public const int HeightStdDevFieldNumber = 18;
-
-        /// <summary>Field number for the "weight_std_dev" field.</summary>
-        public const int WeightStdDevFieldNumber = 19;
-
-        /// <summary>Field number for the "km_distance_to_hatch" field.</summary>
-        public const int KmDistanceToHatchFieldNumber = 20;
-
-        /// <summary>Field number for the "family_id" field.</summary>
-        public const int FamilyIdFieldNumber = 21;
-
-        /// <summary>Field number for the "candy_to_evolve" field.</summary>
-        public const int CandyToEvolveFieldNumber = 22;
-
-        private static readonly pb::MessageParser<PokemonSettings> _parser =
-            new pb::MessageParser<PokemonSettings>(() => new PokemonSettings());
-
-        private static readonly pb::FieldCodec<global::AllEnum.PokemonMove> _repeated_quickMoves_codec
-            = pb::FieldCodec.ForEnum(74, x => (int)x, x => (global::AllEnum.PokemonMove)x);
-
-        private static readonly pb::FieldCodec<global::AllEnum.PokemonMove> _repeated_cinematicMoves_codec
-            = pb::FieldCodec.ForEnum(82, x => (int)x, x => (global::AllEnum.PokemonMove)x);
-
-        private static readonly pb::FieldCodec<float> _repeated_animationTime_codec
-            = pb::FieldCodec.ForFloat(90);
-
-        private static readonly pb::FieldCodec<global::AllEnum.PokemonId> _repeated_evolutionIds_codec
-            = pb::FieldCodec.ForEnum(98, x => (int)x, x => (global::AllEnum.PokemonId)x);
-
-        private readonly pbc::RepeatedField<float> animationTime_ = new pbc::RepeatedField<float>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.PokemonMove> cinematicMoves_ =
-            new pbc::RepeatedField<global::AllEnum.PokemonMove>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.PokemonId> evolutionIds_ =
-            new pbc::RepeatedField<global::AllEnum.PokemonId>();
-
-        private readonly pbc::RepeatedField<global::AllEnum.PokemonMove> quickMoves_ =
-            new pbc::RepeatedField<global::AllEnum.PokemonMove>();
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.CameraAttributes camera_;
-        private int candyToEvolve_;
-        private global::AllEnum.PokemonClass class_ = 0;
-        private global::PokemonGo.RocketAPI.GeneratedCode.EncounterAttributes encounter_;
-        private int evolutionPips_;
-        private global::AllEnum.PokemonFamilyId familyId_ = 0;
-        private float heightStdDev_;
-        private float kmDistanceToHatch_;
-        private float modelScale_;
-        private global::AllEnum.PokemonId parentPokemonId_ = 0;
-        private float pokedexHeightM_;
-        private float pokedexWeightKg_;
-        private global::AllEnum.PokemonId pokemonId_ = 0;
-        private global::PokemonGo.RocketAPI.GeneratedCode.StatsAttributes stats_;
-        private global::AllEnum.PokemonType type_ = 0;
-        private global::AllEnum.PokemonType type2_ = 0;
-        private float weightStdDev_;
-
-        public PokemonSettings()
-        {
-            OnConstruction();
-        }
-
-        public PokemonSettings(PokemonSettings other) : this()
-        {
-            pokemonId_ = other.pokemonId_;
-            modelScale_ = other.modelScale_;
-            type_ = other.type_;
-            type2_ = other.type2_;
-            Camera = other.camera_ != null ? other.Camera.Clone() : null;
-            Encounter = other.encounter_ != null ? other.Encounter.Clone() : null;
-            Stats = other.stats_ != null ? other.Stats.Clone() : null;
-            quickMoves_ = other.quickMoves_.Clone();
-            cinematicMoves_ = other.cinematicMoves_.Clone();
-            animationTime_ = other.animationTime_.Clone();
-            evolutionIds_ = other.evolutionIds_.Clone();
-            evolutionPips_ = other.evolutionPips_;
-            class_ = other.class_;
-            pokedexHeightM_ = other.pokedexHeightM_;
-            pokedexWeightKg_ = other.pokedexWeightKg_;
-            parentPokemonId_ = other.parentPokemonId_;
-            heightStdDev_ = other.heightStdDev_;
-            weightStdDev_ = other.weightStdDev_;
-            kmDistanceToHatch_ = other.kmDistanceToHatch_;
-            familyId_ = other.familyId_;
-            candyToEvolve_ = other.candyToEvolve_;
-        }
-
-        public static pb::MessageParser<PokemonSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[78]; }
-        }
-
-        public global::AllEnum.PokemonId PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        public float ModelScale
-        {
-            get { return modelScale_; }
-            set { modelScale_ = value; }
-        }
-
-        public global::AllEnum.PokemonType Type
-        {
-            get { return type_; }
-            set { type_ = value; }
-        }
-
-        public global::AllEnum.PokemonType Type2
-        {
-            get { return type2_; }
-            set { type2_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.CameraAttributes Camera
-        {
-            get { return camera_; }
-            set { camera_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.EncounterAttributes Encounter
-        {
-            get { return encounter_; }
-            set { encounter_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.StatsAttributes Stats
-        {
-            get { return stats_; }
-            set { stats_ = value; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.PokemonMove> QuickMoves
-        {
-            get { return quickMoves_; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.PokemonMove> CinematicMoves
-        {
-            get { return cinematicMoves_; }
-        }
-
-        public pbc::RepeatedField<float> AnimationTime
-        {
-            get { return animationTime_; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.PokemonId> EvolutionIds
-        {
-            get { return evolutionIds_; }
-        }
-
-        public int EvolutionPips
-        {
-            get { return evolutionPips_; }
-            set { evolutionPips_ = value; }
-        }
-
-        public global::AllEnum.PokemonClass Class
-        {
-            get { return class_; }
-            set { class_ = value; }
-        }
-
-        public float PokedexHeightM
-        {
-            get { return pokedexHeightM_; }
-            set { pokedexHeightM_ = value; }
-        }
-
-        public float PokedexWeightKg
-        {
-            get { return pokedexWeightKg_; }
-            set { pokedexWeightKg_ = value; }
-        }
-
-        public global::AllEnum.PokemonId ParentPokemonId
-        {
-            get { return parentPokemonId_; }
-            set { parentPokemonId_ = value; }
-        }
-
-        public float HeightStdDev
-        {
-            get { return heightStdDev_; }
-            set { heightStdDev_ = value; }
-        }
-
-        public float WeightStdDev
-        {
-            get { return weightStdDev_; }
-            set { weightStdDev_ = value; }
-        }
-
-        public float KmDistanceToHatch
-        {
-            get { return kmDistanceToHatch_; }
-            set { kmDistanceToHatch_ = value; }
-        }
-
-        public global::AllEnum.PokemonFamilyId FamilyId
-        {
-            get { return familyId_; }
-            set { familyId_ = value; }
-        }
-
-        public int CandyToEvolve
-        {
-            get { return candyToEvolve_; }
-            set { candyToEvolve_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PokemonSettings Clone()
-        {
-            return new PokemonSettings(this);
-        }
-
-        public bool Equals(PokemonSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokemonId != other.PokemonId) return false;
-            if (ModelScale != other.ModelScale) return false;
-            if (Type != other.Type) return false;
-            if (Type2 != other.Type2) return false;
-            if (!Equals(Camera, other.Camera)) return false;
-            if (!Equals(Encounter, other.Encounter)) return false;
-            if (!Equals(Stats, other.Stats)) return false;
-            if (!quickMoves_.Equals(other.quickMoves_)) return false;
-            if (!cinematicMoves_.Equals(other.cinematicMoves_)) return false;
-            if (!animationTime_.Equals(other.animationTime_)) return false;
-            if (!evolutionIds_.Equals(other.evolutionIds_)) return false;
-            if (EvolutionPips != other.EvolutionPips) return false;
-            if (Class != other.Class) return false;
-            if (PokedexHeightM != other.PokedexHeightM) return false;
-            if (PokedexWeightKg != other.PokedexWeightKg) return false;
-            if (ParentPokemonId != other.ParentPokemonId) return false;
-            if (HeightStdDev != other.HeightStdDev) return false;
-            if (WeightStdDev != other.WeightStdDev) return false;
-            if (KmDistanceToHatch != other.KmDistanceToHatch) return false;
-            if (FamilyId != other.FamilyId) return false;
-            if (CandyToEvolve != other.CandyToEvolve) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokemonId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)PokemonId);
-            }
-            if (ModelScale != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(ModelScale);
-            }
-            if (Type != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteEnum((int)Type);
-            }
-            if (Type2 != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteEnum((int)Type2);
-            }
-            if (camera_ != null)
-            {
-                output.WriteRawTag(50);
-                output.WriteMessage(Camera);
-            }
-            if (encounter_ != null)
-            {
-                output.WriteRawTag(58);
-                output.WriteMessage(Encounter);
-            }
-            if (stats_ != null)
-            {
-                output.WriteRawTag(66);
-                output.WriteMessage(Stats);
-            }
-            quickMoves_.WriteTo(output, _repeated_quickMoves_codec);
-            cinematicMoves_.WriteTo(output, _repeated_cinematicMoves_codec);
-            animationTime_.WriteTo(output, _repeated_animationTime_codec);
-            evolutionIds_.WriteTo(output, _repeated_evolutionIds_codec);
-            if (EvolutionPips != 0)
-            {
-                output.WriteRawTag(104);
-                output.WriteInt32(EvolutionPips);
-            }
-            if (Class != 0)
-            {
-                output.WriteRawTag(112);
-                output.WriteEnum((int)Class);
-            }
-            if (PokedexHeightM != 0F)
-            {
-                output.WriteRawTag(125);
-                output.WriteFloat(PokedexHeightM);
-            }
-            if (PokedexWeightKg != 0F)
-            {
-                output.WriteRawTag(133, 1);
-                output.WriteFloat(PokedexWeightKg);
-            }
-            if (ParentPokemonId != 0)
-            {
-                output.WriteRawTag(136, 1);
-                output.WriteEnum((int)ParentPokemonId);
-            }
-            if (HeightStdDev != 0F)
-            {
-                output.WriteRawTag(149, 1);
-                output.WriteFloat(HeightStdDev);
-            }
-            if (WeightStdDev != 0F)
-            {
-                output.WriteRawTag(157, 1);
-                output.WriteFloat(WeightStdDev);
-            }
-            if (KmDistanceToHatch != 0F)
-            {
-                output.WriteRawTag(165, 1);
-                output.WriteFloat(KmDistanceToHatch);
-            }
-            if (FamilyId != 0)
-            {
-                output.WriteRawTag(168, 1);
-                output.WriteEnum((int)FamilyId);
-            }
-            if (CandyToEvolve != 0)
-            {
-                output.WriteRawTag(176, 1);
-                output.WriteInt32(CandyToEvolve);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokemonId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)PokemonId);
-            }
-            if (ModelScale != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (Type != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type);
-            }
-            if (Type2 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type2);
-            }
-            if (camera_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Camera);
-            }
-            if (encounter_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Encounter);
-            }
-            if (stats_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stats);
-            }
-            size += quickMoves_.CalculateSize(_repeated_quickMoves_codec);
-            size += cinematicMoves_.CalculateSize(_repeated_cinematicMoves_codec);
-            size += animationTime_.CalculateSize(_repeated_animationTime_codec);
-            size += evolutionIds_.CalculateSize(_repeated_evolutionIds_codec);
-            if (EvolutionPips != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(EvolutionPips);
-            }
-            if (Class != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Class);
-            }
-            if (PokedexHeightM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (PokedexWeightKg != 0F)
-            {
-                size += 2 + 4;
-            }
-            if (ParentPokemonId != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeEnumSize((int)ParentPokemonId);
-            }
-            if (HeightStdDev != 0F)
-            {
-                size += 2 + 4;
-            }
-            if (WeightStdDev != 0F)
-            {
-                size += 2 + 4;
-            }
-            if (KmDistanceToHatch != 0F)
-            {
-                size += 2 + 4;
-            }
-            if (FamilyId != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeEnumSize((int)FamilyId);
-            }
-            if (CandyToEvolve != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeInt32Size(CandyToEvolve);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PokemonSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokemonId != 0)
-            {
-                PokemonId = other.PokemonId;
-            }
-            if (other.ModelScale != 0F)
-            {
-                ModelScale = other.ModelScale;
-            }
-            if (other.Type != 0)
-            {
-                Type = other.Type;
-            }
-            if (other.Type2 != 0)
-            {
-                Type2 = other.Type2;
-            }
-            if (other.camera_ != null)
-            {
-                if (camera_ == null)
-                {
-                    camera_ = new global::PokemonGo.RocketAPI.GeneratedCode.CameraAttributes();
-                }
-                Camera.MergeFrom(other.Camera);
-            }
-            if (other.encounter_ != null)
-            {
-                if (encounter_ == null)
-                {
-                    encounter_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterAttributes();
-                }
-                Encounter.MergeFrom(other.Encounter);
-            }
-            if (other.stats_ != null)
-            {
-                if (stats_ == null)
-                {
-                    stats_ = new global::PokemonGo.RocketAPI.GeneratedCode.StatsAttributes();
-                }
-                Stats.MergeFrom(other.Stats);
-            }
-            quickMoves_.Add(other.quickMoves_);
-            cinematicMoves_.Add(other.cinematicMoves_);
-            animationTime_.Add(other.animationTime_);
-            evolutionIds_.Add(other.evolutionIds_);
-            if (other.EvolutionPips != 0)
-            {
-                EvolutionPips = other.EvolutionPips;
-            }
-            if (other.Class != 0)
-            {
-                Class = other.Class;
-            }
-            if (other.PokedexHeightM != 0F)
-            {
-                PokedexHeightM = other.PokedexHeightM;
-            }
-            if (other.PokedexWeightKg != 0F)
-            {
-                PokedexWeightKg = other.PokedexWeightKg;
-            }
-            if (other.ParentPokemonId != 0)
-            {
-                ParentPokemonId = other.ParentPokemonId;
-            }
-            if (other.HeightStdDev != 0F)
-            {
-                HeightStdDev = other.HeightStdDev;
-            }
-            if (other.WeightStdDev != 0F)
-            {
-                WeightStdDev = other.WeightStdDev;
-            }
-            if (other.KmDistanceToHatch != 0F)
-            {
-                KmDistanceToHatch = other.KmDistanceToHatch;
-            }
-            if (other.FamilyId != 0)
-            {
-                FamilyId = other.FamilyId;
-            }
-            if (other.CandyToEvolve != 0)
-            {
-                CandyToEvolve = other.CandyToEvolve;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            pokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 29:
-                        {
-                            ModelScale = input.ReadFloat();
-                            break;
-                        }
-                    case 32:
-                        {
-                            type_ = (global::AllEnum.PokemonType)input.ReadEnum();
-                            break;
-                        }
-                    case 40:
-                        {
-                            type2_ = (global::AllEnum.PokemonType)input.ReadEnum();
-                            break;
-                        }
-                    case 50:
-                        {
-                            if (camera_ == null)
-                            {
-                                camera_ = new global::PokemonGo.RocketAPI.GeneratedCode.CameraAttributes();
-                            }
-                            input.ReadMessage(camera_);
-                            break;
-                        }
-                    case 58:
-                        {
-                            if (encounter_ == null)
-                            {
-                                encounter_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterAttributes();
-                            }
-                            input.ReadMessage(encounter_);
-                            break;
-                        }
-                    case 66:
-                        {
-                            if (stats_ == null)
-                            {
-                                stats_ = new global::PokemonGo.RocketAPI.GeneratedCode.StatsAttributes();
-                            }
-                            input.ReadMessage(stats_);
-                            break;
-                        }
-                    case 74:
-                    case 72:
-                        {
-                            quickMoves_.AddEntriesFrom(input, _repeated_quickMoves_codec);
-                            break;
-                        }
-                    case 82:
-                    case 80:
-                        {
-                            cinematicMoves_.AddEntriesFrom(input, _repeated_cinematicMoves_codec);
-                            break;
-                        }
-                    case 90:
-                    case 93:
-                        {
-                            animationTime_.AddEntriesFrom(input, _repeated_animationTime_codec);
-                            break;
-                        }
-                    case 98:
-                    case 96:
-                        {
-                            evolutionIds_.AddEntriesFrom(input, _repeated_evolutionIds_codec);
-                            break;
-                        }
-                    case 104:
-                        {
-                            EvolutionPips = input.ReadInt32();
-                            break;
-                        }
-                    case 112:
-                        {
-                            class_ = (global::AllEnum.PokemonClass)input.ReadEnum();
-                            break;
-                        }
-                    case 125:
-                        {
-                            PokedexHeightM = input.ReadFloat();
-                            break;
-                        }
-                    case 133:
-                        {
-                            PokedexWeightKg = input.ReadFloat();
-                            break;
-                        }
-                    case 136:
-                        {
-                            parentPokemonId_ = (global::AllEnum.PokemonId)input.ReadEnum();
-                            break;
-                        }
-                    case 149:
-                        {
-                            HeightStdDev = input.ReadFloat();
-                            break;
-                        }
-                    case 157:
-                        {
-                            WeightStdDev = input.ReadFloat();
-                            break;
-                        }
-                    case 165:
-                        {
-                            KmDistanceToHatch = input.ReadFloat();
-                            break;
-                        }
-                    case 168:
-                        {
-                            familyId_ = (global::AllEnum.PokemonFamilyId)input.ReadEnum();
-                            break;
-                        }
-                    case 176:
-                        {
-                            CandyToEvolve = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PokemonSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokemonId != 0) hash ^= PokemonId.GetHashCode();
-            if (ModelScale != 0F) hash ^= ModelScale.GetHashCode();
-            if (Type != 0) hash ^= Type.GetHashCode();
-            if (Type2 != 0) hash ^= Type2.GetHashCode();
-            if (camera_ != null) hash ^= Camera.GetHashCode();
-            if (encounter_ != null) hash ^= Encounter.GetHashCode();
-            if (stats_ != null) hash ^= Stats.GetHashCode();
-            hash ^= quickMoves_.GetHashCode();
-            hash ^= cinematicMoves_.GetHashCode();
-            hash ^= animationTime_.GetHashCode();
-            hash ^= evolutionIds_.GetHashCode();
-            if (EvolutionPips != 0) hash ^= EvolutionPips.GetHashCode();
-            if (Class != 0) hash ^= Class.GetHashCode();
-            if (PokedexHeightM != 0F) hash ^= PokedexHeightM.GetHashCode();
-            if (PokedexWeightKg != 0F) hash ^= PokedexWeightKg.GetHashCode();
-            if (ParentPokemonId != 0) hash ^= ParentPokemonId.GetHashCode();
-            if (HeightStdDev != 0F) hash ^= HeightStdDev.GetHashCode();
-            if (WeightStdDev != 0F) hash ^= WeightStdDev.GetHashCode();
-            if (KmDistanceToHatch != 0F) hash ^= KmDistanceToHatch.GetHashCode();
-            if (FamilyId != 0) hash ^= FamilyId.GetHashCode();
-            if (CandyToEvolve != 0) hash ^= CandyToEvolve.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class CameraAttributes : pb::IMessage<CameraAttributes>
-    {
-        /// <summary>Field number for the "disk_radius_m" field.</summary>
-        public const int DiskRadiusMFieldNumber = 1;
-
-        /// <summary>Field number for the "cylinder_radius_m" field.</summary>
-        public const int CylinderRadiusMFieldNumber = 2;
-
-        /// <summary>Field number for the "cylinder_height_m" field.</summary>
-        public const int CylinderHeightMFieldNumber = 3;
-
-        /// <summary>Field number for the "cylinder_ground_m" field.</summary>
-        public const int CylinderGroundMFieldNumber = 4;
-
-        /// <summary>Field number for the "shoulder_mode_scale" field.</summary>
-        public const int ShoulderModeScaleFieldNumber = 5;
-
-        private static readonly pb::MessageParser<CameraAttributes> _parser =
-            new pb::MessageParser<CameraAttributes>(() => new CameraAttributes());
-
-        private float cylinderGroundM_;
-        private float cylinderHeightM_;
-        private float cylinderRadiusM_;
-        private float diskRadiusM_;
-        private float shoulderModeScale_;
-
-        public CameraAttributes()
-        {
-            OnConstruction();
-        }
-
-        public CameraAttributes(CameraAttributes other) : this()
-        {
-            diskRadiusM_ = other.diskRadiusM_;
-            cylinderRadiusM_ = other.cylinderRadiusM_;
-            cylinderHeightM_ = other.cylinderHeightM_;
-            cylinderGroundM_ = other.cylinderGroundM_;
-            shoulderModeScale_ = other.shoulderModeScale_;
-        }
-
-        public static pb::MessageParser<CameraAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[79]; }
-        }
-
-        public float DiskRadiusM
-        {
-            get { return diskRadiusM_; }
-            set { diskRadiusM_ = value; }
-        }
-
-        public float CylinderRadiusM
-        {
-            get { return cylinderRadiusM_; }
-            set { cylinderRadiusM_ = value; }
-        }
-
-        public float CylinderHeightM
-        {
-            get { return cylinderHeightM_; }
-            set { cylinderHeightM_ = value; }
-        }
-
-        public float CylinderGroundM
-        {
-            get { return cylinderGroundM_; }
-            set { cylinderGroundM_ = value; }
-        }
-
-        public float ShoulderModeScale
-        {
-            get { return shoulderModeScale_; }
-            set { shoulderModeScale_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public CameraAttributes Clone()
-        {
-            return new CameraAttributes(this);
-        }
-
-        public bool Equals(CameraAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (DiskRadiusM != other.DiskRadiusM) return false;
-            if (CylinderRadiusM != other.CylinderRadiusM) return false;
-            if (CylinderHeightM != other.CylinderHeightM) return false;
-            if (CylinderGroundM != other.CylinderGroundM) return false;
-            if (ShoulderModeScale != other.ShoulderModeScale) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (DiskRadiusM != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(DiskRadiusM);
-            }
-            if (CylinderRadiusM != 0F)
-            {
-                output.WriteRawTag(21);
-                output.WriteFloat(CylinderRadiusM);
-            }
-            if (CylinderHeightM != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(CylinderHeightM);
-            }
-            if (CylinderGroundM != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(CylinderGroundM);
-            }
-            if (ShoulderModeScale != 0F)
-            {
-                output.WriteRawTag(45);
-                output.WriteFloat(ShoulderModeScale);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (DiskRadiusM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CylinderRadiusM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CylinderHeightM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CylinderGroundM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (ShoulderModeScale != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(CameraAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.DiskRadiusM != 0F)
-            {
-                DiskRadiusM = other.DiskRadiusM;
-            }
-            if (other.CylinderRadiusM != 0F)
-            {
-                CylinderRadiusM = other.CylinderRadiusM;
-            }
-            if (other.CylinderHeightM != 0F)
-            {
-                CylinderHeightM = other.CylinderHeightM;
-            }
-            if (other.CylinderGroundM != 0F)
-            {
-                CylinderGroundM = other.CylinderGroundM;
-            }
-            if (other.ShoulderModeScale != 0F)
-            {
-                ShoulderModeScale = other.ShoulderModeScale;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            DiskRadiusM = input.ReadFloat();
-                            break;
-                        }
-                    case 21:
-                        {
-                            CylinderRadiusM = input.ReadFloat();
-                            break;
-                        }
-                    case 29:
-                        {
-                            CylinderHeightM = input.ReadFloat();
-                            break;
-                        }
-                    case 37:
-                        {
-                            CylinderGroundM = input.ReadFloat();
-                            break;
-                        }
-                    case 45:
-                        {
-                            ShoulderModeScale = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as CameraAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (DiskRadiusM != 0F) hash ^= DiskRadiusM.GetHashCode();
-            if (CylinderRadiusM != 0F) hash ^= CylinderRadiusM.GetHashCode();
-            if (CylinderHeightM != 0F) hash ^= CylinderHeightM.GetHashCode();
-            if (CylinderGroundM != 0F) hash ^= CylinderGroundM.GetHashCode();
-            if (ShoulderModeScale != 0F) hash ^= ShoulderModeScale.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EncounterAttributes : pb::IMessage<EncounterAttributes>
-    {
-        /// <summary>Field number for the "base_capture_rate" field.</summary>
-        public const int BaseCaptureRateFieldNumber = 1;
-
-        /// <summary>Field number for the "base_flee_rate" field.</summary>
-        public const int BaseFleeRateFieldNumber = 2;
-
-        /// <summary>Field number for the "collision_radius_m" field.</summary>
-        public const int CollisionRadiusMFieldNumber = 3;
-
-        /// <summary>Field number for the "collision_height_m" field.</summary>
-        public const int CollisionHeightMFieldNumber = 4;
-
-        /// <summary>Field number for the "collision_head_radius_m" field.</summary>
-        public const int CollisionHeadRadiusMFieldNumber = 5;
-
-        /// <summary>Field number for the "movement_type" field.</summary>
-        public const int MovementTypeFieldNumber = 6;
-
-        /// <summary>Field number for the "movement_timer_s" field.</summary>
-        public const int MovementTimerSFieldNumber = 7;
-
-        /// <summary>Field number for the "jump_time_s" field.</summary>
-        public const int JumpTimeSFieldNumber = 8;
-
-        /// <summary>Field number for the "attack_timer_s" field.</summary>
-        public const int AttackTimerSFieldNumber = 9;
-
-        private static readonly pb::MessageParser<EncounterAttributes> _parser =
-            new pb::MessageParser<EncounterAttributes>(() => new EncounterAttributes());
-
-        private float attackTimerS_;
-        private float baseCaptureRate_;
-        private float baseFleeRate_;
-        private float collisionHeadRadiusM_;
-        private float collisionHeightM_;
-        private float collisionRadiusM_;
-        private float jumpTimeS_;
-        private float movementTimerS_;
-        private global::AllEnum.PokemonMovementType movementType_ = 0;
-
-        public EncounterAttributes()
-        {
-            OnConstruction();
-        }
-
-        public EncounterAttributes(EncounterAttributes other) : this()
-        {
-            baseCaptureRate_ = other.baseCaptureRate_;
-            baseFleeRate_ = other.baseFleeRate_;
-            collisionRadiusM_ = other.collisionRadiusM_;
-            collisionHeightM_ = other.collisionHeightM_;
-            collisionHeadRadiusM_ = other.collisionHeadRadiusM_;
-            movementType_ = other.movementType_;
-            movementTimerS_ = other.movementTimerS_;
-            jumpTimeS_ = other.jumpTimeS_;
-            attackTimerS_ = other.attackTimerS_;
-        }
-
-        public static pb::MessageParser<EncounterAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[80]; }
-        }
-
-        public float BaseCaptureRate
-        {
-            get { return baseCaptureRate_; }
-            set { baseCaptureRate_ = value; }
-        }
-
-        public float BaseFleeRate
-        {
-            get { return baseFleeRate_; }
-            set { baseFleeRate_ = value; }
-        }
-
-        public float CollisionRadiusM
-        {
-            get { return collisionRadiusM_; }
-            set { collisionRadiusM_ = value; }
-        }
-
-        public float CollisionHeightM
-        {
-            get { return collisionHeightM_; }
-            set { collisionHeightM_ = value; }
-        }
-
-        public float CollisionHeadRadiusM
-        {
-            get { return collisionHeadRadiusM_; }
-            set { collisionHeadRadiusM_ = value; }
-        }
-
-        public global::AllEnum.PokemonMovementType MovementType
-        {
-            get { return movementType_; }
-            set { movementType_ = value; }
-        }
-
-        public float MovementTimerS
-        {
-            get { return movementTimerS_; }
-            set { movementTimerS_ = value; }
-        }
-
-        public float JumpTimeS
-        {
-            get { return jumpTimeS_; }
-            set { jumpTimeS_ = value; }
-        }
-
-        public float AttackTimerS
-        {
-            get { return attackTimerS_; }
-            set { attackTimerS_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EncounterAttributes Clone()
-        {
-            return new EncounterAttributes(this);
-        }
-
-        public bool Equals(EncounterAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (BaseCaptureRate != other.BaseCaptureRate) return false;
-            if (BaseFleeRate != other.BaseFleeRate) return false;
-            if (CollisionRadiusM != other.CollisionRadiusM) return false;
-            if (CollisionHeightM != other.CollisionHeightM) return false;
-            if (CollisionHeadRadiusM != other.CollisionHeadRadiusM) return false;
-            if (MovementType != other.MovementType) return false;
-            if (MovementTimerS != other.MovementTimerS) return false;
-            if (JumpTimeS != other.JumpTimeS) return false;
-            if (AttackTimerS != other.AttackTimerS) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (BaseCaptureRate != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(BaseCaptureRate);
-            }
-            if (BaseFleeRate != 0F)
-            {
-                output.WriteRawTag(21);
-                output.WriteFloat(BaseFleeRate);
-            }
-            if (CollisionRadiusM != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(CollisionRadiusM);
-            }
-            if (CollisionHeightM != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(CollisionHeightM);
-            }
-            if (CollisionHeadRadiusM != 0F)
-            {
-                output.WriteRawTag(45);
-                output.WriteFloat(CollisionHeadRadiusM);
-            }
-            if (MovementType != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteEnum((int)MovementType);
-            }
-            if (MovementTimerS != 0F)
-            {
-                output.WriteRawTag(61);
-                output.WriteFloat(MovementTimerS);
-            }
-            if (JumpTimeS != 0F)
-            {
-                output.WriteRawTag(69);
-                output.WriteFloat(JumpTimeS);
-            }
-            if (AttackTimerS != 0F)
-            {
-                output.WriteRawTag(77);
-                output.WriteFloat(AttackTimerS);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (BaseCaptureRate != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (BaseFleeRate != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CollisionRadiusM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CollisionHeightM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CollisionHeadRadiusM != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (MovementType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)MovementType);
-            }
-            if (MovementTimerS != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (JumpTimeS != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (AttackTimerS != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(EncounterAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.BaseCaptureRate != 0F)
-            {
-                BaseCaptureRate = other.BaseCaptureRate;
-            }
-            if (other.BaseFleeRate != 0F)
-            {
-                BaseFleeRate = other.BaseFleeRate;
-            }
-            if (other.CollisionRadiusM != 0F)
-            {
-                CollisionRadiusM = other.CollisionRadiusM;
-            }
-            if (other.CollisionHeightM != 0F)
-            {
-                CollisionHeightM = other.CollisionHeightM;
-            }
-            if (other.CollisionHeadRadiusM != 0F)
-            {
-                CollisionHeadRadiusM = other.CollisionHeadRadiusM;
-            }
-            if (other.MovementType != 0)
-            {
-                MovementType = other.MovementType;
-            }
-            if (other.MovementTimerS != 0F)
-            {
-                MovementTimerS = other.MovementTimerS;
-            }
-            if (other.JumpTimeS != 0F)
-            {
-                JumpTimeS = other.JumpTimeS;
-            }
-            if (other.AttackTimerS != 0F)
-            {
-                AttackTimerS = other.AttackTimerS;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            BaseCaptureRate = input.ReadFloat();
-                            break;
-                        }
-                    case 21:
-                        {
-                            BaseFleeRate = input.ReadFloat();
-                            break;
-                        }
-                    case 29:
-                        {
-                            CollisionRadiusM = input.ReadFloat();
-                            break;
-                        }
-                    case 37:
-                        {
-                            CollisionHeightM = input.ReadFloat();
-                            break;
-                        }
-                    case 45:
-                        {
-                            CollisionHeadRadiusM = input.ReadFloat();
-                            break;
-                        }
-                    case 48:
-                        {
-                            movementType_ = (global::AllEnum.PokemonMovementType)input.ReadEnum();
-                            break;
-                        }
-                    case 61:
-                        {
-                            MovementTimerS = input.ReadFloat();
-                            break;
-                        }
-                    case 69:
-                        {
-                            JumpTimeS = input.ReadFloat();
-                            break;
-                        }
-                    case 77:
-                        {
-                            AttackTimerS = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EncounterAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (BaseCaptureRate != 0F) hash ^= BaseCaptureRate.GetHashCode();
-            if (BaseFleeRate != 0F) hash ^= BaseFleeRate.GetHashCode();
-            if (CollisionRadiusM != 0F) hash ^= CollisionRadiusM.GetHashCode();
-            if (CollisionHeightM != 0F) hash ^= CollisionHeightM.GetHashCode();
-            if (CollisionHeadRadiusM != 0F) hash ^= CollisionHeadRadiusM.GetHashCode();
-            if (MovementType != 0) hash ^= MovementType.GetHashCode();
-            if (MovementTimerS != 0F) hash ^= MovementTimerS.GetHashCode();
-            if (JumpTimeS != 0F) hash ^= JumpTimeS.GetHashCode();
-            if (AttackTimerS != 0F) hash ^= AttackTimerS.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class StatsAttributes : pb::IMessage<StatsAttributes>
-    {
-        /// <summary>Field number for the "base_stamina" field.</summary>
-        public const int BaseStaminaFieldNumber = 1;
-
-        /// <summary>Field number for the "base_attack" field.</summary>
-        public const int BaseAttackFieldNumber = 2;
-
-        /// <summary>Field number for the "base_defense" field.</summary>
-        public const int BaseDefenseFieldNumber = 3;
-
-        /// <summary>Field number for the "dodge_energy_delta" field.</summary>
-        public const int DodgeEnergyDeltaFieldNumber = 8;
-
-        private static readonly pb::MessageParser<StatsAttributes> _parser =
-            new pb::MessageParser<StatsAttributes>(() => new StatsAttributes());
-
-        private int baseAttack_;
-        private int baseDefense_;
-        private int baseStamina_;
-        private int dodgeEnergyDelta_;
-
-        public StatsAttributes()
-        {
-            OnConstruction();
-        }
-
-        public StatsAttributes(StatsAttributes other) : this()
-        {
-            baseStamina_ = other.baseStamina_;
-            baseAttack_ = other.baseAttack_;
-            baseDefense_ = other.baseDefense_;
-            dodgeEnergyDelta_ = other.dodgeEnergyDelta_;
-        }
-
-        public static pb::MessageParser<StatsAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[81]; }
-        }
-
-        public int BaseStamina
-        {
-            get { return baseStamina_; }
-            set { baseStamina_ = value; }
-        }
-
-        public int BaseAttack
-        {
-            get { return baseAttack_; }
-            set { baseAttack_ = value; }
-        }
-
-        public int BaseDefense
-        {
-            get { return baseDefense_; }
-            set { baseDefense_ = value; }
-        }
-
-        public int DodgeEnergyDelta
-        {
-            get { return dodgeEnergyDelta_; }
-            set { dodgeEnergyDelta_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public StatsAttributes Clone()
-        {
-            return new StatsAttributes(this);
-        }
-
-        public bool Equals(StatsAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (BaseStamina != other.BaseStamina) return false;
-            if (BaseAttack != other.BaseAttack) return false;
-            if (BaseDefense != other.BaseDefense) return false;
-            if (DodgeEnergyDelta != other.DodgeEnergyDelta) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (BaseStamina != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(BaseStamina);
-            }
-            if (BaseAttack != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(BaseAttack);
-            }
-            if (BaseDefense != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(BaseDefense);
-            }
-            if (DodgeEnergyDelta != 0)
-            {
-                output.WriteRawTag(64);
-                output.WriteInt32(DodgeEnergyDelta);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (BaseStamina != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseStamina);
-            }
-            if (BaseAttack != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseAttack);
-            }
-            if (BaseDefense != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseDefense);
-            }
-            if (DodgeEnergyDelta != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DodgeEnergyDelta);
-            }
-            return size;
-        }
-
-        public void MergeFrom(StatsAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.BaseStamina != 0)
-            {
-                BaseStamina = other.BaseStamina;
-            }
-            if (other.BaseAttack != 0)
-            {
-                BaseAttack = other.BaseAttack;
-            }
-            if (other.BaseDefense != 0)
-            {
-                BaseDefense = other.BaseDefense;
-            }
-            if (other.DodgeEnergyDelta != 0)
-            {
-                DodgeEnergyDelta = other.DodgeEnergyDelta;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            BaseStamina = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            BaseAttack = input.ReadInt32();
-                            break;
-                        }
-                    case 24:
-                        {
-                            BaseDefense = input.ReadInt32();
-                            break;
-                        }
-                    case 64:
-                        {
-                            DodgeEnergyDelta = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as StatsAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (BaseStamina != 0) hash ^= BaseStamina.GetHashCode();
-            if (BaseAttack != 0) hash ^= BaseAttack.GetHashCode();
-            if (BaseDefense != 0) hash ^= BaseDefense.GetHashCode();
-            if (DodgeEnergyDelta != 0) hash ^= DodgeEnergyDelta.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class ItemSettings : pb::IMessage<ItemSettings>
-    {
-        /// <summary>Field number for the "item_id" field.</summary>
-        public const int ItemIdFieldNumber = 1;
-
-        /// <summary>Field number for the "item_type" field.</summary>
-        public const int ItemTypeFieldNumber = 2;
-
-        /// <summary>Field number for the "category" field.</summary>
-        public const int CategoryFieldNumber = 3;
-
-        /// <summary>Field number for the "drop_freq" field.</summary>
-        public const int DropFreqFieldNumber = 4;
-
-        /// <summary>Field number for the "drop_trainer_level" field.</summary>
-        public const int DropTrainerLevelFieldNumber = 5;
-
-        /// <summary>Field number for the "pokeball" field.</summary>
-        public const int PokeballFieldNumber = 6;
-
-        /// <summary>Field number for the "potion" field.</summary>
-        public const int PotionFieldNumber = 7;
-
-        /// <summary>Field number for the "revive" field.</summary>
-        public const int ReviveFieldNumber = 8;
-
-        /// <summary>Field number for the "battle" field.</summary>
-        public const int BattleFieldNumber = 9;
-
-        /// <summary>Field number for the "food" field.</summary>
-        public const int FoodFieldNumber = 10;
-
-        /// <summary>Field number for the "inventory_upgrade" field.</summary>
-        public const int InventoryUpgradeFieldNumber = 11;
-
-        /// <summary>Field number for the "xp_boost" field.</summary>
-        public const int XpBoostFieldNumber = 12;
-
-        /// <summary>Field number for the "incense" field.</summary>
-        public const int IncenseFieldNumber = 13;
-
-        /// <summary>Field number for the "egg_incubator" field.</summary>
-        public const int EggIncubatorFieldNumber = 14;
-
-        /// <summary>Field number for the "fort_modifier" field.</summary>
-        public const int FortModifierFieldNumber = 15;
-
-        private static readonly pb::MessageParser<ItemSettings> _parser =
-            new pb::MessageParser<ItemSettings>(() => new ItemSettings());
-
-        private global::PokemonGo.RocketAPI.GeneratedCode.BattleAttributes battle_;
-        private global::AllEnum.ItemCategory category_ = 0;
-        private float dropFreq_;
-        private int dropTrainerLevel_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.EggIncubatorAttributes eggIncubator_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.FoodAttributes food_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.FortModifierAttributes fortModifier_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.IncenseAttributes incense_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgradeAttributes inventoryUpgrade_;
-        private global::AllEnum.ItemId itemId_ = 0;
-        private global::AllEnum.ItemType itemType_ = 0;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PokeballAttributes pokeball_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.PotionAttributes potion_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.ReviveAttributes revive_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.ExperienceBoostAttributes xpBoost_;
-
-        public ItemSettings()
-        {
-            OnConstruction();
-        }
-
-        public ItemSettings(ItemSettings other) : this()
-        {
-            itemId_ = other.itemId_;
-            itemType_ = other.itemType_;
-            category_ = other.category_;
-            dropFreq_ = other.dropFreq_;
-            dropTrainerLevel_ = other.dropTrainerLevel_;
-            Pokeball = other.pokeball_ != null ? other.Pokeball.Clone() : null;
-            Potion = other.potion_ != null ? other.Potion.Clone() : null;
-            Revive = other.revive_ != null ? other.Revive.Clone() : null;
-            Battle = other.battle_ != null ? other.Battle.Clone() : null;
-            Food = other.food_ != null ? other.Food.Clone() : null;
-            InventoryUpgrade = other.inventoryUpgrade_ != null ? other.InventoryUpgrade.Clone() : null;
-            XpBoost = other.xpBoost_ != null ? other.XpBoost.Clone() : null;
-            Incense = other.incense_ != null ? other.Incense.Clone() : null;
-            EggIncubator = other.eggIncubator_ != null ? other.EggIncubator.Clone() : null;
-            FortModifier = other.fortModifier_ != null ? other.FortModifier.Clone() : null;
-        }
-
-        public static pb::MessageParser<ItemSettings> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[82]; }
-        }
-
-        public global::AllEnum.ItemId ItemId
-        {
-            get { return itemId_; }
-            set { itemId_ = value; }
-        }
-
-        public global::AllEnum.ItemType ItemType
-        {
-            get { return itemType_; }
-            set { itemType_ = value; }
-        }
-
-        public global::AllEnum.ItemCategory Category
-        {
-            get { return category_; }
-            set { category_ = value; }
-        }
-
-        public float DropFreq
-        {
-            get { return dropFreq_; }
-            set { dropFreq_ = value; }
-        }
-
-        public int DropTrainerLevel
-        {
-            get { return dropTrainerLevel_; }
-            set { dropTrainerLevel_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PokeballAttributes Pokeball
-        {
-            get { return pokeball_; }
-            set { pokeball_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.PotionAttributes Potion
-        {
-            get { return potion_; }
-            set { potion_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.ReviveAttributes Revive
-        {
-            get { return revive_; }
-            set { revive_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.BattleAttributes Battle
-        {
-            get { return battle_; }
-            set { battle_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.FoodAttributes Food
-        {
-            get { return food_; }
-            set { food_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgradeAttributes InventoryUpgrade
-        {
-            get { return inventoryUpgrade_; }
-            set { inventoryUpgrade_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.ExperienceBoostAttributes XpBoost
-        {
-            get { return xpBoost_; }
-            set { xpBoost_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.IncenseAttributes Incense
-        {
-            get { return incense_; }
-            set { incense_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.EggIncubatorAttributes EggIncubator
-        {
-            get { return eggIncubator_; }
-            set { eggIncubator_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.FortModifierAttributes FortModifier
-        {
-            get { return fortModifier_; }
-            set { fortModifier_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public ItemSettings Clone()
-        {
-            return new ItemSettings(this);
-        }
-
-        public bool Equals(ItemSettings other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemId != other.ItemId) return false;
-            if (ItemType != other.ItemType) return false;
-            if (Category != other.Category) return false;
-            if (DropFreq != other.DropFreq) return false;
-            if (DropTrainerLevel != other.DropTrainerLevel) return false;
-            if (!Equals(Pokeball, other.Pokeball)) return false;
-            if (!Equals(Potion, other.Potion)) return false;
-            if (!Equals(Revive, other.Revive)) return false;
-            if (!Equals(Battle, other.Battle)) return false;
-            if (!Equals(Food, other.Food)) return false;
-            if (!Equals(InventoryUpgrade, other.InventoryUpgrade)) return false;
-            if (!Equals(XpBoost, other.XpBoost)) return false;
-            if (!Equals(Incense, other.Incense)) return false;
-            if (!Equals(EggIncubator, other.EggIncubator)) return false;
-            if (!Equals(FortModifier, other.FortModifier)) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemId != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)ItemId);
-            }
-            if (ItemType != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)ItemType);
-            }
-            if (Category != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteEnum((int)Category);
-            }
-            if (DropFreq != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(DropFreq);
-            }
-            if (DropTrainerLevel != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(DropTrainerLevel);
-            }
-            if (pokeball_ != null)
-            {
-                output.WriteRawTag(50);
-                output.WriteMessage(Pokeball);
-            }
-            if (potion_ != null)
-            {
-                output.WriteRawTag(58);
-                output.WriteMessage(Potion);
-            }
-            if (revive_ != null)
-            {
-                output.WriteRawTag(66);
-                output.WriteMessage(Revive);
-            }
-            if (battle_ != null)
-            {
-                output.WriteRawTag(74);
-                output.WriteMessage(Battle);
-            }
-            if (food_ != null)
-            {
-                output.WriteRawTag(82);
-                output.WriteMessage(Food);
-            }
-            if (inventoryUpgrade_ != null)
-            {
-                output.WriteRawTag(90);
-                output.WriteMessage(InventoryUpgrade);
-            }
-            if (xpBoost_ != null)
-            {
-                output.WriteRawTag(98);
-                output.WriteMessage(XpBoost);
-            }
-            if (incense_ != null)
-            {
-                output.WriteRawTag(106);
-                output.WriteMessage(Incense);
-            }
-            if (eggIncubator_ != null)
-            {
-                output.WriteRawTag(114);
-                output.WriteMessage(EggIncubator);
-            }
-            if (fortModifier_ != null)
-            {
-                output.WriteRawTag(122);
-                output.WriteMessage(FortModifier);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemId != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
-            }
-            if (ItemType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemType);
-            }
-            if (Category != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Category);
-            }
-            if (DropFreq != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (DropTrainerLevel != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DropTrainerLevel);
-            }
-            if (pokeball_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Pokeball);
-            }
-            if (potion_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Potion);
-            }
-            if (revive_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Revive);
-            }
-            if (battle_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Battle);
-            }
-            if (food_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Food);
-            }
-            if (inventoryUpgrade_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventoryUpgrade);
-            }
-            if (xpBoost_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(XpBoost);
-            }
-            if (incense_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Incense);
-            }
-            if (eggIncubator_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(EggIncubator);
-            }
-            if (fortModifier_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortModifier);
-            }
-            return size;
-        }
-
-        public void MergeFrom(ItemSettings other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemId != 0)
-            {
-                ItemId = other.ItemId;
-            }
-            if (other.ItemType != 0)
-            {
-                ItemType = other.ItemType;
-            }
-            if (other.Category != 0)
-            {
-                Category = other.Category;
-            }
-            if (other.DropFreq != 0F)
-            {
-                DropFreq = other.DropFreq;
-            }
-            if (other.DropTrainerLevel != 0)
-            {
-                DropTrainerLevel = other.DropTrainerLevel;
-            }
-            if (other.pokeball_ != null)
-            {
-                if (pokeball_ == null)
-                {
-                    pokeball_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokeballAttributes();
-                }
-                Pokeball.MergeFrom(other.Pokeball);
-            }
-            if (other.potion_ != null)
-            {
-                if (potion_ == null)
-                {
-                    potion_ = new global::PokemonGo.RocketAPI.GeneratedCode.PotionAttributes();
-                }
-                Potion.MergeFrom(other.Potion);
-            }
-            if (other.revive_ != null)
-            {
-                if (revive_ == null)
-                {
-                    revive_ = new global::PokemonGo.RocketAPI.GeneratedCode.ReviveAttributes();
-                }
-                Revive.MergeFrom(other.Revive);
-            }
-            if (other.battle_ != null)
-            {
-                if (battle_ == null)
-                {
-                    battle_ = new global::PokemonGo.RocketAPI.GeneratedCode.BattleAttributes();
-                }
-                Battle.MergeFrom(other.Battle);
-            }
-            if (other.food_ != null)
-            {
-                if (food_ == null)
-                {
-                    food_ = new global::PokemonGo.RocketAPI.GeneratedCode.FoodAttributes();
-                }
-                Food.MergeFrom(other.Food);
-            }
-            if (other.inventoryUpgrade_ != null)
-            {
-                if (inventoryUpgrade_ == null)
-                {
-                    inventoryUpgrade_ = new global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgradeAttributes();
-                }
-                InventoryUpgrade.MergeFrom(other.InventoryUpgrade);
-            }
-            if (other.xpBoost_ != null)
-            {
-                if (xpBoost_ == null)
-                {
-                    xpBoost_ = new global::PokemonGo.RocketAPI.GeneratedCode.ExperienceBoostAttributes();
-                }
-                XpBoost.MergeFrom(other.XpBoost);
-            }
-            if (other.incense_ != null)
-            {
-                if (incense_ == null)
-                {
-                    incense_ = new global::PokemonGo.RocketAPI.GeneratedCode.IncenseAttributes();
-                }
-                Incense.MergeFrom(other.Incense);
-            }
-            if (other.eggIncubator_ != null)
-            {
-                if (eggIncubator_ == null)
-                {
-                    eggIncubator_ = new global::PokemonGo.RocketAPI.GeneratedCode.EggIncubatorAttributes();
-                }
-                EggIncubator.MergeFrom(other.EggIncubator);
-            }
-            if (other.fortModifier_ != null)
-            {
-                if (fortModifier_ == null)
-                {
-                    fortModifier_ = new global::PokemonGo.RocketAPI.GeneratedCode.FortModifierAttributes();
-                }
-                FortModifier.MergeFrom(other.FortModifier);
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            itemType_ = (global::AllEnum.ItemType)input.ReadEnum();
-                            break;
-                        }
-                    case 24:
-                        {
-                            category_ = (global::AllEnum.ItemCategory)input.ReadEnum();
-                            break;
-                        }
-                    case 37:
-                        {
-                            DropFreq = input.ReadFloat();
-                            break;
-                        }
-                    case 40:
-                        {
-                            DropTrainerLevel = input.ReadInt32();
-                            break;
-                        }
-                    case 50:
-                        {
-                            if (pokeball_ == null)
-                            {
-                                pokeball_ = new global::PokemonGo.RocketAPI.GeneratedCode.PokeballAttributes();
-                            }
-                            input.ReadMessage(pokeball_);
-                            break;
-                        }
-                    case 58:
-                        {
-                            if (potion_ == null)
-                            {
-                                potion_ = new global::PokemonGo.RocketAPI.GeneratedCode.PotionAttributes();
-                            }
-                            input.ReadMessage(potion_);
-                            break;
-                        }
-                    case 66:
-                        {
-                            if (revive_ == null)
-                            {
-                                revive_ = new global::PokemonGo.RocketAPI.GeneratedCode.ReviveAttributes();
-                            }
-                            input.ReadMessage(revive_);
-                            break;
-                        }
-                    case 74:
-                        {
-                            if (battle_ == null)
-                            {
-                                battle_ = new global::PokemonGo.RocketAPI.GeneratedCode.BattleAttributes();
-                            }
-                            input.ReadMessage(battle_);
-                            break;
-                        }
-                    case 82:
-                        {
-                            if (food_ == null)
-                            {
-                                food_ = new global::PokemonGo.RocketAPI.GeneratedCode.FoodAttributes();
-                            }
-                            input.ReadMessage(food_);
-                            break;
-                        }
-                    case 90:
-                        {
-                            if (inventoryUpgrade_ == null)
-                            {
-                                inventoryUpgrade_ =
-                                    new global::PokemonGo.RocketAPI.GeneratedCode.InventoryUpgradeAttributes();
-                            }
-                            input.ReadMessage(inventoryUpgrade_);
-                            break;
-                        }
-                    case 98:
-                        {
-                            if (xpBoost_ == null)
-                            {
-                                xpBoost_ = new global::PokemonGo.RocketAPI.GeneratedCode.ExperienceBoostAttributes();
-                            }
-                            input.ReadMessage(xpBoost_);
-                            break;
-                        }
-                    case 106:
-                        {
-                            if (incense_ == null)
-                            {
-                                incense_ = new global::PokemonGo.RocketAPI.GeneratedCode.IncenseAttributes();
-                            }
-                            input.ReadMessage(incense_);
-                            break;
-                        }
-                    case 114:
-                        {
-                            if (eggIncubator_ == null)
-                            {
-                                eggIncubator_ = new global::PokemonGo.RocketAPI.GeneratedCode.EggIncubatorAttributes();
-                            }
-                            input.ReadMessage(eggIncubator_);
-                            break;
-                        }
-                    case 122:
-                        {
-                            if (fortModifier_ == null)
-                            {
-                                fortModifier_ = new global::PokemonGo.RocketAPI.GeneratedCode.FortModifierAttributes();
-                            }
-                            input.ReadMessage(fortModifier_);
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as ItemSettings);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemId != 0) hash ^= ItemId.GetHashCode();
-            if (ItemType != 0) hash ^= ItemType.GetHashCode();
-            if (Category != 0) hash ^= Category.GetHashCode();
-            if (DropFreq != 0F) hash ^= DropFreq.GetHashCode();
-            if (DropTrainerLevel != 0) hash ^= DropTrainerLevel.GetHashCode();
-            if (pokeball_ != null) hash ^= Pokeball.GetHashCode();
-            if (potion_ != null) hash ^= Potion.GetHashCode();
-            if (revive_ != null) hash ^= Revive.GetHashCode();
-            if (battle_ != null) hash ^= Battle.GetHashCode();
-            if (food_ != null) hash ^= Food.GetHashCode();
-            if (inventoryUpgrade_ != null) hash ^= InventoryUpgrade.GetHashCode();
-            if (xpBoost_ != null) hash ^= XpBoost.GetHashCode();
-            if (incense_ != null) hash ^= Incense.GetHashCode();
-            if (eggIncubator_ != null) hash ^= EggIncubator.GetHashCode();
-            if (fortModifier_ != null) hash ^= FortModifier.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class BattleAttributes : pb::IMessage<BattleAttributes>
-    {
-        /// <summary>Field number for the "sta_percent" field.</summary>
-        public const int StaPercentFieldNumber = 1;
-
-        private static readonly pb::MessageParser<BattleAttributes> _parser =
-            new pb::MessageParser<BattleAttributes>(() => new BattleAttributes());
-
-        private float staPercent_;
-
-        public BattleAttributes()
-        {
-            OnConstruction();
-        }
-
-        public BattleAttributes(BattleAttributes other) : this()
-        {
-            staPercent_ = other.staPercent_;
-        }
-
-        public static pb::MessageParser<BattleAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[83]; }
-        }
-
-        public float StaPercent
-        {
-            get { return staPercent_; }
-            set { staPercent_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public BattleAttributes Clone()
-        {
-            return new BattleAttributes(this);
-        }
-
-        public bool Equals(BattleAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (StaPercent != other.StaPercent) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (StaPercent != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(StaPercent);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (StaPercent != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(BattleAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.StaPercent != 0F)
-            {
-                StaPercent = other.StaPercent;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            StaPercent = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as BattleAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EggIncubatorAttributes : pb::IMessage<EggIncubatorAttributes>
-    {
-        /// <summary>Field number for the "incubator_type" field.</summary>
-        public const int IncubatorTypeFieldNumber = 1;
-
-        /// <summary>Field number for the "uses" field.</summary>
-        public const int UsesFieldNumber = 2;
-
-        /// <summary>Field number for the "distance_multiplier" field.</summary>
-        public const int DistanceMultiplierFieldNumber = 3;
-
-        private static readonly pb::MessageParser<EggIncubatorAttributes> _parser =
-            new pb::MessageParser<EggIncubatorAttributes>(() => new EggIncubatorAttributes());
-
-        private float distanceMultiplier_;
-        private global::AllEnum.EggIncubatorType incubatorType_ = 0;
-        private int uses_;
-
-        public EggIncubatorAttributes()
-        {
-            OnConstruction();
-        }
-
-        public EggIncubatorAttributes(EggIncubatorAttributes other) : this()
-        {
-            incubatorType_ = other.incubatorType_;
-            uses_ = other.uses_;
-            distanceMultiplier_ = other.distanceMultiplier_;
-        }
-
-        public static pb::MessageParser<EggIncubatorAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[84]; }
-        }
-
-        public global::AllEnum.EggIncubatorType IncubatorType
-        {
-            get { return incubatorType_; }
-            set { incubatorType_ = value; }
-        }
-
-        public int Uses
-        {
-            get { return uses_; }
-            set { uses_ = value; }
-        }
-
-        public float DistanceMultiplier
-        {
-            get { return distanceMultiplier_; }
-            set { distanceMultiplier_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EggIncubatorAttributes Clone()
-        {
-            return new EggIncubatorAttributes(this);
-        }
-
-        public bool Equals(EggIncubatorAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (IncubatorType != other.IncubatorType) return false;
-            if (Uses != other.Uses) return false;
-            if (DistanceMultiplier != other.DistanceMultiplier) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (IncubatorType != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)IncubatorType);
-            }
-            if (Uses != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(Uses);
-            }
-            if (DistanceMultiplier != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(DistanceMultiplier);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (IncubatorType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)IncubatorType);
-            }
-            if (Uses != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Uses);
-            }
-            if (DistanceMultiplier != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(EggIncubatorAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.IncubatorType != 0)
-            {
-                IncubatorType = other.IncubatorType;
-            }
-            if (other.Uses != 0)
-            {
-                Uses = other.Uses;
-            }
-            if (other.DistanceMultiplier != 0F)
-            {
-                DistanceMultiplier = other.DistanceMultiplier;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            incubatorType_ = (global::AllEnum.EggIncubatorType)input.ReadEnum();
-                            break;
-                        }
-                    case 16:
-                        {
-                            Uses = input.ReadInt32();
-                            break;
-                        }
-                    case 29:
-                        {
-                            DistanceMultiplier = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EggIncubatorAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (IncubatorType != 0) hash ^= IncubatorType.GetHashCode();
-            if (Uses != 0) hash ^= Uses.GetHashCode();
-            if (DistanceMultiplier != 0F) hash ^= DistanceMultiplier.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class ExperienceBoostAttributes : pb::IMessage<ExperienceBoostAttributes>
-    {
-        /// <summary>Field number for the "xp_multiplier" field.</summary>
-        public const int XpMultiplierFieldNumber = 1;
-
-        /// <summary>Field number for the "boost_duration_ms" field.</summary>
-        public const int BoostDurationMsFieldNumber = 2;
-
-        private static readonly pb::MessageParser<ExperienceBoostAttributes> _parser =
-            new pb::MessageParser<ExperienceBoostAttributes>(() => new ExperienceBoostAttributes());
-
-        private int boostDurationMs_;
-        private float xpMultiplier_;
-
-        public ExperienceBoostAttributes()
-        {
-            OnConstruction();
-        }
-
-        public ExperienceBoostAttributes(ExperienceBoostAttributes other) : this()
-        {
-            xpMultiplier_ = other.xpMultiplier_;
-            boostDurationMs_ = other.boostDurationMs_;
-        }
-
-        public static pb::MessageParser<ExperienceBoostAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[85]; }
-        }
-
-        public float XpMultiplier
-        {
-            get { return xpMultiplier_; }
-            set { xpMultiplier_ = value; }
-        }
-
-        public int BoostDurationMs
-        {
-            get { return boostDurationMs_; }
-            set { boostDurationMs_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public ExperienceBoostAttributes Clone()
-        {
-            return new ExperienceBoostAttributes(this);
-        }
-
-        public bool Equals(ExperienceBoostAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (XpMultiplier != other.XpMultiplier) return false;
-            if (BoostDurationMs != other.BoostDurationMs) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (XpMultiplier != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(XpMultiplier);
-            }
-            if (BoostDurationMs != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(BoostDurationMs);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (XpMultiplier != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (BoostDurationMs != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BoostDurationMs);
-            }
-            return size;
-        }
-
-        public void MergeFrom(ExperienceBoostAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.XpMultiplier != 0F)
-            {
-                XpMultiplier = other.XpMultiplier;
-            }
-            if (other.BoostDurationMs != 0)
-            {
-                BoostDurationMs = other.BoostDurationMs;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            XpMultiplier = input.ReadFloat();
-                            break;
-                        }
-                    case 16:
-                        {
-                            BoostDurationMs = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as ExperienceBoostAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (XpMultiplier != 0F) hash ^= XpMultiplier.GetHashCode();
-            if (BoostDurationMs != 0) hash ^= BoostDurationMs.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FoodAttributes : pb::IMessage<FoodAttributes>
-    {
-        /// <summary>Field number for the "item_effect" field.</summary>
-        public const int ItemEffectFieldNumber = 1;
-
-        /// <summary>Field number for the "item_effect_percent" field.</summary>
-        public const int ItemEffectPercentFieldNumber = 2;
-
-        /// <summary>Field number for the "growth_percent" field.</summary>
-        public const int GrowthPercentFieldNumber = 3;
-
-        private static readonly pb::MessageParser<FoodAttributes> _parser =
-            new pb::MessageParser<FoodAttributes>(() => new FoodAttributes());
-
-        private static readonly pb::FieldCodec<global::AllEnum.ItemEffect> _repeated_itemEffect_codec
-            = pb::FieldCodec.ForEnum(10, x => (int)x, x => (global::AllEnum.ItemEffect)x);
-
-        private static readonly pb::FieldCodec<float> _repeated_itemEffectPercent_codec
-            = pb::FieldCodec.ForFloat(18);
-
-        private readonly pbc::RepeatedField<global::AllEnum.ItemEffect> itemEffect_ =
-            new pbc::RepeatedField<global::AllEnum.ItemEffect>();
-
-        private readonly pbc::RepeatedField<float> itemEffectPercent_ = new pbc::RepeatedField<float>();
-        private float growthPercent_;
-
-        public FoodAttributes()
-        {
-            OnConstruction();
-        }
-
-        public FoodAttributes(FoodAttributes other) : this()
-        {
-            itemEffect_ = other.itemEffect_.Clone();
-            itemEffectPercent_ = other.itemEffectPercent_.Clone();
-            growthPercent_ = other.growthPercent_;
-        }
-
-        public static pb::MessageParser<FoodAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[86]; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.ItemEffect> ItemEffect
-        {
-            get { return itemEffect_; }
-        }
-
-        public pbc::RepeatedField<float> ItemEffectPercent
-        {
-            get { return itemEffectPercent_; }
-        }
-
-        public float GrowthPercent
-        {
-            get { return growthPercent_; }
-            set { growthPercent_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FoodAttributes Clone()
-        {
-            return new FoodAttributes(this);
-        }
-
-        public bool Equals(FoodAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (!itemEffect_.Equals(other.itemEffect_)) return false;
-            if (!itemEffectPercent_.Equals(other.itemEffectPercent_)) return false;
-            if (GrowthPercent != other.GrowthPercent) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            itemEffect_.WriteTo(output, _repeated_itemEffect_codec);
-            itemEffectPercent_.WriteTo(output, _repeated_itemEffectPercent_codec);
-            if (GrowthPercent != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(GrowthPercent);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            size += itemEffect_.CalculateSize(_repeated_itemEffect_codec);
-            size += itemEffectPercent_.CalculateSize(_repeated_itemEffectPercent_codec);
-            if (GrowthPercent != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(FoodAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            itemEffect_.Add(other.itemEffect_);
-            itemEffectPercent_.Add(other.itemEffectPercent_);
-            if (other.GrowthPercent != 0F)
-            {
-                GrowthPercent = other.GrowthPercent;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 10:
-                    case 8:
-                        {
-                            itemEffect_.AddEntriesFrom(input, _repeated_itemEffect_codec);
-                            break;
-                        }
-                    case 18:
-                    case 21:
-                        {
-                            itemEffectPercent_.AddEntriesFrom(input, _repeated_itemEffectPercent_codec);
-                            break;
-                        }
-                    case 29:
-                        {
-                            GrowthPercent = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FoodAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            hash ^= itemEffect_.GetHashCode();
-            hash ^= itemEffectPercent_.GetHashCode();
-            if (GrowthPercent != 0F) hash ^= GrowthPercent.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class FortModifierAttributes : pb::IMessage<FortModifierAttributes>
-    {
-        /// <summary>Field number for the "modifier_lifetime_seconds" field.</summary>
-        public const int ModifierLifetimeSecondsFieldNumber = 1;
-
-        /// <summary>Field number for the "troy_disk_num_pokemon_spawned" field.</summary>
-        public const int TroyDiskNumPokemonSpawnedFieldNumber = 2;
-
-        private static readonly pb::MessageParser<FortModifierAttributes> _parser =
-            new pb::MessageParser<FortModifierAttributes>(() => new FortModifierAttributes());
-
-        private int modifierLifetimeSeconds_;
-        private int troyDiskNumPokemonSpawned_;
-
-        public FortModifierAttributes()
-        {
-            OnConstruction();
-        }
-
-        public FortModifierAttributes(FortModifierAttributes other) : this()
-        {
-            modifierLifetimeSeconds_ = other.modifierLifetimeSeconds_;
-            troyDiskNumPokemonSpawned_ = other.troyDiskNumPokemonSpawned_;
-        }
-
-        public static pb::MessageParser<FortModifierAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[87]; }
-        }
-
-        public int ModifierLifetimeSeconds
-        {
-            get { return modifierLifetimeSeconds_; }
-            set { modifierLifetimeSeconds_ = value; }
-        }
-
-        public int TroyDiskNumPokemonSpawned
-        {
-            get { return troyDiskNumPokemonSpawned_; }
-            set { troyDiskNumPokemonSpawned_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public FortModifierAttributes Clone()
-        {
-            return new FortModifierAttributes(this);
-        }
-
-        public bool Equals(FortModifierAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ModifierLifetimeSeconds != other.ModifierLifetimeSeconds) return false;
-            if (TroyDiskNumPokemonSpawned != other.TroyDiskNumPokemonSpawned) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ModifierLifetimeSeconds != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(ModifierLifetimeSeconds);
-            }
-            if (TroyDiskNumPokemonSpawned != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(TroyDiskNumPokemonSpawned);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ModifierLifetimeSeconds != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(ModifierLifetimeSeconds);
-            }
-            if (TroyDiskNumPokemonSpawned != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(TroyDiskNumPokemonSpawned);
-            }
-            return size;
-        }
-
-        public void MergeFrom(FortModifierAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ModifierLifetimeSeconds != 0)
-            {
-                ModifierLifetimeSeconds = other.ModifierLifetimeSeconds;
-            }
-            if (other.TroyDiskNumPokemonSpawned != 0)
-            {
-                TroyDiskNumPokemonSpawned = other.TroyDiskNumPokemonSpawned;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            ModifierLifetimeSeconds = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            TroyDiskNumPokemonSpawned = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as FortModifierAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ModifierLifetimeSeconds != 0) hash ^= ModifierLifetimeSeconds.GetHashCode();
-            if (TroyDiskNumPokemonSpawned != 0) hash ^= TroyDiskNumPokemonSpawned.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class IncenseAttributes : pb::IMessage<IncenseAttributes>
-    {
-        /// <summary>Field number for the "incense_lifetime_seconds" field.</summary>
-        public const int IncenseLifetimeSecondsFieldNumber = 1;
-
-        /// <summary>Field number for the "pokemon_type" field.</summary>
-        public const int PokemonTypeFieldNumber = 2;
-
-        /// <summary>Field number for the "pokemon_incense_type_probability" field.</summary>
-        public const int PokemonIncenseTypeProbabilityFieldNumber = 3;
-
-        /// <summary>Field number for the "standing_time_between_encounters_seconds" field.</summary>
-        public const int StandingTimeBetweenEncountersSecondsFieldNumber = 4;
-
-        /// <summary>Field number for the "moving_time_between_encounter_seconds" field.</summary>
-        public const int MovingTimeBetweenEncounterSecondsFieldNumber = 5;
-
-        /// <summary>Field number for the "distance_required_for_shorter_interval_meters" field.</summary>
-        public const int DistanceRequiredForShorterIntervalMetersFieldNumber = 6;
-
-        /// <summary>Field number for the "pokemon_attracted_length_sec" field.</summary>
-        public const int PokemonAttractedLengthSecFieldNumber = 7;
-
-        private static readonly pb::MessageParser<IncenseAttributes> _parser =
-            new pb::MessageParser<IncenseAttributes>(() => new IncenseAttributes());
-
-        private static readonly pb::FieldCodec<global::AllEnum.PokemonType> _repeated_pokemonType_codec
-            = pb::FieldCodec.ForEnum(18, x => (int)x, x => (global::AllEnum.PokemonType)x);
-
-        private readonly pbc::RepeatedField<global::AllEnum.PokemonType> pokemonType_ =
-            new pbc::RepeatedField<global::AllEnum.PokemonType>();
-
-        private int distanceRequiredForShorterIntervalMeters_;
-        private int incenseLifetimeSeconds_;
-        private int movingTimeBetweenEncounterSeconds_;
-        private int pokemonAttractedLengthSec_;
-        private float pokemonIncenseTypeProbability_;
-        private int standingTimeBetweenEncountersSeconds_;
-
-        public IncenseAttributes()
-        {
-            OnConstruction();
-        }
-
-        public IncenseAttributes(IncenseAttributes other) : this()
-        {
-            incenseLifetimeSeconds_ = other.incenseLifetimeSeconds_;
-            pokemonType_ = other.pokemonType_.Clone();
-            pokemonIncenseTypeProbability_ = other.pokemonIncenseTypeProbability_;
-            standingTimeBetweenEncountersSeconds_ = other.standingTimeBetweenEncountersSeconds_;
-            movingTimeBetweenEncounterSeconds_ = other.movingTimeBetweenEncounterSeconds_;
-            distanceRequiredForShorterIntervalMeters_ = other.distanceRequiredForShorterIntervalMeters_;
-            pokemonAttractedLengthSec_ = other.pokemonAttractedLengthSec_;
-        }
-
-        public static pb::MessageParser<IncenseAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[88]; }
-        }
-
-        public int IncenseLifetimeSeconds
-        {
-            get { return incenseLifetimeSeconds_; }
-            set { incenseLifetimeSeconds_ = value; }
-        }
-
-        public pbc::RepeatedField<global::AllEnum.PokemonType> PokemonType
-        {
-            get { return pokemonType_; }
-        }
-
-        public float PokemonIncenseTypeProbability
-        {
-            get { return pokemonIncenseTypeProbability_; }
-            set { pokemonIncenseTypeProbability_ = value; }
-        }
-
-        public int StandingTimeBetweenEncountersSeconds
-        {
-            get { return standingTimeBetweenEncountersSeconds_; }
-            set { standingTimeBetweenEncountersSeconds_ = value; }
-        }
-
-        public int MovingTimeBetweenEncounterSeconds
-        {
-            get { return movingTimeBetweenEncounterSeconds_; }
-            set { movingTimeBetweenEncounterSeconds_ = value; }
-        }
-
-        public int DistanceRequiredForShorterIntervalMeters
-        {
-            get { return distanceRequiredForShorterIntervalMeters_; }
-            set { distanceRequiredForShorterIntervalMeters_ = value; }
-        }
-
-        public int PokemonAttractedLengthSec
-        {
-            get { return pokemonAttractedLengthSec_; }
-            set { pokemonAttractedLengthSec_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public IncenseAttributes Clone()
-        {
-            return new IncenseAttributes(this);
-        }
-
-        public bool Equals(IncenseAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (IncenseLifetimeSeconds != other.IncenseLifetimeSeconds) return false;
-            if (!pokemonType_.Equals(other.pokemonType_)) return false;
-            if (PokemonIncenseTypeProbability != other.PokemonIncenseTypeProbability) return false;
-            if (StandingTimeBetweenEncountersSeconds != other.StandingTimeBetweenEncountersSeconds) return false;
-            if (MovingTimeBetweenEncounterSeconds != other.MovingTimeBetweenEncounterSeconds) return false;
-            if (DistanceRequiredForShorterIntervalMeters != other.DistanceRequiredForShorterIntervalMeters)
-                return false;
-            if (PokemonAttractedLengthSec != other.PokemonAttractedLengthSec) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (IncenseLifetimeSeconds != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(IncenseLifetimeSeconds);
-            }
-            pokemonType_.WriteTo(output, _repeated_pokemonType_codec);
-            if (PokemonIncenseTypeProbability != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(PokemonIncenseTypeProbability);
-            }
-            if (StandingTimeBetweenEncountersSeconds != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(StandingTimeBetweenEncountersSeconds);
-            }
-            if (MovingTimeBetweenEncounterSeconds != 0)
-            {
-                output.WriteRawTag(40);
-                output.WriteInt32(MovingTimeBetweenEncounterSeconds);
-            }
-            if (DistanceRequiredForShorterIntervalMeters != 0)
-            {
-                output.WriteRawTag(48);
-                output.WriteInt32(DistanceRequiredForShorterIntervalMeters);
-            }
-            if (PokemonAttractedLengthSec != 0)
-            {
-                output.WriteRawTag(56);
-                output.WriteInt32(PokemonAttractedLengthSec);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (IncenseLifetimeSeconds != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(IncenseLifetimeSeconds);
-            }
-            size += pokemonType_.CalculateSize(_repeated_pokemonType_codec);
-            if (PokemonIncenseTypeProbability != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (StandingTimeBetweenEncountersSeconds != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(StandingTimeBetweenEncountersSeconds);
-            }
-            if (MovingTimeBetweenEncounterSeconds != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MovingTimeBetweenEncounterSeconds);
-            }
-            if (DistanceRequiredForShorterIntervalMeters != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(DistanceRequiredForShorterIntervalMeters);
-            }
-            if (PokemonAttractedLengthSec != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonAttractedLengthSec);
-            }
-            return size;
-        }
-
-        public void MergeFrom(IncenseAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.IncenseLifetimeSeconds != 0)
-            {
-                IncenseLifetimeSeconds = other.IncenseLifetimeSeconds;
-            }
-            pokemonType_.Add(other.pokemonType_);
-            if (other.PokemonIncenseTypeProbability != 0F)
-            {
-                PokemonIncenseTypeProbability = other.PokemonIncenseTypeProbability;
-            }
-            if (other.StandingTimeBetweenEncountersSeconds != 0)
-            {
-                StandingTimeBetweenEncountersSeconds = other.StandingTimeBetweenEncountersSeconds;
-            }
-            if (other.MovingTimeBetweenEncounterSeconds != 0)
-            {
-                MovingTimeBetweenEncounterSeconds = other.MovingTimeBetweenEncounterSeconds;
-            }
-            if (other.DistanceRequiredForShorterIntervalMeters != 0)
-            {
-                DistanceRequiredForShorterIntervalMeters = other.DistanceRequiredForShorterIntervalMeters;
-            }
-            if (other.PokemonAttractedLengthSec != 0)
-            {
-                PokemonAttractedLengthSec = other.PokemonAttractedLengthSec;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            IncenseLifetimeSeconds = input.ReadInt32();
-                            break;
-                        }
-                    case 18:
-                    case 16:
-                        {
-                            pokemonType_.AddEntriesFrom(input, _repeated_pokemonType_codec);
-                            break;
-                        }
-                    case 29:
-                        {
-                            PokemonIncenseTypeProbability = input.ReadFloat();
-                            break;
-                        }
-                    case 32:
-                        {
-                            StandingTimeBetweenEncountersSeconds = input.ReadInt32();
-                            break;
-                        }
-                    case 40:
-                        {
-                            MovingTimeBetweenEncounterSeconds = input.ReadInt32();
-                            break;
-                        }
-                    case 48:
-                        {
-                            DistanceRequiredForShorterIntervalMeters = input.ReadInt32();
-                            break;
-                        }
-                    case 56:
-                        {
-                            PokemonAttractedLengthSec = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as IncenseAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (IncenseLifetimeSeconds != 0) hash ^= IncenseLifetimeSeconds.GetHashCode();
-            hash ^= pokemonType_.GetHashCode();
-            if (PokemonIncenseTypeProbability != 0F) hash ^= PokemonIncenseTypeProbability.GetHashCode();
-            if (StandingTimeBetweenEncountersSeconds != 0) hash ^= StandingTimeBetweenEncountersSeconds.GetHashCode();
-            if (MovingTimeBetweenEncounterSeconds != 0) hash ^= MovingTimeBetweenEncounterSeconds.GetHashCode();
-            if (DistanceRequiredForShorterIntervalMeters != 0)
-                hash ^= DistanceRequiredForShorterIntervalMeters.GetHashCode();
-            if (PokemonAttractedLengthSec != 0) hash ^= PokemonAttractedLengthSec.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class InventoryUpgradeAttributes : pb::IMessage<InventoryUpgradeAttributes>
-    {
-        /// <summary>Field number for the "additional_storage" field.</summary>
-        public const int AdditionalStorageFieldNumber = 1;
-
-        /// <summary>Field number for the "upgrade_type" field.</summary>
-        public const int UpgradeTypeFieldNumber = 2;
-
-        private static readonly pb::MessageParser<InventoryUpgradeAttributes> _parser =
-            new pb::MessageParser<InventoryUpgradeAttributes>(() => new InventoryUpgradeAttributes());
-
-        private int additionalStorage_;
-        private global::AllEnum.InventoryUpgradeType upgradeType_ = 0;
-
-        public InventoryUpgradeAttributes()
-        {
-            OnConstruction();
-        }
-
-        public InventoryUpgradeAttributes(InventoryUpgradeAttributes other) : this()
-        {
-            additionalStorage_ = other.additionalStorage_;
-            upgradeType_ = other.upgradeType_;
-        }
-
-        public static pb::MessageParser<InventoryUpgradeAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[89]; }
-        }
-
-        public int AdditionalStorage
-        {
-            get { return additionalStorage_; }
-            set { additionalStorage_ = value; }
-        }
-
-        public global::AllEnum.InventoryUpgradeType UpgradeType
-        {
-            get { return upgradeType_; }
-            set { upgradeType_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public InventoryUpgradeAttributes Clone()
-        {
-            return new InventoryUpgradeAttributes(this);
-        }
-
-        public bool Equals(InventoryUpgradeAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (AdditionalStorage != other.AdditionalStorage) return false;
-            if (UpgradeType != other.UpgradeType) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (AdditionalStorage != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(AdditionalStorage);
-            }
-            if (UpgradeType != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteEnum((int)UpgradeType);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (AdditionalStorage != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(AdditionalStorage);
-            }
-            if (UpgradeType != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)UpgradeType);
-            }
-            return size;
-        }
-
-        public void MergeFrom(InventoryUpgradeAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.AdditionalStorage != 0)
-            {
-                AdditionalStorage = other.AdditionalStorage;
-            }
-            if (other.UpgradeType != 0)
-            {
-                UpgradeType = other.UpgradeType;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            AdditionalStorage = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            upgradeType_ = (global::AllEnum.InventoryUpgradeType)input.ReadEnum();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as InventoryUpgradeAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (AdditionalStorage != 0) hash ^= AdditionalStorage.GetHashCode();
-            if (UpgradeType != 0) hash ^= UpgradeType.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PokeballAttributes : pb::IMessage<PokeballAttributes>
-    {
-        /// <summary>Field number for the "item_effect" field.</summary>
-        public const int ItemEffectFieldNumber = 1;
-
-        /// <summary>Field number for the "capture_multi" field.</summary>
-        public const int CaptureMultiFieldNumber = 2;
-
-        /// <summary>Field number for the "capture_multi_effect" field.</summary>
-        public const int CaptureMultiEffectFieldNumber = 3;
-
-        /// <summary>Field number for the "item_effect_mod" field.</summary>
-        public const int ItemEffectModFieldNumber = 4;
-
-        private static readonly pb::MessageParser<PokeballAttributes> _parser =
-            new pb::MessageParser<PokeballAttributes>(() => new PokeballAttributes());
-
-        private float captureMulti_;
-        private float captureMultiEffect_;
-        private global::AllEnum.ItemEffect itemEffect_ = 0;
-        private float itemEffectMod_;
-
-        public PokeballAttributes()
-        {
-            OnConstruction();
-        }
-
-        public PokeballAttributes(PokeballAttributes other) : this()
-        {
-            itemEffect_ = other.itemEffect_;
-            captureMulti_ = other.captureMulti_;
-            captureMultiEffect_ = other.captureMultiEffect_;
-            itemEffectMod_ = other.itemEffectMod_;
-        }
-
-        public static pb::MessageParser<PokeballAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[90]; }
-        }
-
-        public global::AllEnum.ItemEffect ItemEffect
-        {
-            get { return itemEffect_; }
-            set { itemEffect_ = value; }
-        }
-
-        public float CaptureMulti
-        {
-            get { return captureMulti_; }
-            set { captureMulti_ = value; }
-        }
-
-        public float CaptureMultiEffect
-        {
-            get { return captureMultiEffect_; }
-            set { captureMultiEffect_ = value; }
-        }
-
-        public float ItemEffectMod
-        {
-            get { return itemEffectMod_; }
-            set { itemEffectMod_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PokeballAttributes Clone()
-        {
-            return new PokeballAttributes(this);
-        }
-
-        public bool Equals(PokeballAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (ItemEffect != other.ItemEffect) return false;
-            if (CaptureMulti != other.CaptureMulti) return false;
-            if (CaptureMultiEffect != other.CaptureMultiEffect) return false;
-            if (ItemEffectMod != other.ItemEffectMod) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (ItemEffect != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteEnum((int)ItemEffect);
-            }
-            if (CaptureMulti != 0F)
-            {
-                output.WriteRawTag(21);
-                output.WriteFloat(CaptureMulti);
-            }
-            if (CaptureMultiEffect != 0F)
-            {
-                output.WriteRawTag(29);
-                output.WriteFloat(CaptureMultiEffect);
-            }
-            if (ItemEffectMod != 0F)
-            {
-                output.WriteRawTag(37);
-                output.WriteFloat(ItemEffectMod);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (ItemEffect != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemEffect);
-            }
-            if (CaptureMulti != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (CaptureMultiEffect != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (ItemEffectMod != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(PokeballAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.ItemEffect != 0)
-            {
-                ItemEffect = other.ItemEffect;
-            }
-            if (other.CaptureMulti != 0F)
-            {
-                CaptureMulti = other.CaptureMulti;
-            }
-            if (other.CaptureMultiEffect != 0F)
-            {
-                CaptureMultiEffect = other.CaptureMultiEffect;
-            }
-            if (other.ItemEffectMod != 0F)
-            {
-                ItemEffectMod = other.ItemEffectMod;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            itemEffect_ = (global::AllEnum.ItemEffect)input.ReadEnum();
-                            break;
-                        }
-                    case 21:
-                        {
-                            CaptureMulti = input.ReadFloat();
-                            break;
-                        }
-                    case 29:
-                        {
-                            CaptureMultiEffect = input.ReadFloat();
-                            break;
-                        }
-                    case 37:
-                        {
-                            ItemEffectMod = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PokeballAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (ItemEffect != 0) hash ^= ItemEffect.GetHashCode();
-            if (CaptureMulti != 0F) hash ^= CaptureMulti.GetHashCode();
-            if (CaptureMultiEffect != 0F) hash ^= CaptureMultiEffect.GetHashCode();
-            if (ItemEffectMod != 0F) hash ^= ItemEffectMod.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class PotionAttributes : pb::IMessage<PotionAttributes>
-    {
-        /// <summary>Field number for the "sta_percent" field.</summary>
-        public const int StaPercentFieldNumber = 1;
-
-        /// <summary>Field number for the "sta_amount" field.</summary>
-        public const int StaAmountFieldNumber = 2;
-
-        private static readonly pb::MessageParser<PotionAttributes> _parser =
-            new pb::MessageParser<PotionAttributes>(() => new PotionAttributes());
-
-        private int staAmount_;
-        private float staPercent_;
-
-        public PotionAttributes()
-        {
-            OnConstruction();
-        }
-
-        public PotionAttributes(PotionAttributes other) : this()
-        {
-            staPercent_ = other.staPercent_;
-            staAmount_ = other.staAmount_;
-        }
-
-        public static pb::MessageParser<PotionAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[91]; }
-        }
-
-        public float StaPercent
-        {
-            get { return staPercent_; }
-            set { staPercent_ = value; }
-        }
-
-        public int StaAmount
-        {
-            get { return staAmount_; }
-            set { staAmount_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public PotionAttributes Clone()
-        {
-            return new PotionAttributes(this);
-        }
-
-        public bool Equals(PotionAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (StaPercent != other.StaPercent) return false;
-            if (StaAmount != other.StaAmount) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (StaPercent != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(StaPercent);
-            }
-            if (StaAmount != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(StaAmount);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (StaPercent != 0F)
-            {
-                size += 1 + 4;
-            }
-            if (StaAmount != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(StaAmount);
-            }
-            return size;
-        }
-
-        public void MergeFrom(PotionAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.StaPercent != 0F)
-            {
-                StaPercent = other.StaPercent;
-            }
-            if (other.StaAmount != 0)
-            {
-                StaAmount = other.StaAmount;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            StaPercent = input.ReadFloat();
-                            break;
-                        }
-                    case 16:
-                        {
-                            StaAmount = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as PotionAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
-            if (StaAmount != 0) hash ^= StaAmount.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class ReviveAttributes : pb::IMessage<ReviveAttributes>
-    {
-        /// <summary>Field number for the "sta_percent" field.</summary>
-        public const int StaPercentFieldNumber = 1;
-
-        private static readonly pb::MessageParser<ReviveAttributes> _parser =
-            new pb::MessageParser<ReviveAttributes>(() => new ReviveAttributes());
-
-        private float staPercent_;
-
-        public ReviveAttributes()
-        {
-            OnConstruction();
-        }
-
-        public ReviveAttributes(ReviveAttributes other) : this()
-        {
-            staPercent_ = other.staPercent_;
-        }
-
-        public static pb::MessageParser<ReviveAttributes> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[92]; }
-        }
-
-        public float StaPercent
-        {
-            get { return staPercent_; }
-            set { staPercent_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public ReviveAttributes Clone()
-        {
-            return new ReviveAttributes(this);
-        }
-
-        public bool Equals(ReviveAttributes other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (StaPercent != other.StaPercent) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (StaPercent != 0F)
-            {
-                output.WriteRawTag(13);
-                output.WriteFloat(StaPercent);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (StaPercent != 0F)
-            {
-                size += 1 + 4;
-            }
-            return size;
-        }
-
-        public void MergeFrom(ReviveAttributes other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.StaPercent != 0F)
-            {
-                StaPercent = other.StaPercent;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 13:
-                        {
-                            StaPercent = input.ReadFloat();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as ReviveAttributes);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (StaPercent != 0F) hash ^= StaPercent.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    /// <summary>
-    ///     POKEMON TRANSFER
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class TransferPokemon : pb::IMessage<TransferPokemon>
-    {
-        /// <summary>Field number for the "PokemonId" field.</summary>
-        public const int PokemonIdFieldNumber = 1;
-
-        private static readonly pb::MessageParser<TransferPokemon> _parser =
-            new pb::MessageParser<TransferPokemon>(() => new TransferPokemon());
-
-        private ulong pokemonId_;
-
-        public TransferPokemon()
-        {
-            OnConstruction();
-        }
-
-        public TransferPokemon(TransferPokemon other) : this()
-        {
-            pokemonId_ = other.pokemonId_;
-        }
-
-        public static pb::MessageParser<TransferPokemon> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[93]; }
-        }
-
-        public ulong PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public TransferPokemon Clone()
-        {
-            return new TransferPokemon(this);
-        }
-
-        public bool Equals(TransferPokemon other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokemonId != other.PokemonId) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokemonId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(PokemonId);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokemonId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(TransferPokemon other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokemonId != 0UL)
-            {
-                PokemonId = other.PokemonId;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            PokemonId = input.ReadFixed64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as TransferPokemon);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class TransferPokemonOut : pb::IMessage<TransferPokemonOut>
-    {
-        /// <summary>Field number for the "Status" field.</summary>
-        public const int StatusFieldNumber = 1;
-
-        /// <summary>Field number for the "CandyAwarded" field.</summary>
-        public const int CandyAwardedFieldNumber = 2;
-
-        private static readonly pb::MessageParser<TransferPokemonOut> _parser =
-            new pb::MessageParser<TransferPokemonOut>(() => new TransferPokemonOut());
-
-        private int candyAwarded_;
-        private int status_;
-
-        public TransferPokemonOut()
-        {
-            OnConstruction();
-        }
-
-        public TransferPokemonOut(TransferPokemonOut other) : this()
-        {
-            status_ = other.status_;
-            candyAwarded_ = other.candyAwarded_;
-        }
-
-        public static pb::MessageParser<TransferPokemonOut> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[94]; }
-        }
-
-        public int Status
-        {
-            get { return status_; }
-            set { status_ = value; }
-        }
-
-        public int CandyAwarded
-        {
-            get { return candyAwarded_; }
-            set { candyAwarded_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public TransferPokemonOut Clone()
-        {
-            return new TransferPokemonOut(this);
-        }
-
-        public bool Equals(TransferPokemonOut other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Status != other.Status) return false;
-            if (CandyAwarded != other.CandyAwarded) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Status != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Status);
-            }
-            if (CandyAwarded != 0)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt32(CandyAwarded);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Status != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Status);
-            }
-            if (CandyAwarded != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
-            }
-            return size;
-        }
-
-        public void MergeFrom(TransferPokemonOut other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Status != 0)
-            {
-                Status = other.Status;
-            }
-            if (other.CandyAwarded != 0)
-            {
-                CandyAwarded = other.CandyAwarded;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Status = input.ReadInt32();
-                            break;
-                        }
-                    case 16:
-                        {
-                            CandyAwarded = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as TransferPokemonOut);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Status != 0) hash ^= Status.GetHashCode();
-            if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    /// <summary>
-    ///     EVOLVE
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EvolvePokemon : pb::IMessage<EvolvePokemon>
-    {
-        /// <summary>Field number for the "PokemonId" field.</summary>
-        public const int PokemonIdFieldNumber = 1;
-
-        private static readonly pb::MessageParser<EvolvePokemon> _parser =
-            new pb::MessageParser<EvolvePokemon>(() => new EvolvePokemon());
-
-        private ulong pokemonId_;
-
-        public EvolvePokemon()
-        {
-            OnConstruction();
-        }
-
-        public EvolvePokemon(EvolvePokemon other) : this()
-        {
-            pokemonId_ = other.pokemonId_;
-        }
-
-        public static pb::MessageParser<EvolvePokemon> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[95]; }
-        }
-
-        public ulong PokemonId
-        {
-            get { return pokemonId_; }
-            set { pokemonId_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EvolvePokemon Clone()
-        {
-            return new EvolvePokemon(this);
-        }
-
-        public bool Equals(EvolvePokemon other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (PokemonId != other.PokemonId) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (PokemonId != 0UL)
-            {
-                output.WriteRawTag(9);
-                output.WriteFixed64(PokemonId);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (PokemonId != 0UL)
-            {
-                size += 1 + 8;
-            }
-            return size;
-        }
-
-        public void MergeFrom(EvolvePokemon other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.PokemonId != 0UL)
-            {
-                PokemonId = other.PokemonId;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 9:
-                        {
-                            PokemonId = input.ReadFixed64();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EvolvePokemon);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (PokemonId != 0UL) hash ^= PokemonId.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class EvolvePokemonOut : pb::IMessage<EvolvePokemonOut>
-    {
-        /// <summary>Field number for the "Result" field.</summary>
-        public const int ResultFieldNumber = 1;
-
-        /// <summary>Field number for the "EvolvedPokemon" field.</summary>
-        public const int EvolvedPokemonFieldNumber = 2;
-
-        /// <summary>Field number for the "ExpAwarded" field.</summary>
-        public const int ExpAwardedFieldNumber = 3;
-
-        /// <summary>Field number for the "CandyAwarded" field.</summary>
-        public const int CandyAwardedFieldNumber = 4;
-
-        private static readonly pb::MessageParser<EvolvePokemonOut> _parser =
-            new pb::MessageParser<EvolvePokemonOut>(() => new EvolvePokemonOut());
-
-        private int candyAwarded_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.Pokemon evolvedPokemon_;
-        private int expAwarded_;
-        private int result_;
-
-        public EvolvePokemonOut()
-        {
-            OnConstruction();
-        }
-
-        public EvolvePokemonOut(EvolvePokemonOut other) : this()
-        {
-            result_ = other.result_;
-            EvolvedPokemon = other.evolvedPokemon_ != null ? other.EvolvedPokemon.Clone() : null;
-            expAwarded_ = other.expAwarded_;
-            candyAwarded_ = other.candyAwarded_;
-        }
-
-        public static pb::MessageParser<EvolvePokemonOut> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[96]; }
-        }
-
-        public int Result
-        {
-            get { return result_; }
-            set { result_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Pokemon EvolvedPokemon
-        {
-            get { return evolvedPokemon_; }
-            set { evolvedPokemon_ = value; }
-        }
-
-        public int ExpAwarded
-        {
-            get { return expAwarded_; }
-            set { expAwarded_ = value; }
-        }
-
-        public int CandyAwarded
-        {
-            get { return candyAwarded_; }
-            set { candyAwarded_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public EvolvePokemonOut Clone()
-        {
-            return new EvolvePokemonOut(this);
-        }
-
-        public bool Equals(EvolvePokemonOut other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Result != other.Result) return false;
-            if (!Equals(EvolvedPokemon, other.EvolvedPokemon)) return false;
-            if (ExpAwarded != other.ExpAwarded) return false;
-            if (CandyAwarded != other.CandyAwarded) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Result != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Result);
-            }
-            if (evolvedPokemon_ != null)
-            {
-                output.WriteRawTag(18);
-                output.WriteMessage(EvolvedPokemon);
-            }
-            if (ExpAwarded != 0)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt32(ExpAwarded);
-            }
-            if (CandyAwarded != 0)
-            {
-                output.WriteRawTag(32);
-                output.WriteInt32(CandyAwarded);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Result != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Result);
-            }
-            if (evolvedPokemon_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(EvolvedPokemon);
-            }
-            if (ExpAwarded != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(ExpAwarded);
-            }
-            if (CandyAwarded != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(CandyAwarded);
-            }
-            return size;
-        }
-
-        public void MergeFrom(EvolvePokemonOut other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Result != 0)
-            {
-                Result = other.Result;
-            }
-            if (other.evolvedPokemon_ != null)
-            {
-                if (evolvedPokemon_ == null)
-                {
-                    evolvedPokemon_ = new global::PokemonGo.RocketAPI.GeneratedCode.Pokemon();
-                }
-                EvolvedPokemon.MergeFrom(other.EvolvedPokemon);
-            }
-            if (other.ExpAwarded != 0)
-            {
-                ExpAwarded = other.ExpAwarded;
-            }
-            if (other.CandyAwarded != 0)
-            {
-                CandyAwarded = other.CandyAwarded;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                        {
-                            Result = input.ReadInt32();
-                            break;
-                        }
-                    case 18:
-                        {
-                            if (evolvedPokemon_ == null)
-                            {
-                                evolvedPokemon_ = new global::PokemonGo.RocketAPI.GeneratedCode.Pokemon();
-                            }
-                            input.ReadMessage(evolvedPokemon_);
-                            break;
-                        }
-                    case 24:
-                        {
-                            ExpAwarded = input.ReadInt32();
-                            break;
-                        }
-                    case 32:
-                        {
-                            CandyAwarded = input.ReadInt32();
-                            break;
-                        }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as EvolvePokemonOut);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Result != 0) hash ^= Result.GetHashCode();
-            if (evolvedPokemon_ != null) hash ^= EvolvedPokemon.GetHashCode();
-            if (ExpAwarded != 0) hash ^= ExpAwarded.GetHashCode();
-            if (CandyAwarded != 0) hash ^= CandyAwarded.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-    }
-
-    #endregion
-}
-
-#endregion Designer generated code
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/GeneratedCode/Request.cs b/PokemonGo/RocketAPI/GeneratedCode/Request.cs
deleted file mode 100644
index a8b1cc7..0000000
--- a/PokemonGo/RocketAPI/GeneratedCode/Request.cs
+++ /dev/null
@@ -1,3394 +0,0 @@
-#pragma warning disable 1591, 0612, 3021
-
-#region Designer generated code
-
-#region
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-
-#endregion
-
-namespace PokemonGo.RocketAPI.GeneratedCode
-{
-    /// <summary>Holder for reflection information generated from Request.proto</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public static partial class RequestReflection
-    {
-        #region Descriptor
-
-        /// <summary>File descriptor for Request.proto</summary>
-        public static pbr::FileDescriptor Descriptor
-        {
-            get { return descriptor; }
-        }
-
-        private static pbr::FileDescriptor descriptor;
-
-        static RequestReflection()
-        {
-            var descriptorData = global::System.Convert.FromBase64String(
-                string.Concat(
-                    "Cg1SZXF1ZXN0LnByb3RvEiFQb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-                    "ZENvZGUihAwKB1JlcXVlc3QSEAoIdW5rbm93bjEYASABKAUSDgoGcnBjX2lk",
-                    "GAMgASgDEkUKCHJlcXVlc3RzGAQgAygLMjMuUG9rZW1vbkdvLlJvY2tldEFQ",
-                    "SS5HZW5lcmF0ZWRDb2RlLlJlcXVlc3QuUmVxdWVzdHMSRQoIdW5rbm93bjYY",
-                    "BiABKAsyMy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuUmVx",
-                    "dWVzdC5Vbmtub3duNhIQCghsYXRpdHVkZRgHIAEoBhIRCglsb25naXR1ZGUY",
-                    "CCABKAYSEAoIYWx0aXR1ZGUYCSABKAYSQQoEYXV0aBgKIAEoCzIzLlBva2Vt",
-                    "b25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5SZXF1ZXN0LkF1dGhJbmZv",
-                    "EksKC3Vua25vd25hdXRoGAsgASgLMjYuUG9rZW1vbkdvLlJvY2tldEFQSS5H",
-                    "ZW5lcmF0ZWRDb2RlLlJlcXVlc3QuVW5rbm93bkF1dGgSEQoJdW5rbm93bjEy",
-                    "GAwgASgDGkYKC1Vua25vd25BdXRoEhEKCXVua25vd243MRgBIAEoDBIRCgl0",
-                    "aW1lc3RhbXAYAiABKAMSEQoJdW5rbm93bjczGAMgASgMGikKCFJlcXVlc3Rz",
-                    "EgwKBHR5cGUYASABKAUSDwoHbWVzc2FnZRgCIAEoDBocCghVbmtub3duMxIQ",
-                    "Cgh1bmtub3duNBgBIAEoCRqKAQoIVW5rbm93bjYSEAoIdW5rbm93bjEYASAB",
-                    "KAUSTgoIdW5rbm93bjIYAiABKAsyPC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdl",
-                    "bmVyYXRlZENvZGUuUmVxdWVzdC5Vbmtub3duNi5Vbmtub3duMhocCghVbmtu",
-                    "b3duMhIQCgh1bmtub3duMRgBIAEoDBqQAQoIQXV0aEluZm8SEAoIcHJvdmlk",
-                    "ZXIYASABKAkSRgoFdG9rZW4YAiABKAsyNy5Qb2tlbW9uR28uUm9ja2V0QVBJ",
-                    "LkdlbmVyYXRlZENvZGUuUmVxdWVzdC5BdXRoSW5mby5KV1QaKgoDSldUEhAK",
-                    "CGNvbnRlbnRzGAEgASgJEhEKCXVua25vd24xMxgCIAEoBRotChFQbGF5ZXJV",
-                    "cGRhdGVQcm90bxILCgNMYXQYASABKAYSCwoDTG5nGAIgASgGGlwKEU1hcE9i",
-                    "amVjdHNSZXF1ZXN0Eg8KB2NlbGxJZHMYASABKAwSEQoJdW5rbm93bjE0GAIg",
-                    "ASgMEhAKCGxhdGl0dWRlGAMgASgGEhEKCWxvbmdpdHVkZRgEIAEoBhqDAQoR",
-                    "Rm9ydFNlYXJjaFJlcXVlc3QSCgoCSWQYASABKAwSGAoQUGxheWVyTGF0RGVn",
-                    "cmVlcxgCIAEoBhIYChBQbGF5ZXJMbmdEZWdyZWVzGAMgASgGEhYKDkZvcnRM",
-                    "YXREZWdyZWVzGAQgASgGEhYKDkZvcnRMbmdEZWdyZWVzGAUgASgGGkUKEkZv",
-                    "cnREZXRhaWxzUmVxdWVzdBIKCgJJZBgBIAEoDBIQCghMYXRpdHVkZRgCIAEo",
-                    "BhIRCglMb25naXR1ZGUYAyABKAYacQoQRW5jb3VudGVyUmVxdWVzdBITCgtF",
-                    "bmNvdW50ZXJJZBgBIAEoBhIUCgxTcGF3bnBvaW50SWQYAiABKAkSGAoQUGxh",
-                    "eWVyTGF0RGVncmVlcxgDIAEoBhIYChBQbGF5ZXJMbmdEZWdyZWVzGAQgASgG",
-                    "GrwBChNDYXRjaFBva2Vtb25SZXF1ZXN0EhMKC0VuY291bnRlcklkGAEgASgG",
-                    "EhAKCFBva2ViYWxsGAIgASgFEh0KFU5vcm1hbGl6ZWRSZXRpY2xlU2l6ZRgD",
-                    "IAEoBhIWCg5TcGF3blBvaW50R3VpZBgEIAEoCRISCgpIaXRQb2tlbW9uGAUg",
-                    "ASgFEhQKDFNwaW5Nb2RpZmllchgGIAEoBhIdChVOb3JtYWxpemVkSGl0UG9z",
-                    "aXRpb24YByABKAYaHAoMU2V0dGluZ3NHdWlkEgwKBGd1aWQYASABKAwaFAoE",
-                    "VGltZRIMCgR0aW1lGAEgASgDYgZwcm90bzM="));
-            descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-                new pbr::FileDescriptor[] {},
-                new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[]
-                {
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request),
-                        global::PokemonGo.RocketAPI.GeneratedCode.Request.Parser,
-                        new[]
-                        {
-                            "Unknown1", "RpcId", "Requests", "Unknown6", "Latitude", "Longitude", "Altitude", "Auth",
-                            "Unknownauth", "Unknown12"
-                        }, null, null, new pbr::GeneratedClrTypeInfo[]
-                        {
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.UnknownAuth),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.UnknownAuth.Parser,
-                                new[] {"Unknown71", "Timestamp", "Unknown73"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests.Parser,
-                                new[] {"Type", "Message"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown3),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown3.Parser,
-                                new[] {"Unknown4"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Parser,
-                                new[] {"Unknown1", "Unknown2"}, null, null,
-                                new pbr::GeneratedClrTypeInfo[]
-                                {
-                                    new pbr::GeneratedClrTypeInfo(
-                                        typeof(
-                                            global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Types.
-                                                Unknown2),
-                                        global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Types
-                                            .Unknown2.Parser, new[] {"Unknown1"}, null, null, null)
-                                }),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Parser,
-                                new[] {"Provider", "Token"}, null, null,
-                                new pbr::GeneratedClrTypeInfo[]
-                                {
-                                    new pbr::GeneratedClrTypeInfo(
-                                        typeof(
-                                            global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Types.
-                                                JWT),
-                                        global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Types.JWT
-                                            .Parser, new[] {"Contents", "Unknown13"}, null, null, null)
-                                }),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.PlayerUpdateProto),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.PlayerUpdateProto.Parser,
-                                new[] {"Lat", "Lng"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.MapObjectsRequest),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.MapObjectsRequest.Parser,
-                                new[] {"CellIds", "Unknown14", "Latitude", "Longitude"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortSearchRequest),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortSearchRequest.Parser,
-                                new[]
-                                {"Id", "PlayerLatDegrees", "PlayerLngDegrees", "FortLatDegrees", "FortLngDegrees"},
-                                null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortDetailsRequest),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortDetailsRequest.Parser,
-                                new[] {"Id", "Latitude", "Longitude"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.EncounterRequest),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.EncounterRequest.Parser,
-                                new[] {"EncounterId", "SpawnpointId", "PlayerLatDegrees", "PlayerLngDegrees"}, null,
-                                null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.CatchPokemonRequest),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.CatchPokemonRequest.Parser,
-                                new[]
-                                {
-                                    "EncounterId", "Pokeball", "NormalizedReticleSize", "SpawnPointGuid", "HitPokemon",
-                                    "SpinModifier", "NormalizedHitPosition"
-                                }, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.SettingsGuid),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.SettingsGuid.Parser,
-                                new[] {"Guid"}, null, null, null),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Time),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Time.Parser, new[] {"Time_"},
-                                null, null, null)
-                        })
-                }));
-        }
-
-        #endregion
-    }
-
-    #region Messages
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class Request : pb::IMessage<Request>
-    {
-        /// <summary>Field number for the "unknown1" field.</summary>
-        public const int Unknown1FieldNumber = 1;
-
-        /// <summary>Field number for the "rpc_id" field.</summary>
-        public const int RpcIdFieldNumber = 3;
-
-        /// <summary>Field number for the "requests" field.</summary>
-        public const int RequestsFieldNumber = 4;
-
-        /// <summary>Field number for the "unknown6" field.</summary>
-        public const int Unknown6FieldNumber = 6;
-
-        /// <summary>Field number for the "latitude" field.</summary>
-        public const int LatitudeFieldNumber = 7;
-
-        /// <summary>Field number for the "longitude" field.</summary>
-        public const int LongitudeFieldNumber = 8;
-
-        /// <summary>Field number for the "altitude" field.</summary>
-        public const int AltitudeFieldNumber = 9;
-
-        /// <summary>Field number for the "auth" field.</summary>
-        public const int AuthFieldNumber = 10;
-
-        /// <summary>Field number for the "unknownauth" field.</summary>
-        public const int UnknownauthFieldNumber = 11;
-
-        /// <summary>Field number for the "unknown12" field.</summary>
-        public const int Unknown12FieldNumber = 12;
-
-        private static readonly pb::MessageParser<Request> _parser = new pb::MessageParser<Request>(() => new Request());
-
-        private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests>
-            _repeated_requests_codec
-                = pb::FieldCodec.ForMessage(34, global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests.Parser);
-
-        private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests> requests_
-            = new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests>();
-
-        private ulong altitude_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo auth_;
-        private ulong latitude_;
-        private ulong longitude_;
-        private long rpcId_;
-        private int unknown1_;
-        private long unknown12_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6 unknown6_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.UnknownAuth unknownauth_;
-
-        public Request()
-        {
-            OnConstruction();
-        }
-
-        public Request(Request other) : this()
-        {
-            unknown1_ = other.unknown1_;
-            rpcId_ = other.rpcId_;
-            requests_ = other.requests_.Clone();
-            Unknown6 = other.unknown6_ != null ? other.Unknown6.Clone() : null;
-            latitude_ = other.latitude_;
-            longitude_ = other.longitude_;
-            altitude_ = other.altitude_;
-            Auth = other.auth_ != null ? other.Auth.Clone() : null;
-            Unknownauth = other.unknownauth_ != null ? other.Unknownauth.Clone() : null;
-            unknown12_ = other.unknown12_;
-        }
-
-        public static pb::MessageParser<Request> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.RequestReflection.Descriptor.MessageTypes[0]; }
-        }
-
-        public int Unknown1
-        {
-            get { return unknown1_; }
-            set { unknown1_ = value; }
-        }
-
-        public long RpcId
-        {
-            get { return rpcId_; }
-            set { rpcId_ = value; }
-        }
-
-        public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Requests> Requests
-        {
-            get { return requests_; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6 Unknown6
-        {
-            get { return unknown6_; }
-            set { unknown6_ = value; }
-        }
-
-        public ulong Latitude
-        {
-            get { return latitude_; }
-            set { latitude_ = value; }
-        }
-
-        public ulong Longitude
-        {
-            get { return longitude_; }
-            set { longitude_ = value; }
-        }
-
-        public ulong Altitude
-        {
-            get { return altitude_; }
-            set { altitude_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo Auth
-        {
-            get { return auth_; }
-            set { auth_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.UnknownAuth Unknownauth
-        {
-            get { return unknownauth_; }
-            set { unknownauth_ = value; }
-        }
-
-        public long Unknown12
-        {
-            get { return unknown12_; }
-            set { unknown12_ = value; }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public Request Clone()
-        {
-            return new Request(this);
-        }
-
-        public bool Equals(Request other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Unknown1 != other.Unknown1) return false;
-            if (RpcId != other.RpcId) return false;
-            if (!requests_.Equals(other.requests_)) return false;
-            if (!Equals(Unknown6, other.Unknown6)) return false;
-            if (Latitude != other.Latitude) return false;
-            if (Longitude != other.Longitude) return false;
-            if (Altitude != other.Altitude) return false;
-            if (!Equals(Auth, other.Auth)) return false;
-            if (!Equals(Unknownauth, other.Unknownauth)) return false;
-            if (Unknown12 != other.Unknown12) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Unknown1 != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Unknown1);
-            }
-            if (RpcId != 0L)
-            {
-                output.WriteRawTag(24);
-                output.WriteInt64(RpcId);
-            }
-            requests_.WriteTo(output, _repeated_requests_codec);
-            if (unknown6_ != null)
-            {
-                output.WriteRawTag(50);
-                output.WriteMessage(Unknown6);
-            }
-            if (Latitude != 0UL)
-            {
-                output.WriteRawTag(57);
-                output.WriteFixed64(Latitude);
-            }
-            if (Longitude != 0UL)
-            {
-                output.WriteRawTag(65);
-                output.WriteFixed64(Longitude);
-            }
-            if (Altitude != 0UL)
-            {
-                output.WriteRawTag(73);
-                output.WriteFixed64(Altitude);
-            }
-            if (auth_ != null)
-            {
-                output.WriteRawTag(82);
-                output.WriteMessage(Auth);
-            }
-            if (unknownauth_ != null)
-            {
-                output.WriteRawTag(90);
-                output.WriteMessage(Unknownauth);
-            }
-            if (Unknown12 != 0L)
-            {
-                output.WriteRawTag(96);
-                output.WriteInt64(Unknown12);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Unknown1 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
-            }
-            if (RpcId != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(RpcId);
-            }
-            size += requests_.CalculateSize(_repeated_requests_codec);
-            if (unknown6_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown6);
-            }
-            if (Latitude != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (Longitude != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (Altitude != 0UL)
-            {
-                size += 1 + 8;
-            }
-            if (auth_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Auth);
-            }
-            if (unknownauth_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknownauth);
-            }
-            if (Unknown12 != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown12);
-            }
-            return size;
-        }
-
-        public void MergeFrom(Request other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Unknown1 != 0)
-            {
-                Unknown1 = other.Unknown1;
-            }
-            if (other.RpcId != 0L)
-            {
-                RpcId = other.RpcId;
-            }
-            requests_.Add(other.requests_);
-            if (other.unknown6_ != null)
-            {
-                if (unknown6_ == null)
-                {
-                    unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6();
-                }
-                Unknown6.MergeFrom(other.Unknown6);
-            }
-            if (other.Latitude != 0UL)
-            {
-                Latitude = other.Latitude;
-            }
-            if (other.Longitude != 0UL)
-            {
-                Longitude = other.Longitude;
-            }
-            if (other.Altitude != 0UL)
-            {
-                Altitude = other.Altitude;
-            }
-            if (other.auth_ != null)
-            {
-                if (auth_ == null)
-                {
-                    auth_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo();
-                }
-                Auth.MergeFrom(other.Auth);
-            }
-            if (other.unknownauth_ != null)
-            {
-                if (unknownauth_ == null)
-                {
-                    unknownauth_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.UnknownAuth();
-                }
-                Unknownauth.MergeFrom(other.Unknownauth);
-            }
-            if (other.Unknown12 != 0L)
-            {
-                Unknown12 = other.Unknown12;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                    {
-                        Unknown1 = input.ReadInt32();
-                        break;
-                    }
-                    case 24:
-                    {
-                        RpcId = input.ReadInt64();
-                        break;
-                    }
-                    case 34:
-                    {
-                        requests_.AddEntriesFrom(input, _repeated_requests_codec);
-                        break;
-                    }
-                    case 50:
-                    {
-                        if (unknown6_ == null)
-                        {
-                            unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6();
-                        }
-                        input.ReadMessage(unknown6_);
-                        break;
-                    }
-                    case 57:
-                    {
-                        Latitude = input.ReadFixed64();
-                        break;
-                    }
-                    case 65:
-                    {
-                        Longitude = input.ReadFixed64();
-                        break;
-                    }
-                    case 73:
-                    {
-                        Altitude = input.ReadFixed64();
-                        break;
-                    }
-                    case 82:
-                    {
-                        if (auth_ == null)
-                        {
-                            auth_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo();
-                        }
-                        input.ReadMessage(auth_);
-                        break;
-                    }
-                    case 90:
-                    {
-                        if (unknownauth_ == null)
-                        {
-                            unknownauth_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.UnknownAuth();
-                        }
-                        input.ReadMessage(unknownauth_);
-                        break;
-                    }
-                    case 96:
-                    {
-                        Unknown12 = input.ReadInt64();
-                        break;
-                    }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as Request);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
-            if (RpcId != 0L) hash ^= RpcId.GetHashCode();
-            hash ^= requests_.GetHashCode();
-            if (unknown6_ != null) hash ^= Unknown6.GetHashCode();
-            if (Latitude != 0UL) hash ^= Latitude.GetHashCode();
-            if (Longitude != 0UL) hash ^= Longitude.GetHashCode();
-            if (Altitude != 0UL) hash ^= Altitude.GetHashCode();
-            if (auth_ != null) hash ^= Auth.GetHashCode();
-            if (unknownauth_ != null) hash ^= Unknownauth.GetHashCode();
-            if (Unknown12 != 0L) hash ^= Unknown12.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the Request message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class UnknownAuth : pb::IMessage<UnknownAuth>
-            {
-                /// <summary>Field number for the "unknown71" field.</summary>
-                public const int Unknown71FieldNumber = 1;
-
-                /// <summary>Field number for the "timestamp" field.</summary>
-                public const int TimestampFieldNumber = 2;
-
-                /// <summary>Field number for the "unknown73" field.</summary>
-                public const int Unknown73FieldNumber = 3;
-
-                private static readonly pb::MessageParser<UnknownAuth> _parser =
-                    new pb::MessageParser<UnknownAuth>(() => new UnknownAuth());
-
-                private long timestamp_;
-                private pb::ByteString unknown71_ = pb::ByteString.Empty;
-                private pb::ByteString unknown73_ = pb::ByteString.Empty;
-
-                public UnknownAuth()
-                {
-                    OnConstruction();
-                }
-
-                public UnknownAuth(UnknownAuth other) : this()
-                {
-                    unknown71_ = other.unknown71_;
-                    timestamp_ = other.timestamp_;
-                    unknown73_ = other.unknown73_;
-                }
-
-                public static pb::MessageParser<UnknownAuth> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[0]; }
-                }
-
-                public pb::ByteString Unknown71
-                {
-                    get { return unknown71_; }
-                    set { unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public long Timestamp
-                {
-                    get { return timestamp_; }
-                    set { timestamp_ = value; }
-                }
-
-                public pb::ByteString Unknown73
-                {
-                    get { return unknown73_; }
-                    set { unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public UnknownAuth Clone()
-                {
-                    return new UnknownAuth(this);
-                }
-
-                public bool Equals(UnknownAuth other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Unknown71 != other.Unknown71) return false;
-                    if (Timestamp != other.Timestamp) return false;
-                    if (Unknown73 != other.Unknown73) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Unknown71.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteBytes(Unknown71);
-                    }
-                    if (Timestamp != 0L)
-                    {
-                        output.WriteRawTag(16);
-                        output.WriteInt64(Timestamp);
-                    }
-                    if (Unknown73.Length != 0)
-                    {
-                        output.WriteRawTag(26);
-                        output.WriteBytes(Unknown73);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Unknown71.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
-                    }
-                    if (Timestamp != 0L)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Timestamp);
-                    }
-                    if (Unknown73.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(UnknownAuth other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Unknown71.Length != 0)
-                    {
-                        Unknown71 = other.Unknown71;
-                    }
-                    if (other.Timestamp != 0L)
-                    {
-                        Timestamp = other.Timestamp;
-                    }
-                    if (other.Unknown73.Length != 0)
-                    {
-                        Unknown73 = other.Unknown73;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Unknown71 = input.ReadBytes();
-                                break;
-                            }
-                            case 16:
-                            {
-                                Timestamp = input.ReadInt64();
-                                break;
-                            }
-                            case 26:
-                            {
-                                Unknown73 = input.ReadBytes();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as UnknownAuth);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
-                    if (Timestamp != 0L) hash ^= Timestamp.GetHashCode();
-                    if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class Requests : pb::IMessage<Requests>
-            {
-                /// <summary>Field number for the "type" field.</summary>
-                public const int TypeFieldNumber = 1;
-
-                /// <summary>Field number for the "message" field.</summary>
-                public const int MessageFieldNumber = 2;
-
-                private static readonly pb::MessageParser<Requests> _parser =
-                    new pb::MessageParser<Requests>(() => new Requests());
-
-                private pb::ByteString message_ = pb::ByteString.Empty;
-                private int type_;
-
-                public Requests()
-                {
-                    OnConstruction();
-                }
-
-                public Requests(Requests other) : this()
-                {
-                    type_ = other.type_;
-                    message_ = other.message_;
-                }
-
-                public static pb::MessageParser<Requests> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[1]; }
-                }
-
-                public int Type
-                {
-                    get { return type_; }
-                    set { type_ = value; }
-                }
-
-                public pb::ByteString Message
-                {
-                    get { return message_; }
-                    set { message_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public Requests Clone()
-                {
-                    return new Requests(this);
-                }
-
-                public bool Equals(Requests other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Type != other.Type) return false;
-                    if (Message != other.Message) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Type != 0)
-                    {
-                        output.WriteRawTag(8);
-                        output.WriteInt32(Type);
-                    }
-                    if (Message.Length != 0)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteBytes(Message);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Type != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Type);
-                    }
-                    if (Message.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Message);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(Requests other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Type != 0)
-                    {
-                        Type = other.Type;
-                    }
-                    if (other.Message.Length != 0)
-                    {
-                        Message = other.Message;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 8:
-                            {
-                                Type = input.ReadInt32();
-                                break;
-                            }
-                            case 18:
-                            {
-                                Message = input.ReadBytes();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as Requests);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Type != 0) hash ^= Type.GetHashCode();
-                    if (Message.Length != 0) hash ^= Message.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class Unknown3 : pb::IMessage<Unknown3>
-            {
-                /// <summary>Field number for the "unknown4" field.</summary>
-                public const int Unknown4FieldNumber = 1;
-
-                private static readonly pb::MessageParser<Unknown3> _parser =
-                    new pb::MessageParser<Unknown3>(() => new Unknown3());
-
-                private string unknown4_ = "";
-
-                public Unknown3()
-                {
-                    OnConstruction();
-                }
-
-                public Unknown3(Unknown3 other) : this()
-                {
-                    unknown4_ = other.unknown4_;
-                }
-
-                public static pb::MessageParser<Unknown3> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[2]; }
-                }
-
-                public string Unknown4
-                {
-                    get { return unknown4_; }
-                    set { unknown4_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public Unknown3 Clone()
-                {
-                    return new Unknown3(this);
-                }
-
-                public bool Equals(Unknown3 other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Unknown4 != other.Unknown4) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Unknown4.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteString(Unknown4);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Unknown4.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeStringSize(Unknown4);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(Unknown3 other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Unknown4.Length != 0)
-                    {
-                        Unknown4 = other.Unknown4;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Unknown4 = input.ReadString();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as Unknown3);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Unknown4.Length != 0) hash ^= Unknown4.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class Unknown6 : pb::IMessage<Unknown6>
-            {
-                /// <summary>Field number for the "unknown1" field.</summary>
-                public const int Unknown1FieldNumber = 1;
-
-                /// <summary>Field number for the "unknown2" field.</summary>
-                public const int Unknown2FieldNumber = 2;
-
-                private static readonly pb::MessageParser<Unknown6> _parser =
-                    new pb::MessageParser<Unknown6>(() => new Unknown6());
-
-                private int unknown1_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Types.Unknown2 unknown2_;
-
-                public Unknown6()
-                {
-                    OnConstruction();
-                }
-
-                public Unknown6(Unknown6 other) : this()
-                {
-                    unknown1_ = other.unknown1_;
-                    Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
-                }
-
-                public static pb::MessageParser<Unknown6> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[3]; }
-                }
-
-                public int Unknown1
-                {
-                    get { return unknown1_; }
-                    set { unknown1_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Types.Unknown2 Unknown2
-                {
-                    get { return unknown2_; }
-                    set { unknown2_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public Unknown6 Clone()
-                {
-                    return new Unknown6(this);
-                }
-
-                public bool Equals(Unknown6 other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Unknown1 != other.Unknown1) return false;
-                    if (!Equals(Unknown2, other.Unknown2)) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Unknown1 != 0)
-                    {
-                        output.WriteRawTag(8);
-                        output.WriteInt32(Unknown1);
-                    }
-                    if (unknown2_ != null)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteMessage(Unknown2);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Unknown1 != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
-                    }
-                    if (unknown2_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(Unknown6 other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Unknown1 != 0)
-                    {
-                        Unknown1 = other.Unknown1;
-                    }
-                    if (other.unknown2_ != null)
-                    {
-                        if (unknown2_ == null)
-                        {
-                            unknown2_ =
-                                new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Types.Unknown2();
-                        }
-                        Unknown2.MergeFrom(other.Unknown2);
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 8:
-                            {
-                                Unknown1 = input.ReadInt32();
-                                break;
-                            }
-                            case 18:
-                            {
-                                if (unknown2_ == null)
-                                {
-                                    unknown2_ =
-                                        new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Types.
-                                            Unknown2();
-                                }
-                                input.ReadMessage(unknown2_);
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as Unknown6);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
-                    if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-
-                #region Nested types
-
-                /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
-                [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-                public static partial class Types
-                {
-                    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-                    public sealed partial class Unknown2 : pb::IMessage<Unknown2>
-                    {
-                        /// <summary>Field number for the "unknown1" field.</summary>
-                        public const int Unknown1FieldNumber = 1;
-
-                        private static readonly pb::MessageParser<Unknown2> _parser =
-                            new pb::MessageParser<Unknown2>(() => new Unknown2());
-
-                        private pb::ByteString unknown1_ = pb::ByteString.Empty;
-
-                        public Unknown2()
-                        {
-                            OnConstruction();
-                        }
-
-                        public Unknown2(Unknown2 other) : this()
-                        {
-                            unknown1_ = other.unknown1_;
-                        }
-
-                        public static pb::MessageParser<Unknown2> Parser
-                        {
-                            get { return _parser; }
-                        }
-
-                        public static pbr::MessageDescriptor Descriptor
-                        {
-                            get
-                            {
-                                return
-                                    global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Unknown6.Descriptor
-                                        .NestedTypes[0];
-                            }
-                        }
-
-                        public pb::ByteString Unknown1
-                        {
-                            get { return unknown1_; }
-                            set { unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                        }
-
-                        pbr::MessageDescriptor pb::IMessage.Descriptor
-                        {
-                            get { return Descriptor; }
-                        }
-
-                        public Unknown2 Clone()
-                        {
-                            return new Unknown2(this);
-                        }
-
-                        public bool Equals(Unknown2 other)
-                        {
-                            if (ReferenceEquals(other, null))
-                            {
-                                return false;
-                            }
-                            if (ReferenceEquals(other, this))
-                            {
-                                return true;
-                            }
-                            if (Unknown1 != other.Unknown1) return false;
-                            return true;
-                        }
-
-                        public void WriteTo(pb::CodedOutputStream output)
-                        {
-                            if (Unknown1.Length != 0)
-                            {
-                                output.WriteRawTag(10);
-                                output.WriteBytes(Unknown1);
-                            }
-                        }
-
-                        public int CalculateSize()
-                        {
-                            var size = 0;
-                            if (Unknown1.Length != 0)
-                            {
-                                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
-                            }
-                            return size;
-                        }
-
-                        public void MergeFrom(Unknown2 other)
-                        {
-                            if (other == null)
-                            {
-                                return;
-                            }
-                            if (other.Unknown1.Length != 0)
-                            {
-                                Unknown1 = other.Unknown1;
-                            }
-                        }
-
-                        public void MergeFrom(pb::CodedInputStream input)
-                        {
-                            uint tag;
-                            while ((tag = input.ReadTag()) != 0)
-                            {
-                                switch (tag)
-                                {
-                                    default:
-                                        input.SkipLastField();
-                                        break;
-                                    case 10:
-                                    {
-                                        Unknown1 = input.ReadBytes();
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-
-                        public override bool Equals(object other)
-                        {
-                            return Equals(other as Unknown2);
-                        }
-
-                        public override int GetHashCode()
-                        {
-                            var hash = 1;
-                            if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
-                            return hash;
-                        }
-
-                        partial void OnConstruction();
-
-                        public override string ToString()
-                        {
-                            return pb::JsonFormatter.ToDiagnosticString(this);
-                        }
-                    }
-                }
-
-                #endregion
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class AuthInfo : pb::IMessage<AuthInfo>
-            {
-                /// <summary>Field number for the "provider" field.</summary>
-                public const int ProviderFieldNumber = 1;
-
-                /// <summary>Field number for the "token" field.</summary>
-                public const int TokenFieldNumber = 2;
-
-                private static readonly pb::MessageParser<AuthInfo> _parser =
-                    new pb::MessageParser<AuthInfo>(() => new AuthInfo());
-
-                private string provider_ = "";
-                private global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Types.JWT token_;
-
-                public AuthInfo()
-                {
-                    OnConstruction();
-                }
-
-                public AuthInfo(AuthInfo other) : this()
-                {
-                    provider_ = other.provider_;
-                    Token = other.token_ != null ? other.Token.Clone() : null;
-                }
-
-                public static pb::MessageParser<AuthInfo> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[4]; }
-                }
-
-                public string Provider
-                {
-                    get { return provider_; }
-                    set { provider_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Types.JWT Token
-                {
-                    get { return token_; }
-                    set { token_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public AuthInfo Clone()
-                {
-                    return new AuthInfo(this);
-                }
-
-                public bool Equals(AuthInfo other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Provider != other.Provider) return false;
-                    if (!Equals(Token, other.Token)) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Provider.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteString(Provider);
-                    }
-                    if (token_ != null)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteMessage(Token);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Provider.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeStringSize(Provider);
-                    }
-                    if (token_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Token);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(AuthInfo other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Provider.Length != 0)
-                    {
-                        Provider = other.Provider;
-                    }
-                    if (other.token_ != null)
-                    {
-                        if (token_ == null)
-                        {
-                            token_ = new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Types.JWT();
-                        }
-                        Token.MergeFrom(other.Token);
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Provider = input.ReadString();
-                                break;
-                            }
-                            case 18:
-                            {
-                                if (token_ == null)
-                                {
-                                    token_ =
-                                        new global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Types.JWT();
-                                }
-                                input.ReadMessage(token_);
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as AuthInfo);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Provider.Length != 0) hash ^= Provider.GetHashCode();
-                    if (token_ != null) hash ^= Token.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-
-                #region Nested types
-
-                /// <summary>Container for nested types declared in the AuthInfo message type.</summary>
-                [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-                public static partial class Types
-                {
-                    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-                    public sealed partial class JWT : pb::IMessage<JWT>
-                    {
-                        /// <summary>Field number for the "contents" field.</summary>
-                        public const int ContentsFieldNumber = 1;
-
-                        /// <summary>Field number for the "unknown13" field.</summary>
-                        public const int Unknown13FieldNumber = 2;
-
-                        private static readonly pb::MessageParser<JWT> _parser =
-                            new pb::MessageParser<JWT>(() => new JWT());
-
-                        private string contents_ = "";
-                        private int unknown13_;
-
-                        public JWT()
-                        {
-                            OnConstruction();
-                        }
-
-                        public JWT(JWT other) : this()
-                        {
-                            contents_ = other.contents_;
-                            unknown13_ = other.unknown13_;
-                        }
-
-                        public static pb::MessageParser<JWT> Parser
-                        {
-                            get { return _parser; }
-                        }
-
-                        public static pbr::MessageDescriptor Descriptor
-                        {
-                            get
-                            {
-                                return
-                                    global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.AuthInfo.Descriptor
-                                        .NestedTypes[0];
-                            }
-                        }
-
-                        public string Contents
-                        {
-                            get { return contents_; }
-                            set { contents_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                        }
-
-                        public int Unknown13
-                        {
-                            get { return unknown13_; }
-                            set { unknown13_ = value; }
-                        }
-
-                        pbr::MessageDescriptor pb::IMessage.Descriptor
-                        {
-                            get { return Descriptor; }
-                        }
-
-                        public JWT Clone()
-                        {
-                            return new JWT(this);
-                        }
-
-                        public bool Equals(JWT other)
-                        {
-                            if (ReferenceEquals(other, null))
-                            {
-                                return false;
-                            }
-                            if (ReferenceEquals(other, this))
-                            {
-                                return true;
-                            }
-                            if (Contents != other.Contents) return false;
-                            if (Unknown13 != other.Unknown13) return false;
-                            return true;
-                        }
-
-                        public void WriteTo(pb::CodedOutputStream output)
-                        {
-                            if (Contents.Length != 0)
-                            {
-                                output.WriteRawTag(10);
-                                output.WriteString(Contents);
-                            }
-                            if (Unknown13 != 0)
-                            {
-                                output.WriteRawTag(16);
-                                output.WriteInt32(Unknown13);
-                            }
-                        }
-
-                        public int CalculateSize()
-                        {
-                            var size = 0;
-                            if (Contents.Length != 0)
-                            {
-                                size += 1 + pb::CodedOutputStream.ComputeStringSize(Contents);
-                            }
-                            if (Unknown13 != 0)
-                            {
-                                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown13);
-                            }
-                            return size;
-                        }
-
-                        public void MergeFrom(JWT other)
-                        {
-                            if (other == null)
-                            {
-                                return;
-                            }
-                            if (other.Contents.Length != 0)
-                            {
-                                Contents = other.Contents;
-                            }
-                            if (other.Unknown13 != 0)
-                            {
-                                Unknown13 = other.Unknown13;
-                            }
-                        }
-
-                        public void MergeFrom(pb::CodedInputStream input)
-                        {
-                            uint tag;
-                            while ((tag = input.ReadTag()) != 0)
-                            {
-                                switch (tag)
-                                {
-                                    default:
-                                        input.SkipLastField();
-                                        break;
-                                    case 10:
-                                    {
-                                        Contents = input.ReadString();
-                                        break;
-                                    }
-                                    case 16:
-                                    {
-                                        Unknown13 = input.ReadInt32();
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-
-                        public override bool Equals(object other)
-                        {
-                            return Equals(other as JWT);
-                        }
-
-                        public override int GetHashCode()
-                        {
-                            var hash = 1;
-                            if (Contents.Length != 0) hash ^= Contents.GetHashCode();
-                            if (Unknown13 != 0) hash ^= Unknown13.GetHashCode();
-                            return hash;
-                        }
-
-                        partial void OnConstruction();
-
-                        public override string ToString()
-                        {
-                            return pb::JsonFormatter.ToDiagnosticString(this);
-                        }
-                    }
-                }
-
-                #endregion
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class PlayerUpdateProto : pb::IMessage<PlayerUpdateProto>
-            {
-                /// <summary>Field number for the "Lat" field.</summary>
-                public const int LatFieldNumber = 1;
-
-                /// <summary>Field number for the "Lng" field.</summary>
-                public const int LngFieldNumber = 2;
-
-                private static readonly pb::MessageParser<PlayerUpdateProto> _parser =
-                    new pb::MessageParser<PlayerUpdateProto>(() => new PlayerUpdateProto());
-
-                private ulong lat_;
-                private ulong lng_;
-
-                public PlayerUpdateProto()
-                {
-                    OnConstruction();
-                }
-
-                public PlayerUpdateProto(PlayerUpdateProto other) : this()
-                {
-                    lat_ = other.lat_;
-                    lng_ = other.lng_;
-                }
-
-                public static pb::MessageParser<PlayerUpdateProto> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[5]; }
-                }
-
-                public ulong Lat
-                {
-                    get { return lat_; }
-                    set { lat_ = value; }
-                }
-
-                public ulong Lng
-                {
-                    get { return lng_; }
-                    set { lng_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public PlayerUpdateProto Clone()
-                {
-                    return new PlayerUpdateProto(this);
-                }
-
-                public bool Equals(PlayerUpdateProto other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Lat != other.Lat) return false;
-                    if (Lng != other.Lng) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Lat != 0UL)
-                    {
-                        output.WriteRawTag(9);
-                        output.WriteFixed64(Lat);
-                    }
-                    if (Lng != 0UL)
-                    {
-                        output.WriteRawTag(17);
-                        output.WriteFixed64(Lng);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Lat != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (Lng != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(PlayerUpdateProto other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Lat != 0UL)
-                    {
-                        Lat = other.Lat;
-                    }
-                    if (other.Lng != 0UL)
-                    {
-                        Lng = other.Lng;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 9:
-                            {
-                                Lat = input.ReadFixed64();
-                                break;
-                            }
-                            case 17:
-                            {
-                                Lng = input.ReadFixed64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as PlayerUpdateProto);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Lat != 0UL) hash ^= Lat.GetHashCode();
-                    if (Lng != 0UL) hash ^= Lng.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class MapObjectsRequest : pb::IMessage<MapObjectsRequest>
-            {
-                /// <summary>Field number for the "cellIds" field.</summary>
-                public const int CellIdsFieldNumber = 1;
-
-                /// <summary>Field number for the "unknown14" field.</summary>
-                public const int Unknown14FieldNumber = 2;
-
-                /// <summary>Field number for the "latitude" field.</summary>
-                public const int LatitudeFieldNumber = 3;
-
-                /// <summary>Field number for the "longitude" field.</summary>
-                public const int LongitudeFieldNumber = 4;
-
-                private static readonly pb::MessageParser<MapObjectsRequest> _parser =
-                    new pb::MessageParser<MapObjectsRequest>(() => new MapObjectsRequest());
-
-                private pb::ByteString cellIds_ = pb::ByteString.Empty;
-                private ulong latitude_;
-                private ulong longitude_;
-                private pb::ByteString unknown14_ = pb::ByteString.Empty;
-
-                public MapObjectsRequest()
-                {
-                    OnConstruction();
-                }
-
-                public MapObjectsRequest(MapObjectsRequest other) : this()
-                {
-                    cellIds_ = other.cellIds_;
-                    unknown14_ = other.unknown14_;
-                    latitude_ = other.latitude_;
-                    longitude_ = other.longitude_;
-                }
-
-                public static pb::MessageParser<MapObjectsRequest> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[6]; }
-                }
-
-                public pb::ByteString CellIds
-                {
-                    get { return cellIds_; }
-                    set { cellIds_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public pb::ByteString Unknown14
-                {
-                    get { return unknown14_; }
-                    set { unknown14_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public ulong Latitude
-                {
-                    get { return latitude_; }
-                    set { latitude_ = value; }
-                }
-
-                public ulong Longitude
-                {
-                    get { return longitude_; }
-                    set { longitude_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public MapObjectsRequest Clone()
-                {
-                    return new MapObjectsRequest(this);
-                }
-
-                public bool Equals(MapObjectsRequest other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (CellIds != other.CellIds) return false;
-                    if (Unknown14 != other.Unknown14) return false;
-                    if (Latitude != other.Latitude) return false;
-                    if (Longitude != other.Longitude) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (CellIds.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteBytes(CellIds);
-                    }
-                    if (Unknown14.Length != 0)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteBytes(Unknown14);
-                    }
-                    if (Latitude != 0UL)
-                    {
-                        output.WriteRawTag(25);
-                        output.WriteFixed64(Latitude);
-                    }
-                    if (Longitude != 0UL)
-                    {
-                        output.WriteRawTag(33);
-                        output.WriteFixed64(Longitude);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (CellIds.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(CellIds);
-                    }
-                    if (Unknown14.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown14);
-                    }
-                    if (Latitude != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (Longitude != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(MapObjectsRequest other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.CellIds.Length != 0)
-                    {
-                        CellIds = other.CellIds;
-                    }
-                    if (other.Unknown14.Length != 0)
-                    {
-                        Unknown14 = other.Unknown14;
-                    }
-                    if (other.Latitude != 0UL)
-                    {
-                        Latitude = other.Latitude;
-                    }
-                    if (other.Longitude != 0UL)
-                    {
-                        Longitude = other.Longitude;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                CellIds = input.ReadBytes();
-                                break;
-                            }
-                            case 18:
-                            {
-                                Unknown14 = input.ReadBytes();
-                                break;
-                            }
-                            case 25:
-                            {
-                                Latitude = input.ReadFixed64();
-                                break;
-                            }
-                            case 33:
-                            {
-                                Longitude = input.ReadFixed64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as MapObjectsRequest);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (CellIds.Length != 0) hash ^= CellIds.GetHashCode();
-                    if (Unknown14.Length != 0) hash ^= Unknown14.GetHashCode();
-                    if (Latitude != 0UL) hash ^= Latitude.GetHashCode();
-                    if (Longitude != 0UL) hash ^= Longitude.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class FortSearchRequest : pb::IMessage<FortSearchRequest>
-            {
-                /// <summary>Field number for the "Id" field.</summary>
-                public const int IdFieldNumber = 1;
-
-                /// <summary>Field number for the "PlayerLatDegrees" field.</summary>
-                public const int PlayerLatDegreesFieldNumber = 2;
-
-                /// <summary>Field number for the "PlayerLngDegrees" field.</summary>
-                public const int PlayerLngDegreesFieldNumber = 3;
-
-                /// <summary>Field number for the "FortLatDegrees" field.</summary>
-                public const int FortLatDegreesFieldNumber = 4;
-
-                /// <summary>Field number for the "FortLngDegrees" field.</summary>
-                public const int FortLngDegreesFieldNumber = 5;
-
-                private static readonly pb::MessageParser<FortSearchRequest> _parser =
-                    new pb::MessageParser<FortSearchRequest>(() => new FortSearchRequest());
-
-                private ulong fortLatDegrees_;
-                private ulong fortLngDegrees_;
-                private pb::ByteString id_ = pb::ByteString.Empty;
-                private ulong playerLatDegrees_;
-                private ulong playerLngDegrees_;
-
-                public FortSearchRequest()
-                {
-                    OnConstruction();
-                }
-
-                public FortSearchRequest(FortSearchRequest other) : this()
-                {
-                    id_ = other.id_;
-                    playerLatDegrees_ = other.playerLatDegrees_;
-                    playerLngDegrees_ = other.playerLngDegrees_;
-                    fortLatDegrees_ = other.fortLatDegrees_;
-                    fortLngDegrees_ = other.fortLngDegrees_;
-                }
-
-                public static pb::MessageParser<FortSearchRequest> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[7]; }
-                }
-
-                public pb::ByteString Id
-                {
-                    get { return id_; }
-                    set { id_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public ulong PlayerLatDegrees
-                {
-                    get { return playerLatDegrees_; }
-                    set { playerLatDegrees_ = value; }
-                }
-
-                public ulong PlayerLngDegrees
-                {
-                    get { return playerLngDegrees_; }
-                    set { playerLngDegrees_ = value; }
-                }
-
-                public ulong FortLatDegrees
-                {
-                    get { return fortLatDegrees_; }
-                    set { fortLatDegrees_ = value; }
-                }
-
-                public ulong FortLngDegrees
-                {
-                    get { return fortLngDegrees_; }
-                    set { fortLngDegrees_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public FortSearchRequest Clone()
-                {
-                    return new FortSearchRequest(this);
-                }
-
-                public bool Equals(FortSearchRequest other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Id != other.Id) return false;
-                    if (PlayerLatDegrees != other.PlayerLatDegrees) return false;
-                    if (PlayerLngDegrees != other.PlayerLngDegrees) return false;
-                    if (FortLatDegrees != other.FortLatDegrees) return false;
-                    if (FortLngDegrees != other.FortLngDegrees) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Id.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteBytes(Id);
-                    }
-                    if (PlayerLatDegrees != 0UL)
-                    {
-                        output.WriteRawTag(17);
-                        output.WriteFixed64(PlayerLatDegrees);
-                    }
-                    if (PlayerLngDegrees != 0UL)
-                    {
-                        output.WriteRawTag(25);
-                        output.WriteFixed64(PlayerLngDegrees);
-                    }
-                    if (FortLatDegrees != 0UL)
-                    {
-                        output.WriteRawTag(33);
-                        output.WriteFixed64(FortLatDegrees);
-                    }
-                    if (FortLngDegrees != 0UL)
-                    {
-                        output.WriteRawTag(41);
-                        output.WriteFixed64(FortLngDegrees);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Id.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Id);
-                    }
-                    if (PlayerLatDegrees != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (PlayerLngDegrees != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (FortLatDegrees != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (FortLngDegrees != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(FortSearchRequest other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Id.Length != 0)
-                    {
-                        Id = other.Id;
-                    }
-                    if (other.PlayerLatDegrees != 0UL)
-                    {
-                        PlayerLatDegrees = other.PlayerLatDegrees;
-                    }
-                    if (other.PlayerLngDegrees != 0UL)
-                    {
-                        PlayerLngDegrees = other.PlayerLngDegrees;
-                    }
-                    if (other.FortLatDegrees != 0UL)
-                    {
-                        FortLatDegrees = other.FortLatDegrees;
-                    }
-                    if (other.FortLngDegrees != 0UL)
-                    {
-                        FortLngDegrees = other.FortLngDegrees;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Id = input.ReadBytes();
-                                break;
-                            }
-                            case 17:
-                            {
-                                PlayerLatDegrees = input.ReadFixed64();
-                                break;
-                            }
-                            case 25:
-                            {
-                                PlayerLngDegrees = input.ReadFixed64();
-                                break;
-                            }
-                            case 33:
-                            {
-                                FortLatDegrees = input.ReadFixed64();
-                                break;
-                            }
-                            case 41:
-                            {
-                                FortLngDegrees = input.ReadFixed64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as FortSearchRequest);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Id.Length != 0) hash ^= Id.GetHashCode();
-                    if (PlayerLatDegrees != 0UL) hash ^= PlayerLatDegrees.GetHashCode();
-                    if (PlayerLngDegrees != 0UL) hash ^= PlayerLngDegrees.GetHashCode();
-                    if (FortLatDegrees != 0UL) hash ^= FortLatDegrees.GetHashCode();
-                    if (FortLngDegrees != 0UL) hash ^= FortLngDegrees.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class FortDetailsRequest : pb::IMessage<FortDetailsRequest>
-            {
-                /// <summary>Field number for the "Id" field.</summary>
-                public const int IdFieldNumber = 1;
-
-                /// <summary>Field number for the "Latitude" field.</summary>
-                public const int LatitudeFieldNumber = 2;
-
-                /// <summary>Field number for the "Longitude" field.</summary>
-                public const int LongitudeFieldNumber = 3;
-
-                private static readonly pb::MessageParser<FortDetailsRequest> _parser =
-                    new pb::MessageParser<FortDetailsRequest>(() => new FortDetailsRequest());
-
-                private pb::ByteString id_ = pb::ByteString.Empty;
-                private ulong latitude_;
-                private ulong longitude_;
-
-                public FortDetailsRequest()
-                {
-                    OnConstruction();
-                }
-
-                public FortDetailsRequest(FortDetailsRequest other) : this()
-                {
-                    id_ = other.id_;
-                    latitude_ = other.latitude_;
-                    longitude_ = other.longitude_;
-                }
-
-                public static pb::MessageParser<FortDetailsRequest> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[8]; }
-                }
-
-                public pb::ByteString Id
-                {
-                    get { return id_; }
-                    set { id_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public ulong Latitude
-                {
-                    get { return latitude_; }
-                    set { latitude_ = value; }
-                }
-
-                public ulong Longitude
-                {
-                    get { return longitude_; }
-                    set { longitude_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public FortDetailsRequest Clone()
-                {
-                    return new FortDetailsRequest(this);
-                }
-
-                public bool Equals(FortDetailsRequest other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Id != other.Id) return false;
-                    if (Latitude != other.Latitude) return false;
-                    if (Longitude != other.Longitude) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Id.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteBytes(Id);
-                    }
-                    if (Latitude != 0UL)
-                    {
-                        output.WriteRawTag(17);
-                        output.WriteFixed64(Latitude);
-                    }
-                    if (Longitude != 0UL)
-                    {
-                        output.WriteRawTag(25);
-                        output.WriteFixed64(Longitude);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Id.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Id);
-                    }
-                    if (Latitude != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (Longitude != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(FortDetailsRequest other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Id.Length != 0)
-                    {
-                        Id = other.Id;
-                    }
-                    if (other.Latitude != 0UL)
-                    {
-                        Latitude = other.Latitude;
-                    }
-                    if (other.Longitude != 0UL)
-                    {
-                        Longitude = other.Longitude;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Id = input.ReadBytes();
-                                break;
-                            }
-                            case 17:
-                            {
-                                Latitude = input.ReadFixed64();
-                                break;
-                            }
-                            case 25:
-                            {
-                                Longitude = input.ReadFixed64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as FortDetailsRequest);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Id.Length != 0) hash ^= Id.GetHashCode();
-                    if (Latitude != 0UL) hash ^= Latitude.GetHashCode();
-                    if (Longitude != 0UL) hash ^= Longitude.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class EncounterRequest : pb::IMessage<EncounterRequest>
-            {
-                /// <summary>Field number for the "EncounterId" field.</summary>
-                public const int EncounterIdFieldNumber = 1;
-
-                /// <summary>Field number for the "SpawnpointId" field.</summary>
-                public const int SpawnpointIdFieldNumber = 2;
-
-                /// <summary>Field number for the "PlayerLatDegrees" field.</summary>
-                public const int PlayerLatDegreesFieldNumber = 3;
-
-                /// <summary>Field number for the "PlayerLngDegrees" field.</summary>
-                public const int PlayerLngDegreesFieldNumber = 4;
-
-                private static readonly pb::MessageParser<EncounterRequest> _parser =
-                    new pb::MessageParser<EncounterRequest>(() => new EncounterRequest());
-
-                private ulong encounterId_;
-                private ulong playerLatDegrees_;
-                private ulong playerLngDegrees_;
-                private string spawnpointId_ = "";
-
-                public EncounterRequest()
-                {
-                    OnConstruction();
-                }
-
-                public EncounterRequest(EncounterRequest other) : this()
-                {
-                    encounterId_ = other.encounterId_;
-                    spawnpointId_ = other.spawnpointId_;
-                    playerLatDegrees_ = other.playerLatDegrees_;
-                    playerLngDegrees_ = other.playerLngDegrees_;
-                }
-
-                public static pb::MessageParser<EncounterRequest> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[9]; }
-                }
-
-                public ulong EncounterId
-                {
-                    get { return encounterId_; }
-                    set { encounterId_ = value; }
-                }
-
-                public string SpawnpointId
-                {
-                    get { return spawnpointId_; }
-                    set { spawnpointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public ulong PlayerLatDegrees
-                {
-                    get { return playerLatDegrees_; }
-                    set { playerLatDegrees_ = value; }
-                }
-
-                public ulong PlayerLngDegrees
-                {
-                    get { return playerLngDegrees_; }
-                    set { playerLngDegrees_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public EncounterRequest Clone()
-                {
-                    return new EncounterRequest(this);
-                }
-
-                public bool Equals(EncounterRequest other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (EncounterId != other.EncounterId) return false;
-                    if (SpawnpointId != other.SpawnpointId) return false;
-                    if (PlayerLatDegrees != other.PlayerLatDegrees) return false;
-                    if (PlayerLngDegrees != other.PlayerLngDegrees) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (EncounterId != 0UL)
-                    {
-                        output.WriteRawTag(9);
-                        output.WriteFixed64(EncounterId);
-                    }
-                    if (SpawnpointId.Length != 0)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteString(SpawnpointId);
-                    }
-                    if (PlayerLatDegrees != 0UL)
-                    {
-                        output.WriteRawTag(25);
-                        output.WriteFixed64(PlayerLatDegrees);
-                    }
-                    if (PlayerLngDegrees != 0UL)
-                    {
-                        output.WriteRawTag(33);
-                        output.WriteFixed64(PlayerLngDegrees);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (EncounterId != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (SpawnpointId.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnpointId);
-                    }
-                    if (PlayerLatDegrees != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (PlayerLngDegrees != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(EncounterRequest other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.EncounterId != 0UL)
-                    {
-                        EncounterId = other.EncounterId;
-                    }
-                    if (other.SpawnpointId.Length != 0)
-                    {
-                        SpawnpointId = other.SpawnpointId;
-                    }
-                    if (other.PlayerLatDegrees != 0UL)
-                    {
-                        PlayerLatDegrees = other.PlayerLatDegrees;
-                    }
-                    if (other.PlayerLngDegrees != 0UL)
-                    {
-                        PlayerLngDegrees = other.PlayerLngDegrees;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 9:
-                            {
-                                EncounterId = input.ReadFixed64();
-                                break;
-                            }
-                            case 18:
-                            {
-                                SpawnpointId = input.ReadString();
-                                break;
-                            }
-                            case 25:
-                            {
-                                PlayerLatDegrees = input.ReadFixed64();
-                                break;
-                            }
-                            case 33:
-                            {
-                                PlayerLngDegrees = input.ReadFixed64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as EncounterRequest);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-                    if (SpawnpointId.Length != 0) hash ^= SpawnpointId.GetHashCode();
-                    if (PlayerLatDegrees != 0UL) hash ^= PlayerLatDegrees.GetHashCode();
-                    if (PlayerLngDegrees != 0UL) hash ^= PlayerLngDegrees.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class CatchPokemonRequest : pb::IMessage<CatchPokemonRequest>
-            {
-                /// <summary>Field number for the "EncounterId" field.</summary>
-                public const int EncounterIdFieldNumber = 1;
-
-                /// <summary>Field number for the "Pokeball" field.</summary>
-                public const int PokeballFieldNumber = 2;
-
-                /// <summary>Field number for the "NormalizedReticleSize" field.</summary>
-                public const int NormalizedReticleSizeFieldNumber = 3;
-
-                /// <summary>Field number for the "SpawnPointGuid" field.</summary>
-                public const int SpawnPointGuidFieldNumber = 4;
-
-                /// <summary>Field number for the "HitPokemon" field.</summary>
-                public const int HitPokemonFieldNumber = 5;
-
-                /// <summary>Field number for the "SpinModifier" field.</summary>
-                public const int SpinModifierFieldNumber = 6;
-
-                /// <summary>Field number for the "NormalizedHitPosition" field.</summary>
-                public const int NormalizedHitPositionFieldNumber = 7;
-
-                private static readonly pb::MessageParser<CatchPokemonRequest> _parser =
-                    new pb::MessageParser<CatchPokemonRequest>(() => new CatchPokemonRequest());
-
-                private ulong encounterId_;
-                private int hitPokemon_;
-                private ulong normalizedHitPosition_;
-                private ulong normalizedReticleSize_;
-                private int pokeball_;
-                private string spawnPointGuid_ = "";
-                private ulong spinModifier_;
-
-                public CatchPokemonRequest()
-                {
-                    OnConstruction();
-                }
-
-                public CatchPokemonRequest(CatchPokemonRequest other) : this()
-                {
-                    encounterId_ = other.encounterId_;
-                    pokeball_ = other.pokeball_;
-                    normalizedReticleSize_ = other.normalizedReticleSize_;
-                    spawnPointGuid_ = other.spawnPointGuid_;
-                    hitPokemon_ = other.hitPokemon_;
-                    spinModifier_ = other.spinModifier_;
-                    normalizedHitPosition_ = other.normalizedHitPosition_;
-                }
-
-                public static pb::MessageParser<CatchPokemonRequest> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[10]; }
-                }
-
-                public ulong EncounterId
-                {
-                    get { return encounterId_; }
-                    set { encounterId_ = value; }
-                }
-
-                public int Pokeball
-                {
-                    get { return pokeball_; }
-                    set { pokeball_ = value; }
-                }
-
-                public ulong NormalizedReticleSize
-                {
-                    get { return normalizedReticleSize_; }
-                    set { normalizedReticleSize_ = value; }
-                }
-
-                public string SpawnPointGuid
-                {
-                    get { return spawnPointGuid_; }
-                    set { spawnPointGuid_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public int HitPokemon
-                {
-                    get { return hitPokemon_; }
-                    set { hitPokemon_ = value; }
-                }
-
-                public ulong SpinModifier
-                {
-                    get { return spinModifier_; }
-                    set { spinModifier_ = value; }
-                }
-
-                public ulong NormalizedHitPosition
-                {
-                    get { return normalizedHitPosition_; }
-                    set { normalizedHitPosition_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public CatchPokemonRequest Clone()
-                {
-                    return new CatchPokemonRequest(this);
-                }
-
-                public bool Equals(CatchPokemonRequest other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (EncounterId != other.EncounterId) return false;
-                    if (Pokeball != other.Pokeball) return false;
-                    if (NormalizedReticleSize != other.NormalizedReticleSize) return false;
-                    if (SpawnPointGuid != other.SpawnPointGuid) return false;
-                    if (HitPokemon != other.HitPokemon) return false;
-                    if (SpinModifier != other.SpinModifier) return false;
-                    if (NormalizedHitPosition != other.NormalizedHitPosition) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (EncounterId != 0UL)
-                    {
-                        output.WriteRawTag(9);
-                        output.WriteFixed64(EncounterId);
-                    }
-                    if (Pokeball != 0)
-                    {
-                        output.WriteRawTag(16);
-                        output.WriteInt32(Pokeball);
-                    }
-                    if (NormalizedReticleSize != 0UL)
-                    {
-                        output.WriteRawTag(25);
-                        output.WriteFixed64(NormalizedReticleSize);
-                    }
-                    if (SpawnPointGuid.Length != 0)
-                    {
-                        output.WriteRawTag(34);
-                        output.WriteString(SpawnPointGuid);
-                    }
-                    if (HitPokemon != 0)
-                    {
-                        output.WriteRawTag(40);
-                        output.WriteInt32(HitPokemon);
-                    }
-                    if (SpinModifier != 0UL)
-                    {
-                        output.WriteRawTag(49);
-                        output.WriteFixed64(SpinModifier);
-                    }
-                    if (NormalizedHitPosition != 0UL)
-                    {
-                        output.WriteRawTag(57);
-                        output.WriteFixed64(NormalizedHitPosition);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (EncounterId != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (Pokeball != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Pokeball);
-                    }
-                    if (NormalizedReticleSize != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (SpawnPointGuid.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointGuid);
-                    }
-                    if (HitPokemon != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt32Size(HitPokemon);
-                    }
-                    if (SpinModifier != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    if (NormalizedHitPosition != 0UL)
-                    {
-                        size += 1 + 8;
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(CatchPokemonRequest other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.EncounterId != 0UL)
-                    {
-                        EncounterId = other.EncounterId;
-                    }
-                    if (other.Pokeball != 0)
-                    {
-                        Pokeball = other.Pokeball;
-                    }
-                    if (other.NormalizedReticleSize != 0UL)
-                    {
-                        NormalizedReticleSize = other.NormalizedReticleSize;
-                    }
-                    if (other.SpawnPointGuid.Length != 0)
-                    {
-                        SpawnPointGuid = other.SpawnPointGuid;
-                    }
-                    if (other.HitPokemon != 0)
-                    {
-                        HitPokemon = other.HitPokemon;
-                    }
-                    if (other.SpinModifier != 0UL)
-                    {
-                        SpinModifier = other.SpinModifier;
-                    }
-                    if (other.NormalizedHitPosition != 0UL)
-                    {
-                        NormalizedHitPosition = other.NormalizedHitPosition;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 9:
-                            {
-                                EncounterId = input.ReadFixed64();
-                                break;
-                            }
-                            case 16:
-                            {
-                                Pokeball = input.ReadInt32();
-                                break;
-                            }
-                            case 25:
-                            {
-                                NormalizedReticleSize = input.ReadFixed64();
-                                break;
-                            }
-                            case 34:
-                            {
-                                SpawnPointGuid = input.ReadString();
-                                break;
-                            }
-                            case 40:
-                            {
-                                HitPokemon = input.ReadInt32();
-                                break;
-                            }
-                            case 49:
-                            {
-                                SpinModifier = input.ReadFixed64();
-                                break;
-                            }
-                            case 57:
-                            {
-                                NormalizedHitPosition = input.ReadFixed64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as CatchPokemonRequest);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
-                    if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
-                    if (NormalizedReticleSize != 0UL) hash ^= NormalizedReticleSize.GetHashCode();
-                    if (SpawnPointGuid.Length != 0) hash ^= SpawnPointGuid.GetHashCode();
-                    if (HitPokemon != 0) hash ^= HitPokemon.GetHashCode();
-                    if (SpinModifier != 0UL) hash ^= SpinModifier.GetHashCode();
-                    if (NormalizedHitPosition != 0UL) hash ^= NormalizedHitPosition.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class SettingsGuid : pb::IMessage<SettingsGuid>
-            {
-                /// <summary>Field number for the "guid" field.</summary>
-                public const int GuidFieldNumber = 1;
-
-                private static readonly pb::MessageParser<SettingsGuid> _parser =
-                    new pb::MessageParser<SettingsGuid>(() => new SettingsGuid());
-
-                private pb::ByteString guid_ = pb::ByteString.Empty;
-
-                public SettingsGuid()
-                {
-                    OnConstruction();
-                }
-
-                public SettingsGuid(SettingsGuid other) : this()
-                {
-                    guid_ = other.guid_;
-                }
-
-                public static pb::MessageParser<SettingsGuid> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[11]; }
-                }
-
-                public pb::ByteString Guid
-                {
-                    get { return guid_; }
-                    set { guid_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public SettingsGuid Clone()
-                {
-                    return new SettingsGuid(this);
-                }
-
-                public bool Equals(SettingsGuid other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Guid != other.Guid) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Guid.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteBytes(Guid);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Guid.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Guid);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(SettingsGuid other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Guid.Length != 0)
-                    {
-                        Guid = other.Guid;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Guid = input.ReadBytes();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as SettingsGuid);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Guid.Length != 0) hash ^= Guid.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class Time : pb::IMessage<Time>
-            {
-                /// <summary>Field number for the "time" field.</summary>
-                public const int Time_FieldNumber = 1;
-
-                private static readonly pb::MessageParser<Time> _parser = new pb::MessageParser<Time>(() => new Time());
-                private long time_;
-
-                public Time()
-                {
-                    OnConstruction();
-                }
-
-                public Time(Time other) : this()
-                {
-                    time_ = other.time_;
-                }
-
-                public static pb::MessageParser<Time> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[12]; }
-                }
-
-                public long Time_
-                {
-                    get { return time_; }
-                    set { time_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public Time Clone()
-                {
-                    return new Time(this);
-                }
-
-                public bool Equals(Time other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Time_ != other.Time_) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Time_ != 0L)
-                    {
-                        output.WriteRawTag(8);
-                        output.WriteInt64(Time_);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Time_ != 0L)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Time_);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(Time other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Time_ != 0L)
-                    {
-                        Time_ = other.Time_;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 8:
-                            {
-                                Time_ = input.ReadInt64();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as Time);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Time_ != 0L) hash ^= Time_.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-        }
-
-        #endregion
-    }
-
-    #endregion
-}
-
-#endregion Designer generated code
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/GeneratedCode/Response.cs b/PokemonGo/RocketAPI/GeneratedCode/Response.cs
deleted file mode 100644
index 6b06b68..0000000
--- a/PokemonGo/RocketAPI/GeneratedCode/Response.cs
+++ /dev/null
@@ -1,927 +0,0 @@
-#pragma warning disable 1591, 0612, 3021
-
-#region Designer generated code
-
-#region
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-
-#endregion
-
-namespace PokemonGo.RocketAPI.GeneratedCode
-{
-    /// <summary>Holder for reflection information generated from Response.proto</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public static partial class ResponseReflection
-    {
-        #region Descriptor
-
-        /// <summary>File descriptor for Response.proto</summary>
-        public static pbr::FileDescriptor Descriptor
-        {
-            get { return descriptor; }
-        }
-
-        private static pbr::FileDescriptor descriptor;
-
-        static ResponseReflection()
-        {
-            var descriptorData = global::System.Convert.FromBase64String(
-                string.Concat(
-                    "Cg5SZXNwb25zZS5wcm90bxIhUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0",
-                    "ZWRDb2RlIr0DCghSZXNwb25zZRIQCgh1bmtub3duMRgBIAEoBRIQCgh1bmtu",
-                    "b3duMhgCIAEoAxIPCgdhcGlfdXJsGAMgASgJEkYKCHVua25vd242GAYgASgL",
-                    "MjQuUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlJlc3BvbnNl",
-                    "LlVua25vd242Ej4KBGF1dGgYByABKAsyMC5Qb2tlbW9uR28uUm9ja2V0QVBJ",
-                    "LkdlbmVyYXRlZENvZGUuUmVzcG9uc2UuQXV0aBIPCgdwYXlsb2FkGGQgAygM",
-                    "EhQKDGVycm9yTWVzc2FnZRhlIAEoCRqLAQoIVW5rbm93bjYSEAoIdW5rbm93",
-                    "bjEYASABKAUSTwoIdW5rbm93bjIYAiABKAsyPS5Qb2tlbW9uR28uUm9ja2V0",
-                    "QVBJLkdlbmVyYXRlZENvZGUuUmVzcG9uc2UuVW5rbm93bjYuVW5rbm93bjIa",
-                    "HAoIVW5rbm93bjISEAoIdW5rbm93bjEYASABKAwaPwoEQXV0aBIRCgl1bmtu",
-                    "b3duNzEYASABKAwSEQoJdGltZXN0YW1wGAIgASgDEhEKCXVua25vd243MxgD",
-                    "IAEoDGIGcHJvdG8z"));
-            descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-                new pbr::FileDescriptor[] {},
-                new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[]
-                {
-                    new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Response),
-                        global::PokemonGo.RocketAPI.GeneratedCode.Response.Parser,
-                        new[] {"Unknown1", "Unknown2", "ApiUrl", "Unknown6", "Auth", "Payload", "ErrorMessage"}, null,
-                        null, new pbr::GeneratedClrTypeInfo[]
-                        {
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Parser,
-                                new[] {"Unknown1", "Unknown2"}, null, null,
-                                new pbr::GeneratedClrTypeInfo[]
-                                {
-                                    new pbr::GeneratedClrTypeInfo(
-                                        typeof(
-                                            global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Types.
-                                                Unknown2),
-                                        global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Types.Unknown2
-                                            .Parser, new[] {"Unknown1"}, null, null, null)
-                                }),
-                            new pbr::GeneratedClrTypeInfo(
-                                typeof(global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Auth),
-                                global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Auth.Parser,
-                                new[] {"Unknown71", "Timestamp", "Unknown73"}, null, null, null)
-                        })
-                }));
-        }
-
-        #endregion
-    }
-
-    #region Messages
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    public sealed partial class Response : pb::IMessage<Response>
-    {
-        /// <summary>Field number for the "unknown1" field.</summary>
-        public const int Unknown1FieldNumber = 1;
-
-        /// <summary>Field number for the "unknown2" field.</summary>
-        public const int Unknown2FieldNumber = 2;
-
-        /// <summary>Field number for the "api_url" field.</summary>
-        public const int ApiUrlFieldNumber = 3;
-
-        /// <summary>Field number for the "unknown6" field.</summary>
-        public const int Unknown6FieldNumber = 6;
-
-        /// <summary>Field number for the "auth" field.</summary>
-        public const int AuthFieldNumber = 7;
-
-        /// <summary>Field number for the "payload" field.</summary>
-        public const int PayloadFieldNumber = 100;
-
-        /// <summary>Field number for the "errorMessage" field.</summary>
-        public const int ErrorMessageFieldNumber = 101;
-
-        private static readonly pb::MessageParser<Response> _parser =
-            new pb::MessageParser<Response>(() => new Response());
-
-        private static readonly pb::FieldCodec<pb::ByteString> _repeated_payload_codec
-            = pb::FieldCodec.ForBytes(802);
-
-        private readonly pbc::RepeatedField<pb::ByteString> payload_ = new pbc::RepeatedField<pb::ByteString>();
-        private string apiUrl_ = "";
-        private global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Auth auth_;
-        private string errorMessage_ = "";
-        private int unknown1_;
-        private long unknown2_;
-        private global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6 unknown6_;
-
-        public Response()
-        {
-            OnConstruction();
-        }
-
-        public Response(Response other) : this()
-        {
-            unknown1_ = other.unknown1_;
-            unknown2_ = other.unknown2_;
-            apiUrl_ = other.apiUrl_;
-            Unknown6 = other.unknown6_ != null ? other.Unknown6.Clone() : null;
-            Auth = other.auth_ != null ? other.Auth.Clone() : null;
-            payload_ = other.payload_.Clone();
-            errorMessage_ = other.errorMessage_;
-        }
-
-        public static pb::MessageParser<Response> Parser
-        {
-            get { return _parser; }
-        }
-
-        public static pbr::MessageDescriptor Descriptor
-        {
-            get { return global::PokemonGo.RocketAPI.GeneratedCode.ResponseReflection.Descriptor.MessageTypes[0]; }
-        }
-
-        public int Unknown1
-        {
-            get { return unknown1_; }
-            set { unknown1_ = value; }
-        }
-
-        public long Unknown2
-        {
-            get { return unknown2_; }
-            set { unknown2_ = value; }
-        }
-
-        public string ApiUrl
-        {
-            get { return apiUrl_; }
-            set { apiUrl_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6 Unknown6
-        {
-            get { return unknown6_; }
-            set { unknown6_ = value; }
-        }
-
-        public global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Auth Auth
-        {
-            get { return auth_; }
-            set { auth_ = value; }
-        }
-
-        public pbc::RepeatedField<pb::ByteString> Payload
-        {
-            get { return payload_; }
-        }
-
-        public string ErrorMessage
-        {
-            get { return errorMessage_; }
-            set { errorMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-        }
-
-        pbr::MessageDescriptor pb::IMessage.Descriptor
-        {
-            get { return Descriptor; }
-        }
-
-        public Response Clone()
-        {
-            return new Response(this);
-        }
-
-        public bool Equals(Response other)
-        {
-            if (ReferenceEquals(other, null))
-            {
-                return false;
-            }
-            if (ReferenceEquals(other, this))
-            {
-                return true;
-            }
-            if (Unknown1 != other.Unknown1) return false;
-            if (Unknown2 != other.Unknown2) return false;
-            if (ApiUrl != other.ApiUrl) return false;
-            if (!Equals(Unknown6, other.Unknown6)) return false;
-            if (!Equals(Auth, other.Auth)) return false;
-            if (!payload_.Equals(other.payload_)) return false;
-            if (ErrorMessage != other.ErrorMessage) return false;
-            return true;
-        }
-
-        public void WriteTo(pb::CodedOutputStream output)
-        {
-            if (Unknown1 != 0)
-            {
-                output.WriteRawTag(8);
-                output.WriteInt32(Unknown1);
-            }
-            if (Unknown2 != 0L)
-            {
-                output.WriteRawTag(16);
-                output.WriteInt64(Unknown2);
-            }
-            if (ApiUrl.Length != 0)
-            {
-                output.WriteRawTag(26);
-                output.WriteString(ApiUrl);
-            }
-            if (unknown6_ != null)
-            {
-                output.WriteRawTag(50);
-                output.WriteMessage(Unknown6);
-            }
-            if (auth_ != null)
-            {
-                output.WriteRawTag(58);
-                output.WriteMessage(Auth);
-            }
-            payload_.WriteTo(output, _repeated_payload_codec);
-            if (ErrorMessage.Length != 0)
-            {
-                output.WriteRawTag(170, 6);
-                output.WriteString(ErrorMessage);
-            }
-        }
-
-        public int CalculateSize()
-        {
-            var size = 0;
-            if (Unknown1 != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
-            }
-            if (Unknown2 != 0L)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown2);
-            }
-            if (ApiUrl.Length != 0)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeStringSize(ApiUrl);
-            }
-            if (unknown6_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown6);
-            }
-            if (auth_ != null)
-            {
-                size += 1 + pb::CodedOutputStream.ComputeMessageSize(Auth);
-            }
-            size += payload_.CalculateSize(_repeated_payload_codec);
-            if (ErrorMessage.Length != 0)
-            {
-                size += 2 + pb::CodedOutputStream.ComputeStringSize(ErrorMessage);
-            }
-            return size;
-        }
-
-        public void MergeFrom(Response other)
-        {
-            if (other == null)
-            {
-                return;
-            }
-            if (other.Unknown1 != 0)
-            {
-                Unknown1 = other.Unknown1;
-            }
-            if (other.Unknown2 != 0L)
-            {
-                Unknown2 = other.Unknown2;
-            }
-            if (other.ApiUrl.Length != 0)
-            {
-                ApiUrl = other.ApiUrl;
-            }
-            if (other.unknown6_ != null)
-            {
-                if (unknown6_ == null)
-                {
-                    unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6();
-                }
-                Unknown6.MergeFrom(other.Unknown6);
-            }
-            if (other.auth_ != null)
-            {
-                if (auth_ == null)
-                {
-                    auth_ = new global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Auth();
-                }
-                Auth.MergeFrom(other.Auth);
-            }
-            payload_.Add(other.payload_);
-            if (other.ErrorMessage.Length != 0)
-            {
-                ErrorMessage = other.ErrorMessage;
-            }
-        }
-
-        public void MergeFrom(pb::CodedInputStream input)
-        {
-            uint tag;
-            while ((tag = input.ReadTag()) != 0)
-            {
-                switch (tag)
-                {
-                    default:
-                        input.SkipLastField();
-                        break;
-                    case 8:
-                    {
-                        Unknown1 = input.ReadInt32();
-                        break;
-                    }
-                    case 16:
-                    {
-                        Unknown2 = input.ReadInt64();
-                        break;
-                    }
-                    case 26:
-                    {
-                        ApiUrl = input.ReadString();
-                        break;
-                    }
-                    case 50:
-                    {
-                        if (unknown6_ == null)
-                        {
-                            unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6();
-                        }
-                        input.ReadMessage(unknown6_);
-                        break;
-                    }
-                    case 58:
-                    {
-                        if (auth_ == null)
-                        {
-                            auth_ = new global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Auth();
-                        }
-                        input.ReadMessage(auth_);
-                        break;
-                    }
-                    case 802:
-                    {
-                        payload_.AddEntriesFrom(input, _repeated_payload_codec);
-                        break;
-                    }
-                    case 810:
-                    {
-                        ErrorMessage = input.ReadString();
-                        break;
-                    }
-                }
-            }
-        }
-
-        public override bool Equals(object other)
-        {
-            return Equals(other as Response);
-        }
-
-        public override int GetHashCode()
-        {
-            var hash = 1;
-            if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
-            if (Unknown2 != 0L) hash ^= Unknown2.GetHashCode();
-            if (ApiUrl.Length != 0) hash ^= ApiUrl.GetHashCode();
-            if (unknown6_ != null) hash ^= Unknown6.GetHashCode();
-            if (auth_ != null) hash ^= Auth.GetHashCode();
-            hash ^= payload_.GetHashCode();
-            if (ErrorMessage.Length != 0) hash ^= ErrorMessage.GetHashCode();
-            return hash;
-        }
-
-        partial void OnConstruction();
-
-        public override string ToString()
-        {
-            return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        #region Nested types
-
-        /// <summary>Container for nested types declared in the Response message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static partial class Types
-        {
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class Unknown6 : pb::IMessage<Unknown6>
-            {
-                /// <summary>Field number for the "unknown1" field.</summary>
-                public const int Unknown1FieldNumber = 1;
-
-                /// <summary>Field number for the "unknown2" field.</summary>
-                public const int Unknown2FieldNumber = 2;
-
-                private static readonly pb::MessageParser<Unknown6> _parser =
-                    new pb::MessageParser<Unknown6>(() => new Unknown6());
-
-                private int unknown1_;
-                private global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Types.Unknown2 unknown2_;
-
-                public Unknown6()
-                {
-                    OnConstruction();
-                }
-
-                public Unknown6(Unknown6 other) : this()
-                {
-                    unknown1_ = other.unknown1_;
-                    Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
-                }
-
-                public static pb::MessageParser<Unknown6> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Response.Descriptor.NestedTypes[0]; }
-                }
-
-                public int Unknown1
-                {
-                    get { return unknown1_; }
-                    set { unknown1_ = value; }
-                }
-
-                public global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Types.Unknown2 Unknown2
-                {
-                    get { return unknown2_; }
-                    set { unknown2_ = value; }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public Unknown6 Clone()
-                {
-                    return new Unknown6(this);
-                }
-
-                public bool Equals(Unknown6 other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Unknown1 != other.Unknown1) return false;
-                    if (!Equals(Unknown2, other.Unknown2)) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Unknown1 != 0)
-                    {
-                        output.WriteRawTag(8);
-                        output.WriteInt32(Unknown1);
-                    }
-                    if (unknown2_ != null)
-                    {
-                        output.WriteRawTag(18);
-                        output.WriteMessage(Unknown2);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Unknown1 != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
-                    }
-                    if (unknown2_ != null)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(Unknown6 other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Unknown1 != 0)
-                    {
-                        Unknown1 = other.Unknown1;
-                    }
-                    if (other.unknown2_ != null)
-                    {
-                        if (unknown2_ == null)
-                        {
-                            unknown2_ =
-                                new global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Types.Unknown2();
-                        }
-                        Unknown2.MergeFrom(other.Unknown2);
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 8:
-                            {
-                                Unknown1 = input.ReadInt32();
-                                break;
-                            }
-                            case 18:
-                            {
-                                if (unknown2_ == null)
-                                {
-                                    unknown2_ =
-                                        new global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Types.
-                                            Unknown2();
-                                }
-                                input.ReadMessage(unknown2_);
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as Unknown6);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
-                    if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-
-                #region Nested types
-
-                /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
-                [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-                public static partial class Types
-                {
-                    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-                    public sealed partial class Unknown2 : pb::IMessage<Unknown2>
-                    {
-                        /// <summary>Field number for the "unknown1" field.</summary>
-                        public const int Unknown1FieldNumber = 1;
-
-                        private static readonly pb::MessageParser<Unknown2> _parser =
-                            new pb::MessageParser<Unknown2>(() => new Unknown2());
-
-                        private pb::ByteString unknown1_ = pb::ByteString.Empty;
-
-                        public Unknown2()
-                        {
-                            OnConstruction();
-                        }
-
-                        public Unknown2(Unknown2 other) : this()
-                        {
-                            unknown1_ = other.unknown1_;
-                        }
-
-                        public static pb::MessageParser<Unknown2> Parser
-                        {
-                            get { return _parser; }
-                        }
-
-                        public static pbr::MessageDescriptor Descriptor
-                        {
-                            get
-                            {
-                                return
-                                    global::PokemonGo.RocketAPI.GeneratedCode.Response.Types.Unknown6.Descriptor
-                                        .NestedTypes[0];
-                            }
-                        }
-
-                        public pb::ByteString Unknown1
-                        {
-                            get { return unknown1_; }
-                            set { unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                        }
-
-                        pbr::MessageDescriptor pb::IMessage.Descriptor
-                        {
-                            get { return Descriptor; }
-                        }
-
-                        public Unknown2 Clone()
-                        {
-                            return new Unknown2(this);
-                        }
-
-                        public bool Equals(Unknown2 other)
-                        {
-                            if (ReferenceEquals(other, null))
-                            {
-                                return false;
-                            }
-                            if (ReferenceEquals(other, this))
-                            {
-                                return true;
-                            }
-                            if (Unknown1 != other.Unknown1) return false;
-                            return true;
-                        }
-
-                        public void WriteTo(pb::CodedOutputStream output)
-                        {
-                            if (Unknown1.Length != 0)
-                            {
-                                output.WriteRawTag(10);
-                                output.WriteBytes(Unknown1);
-                            }
-                        }
-
-                        public int CalculateSize()
-                        {
-                            var size = 0;
-                            if (Unknown1.Length != 0)
-                            {
-                                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
-                            }
-                            return size;
-                        }
-
-                        public void MergeFrom(Unknown2 other)
-                        {
-                            if (other == null)
-                            {
-                                return;
-                            }
-                            if (other.Unknown1.Length != 0)
-                            {
-                                Unknown1 = other.Unknown1;
-                            }
-                        }
-
-                        public void MergeFrom(pb::CodedInputStream input)
-                        {
-                            uint tag;
-                            while ((tag = input.ReadTag()) != 0)
-                            {
-                                switch (tag)
-                                {
-                                    default:
-                                        input.SkipLastField();
-                                        break;
-                                    case 10:
-                                    {
-                                        Unknown1 = input.ReadBytes();
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-
-                        public override bool Equals(object other)
-                        {
-                            return Equals(other as Unknown2);
-                        }
-
-                        public override int GetHashCode()
-                        {
-                            var hash = 1;
-                            if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
-                            return hash;
-                        }
-
-                        partial void OnConstruction();
-
-                        public override string ToString()
-                        {
-                            return pb::JsonFormatter.ToDiagnosticString(this);
-                        }
-                    }
-                }
-
-                #endregion
-            }
-
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public sealed partial class Auth : pb::IMessage<Auth>
-            {
-                /// <summary>Field number for the "unknown71" field.</summary>
-                public const int Unknown71FieldNumber = 1;
-
-                /// <summary>Field number for the "timestamp" field.</summary>
-                public const int TimestampFieldNumber = 2;
-
-                /// <summary>Field number for the "unknown73" field.</summary>
-                public const int Unknown73FieldNumber = 3;
-
-                private static readonly pb::MessageParser<Auth> _parser = new pb::MessageParser<Auth>(() => new Auth());
-                private long timestamp_;
-                private pb::ByteString unknown71_ = pb::ByteString.Empty;
-                private pb::ByteString unknown73_ = pb::ByteString.Empty;
-
-                public Auth()
-                {
-                    OnConstruction();
-                }
-
-                public Auth(Auth other) : this()
-                {
-                    unknown71_ = other.unknown71_;
-                    timestamp_ = other.timestamp_;
-                    unknown73_ = other.unknown73_;
-                }
-
-                public static pb::MessageParser<Auth> Parser
-                {
-                    get { return _parser; }
-                }
-
-                public static pbr::MessageDescriptor Descriptor
-                {
-                    get { return global::PokemonGo.RocketAPI.GeneratedCode.Response.Descriptor.NestedTypes[1]; }
-                }
-
-                public pb::ByteString Unknown71
-                {
-                    get { return unknown71_; }
-                    set { unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                public long Timestamp
-                {
-                    get { return timestamp_; }
-                    set { timestamp_ = value; }
-                }
-
-                public pb::ByteString Unknown73
-                {
-                    get { return unknown73_; }
-                    set { unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
-                }
-
-                pbr::MessageDescriptor pb::IMessage.Descriptor
-                {
-                    get { return Descriptor; }
-                }
-
-                public Auth Clone()
-                {
-                    return new Auth(this);
-                }
-
-                public bool Equals(Auth other)
-                {
-                    if (ReferenceEquals(other, null))
-                    {
-                        return false;
-                    }
-                    if (ReferenceEquals(other, this))
-                    {
-                        return true;
-                    }
-                    if (Unknown71 != other.Unknown71) return false;
-                    if (Timestamp != other.Timestamp) return false;
-                    if (Unknown73 != other.Unknown73) return false;
-                    return true;
-                }
-
-                public void WriteTo(pb::CodedOutputStream output)
-                {
-                    if (Unknown71.Length != 0)
-                    {
-                        output.WriteRawTag(10);
-                        output.WriteBytes(Unknown71);
-                    }
-                    if (Timestamp != 0L)
-                    {
-                        output.WriteRawTag(16);
-                        output.WriteInt64(Timestamp);
-                    }
-                    if (Unknown73.Length != 0)
-                    {
-                        output.WriteRawTag(26);
-                        output.WriteBytes(Unknown73);
-                    }
-                }
-
-                public int CalculateSize()
-                {
-                    var size = 0;
-                    if (Unknown71.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
-                    }
-                    if (Timestamp != 0L)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Timestamp);
-                    }
-                    if (Unknown73.Length != 0)
-                    {
-                        size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
-                    }
-                    return size;
-                }
-
-                public void MergeFrom(Auth other)
-                {
-                    if (other == null)
-                    {
-                        return;
-                    }
-                    if (other.Unknown71.Length != 0)
-                    {
-                        Unknown71 = other.Unknown71;
-                    }
-                    if (other.Timestamp != 0L)
-                    {
-                        Timestamp = other.Timestamp;
-                    }
-                    if (other.Unknown73.Length != 0)
-                    {
-                        Unknown73 = other.Unknown73;
-                    }
-                }
-
-                public void MergeFrom(pb::CodedInputStream input)
-                {
-                    uint tag;
-                    while ((tag = input.ReadTag()) != 0)
-                    {
-                        switch (tag)
-                        {
-                            default:
-                                input.SkipLastField();
-                                break;
-                            case 10:
-                            {
-                                Unknown71 = input.ReadBytes();
-                                break;
-                            }
-                            case 16:
-                            {
-                                Timestamp = input.ReadInt64();
-                                break;
-                            }
-                            case 26:
-                            {
-                                Unknown73 = input.ReadBytes();
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                public override bool Equals(object other)
-                {
-                    return Equals(other as Auth);
-                }
-
-                public override int GetHashCode()
-                {
-                    var hash = 1;
-                    if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
-                    if (Timestamp != 0L) hash ^= Timestamp.GetHashCode();
-                    if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
-                    return hash;
-                }
-
-                partial void OnConstruction();
-
-                public override string ToString()
-                {
-                    return pb::JsonFormatter.ToDiagnosticString(this);
-                }
-            }
-        }
-
-        #endregion
-    }
-
-    #endregion
-}
-
-#endregion Designer generated code
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Helpers/HttpClientHelper.cs b/PokemonGo/RocketAPI/Helpers/HttpClientHelper.cs
index ebfc286..3b82225 100644
--- a/PokemonGo/RocketAPI/Helpers/HttpClientHelper.cs
+++ b/PokemonGo/RocketAPI/Helpers/HttpClientHelper.cs
@@ -1,12 +1,8 @@
-#region
-
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Net;
 using System.Net.Http;
 using System.Threading.Tasks;

-#endregion
-
 namespace PokemonGo.RocketAPI.Helpers
 {
     public static class HttpClientHelper
@@ -20,7 +16,7 @@ namespace PokemonGo.RocketAPI.Helpers
                 AllowAutoRedirect = false
             };

-            using (var tempHttpClient = new HttpClient(handler))
+            using (var tempHttpClient = new System.Net.Http.HttpClient(handler))
             {
                 var response = await tempHttpClient.PostAsync(url, new FormUrlEncodedContent(keyValuePairs));
                 return await response.Content.ReadAsAsync<TResponse>();
diff --git a/PokemonGo/RocketAPI/Helpers/JsonHelper.cs b/PokemonGo/RocketAPI/Helpers/JsonHelper.cs
new file mode 100644
index 0000000..5230a9c
--- /dev/null
+++ b/PokemonGo/RocketAPI/Helpers/JsonHelper.cs
@@ -0,0 +1,13 @@
+using Newtonsoft.Json.Linq;
+
+namespace PokemonGo.RocketAPI.Helpers
+{
+    public class JsonHelper
+    {
+        public static string GetValue(string json, string key)
+        {
+            var jObject = JObject.Parse(json);
+            return jObject[key].ToString();
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Helpers/RandomHelper.cs b/PokemonGo/RocketAPI/Helpers/RandomHelper.cs
index 169aaf1..f56ee02 100644
--- a/PokemonGo/RocketAPI/Helpers/RandomHelper.cs
+++ b/PokemonGo/RocketAPI/Helpers/RandomHelper.cs
@@ -1,8 +1,4 @@
-#region
-
-using System;
-
-#endregion
+using System;

 namespace PokemonGo.RocketAPI.Helpers
 {
diff --git a/PokemonGo/RocketAPI/Helpers/RequestBuilder.cs b/PokemonGo/RocketAPI/Helpers/RequestBuilder.cs
index 686d630..39d8c9d 100644
--- a/PokemonGo/RocketAPI/Helpers/RequestBuilder.cs
+++ b/PokemonGo/RocketAPI/Helpers/RequestBuilder.cs
@@ -1,73 +1,219 @@
-#region
-
-using System.Linq;
+using Google.Protobuf;
 using PokemonGo.RocketAPI.Enums;
-using PokemonGo.RocketAPI.GeneratedCode;
-
-#endregion
+using POGOProtos.Networking;
+using POGOProtos.Networking.Envelopes;
+using POGOProtos.Networking.Requests;
+using System;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using PokemonGo.RocketAPI.Extensions;

 namespace PokemonGo.RocketAPI.Helpers
 {
-    public static class RequestBuilder
+    public class RequestBuilder
     {
-        public static Request GetInitialRequest(string authToken, AuthType authType, double lat, double lng,
-            double altitude, params Request.Types.Requests[] customRequests)
+        private readonly string _authToken;
+        private readonly AuthType _authType;
+        private readonly double _latitude;
+        private readonly double _longitude;
+        private readonly double _altitude;
+        private readonly AuthTicket _authTicket;
+        static private readonly Stopwatch _internalWatch = new Stopwatch();
+        private readonly ISettings settings;
+
+        public RequestBuilder(string authToken, AuthType authType, double latitude, double longitude, double altitude, ISettings settings, AuthTicket authTicket = null)
         {
-            return new Request
+            _authToken = authToken;
+            _authType = authType;
+            _latitude = latitude;
+            _longitude = longitude;
+            _altitude = altitude;
+            this.settings = settings;
+            _authTicket = authTicket;
+            if (!_internalWatch.IsRunning)
+                _internalWatch.Start();
+        }
+
+        private Unknown6 GenerateSignature(IEnumerable<IMessage> requests)
+        {
+            var sig = new POGOProtos.Networking.Signature();
+            sig.TimestampSinceStart = (ulong)_internalWatch.ElapsedMilliseconds;
+            sig.Timestamp = (ulong)DateTime.UtcNow.ToUnixTime();
+            sig.SensorInfo = new POGOProtos.Networking.Signature.Types.SensorInfo()
             {
-                Altitude = Utils.FloatAsUlong(altitude),
-                Auth = new Request.Types.AuthInfo
-                {
-                    Provider = authType == AuthType.Google ? "google" : "ptc",
-                    Token = new Request.Types.AuthInfo.Types.JWT
-                    {
-                        Contents = authToken,
-                        Unknown13 = 14
-                    }
-                },
-                Latitude = Utils.FloatAsUlong(lat),
-                Longitude = Utils.FloatAsUlong(lng),
-                RpcId = 1469378659230941192,
-                Unknown1 = 2,
-                Unknown12 = 989, //Required otherwise we receive incompatible protocol
-                Requests =
-                {
-                    customRequests
-                }
+                AccelNormalizedZ = GenRandom(9.8),
+                AccelNormalizedX = GenRandom(0.02),
+                AccelNormalizedY = GenRandom(0.3),
+                TimestampSnapshot = (ulong)_internalWatch.ElapsedMilliseconds - 230,
+                MagnetometerX = GenRandom(012271042913198471),
+                MagnetometerY = GenRandom(-0.015570580959320068),
+                MagnetometerZ = GenRandom(0.010850906372070313),
+                AngleNormalizedX = GenRandom(17.950439453125),
+                AngleNormalizedY = GenRandom(-23.36273193359375),
+                AngleNormalizedZ = GenRandom(-48.8250732421875),
+                AccelRawX = GenRandom(-0.0120010357350111),
+                AccelRawY = GenRandom(-0.04214850440621376),
+                AccelRawZ = GenRandom(0.94571763277053833),
+                GyroscopeRawX = GenRandom(7.62939453125e-005),
+                GyroscopeRawY = GenRandom(-0.00054931640625),
+                GyroscopeRawZ = GenRandom(0.0024566650390625),
+                AccelerometerAxes = 3
+            };
+            sig.DeviceInfo = new POGOProtos.Networking.Signature.Types.DeviceInfo()
+            {
+                DeviceId = settings.DeviceId,
+                AndroidBoardName = settings.AndroidBoardName,
+                AndroidBootloader = settings.AndroidBootloader,
+                DeviceBrand = settings.DeviceBrand,
+                DeviceModel = settings.DeviceModel,
+                DeviceModelIdentifier = settings.DeviceModelIdentifier,
+                DeviceModelBoot = settings.DeviceModelBoot,
+                HardwareManufacturer = settings.HardwareManufacturer,
+                HardwareModel = settings.HardwareModel,
+                FirmwareBrand = settings.FirmwareBrand,
+                FirmwareTags = settings.FirmwareTags,
+                FirmwareType = settings.FirmwareType,
+                FirmwareFingerprint = settings.FirmwareFingerprint
             };
+            sig.LocationFix.Add(new POGOProtos.Networking.Signature.Types.LocationFix()
+            {
+                Provider = "network",
+
+                //Unk4 = 120,
+                Latitude = (float)_latitude,
+                Longitude = (float)_longitude,
+                Altitude = (float)_altitude,
+                TimestampSinceStart = (ulong)_internalWatch.ElapsedMilliseconds - 200,
+                Floor = 3,
+                LocationType = 1
+            });
+
+            //Compute 10
+            var x = new System.Data.HashFunction.xxHash(32, 0x1B845238);
+            var firstHash = BitConverter.ToUInt32(x.ComputeHash(_authTicket.ToByteArray()), 0);
+            x = new System.Data.HashFunction.xxHash(32, firstHash);
+            var locationBytes = BitConverter.GetBytes(_latitude).Reverse()
+                .Concat(BitConverter.GetBytes(_longitude).Reverse())
+                .Concat(BitConverter.GetBytes(_altitude).Reverse()).ToArray();
+            sig.LocationHash1 = BitConverter.ToUInt32(x.ComputeHash(locationBytes), 0);
+            //Compute 20
+            x = new System.Data.HashFunction.xxHash(32, 0x1B845238);
+            sig.LocationHash2 = BitConverter.ToUInt32(x.ComputeHash(locationBytes), 0);
+            //Compute 24
+            x = new System.Data.HashFunction.xxHash(64, 0x1B845238);
+            var seed = BitConverter.ToUInt64(x.ComputeHash(_authTicket.ToByteArray()), 0);
+            x = new System.Data.HashFunction.xxHash(64, seed);
+            foreach (var req in requests)
+                sig.RequestHash.Add(BitConverter.ToUInt64(x.ComputeHash(req.ToByteArray()), 0));
+
+            //static for now
+            sig.Unk22 = ByteString.CopyFrom(new byte[16] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F });
+
+
+            Unknown6 val = new Unknown6();
+            val.RequestType = 6;
+            val.Unknown2 = new Unknown6.Types.Unknown2();
+            val.Unknown2.Unknown1 = ByteString.CopyFrom(Encrypt(sig.ToByteArray()));
+            return val;
+        }
+        private byte[] Encrypt(byte[] bytes)
+        {
+            var outputLength = 32 + bytes.Length + (256 - (bytes.Length % 256));
+            var ptr = Marshal.AllocHGlobal(outputLength);
+            var ptrOutput = Marshal.AllocHGlobal(outputLength);
+            FillMemory(ptr, (uint)outputLength, 0);
+            FillMemory(ptrOutput, (uint)outputLength, 0);
+            Marshal.Copy(bytes, 0, ptr, bytes.Length);
+            try
+            {
+                int outputSize = outputLength;
+                EncryptNative(ptr, bytes.Length, new byte[32], 32, ptrOutput, out outputSize);
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+            }
+            var output = new byte[outputLength];
+            Marshal.Copy(ptrOutput, output, 0, outputLength);
+            return output;
         }

-        public static Request GetInitialRequest(string authToken, AuthType authType, double lat, double lng,
-            double altitude, params RequestType[] customRequestTypes)
+        [DllImport("Resources/encrypt.dll", EntryPoint = "encrypt", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
+        static extern private void EncryptNative(IntPtr arr, int length, byte[] iv, int ivsize, IntPtr output, out int outputSize);
+        [DllImport("kernel32.dll", EntryPoint = "RtlFillMemory", SetLastError = false)]
+        static extern void FillMemory(IntPtr destination, uint length, byte fill);
+
+        public RequestEnvelope GetRequestEnvelope(params Request[] customRequests)
         {
-            var customRequests = customRequestTypes.ToList().Select(c => new Request.Types.Requests {Type = (int) c});
-            return GetInitialRequest(authToken, authType, lat, lng, altitude, customRequests.ToArray());
+            var e = new RequestEnvelope
+            {
+                StatusCode = 2, //1
+
+                RequestId = 1469378659230941192, //3
+                Requests = { customRequests }, //4
+
+                //Unknown6 = , //6
+                Latitude = _latitude, //7
+                Longitude = _longitude, //8
+                Altitude = _altitude, //9
+                AuthTicket = _authTicket, //11
+                Unknown12 = 989 //12
+            };
+            e.Unknown6.Add(GenerateSignature(customRequests));
+            return e;
         }

-        public static Request GetRequest(Request.Types.UnknownAuth unknownAuth, double lat, double lng, double altitude,
-            params Request.Types.Requests[] customRequests)
+        public RequestEnvelope GetInitialRequestEnvelope(params Request[] customRequests)
         {
-            return new Request
+            var e = new RequestEnvelope
             {
-                Altitude = Utils.FloatAsUlong(altitude),
-                Unknownauth = unknownAuth,
-                Latitude = Utils.FloatAsUlong(lat),
-                Longitude = Utils.FloatAsUlong(lng),
-                RpcId = 1469378659230941192,
-                Unknown1 = 2,
-                Unknown12 = 989, //Required otherwise we receive incompatible protocol
-                Requests =
+                StatusCode = 2, //1
+
+                RequestId = 1469378659230941192, //3
+                Requests = { customRequests }, //4
+
+                //Unknown6 = , //6
+                Latitude = _latitude, //7
+                Longitude = _longitude, //8
+                Altitude = _altitude, //9
+                AuthInfo = new POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo
                 {
-                    customRequests
-                }
+                    Provider = _authType == AuthType.Google ? "google" : "ptc",
+                    Token = new POGOProtos.Networking.Envelopes.RequestEnvelope.Types.AuthInfo.Types.JWT
+                    {
+                        Contents = _authToken,
+                        Unknown2 = 14
+                    }
+                }, //10
+                Unknown12 = 989 //12
             };
+            return e;
+        }
+
+
+
+        public RequestEnvelope GetRequestEnvelope(RequestType type, IMessage message)
+        {
+            return GetRequestEnvelope(new Request()
+            {
+                RequestType = type,
+                RequestMessage = message.ToByteString()
+            });
+
         }

-        public static Request GetRequest(Request.Types.UnknownAuth unknownAuth, double lat, double lng, double altitude,
-            params RequestType[] customRequestTypes)
+        private static readonly Random RandomDevice = new Random();
+
+        public static double GenRandom(double num)
         {
-            var customRequests = customRequestTypes.ToList().Select(c => new Request.Types.Requests {Type = (int) c});
-            return GetRequest(unknownAuth, lat, lng, altitude, customRequests.ToArray());
+                var randomFactor = 0.3f;
+                var randomMin = (num * (1 - randomFactor));
+                var randomMax = (num * (1 + randomFactor));
+                var randomizedDelay = RandomDevice.NextDouble() * (randomMax - randomMin) + randomMin; ;
+                return randomizedDelay;;
         }
     }
 }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Helpers/RetryHandler.cs b/PokemonGo/RocketAPI/Helpers/RetryHandler.cs
index f472155..2c40fe4 100644
--- a/PokemonGo/RocketAPI/Helpers/RetryHandler.cs
+++ b/PokemonGo/RocketAPI/Helpers/RetryHandler.cs
@@ -1,18 +1,15 @@
-#region
-
 using System;
+using System.Diagnostics;
 using System.Net;
 using System.Net.Http;
 using System.Threading;
 using System.Threading.Tasks;

-#endregion
-
 namespace PokemonGo.RocketAPI.Helpers
 {
     internal class RetryHandler : DelegatingHandler
     {
-        private const int MaxRetries = 100000;
+        private const int MaxRetries = 25;

         public RetryHandler(HttpMessageHandler innerHandler)
             : base(innerHandler)
@@ -28,18 +25,17 @@ namespace PokemonGo.RocketAPI.Helpers
                 try
                 {
                     var response = await base.SendAsync(request, cancellationToken);
-                    if (response.StatusCode == HttpStatusCode.BadGateway)
+                    if (response.StatusCode == HttpStatusCode.BadGateway || response.StatusCode == HttpStatusCode.InternalServerError)
                         throw new Exception(); //todo: proper implementation

                     return response;
                 }
-                catch (Exception)
+                catch (Exception ex)
                 {
-                    Console.WriteLine(
-                        $"[{DateTime.Now.ToString("HH:mm:ss")}] [#{i} of {MaxRetries}] retry request {request.RequestUri}");
+                    Debug.WriteLine($"[#{i} of {MaxRetries}] retry request {request.RequestUri} - Error: {ex}");
                     if (i < MaxRetries)
                     {
-                        await Task.Delay(1000);
+                        await Task.Delay(1000, cancellationToken);
                         continue;
                     }
                     throw;
diff --git a/PokemonGo/RocketAPI/Helpers/S2Helper.cs b/PokemonGo/RocketAPI/Helpers/S2Helper.cs
index b8996c9..a028e8c 100644
--- a/PokemonGo/RocketAPI/Helpers/S2Helper.cs
+++ b/PokemonGo/RocketAPI/Helpers/S2Helper.cs
@@ -1,11 +1,7 @@
-#region
-
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
 using Google.Common.Geometry;

-#endregion
-
 namespace PokemonGo.RocketAPI.Helpers
 {
     public class S2Helper
@@ -15,36 +11,39 @@ namespace PokemonGo.RocketAPI.Helpers
             var nearbyCellIds = new List<S2CellId>();

             var cellId = S2CellId.FromLatLng(S2LatLng.FromDegrees(latitude, longitude)).ParentForLevel(15);
-                //.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent;

             nearbyCellIds.Add(cellId);
-            for (var i = 0; i < 10; i++)
+
+            var neighbours = new List<S2CellId>();
+            cellId.GetAllNeighbors(15, neighbours);
+
+            foreach (var neighbour in neighbours)
             {
-                nearbyCellIds.Add(GetPrevious(cellId, i));
-                nearbyCellIds.Add(GetNext(cellId, i));
+                nearbyCellIds.Add(neighbour);
+                nearbyCellIds.AddRange(neighbour.GetEdgeNeighbors());
             }

-            return nearbyCellIds.Select(c => c.Id).OrderBy(c => c).ToList();
+            return nearbyCellIds.Select(c => c.Id).Distinct().OrderBy(c => c).ToList();
         }

-        private static S2CellId GetNext(S2CellId cellId, int depth)
+        private static S2CellId GetPrevious(S2CellId cellId, int depth)
         {
             if (depth < 0)
                 return cellId;

             depth--;

-            return GetNext(cellId.Next, depth);
+            return GetPrevious(cellId.Previous, depth);
         }

-        private static S2CellId GetPrevious(S2CellId cellId, int depth)
+        private static S2CellId GetNext(S2CellId cellId, int depth)
         {
             if (depth < 0)
                 return cellId;

             depth--;

-            return GetPrevious(cellId.Previous, depth);
+            return GetNext(cellId.Next, depth);
         }
     }
 }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Helpers/Utils.cs b/PokemonGo/RocketAPI/Helpers/Utils.cs
index 13727c2..c7ed3e7 100644
--- a/PokemonGo/RocketAPI/Helpers/Utils.cs
+++ b/PokemonGo/RocketAPI/Helpers/Utils.cs
@@ -1,8 +1,4 @@
-#region
-
-using System;
-
-#endregion
+using System;

 namespace PokemonGo.RocketAPI.Helpers
 {
diff --git a/PokemonGo/RocketAPI/HttpClient/PokemonClient.cs b/PokemonGo/RocketAPI/HttpClient/PokemonClient.cs
new file mode 100644
index 0000000..dfa323b
--- /dev/null
+++ b/PokemonGo/RocketAPI/HttpClient/PokemonClient.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using PokemonGo.RocketAPI.Helpers;
+
+namespace PokemonGo.RocketAPI.HttpClient
+{
+    public class PokemonHttpClient : System.Net.Http.HttpClient
+    {
+        private static readonly HttpClientHandler Handler = new HttpClientHandler
+        {
+            AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
+            AllowAutoRedirect = false
+        };
+
+        public PokemonHttpClient() : base(new RetryHandler(Handler))
+        {
+            DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Niantic App");
+            DefaultRequestHeaders.ExpectContinue = false;
+            DefaultRequestHeaders.TryAddWithoutValidation("Connection", "keep-alive");
+            DefaultRequestHeaders.TryAddWithoutValidation("Accept", "*/*");
+            DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/ISettings.cs b/PokemonGo/RocketAPI/ISettings.cs
index 6174471..4ebf061 100644
--- a/PokemonGo/RocketAPI/ISettings.cs
+++ b/PokemonGo/RocketAPI/ISettings.cs
@@ -1,37 +1,30 @@
-#region
-
-using PokemonGo.RocketAPI.Enums;
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-
-#endregion
+using PokemonGo.RocketAPI.Enums;

 namespace PokemonGo.RocketAPI
 {
     public interface ISettings
     {
-        AuthType AuthType { get; }
+        AuthType AuthType { get; set; }
         double DefaultLatitude { get; set; }
         double DefaultLongitude { get; set; }
-        string LevelOutput { get; }
-        int LevelTimeInterval { get; }
+        double DefaultAltitude { get; set; }
         string GoogleRefreshToken { get; set; }
-        string PtcPassword { get; }
-        string PtcUsername { get; }
-        string Email { get; }
-        string Password { get; }
-        bool EvolveAllGivenPokemons { get; }
-        string TransferType { get; }
-        int TransferCPThreshold { get; }
-        int TransferIVThreshold { get; }
-        int TravelSpeed { get; }
-        int ImageSize { get; }
-        bool Recycler { get; }
-        ICollection<KeyValuePair<AllEnum.ItemId, int>> ItemRecycleFilter { get; }
-        int RecycleItemsInterval { get; }
-        string Language { get; }
-        string RazzBerryMode { get; }
-        double RazzBerrySetting { get; }
-        bool CatchPokemon { get; }
+        string PtcPassword { get; set; }
+        string PtcUsername { get; set; }
+        string GoogleUsername { get; set; }
+        string GooglePassword { get; set; }
+        string DeviceId { get; set; }
+        string AndroidBoardName { get; set; }
+        string AndroidBootloader { get; set; }
+        string DeviceBrand { get; set; }
+        string DeviceModel { get; set; }
+        string DeviceModelIdentifier { get; set; }
+        string DeviceModelBoot { get; set; }
+        string HardwareManufacturer { get; set; }
+        string HardwareModel { get; set; }
+        string FirmwareBrand { get; set; }
+        string FirmwareTags { get; set; }
+        string FirmwareType { get; set; }
+        string FirmwareFingerprint { get; set; }
     }
-}
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Login/GoogleLogin.cs b/PokemonGo/RocketAPI/Login/GoogleLogin.cs
index 10c9c70..ea09225 100644
--- a/PokemonGo/RocketAPI/Login/GoogleLogin.cs
+++ b/PokemonGo/RocketAPI/Login/GoogleLogin.cs
@@ -1,3 +1,4 @@
+using DankMemes.GPSOAuthSharp;
 using PokemonGo.RocketAPI.Exceptions;
 using System;
 using System.Collections.Generic;
@@ -21,160 +22,30 @@ namespace PokemonGo.RocketAPI.Login
             this.password = password;
         }

+#pragma warning disable 1998
         public async Task<string> GetAccessToken()
+#pragma warning restore 1998
         {
-            var _GPSOresponse = await PerformMasterLoginAsync(email, password).ConfigureAwait(false);
-            string token;
-            if (!_GPSOresponse.TryGetValue("Token", out token))
-                throw new LoginFailedException();
+            var client = new GPSOAuthClient(email, password);
+            var response = client.PerformMasterLogin();

-            var oauthResponse = await PerformOAuthAsync(
-            token,
-            "audience:server:client_id:848232511240-7so421jotr2609rmqakceuu1luuq0ptb.apps.googleusercontent.com",
-            "com.nianticlabs.pokemongo",
-            "321187995bc7cdc2b5fc91b11a96e2baa8602c62",
-            email).ConfigureAwait(false);
-            return oauthResponse["Auth"];
-        }
-
-        private static string b64Key = "AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3" +
-            "iJIZdodyhKZQrNWp5nKJ3srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pK" +
-            "RI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax/" +
-            "6rmf5AAAAAwEAAQ==";
-
-        private static RSAParameters androidKey = GoogleKeyUtils.KeyFromB64(b64Key);
-
-        private static string version = "0.0.5";
-        private static string authUrl = "https://android.clients.google.com/auth";
-        private static string userAgent = "GPSOAuthSharp/" + version;
-
-        private async static Task<IDictionary<string, string>> PerformAuthRequestAsync(IDictionary<string, string> data)
-        {
-            var handler = new HttpClientHandler
-            {
-                AutomaticDecompression = DecompressionMethods.GZip,
-                AllowAutoRedirect = false
-            };
-            using (var tempHttpClient = new HttpClient(handler))
-            {
-                tempHttpClient.DefaultRequestHeaders.UserAgent.ParseAdd(userAgent);
-
-                HttpResponseMessage response;
-                using (var formUrlEncodedContent = new FormUrlEncodedContent(data))
-                {
-                    response = await tempHttpClient.PostAsync(authUrl, formUrlEncodedContent).ConfigureAwait(false);
-                }
-
-                var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
-                return GoogleKeyUtils.ParseAuthResponse(content);
-            }
-        }
-
-        private static IDictionary<string, string> GenerateBaseRequest(string email, string encryptedPassword, string service)
-            => new Dictionary<string, string> {
-                { "accountType", "HOSTED_OR_GOOGLE" },
-                { "Email", email },
-                { "has_permission", "1" },
-                { "EncryptedPasswd",  encryptedPassword},
-                { "service", service },
-                { "source", "android" },
-                { "device_country", "us" },
-                { "operatorCountry", "us" },
-                { "lang", "en" },
-                { "sdk_version", "21" }
-            };
-
-        private static Task<IDictionary<string, string>> PerformMasterLoginAsync(string email, string password)
-        {
-            var signature = GoogleKeyUtils.CreateSignature(email, password, androidKey);
-            var request = GenerateBaseRequest(email, signature, "ac2dm");
-            request.Add("add_account", "1");
-            return PerformAuthRequestAsync(request);
-        }
-
-        private static Task<IDictionary<string, string>> PerformOAuthAsync(string masterToken, string service, string app, string clientSig, string email)
-        {
-            var request = GenerateBaseRequest(email, masterToken, service);
-            request.Add("app", app);
-            request.Add("client_sig", clientSig);
-            return PerformAuthRequestAsync(request);
-        }
-    }
+            if (response.ContainsKey("Error"))
+                throw new GoogleException(response["Error"]);

-    internal class GoogleKeyUtils
-    {
-        // key_from_b64
-        // BitConverter has different endianness, hence the Reverse()
-        public static RSAParameters KeyFromB64(string b64Key)
-        {
-            var decoded = Convert.FromBase64String(b64Key);
-            var modLength = BitConverter.ToInt32(decoded.Take(4).Reverse().ToArray(), 0);
-            var mod = decoded.Skip(4).Take(modLength).ToArray();
-            var expLength = BitConverter.ToInt32(decoded.Skip(modLength + 4).Take(4).Reverse().ToArray(), 0);
-            var exponent = decoded.Skip(modLength + 8).Take(expLength).ToArray();
-            var rsaKeyInfo = new RSAParameters
-            {
-                Modulus = mod,
-                Exponent = exponent
-            };
-            return rsaKeyInfo;
-        }
+            //Todo: captcha/2fa implementation

-        // key_to_struct
-        // Python version returns a string, but we use byte[] to get the same results
-        public static byte[] KeyToStruct(RSAParameters key)
-        {
-            byte[] modLength = { 0x00, 0x00, 0x00, 0x80 };
-            var mod = key.Modulus;
-            byte[] expLength = { 0x00, 0x00, 0x00, 0x03 };
-            var exponent = key.Exponent;
-            return DataTypeUtils.CombineBytes(modLength, mod, expLength, exponent);
-        }
+            if (!response.ContainsKey("Auth"))
+                throw new GoogleOfflineException();

-        // parse_auth_response
-        public static Dictionary<string, string> ParseAuthResponse(string text)
-        {
-            var responseData = new Dictionary<string, string>();
-            foreach (string line in text.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
-            {
-                var parts = line.Split('=');
-                responseData.Add(parts[0], parts[1]);
-            }
-            return responseData;
-        }
+            var oauthResponse = client.PerformOAuth(response["Token"],
+                "audience:server:client_id:848232511240-7so421jotr2609rmqakceuu1luuq0ptb.apps.googleusercontent.com",
+                "com.nianticlabs.pokemongo",
+                "321187995bc7cdc2b5fc91b11a96e2baa8602c62");

-        // signature
-        public static string CreateSignature(string email, string password, RSAParameters key)
-        {
-            using (var rsa = new RSACryptoServiceProvider())
-            {
-                rsa.ImportParameters(key);
-                var sha1 = SHA1.Create();
-                byte[] prefix = { 0x00 };
-                var hash = sha1.ComputeHash(GoogleKeyUtils.KeyToStruct(key)).Take(4).ToArray();
-                var encrypted = rsa.Encrypt(Encoding.UTF8.GetBytes(email + "\x00" + password), true);
-                return DataTypeUtils.UrlSafeBase64(DataTypeUtils.CombineBytes(prefix, hash, encrypted));
-            }
-        }
+            if (!oauthResponse.ContainsKey("Auth"))
+                throw new GoogleOfflineException();

-        private class DataTypeUtils
-        {
-            public static string UrlSafeBase64(byte[] byteArray)
-            {
-                return Convert.ToBase64String(byteArray).Replace('+', '-').Replace('/', '_');
-            }
-
-            public static byte[] CombineBytes(params byte[][] arrays)
-            {
-                var rv = new byte[arrays.Sum(a => a.Length)];
-                var offset = 0;
-                foreach (byte[] array in arrays)
-                {
-                    Buffer.BlockCopy(array, 0, rv, offset, array.Length);
-                    offset += array.Length;
-                }
-                return rv;
-            }
+            return oauthResponse["Auth"];
         }
     }
 }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Login/PtcLogin.cs b/PokemonGo/RocketAPI/Login/PtcLogin.cs
index 0cf6b04..7aefe50 100644
--- a/PokemonGo/RocketAPI/Login/PtcLogin.cs
+++ b/PokemonGo/RocketAPI/Login/PtcLogin.cs
@@ -1,4 +1,4 @@
-using Newtonsoft.Json;
+using Newtonsoft.Json;
 using PokemonGo.RocketAPI.Exceptions;
 using System.Collections.Generic;
 using System.Net;
@@ -26,7 +26,7 @@ namespace PokemonGo.RocketAPI.Login
                 AllowAutoRedirect = false
             };

-            using (var tempHttpClient = new HttpClient(handler))
+            using (var tempHttpClient = new System.Net.Http.HttpClient(handler))
             {
                 //Get session cookie
                 var sessionData = await GetSessionCookie(tempHttpClient).ConfigureAwait(false);
@@ -73,7 +73,7 @@ namespace PokemonGo.RocketAPI.Login
                 {"code", ticketId}
             };

-        private static async Task<string> GetLoginTicket(string username, string password, HttpClient tempHttpClient, SessionData sessionData)
+        private static async Task<string> GetLoginTicket(string username, string password, System.Net.Http.HttpClient tempHttpClient, SessionData sessionData)
         {
             HttpResponseMessage loginResp;
             var loginRequest = GenerateLoginRequest(sessionData, username, password);
@@ -86,7 +86,7 @@ namespace PokemonGo.RocketAPI.Login
             return ticketId;
         }

-        private static async Task<SessionData> GetSessionCookie(HttpClient tempHttpClient)
+        private static async Task<SessionData> GetSessionCookie(System.Net.Http.HttpClient tempHttpClient)
         {
             var sessionResp = await tempHttpClient.GetAsync(Resources.PtcLoginUrl).ConfigureAwait(false);
             var data = await sessionResp.Content.ReadAsStringAsync().ConfigureAwait(false);
@@ -94,7 +94,7 @@ namespace PokemonGo.RocketAPI.Login
             return sessionData;
         }

-        private static async Task<string> GetToken(HttpClient tempHttpClient, string ticketId)
+        private static async Task<string> GetToken(System.Net.Http.HttpClient tempHttpClient, string ticketId)
         {
             HttpResponseMessage tokenResp;
             var tokenRequest = GenerateTokenVarRequest(ticketId);
diff --git a/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj b/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
index 3dc6681..6f1c16f 100644
--- a/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
+++ b/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
@@ -8,7 +8,7 @@
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>PokemonGo.RocketAPI</RootNamespace>
-    <AssemblyName>Pokemon Go Rocket API</AssemblyName>
+    <AssemblyName>Pokemon.Go.Rocket.API</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
   </PropertyGroup>
@@ -20,7 +20,6 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <UseVSHostingProcess>false</UseVSHostingProcess>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -30,33 +29,78 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
   <ItemGroup>
-    <Reference Include="C5, Version=2.2.5073.27396, Culture=neutral, PublicKeyToken=282361b99ded7e8e, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\C5.2.2.5073.27396\lib\portable-net40+sl50+wp80+win\C5.dll</HintPath>
+    <Reference Include="C5, Version=2.4.5947.17248, Culture=neutral, PublicKeyToken=282361b99ded7e8e, processorArchitecture=MSIL">
+      <HintPath>$(SolutionDir)\packages\C5.2.4.5947.17249\lib\net45\C5.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="Google.Protobuf, Version=3.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Google.Protobuf.3.0.0-beta3\lib\dotnet\Google.Protobuf.dll</HintPath>
+      <HintPath>$(SolutionDir)\packages\Google.Protobuf.3.0.0-beta4\lib\net45\Google.Protobuf.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="GPSOAuthSharp, Version=0.0.5.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\GPSOAuthSharp.0.0.5\lib\GPSOAuthSharp.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>$(SolutionDir)\packages\EnterpriseLibrary.TransientFaultHandling.6.0.1304.0\lib\portable-net45+win+wp8\Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.Data, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>$(SolutionDir)\packages\EnterpriseLibrary.TransientFaultHandling.Data.6.0.1304.1\lib\NET45\Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.Data.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+      <HintPath>$(SolutionDir)\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="POGOProtos, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\POGOProtos\bin\Debug\POGOProtos.dll</HintPath>
+    </Reference>
     <Reference Include="S2Geometry, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\S2Geometry.1.0.3\lib\portable-net45+wp8+win8\S2Geometry.dll</HintPath>
+      <HintPath>$(SolutionDir)\packages\S2Geometry.1.0.1\lib\portable-net45+wp8+win8\S2Geometry.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Drawing" />
+    <Reference Include="System.Data.HashFunction.Core, Version=1.8.2.2, Culture=neutral, PublicKeyToken=80c9288e394c1322, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\System.Data.HashFunction.Core.1.8.2.2\lib\net45\System.Data.HashFunction.Core.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.Data.HashFunction.Interfaces, Version=1.0.0.2, Culture=neutral, PublicKeyToken=80c9288e394c1322, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\System.Data.HashFunction.Interfaces.1.0.0.2\lib\net45\System.Data.HashFunction.Interfaces.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.Data.HashFunction.xxHash, Version=1.8.2.2, Culture=neutral, PublicKeyToken=80c9288e394c1322, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\System.Data.HashFunction.xxHash.1.8.2.2\lib\net45\System.Data.HashFunction.xxHash.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
+      <HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="System.VarintBitConverter, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\VarintBitConverter.1.0.0.0\lib\Net40\System.VarintBitConverter.dll</HintPath>
+      <HintPath>$(SolutionDir)\packages\VarintBitConverter.1.0.0.0\lib\Net40\System.VarintBitConverter.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="System.Web" />
@@ -69,43 +113,46 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Exceptions\GoogleException.cs" />
+    <Compile Include="Exceptions\GoogleOfflineException.cs" />
+    <Compile Include="Exceptions\LoginFailedException.cs" />
     <Compile Include="Extensions\LatLongExtensions.cs" />
-    <Compile Include="ILatLong.cs" />
+    <Compile Include="HttpClient\PokemonClient.cs" />
     <Compile Include="Enums\AuthType.cs" />
-    <Compile Include="Enums\MiscEnums.cs" />
-    <Compile Include="Enums\RequestType.cs" />
-    <Compile Include="Exceptions\LoginFailedException.cs" />
-    <Compile Include="Exceptions\PtcOfflineException.cs" />
+    <Compile Include="Exceptions\AccessTokenExpiredException.cs" />
+    <Compile Include="Exceptions\AccountNotVerifiedException.cs" />
+    <Compile Include="Exceptions\InvalidResponseException.cs" />
+    <Compile Include="Exceptions\PTCOfflineException.cs" />
     <Compile Include="Extensions\DateTimeExtensions.cs" />
-    <Compile Include="GeneratedCode\AllEnum.cs" />
-    <Compile Include="GeneratedCode\Payloads.cs" />
-    <Compile Include="GeneratedCode\Request.cs" />
-    <Compile Include="GeneratedCode\Response.cs" />
     <Compile Include="Helpers\HttpClientHelper.cs" />
-    <Compile Include="Helpers\ProtoHelper.cs" />
+    <Compile Include="Helpers\JsonHelper.cs" />
     <Compile Include="Helpers\RetryHandler.cs" />
     <Compile Include="Helpers\S2Helper.cs" />
     <Compile Include="Helpers\Utils.cs" />
+    <Compile Include="ILatLong.cs" />
     <Compile Include="ISettings.cs" />
     <Compile Include="Login\GoogleLogin.cs" />
     <Compile Include="Login\ILoginType.cs" />
     <Compile Include="Login\PtcLogin.cs" />
+    <Compile Include="Rpc\BaseRpc.cs" />
+    <Compile Include="Rpc\Download.cs" />
+    <Compile Include="Rpc\Encounter.cs" />
+    <Compile Include="Rpc\Fort.cs" />
+    <Compile Include="Rpc\Inventory.cs" />
+    <Compile Include="Rpc\Login.cs" />
+    <Compile Include="Rpc\Map.cs" />
+    <Compile Include="Rpc\Misc.cs" />
+    <Compile Include="Rpc\Player.cs" />
     <None Include="app.config" />
     <Compile Include="Client.cs" />
     <Compile Include="Extensions\HttpClientExtensions.cs" />
     <Compile Include="Helpers\RandomHelper.cs" />
     <Compile Include="Helpers\RequestBuilder.cs" />
-    <Compile Include="ProtoAdditions.cs" />
     <Compile Include="Resources.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="ClassDiagram1.cd" />
     <None Include="packages.config" />
-    <None Include="Proto\AllEnum.proto" />
-    <None Include="Proto\Payloads.proto" />
-    <None Include="Proto\Response.proto" />
-    <None Include="Proto\Request.proto" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/PokemonGo/RocketAPI/Properties/AssemblyInfo.cs b/PokemonGo/RocketAPI/Properties/AssemblyInfo.cs
index 0d37ece..bd7c41f 100644
--- a/PokemonGo/RocketAPI/Properties/AssemblyInfo.cs
+++ b/PokemonGo/RocketAPI/Properties/AssemblyInfo.cs
@@ -1,20 +1,16 @@
-#region
-
-using System.Reflection;
+using System.Reflection;
 using System.Runtime.InteropServices;

-#endregion
-
 // General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.

-[assembly: AssemblyTitle("Pokemon Go Rocket API")]
+[assembly: AssemblyTitle("Pokémon Go Rocket API")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Pokemon Go Rocket API")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyProduct("PokemonGo.RocketAPI")]
+[assembly: AssemblyCopyright("Copyright © 2016")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

@@ -40,4 +36,4 @@ using System.Runtime.InteropServices;
 // [assembly: AssemblyVersion("1.0.*")]

 [assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/AllEnum.proto b/PokemonGo/RocketAPI/Proto/AllEnum.proto
deleted file mode 100644
index 47799ed..0000000
--- a/PokemonGo/RocketAPI/Proto/AllEnum.proto
+++ /dev/null
@@ -1,766 +0,0 @@
-syntax = "proto3";
-
-package AllEnum;
-
-enum RpcDirection {
-  UNKNOWN = 0;
-  RESPONSE = 1;
-  REQUEST = 2;
-}
-
-enum TeamColor {
-  NEUTRAL = 0;
-  BLUE = 1;
-  RED = 2;
-  YELLOW = 3;
-}
-
-
-enum RequestMethod {
-  METHOD_UNSET = 0;
-  PLAYER_UPDATE = 1;
-  GET_PLAYER = 2;
-  GET_INVENTORY = 4;
-  DOWNLOAD_SETTINGS = 5;
-  DOWNLOAD_ITEM_TEMPLATES = 6;
-  DOWNLOAD_REMOTE_CONFIG_VERSION = 7;
-  FORT_SEARCH = 101;
-  ENCOUNTER = 102;
-  CATCH_POKEMON = 103;
-  FORT_DETAILS = 104;
-  ITEM_USE = 105;
-  GET_MAP_OBJECTS = 106;
-  FORT_DEPLOY_POKEMON = 110;
-  FORT_RECALL_POKEMON = 111;
-  RELEASE_POKEMON = 112;
-  USE_ITEM_POTION = 113;
-  USE_ITEM_CAPTURE = 114;
-  USE_ITEM_FLEE = 115;
-  USE_ITEM_REVIVE = 116;
-  TRADE_SEARCH = 117;
-  TRADE_OFFER = 118;
-  TRADE_RESPONSE = 119;
-  TRADE_RESULT = 120;
-  GET_PLAYER_PROFILE = 121;
-  GET_ITEM_PACK = 122;
-  BUY_ITEM_PACK = 123;
-  BUY_GEM_PACK = 124;
-  EVOLVE_POKEMON = 125;
-  GET_HATCHED_EGGS = 126;
-  ENCOUNTER_TUTORIAL_COMPLETE = 127;
-  LEVEL_UP_REWARDS = 128;
-  CHECK_AWARDED_BADGES = 129;
-  USE_ITEM_GYM = 133;
-  GET_GYM_DETAILS = 134;
-  START_GYM_BATTLE = 135;
-  ATTACK_GYM = 136;
-  RECYCLE_INVENTORY_ITEM = 137;
-  COLLECT_DAILY_BONUS = 138;
-  USE_ITEM_XP_BOOST = 139;
-  USE_ITEM_EGG_INCUBATOR = 140;
-  USE_INCENSE = 141;
-  GET_INCENSE_POKEMON = 142;
-  INCENSE_ENCOUNTER = 143;
-  ADD_FORT_MODIFIER = 144;
-  DISK_ENCOUNTER = 145;
-  COLLECT_DAILY_DEFENDER_BONUS = 146;
-  UPGRADE_POKEMON = 147;
-  SET_FAVORITE_POKEMON = 148;
-  NICKNAME_POKEMON = 149;
-  EQUIP_BADGE = 150;
-  SET_CONTACT_SETTINGS = 151;
-  GET_ASSET_DIGEST = 300;
-  GET_DOWNLOAD_URLS = 301;
-  GET_SUGGESTED_CODENAMES = 401;
-  CHECK_CODENAME_AVAILABLE = 402;
-  CLAIM_CODENAME = 403;
-  SET_AVATAR = 404;
-  SET_PLAYER_TEAM = 405;
-  MARK_TUTORIAL_COMPLETE = 406;
-  LOAD_SPAWN_POINTS = 500;
-  ECHO = 666;
-  DEBUG_UPDATE_INVENTORY = 700;
-  DEBUG_DELETE_PLAYER = 701;
-  SFIDA_REGISTRATION = 800;
-  SFIDA_ACTION_LOG = 801;
-  SFIDA_CERTIFICATION = 802;
-  SFIDA_UPDATE = 803;
-  SFIDA_ACTION = 804;
-  SFIDA_DOWSER = 805;
-  SFIDA_CAPTURE = 806;
-}
-
-enum PokemonMove {
-  MOVE_UNSET = 0;
-  THUNDER_SHOCK = 1;
-  QUICK_ATTACK = 2;
-  SCRATCH = 3;
-  EMBER = 4;
-  VINE_WHIP = 5;
-  TACKLE = 6;
-  RAZOR_LEAF = 7;
-  TAKE_DOWN = 8;
-  WATER_GUN = 9;
-  BITE = 10;
-  POUND = 11;
-  DOUBLE_SLAP = 12;
-  WRAP = 13;
-  HYPER_BEAM = 14;
-  LICK = 15;
-  DARK_PULSE = 16;
-  SMOG = 17;
-  SLUDGE = 18;
-  METAL_CLAW = 19;
-  VICE_GRIP = 20;
-  FLAME_WHEEL = 21;
-  MEGAHORN = 22;
-  WING_ATTACK = 23;
-  FLAMETHROWER = 24;
-  SUCKER_PUNCH = 25;
-  DIG = 26;
-  LOW_KICK = 27;
-  CROSS_CHOP = 28;
-  PSYCHO_CUT = 29;
-  PSYBEAM = 30;
-  EARTHQUAKE = 31;
-  STONE_EDGE = 32;
-  ICE_PUNCH = 33;
-  HEART_STAMP = 34;
-  DISCHARGE = 35;
-  FLASH_CANNON = 36;
-  PECK = 37;
-  DRILL_PECK = 38;
-  ICE_BEAM = 39;
-  BLIZZARD = 40;
-  AIR_SLASH = 41;
-  HEAT_WAVE = 42;
-  TWINEEDLE = 43;
-  POISON_JAB = 44;
-  AERIAL_ACE = 45;
-  DRILL_RUN = 46;
-  PETAL_BLIZZARD = 47;
-  MEGA_DRAIN = 48;
-  BUG_BUZZ = 49;
-  POISON_FANG = 50;
-  NIGHT_SLASH = 51;
-  SLASH = 52;
-  BUBBLE_BEAM = 53;
-  SUBMISSION = 54;
-  KARATE_CHOP = 55;
-  LOW_SWEEP = 56;
-  AQUA_JET = 57;
-  AQUA_TAIL = 58;
-  SEED_BOMB = 59;
-  PSYSHOCK = 60;
-  ROCK_THROW = 61;
-  ANCIENT_POWER = 62;
-  ROCK_TOMB = 63;
-  ROCK_SLIDE = 64;
-  POWER_GEM = 65;
-  SHADOW_SNEAK = 66;
-  SHADOW_PUNCH = 67;
-  SHADOW_CLAW = 68;
-  OMINOUS_WIND = 69;
-  SHADOW_BALL = 70;
-  BULLET_PUNCH = 71;
-  MAGNET_BOMB = 72;
-  STEEL_WING = 73;
-  IRON_HEAD = 74;
-  PARABOLIC_CHARGE = 75;
-  SPARK = 76;
-  THUNDER_PUNCH = 77;
-  THUNDER = 78;
-  THUNDERBOLT = 79;
-  TWISTER = 80;
-  DRAGON_BREATH = 81;
-  DRAGON_PULSE = 82;
-  DRAGON_CLAW = 83;
-  DISARMING_VOICE = 84;
-  DRAINING_KISS = 85;
-  DAZZLING_GLEAM = 86;
-  MOONBLAST = 87;
-  PLAY_ROUGH = 88;
-  CROSS_POISON = 89;
-  SLUDGE_BOMB = 90;
-  SLUDGE_WAVE = 91;
-  GUNK_SHOT = 92;
-  MUD_SHOT = 93;
-  BONE_CLUB = 94;
-  BULLDOZE = 95;
-  MUD_BOMB = 96;
-  FURY_CUTTER = 97;
-  BUG_BITE = 98;
-  SIGNAL_BEAM = 99;
-  X_SCISSOR = 100;
-  FLAME_CHARGE = 101;
-  FLAME_BURST = 102;
-  FIRE_BLAST = 103;
-  BRINE = 104;
-  WATER_PULSE = 105;
-  SCALD = 106;
-  HYDRO_PUMP = 107;
-  PSYCHIC = 108;
-  PSYSTRIKE = 109;
-  ICE_SHARD = 110;
-  ICY_WIND = 111;
-  FROST_BREATH = 112;
-  ABSORB = 113;
-  GIGA_DRAIN = 114;
-  FIRE_PUNCH = 115;
-  SOLAR_BEAM = 116;
-  LEAF_BLADE = 117;
-  POWER_WHIP = 118;
-  SPLASH = 119;
-  ACID = 120;
-  AIR_CUTTER = 121;
-  HURRICANE = 122;
-  BRICK_BREAK = 123;
-  CUT = 124;
-  SWIFT = 125;
-  HORN_ATTACK = 126;
-  STOMP = 127;
-  HEADBUTT = 128;
-  HYPER_FANG = 129;
-  SLAM = 130;
-  BODY_SLAM = 131;
-  REST = 132;
-  STRUGGLE = 133;
-  SCALD_BLASTOISE = 134;
-  HYDRO_PUMP_BLASTOISE = 135;
-  WRAP_GREEN = 136;
-  WRAP_PINK = 137;
-  FURY_CUTTER_FAST = 200;
-  BUG_BITE_FAST = 201;
-  BITE_FAST = 202;
-  SUCKER_PUNCH_FAST = 203;
-  DRAGON_BREATH_FAST = 204;
-  THUNDER_SHOCK_FAST = 205;
-  SPARK_FAST = 206;
-  LOW_KICK_FAST = 207;
-  KARATE_CHOP_FAST = 208;
-  EMBER_FAST = 209;
-  WING_ATTACK_FAST = 210;
-  PECK_FAST = 211;
-  LICK_FAST = 212;
-  SHADOW_CLAW_FAST = 213;
-  VINE_WHIP_FAST = 214;
-  RAZOR_LEAF_FAST = 215;
-  MUD_SHOT_FAST = 216;
-  ICE_SHARD_FAST = 217;
-  FROST_BREATH_FAST = 218;
-  QUICK_ATTACK_FAST = 219;
-  SCRATCH_FAST = 220;
-  TACKLE_FAST = 221;
-  POUND_FAST = 222;
-  CUT_FAST = 223;
-  POISON_JAB_FAST = 224;
-  ACID_FAST = 225;
-  PSYCHO_CUT_FAST = 226;
-  ROCK_THROW_FAST = 227;
-  METAL_CLAW_FAST = 228;
-  BULLET_PUNCH_FAST = 229;
-  WATER_GUN_FAST = 230;
-  SPLASH_FAST = 231;
-  WATER_GUN_FAST_BLASTOISE = 232;
-  MUD_SLAP_FAST = 233;
-  ZEN_HEADBUTT_FAST = 234;
-  CONFUSION_FAST = 235;
-  POISON_STING_FAST = 236;
-  BUBBLE_FAST = 237;
-  FEINT_ATTACK_FAST = 238;
-  STEEL_WING_FAST = 239;
-  FIRE_FANG_FAST = 240;
-  ROCK_SMASH_FAST = 241;
-}
-
-enum ItemId {
-  ITEM_UNKNOWN = 0;
-  ITEM_POKE_BALL = 1;
-  ITEM_GREAT_BALL = 2;
-  ITEM_ULTRA_BALL = 3;
-  ITEM_MASTER_BALL = 4;
-  ITEM_POTION = 101;
-  ITEM_SUPER_POTION = 102;
-  ITEM_HYPER_POTION = 103;
-  ITEM_MAX_POTION = 104;
-  ITEM_REVIVE = 201;
-  ITEM_MAX_REVIVE = 202;
-  ITEM_LUCKY_EGG = 301;
-  ITEM_INCENSE_ORDINARY = 401;
-  ITEM_INCENSE_SPICY = 402;
-  ITEM_INCENSE_COOL = 403;
-  ITEM_INCENSE_FLORAL = 404;
-  ITEM_TROY_DISK = 501;
-  ITEM_X_ATTACK = 602;
-  ITEM_X_DEFENSE = 603;
-  ITEM_X_MIRACLE = 604;
-  ITEM_RAZZ_BERRY = 701;
-  ITEM_BLUK_BERRY = 702;
-  ITEM_NANAB_BERRY = 703;
-  ITEM_WEPAR_BERRY = 704;
-  ITEM_PINAP_BERRY = 705;
-  ITEM_SPECIAL_CAMERA = 801;
-  ITEM_INCUBATOR_BASIC_UNLIMITED = 901;
-  ITEM_INCUBATOR_BASIC = 902;
-  ITEM_POKEMON_STORAGE_UPGRADE = 1001;
-  ITEM_ITEM_STORAGE_UPGRADE = 1002;
-}
-
-enum InventoryUpgradeType {
-  UPGRADE_UNSET = 0;
-  INCREASE_ITEM_STORAGE = 1;
-  INCREASE_POKEMON_STORAGE = 2;
-}
-
-enum EggIncubatorType {
-  INCUBATOR_UNSET = 0;
-  INCUBATOR_DISTANCE = 1;
-}
-
-enum PokemonFamilyId {
-  FAMILY_UNSET = 0;
-  FAMILY_BULBASAUR = 1;
-  FAMILY_CHARMANDER = 4;
-  FAMILY_SQUIRTLE = 7;
-  FAMILY_CATERPIE = 10;
-  FAMILY_WEEDLE = 13;
-  FAMILY_PIDGEY = 16;
-  FAMILY_RATTATA = 19;
-  FAMILY_SPEAROW = 21;
-  FAMILY_EKANS = 23;
-  FAMILY_PIKACHU = 25;
-  FAMILY_SANDSHREW = 27;
-  FAMILY_NIDORAN = 29;
-  FAMILY_NIDORAN2 = 32;
-  FAMILY_CLEFAIRY = 35;
-  FAMILY_VULPIX = 37;
-  FAMILY_JIGGLYPUFF = 39;
-  FAMILY_ZUBAT = 41;
-  FAMILY_ODDISH = 43;
-  FAMILY_PARAS = 46;
-  FAMILY_VENONAT = 48;
-  FAMILY_DIGLETT = 50;
-  FAMILY_MEOWTH = 52;
-  FAMILY_PSYDUCK = 54;
-  FAMILY_MANKEY = 56;
-  FAMILY_GROWLITHE = 58;
-  FAMILY_POLIWAG = 60;
-  FAMILY_ABRA = 63;
-  FAMILY_MACHOP = 66;
-  FAMILY_BELLSPROUT = 69;
-  FAMILY_TENTACOOL = 72;
-  FAMILY_GEODUDE = 74;
-  FAMILY_PONYTA = 77;
-  FAMILY_SLOWPOKE = 79;
-  FAMILY_MAGNEMITE = 81;
-  FAMILY_FARFETCHD = 83;
-  FAMILY_DODUO = 84;
-  FAMILY_SEEL = 86;
-  FAMILY_GRIMER = 88;
-  FAMILY_SHELLDER = 90;
-  FAMILY_GASTLY = 92;
-  FAMILY_ONIX = 95;
-  FAMILY_DROWZEE = 96;
-  FAMILY_KRABBY = 98;
-  FAMILY_VOLTORB = 100;
-  FAMILY_EXEGGCUTE = 102;
-  FAMILY_CUBONE = 104;
-  FAMILY_HITMONLEE = 106;
-  FAMILY_HITMONCHAN = 107;
-  FAMILY_LICKITUNG = 108;
-  FAMILY_KOFFING = 109;
-  FAMILY_RHYHORN = 111;
-  FAMILY_CHANSEY = 113;
-  FAMILY_TANGELA = 114;
-  FAMILY_KANGASKHAN = 115;
-  FAMILY_HORSEA = 116;
-  FAMILY_GOLDEEN = 118;
-  FAMILY_STARYU = 120;
-  FAMILY_MR_MIME = 122;
-  FAMILY_SCYTHER = 123;
-  FAMILY_JYNX = 124;
-  FAMILY_ELECTABUZZ = 125;
-  FAMILY_MAGMAR = 126;
-  FAMILY_PINSIR = 127;
-  FAMILY_TAUROS = 128;
-  FAMILY_MAGIKARP = 129;
-  FAMILY_LAPRAS = 131;
-  FAMILY_DITTO = 132;
-  FAMILY_EEVEE = 133;
-  FAMILY_PORYGON = 137;
-  FAMILY_OMANYTE = 138;
-  FAMILY_KABUTO = 140;
-  FAMILY_AERODACTYL = 142;
-  FAMILY_SNORLAX = 143;
-  FAMILY_ARTICUNO = 144;
-  FAMILY_ZAPDOS = 145;
-  FAMILY_MOLTRES = 146;
-  FAMILY_DRATINI = 147;
-  FAMILY_MEWTWO = 150;
-  FAMILY_MEW = 151;
-}
-
-enum MapObjectsStatus {
-  UNSET_STATUS = 0;
-  SUCCESS = 1;
-  LOCATION_UNSET = 2;
-}
-
-enum FortType {
-  GYM = 0;
-  CHECKPOINT = 1;
-}
-
-enum PokemonId {
-  MISSINGNO = 0;
-  BULBASAUR = 1;
-  IVYSAUR = 2;
-  VENUSAUR = 3;
-  CHARMANDER = 4;
-  CHARMELEON = 5;
-  CHARIZARD = 6;
-  SQUIRTLE = 7;
-  WARTORTLE = 8;
-  BLASTOISE = 9;
-  CATERPIE = 10;
-  METAPOD = 11;
-  BUTTERFREE = 12;
-  WEEDLE = 13;
-  KAKUNA = 14;
-  BEEDRILL = 15;
-  PIDGEY = 16;
-  PIDGEOTTO = 17;
-  PIDGEOT = 18;
-  RATTATA = 19;
-  RATICATE = 20;
-  SPEAROW = 21;
-  FEAROW = 22;
-  EKANS = 23;
-  ARBOK = 24;
-  PIKACHU = 25;
-  RAICHU = 26;
-  SANDSHREW = 27;
-  SANDLASH = 28;
-  NIDORAN_FEMALE = 29;
-  NIDORINA = 30;
-  NIDOQUEEN = 31;
-  NIDORAN_MALE = 32;
-  NIDORINO = 33;
-  NIDOKING = 34;
-  CLEFAIRY  = 35;
-  CLEFABLE = 36;
-  VULPIX = 37;
-  NINETALES = 38;
-  JIGGLYPUFF = 39;
-  WIGGLYTUFF = 40;
-  ZUBAT = 41;
-  GOLBAT = 42;
-  ODDISH = 43;
-  GLOOM = 44;
-  VILEPLUME = 45;
-  PARAS = 46;
-  PARASECT = 47;
-  VENONAT = 48;
-  VENOMOTH = 49;
-  DIGLETT = 50;
-  DUGTRIO = 51;
-  MEOWTH = 52;
-  PERSIAN = 53;
-  PSYDUCK = 54;
-  GOLDUCK = 55;
-  MANKEY = 56;
-  PRIMEAPE = 57;
-  GROWLITHE = 58;
-  ARCANINE = 59;
-  POLIWAG = 60;
-  POLIWHIRL = 61;
-  POLIWRATH = 62;
-  ABRA = 63;
-  KADABRA = 64;
-  ALAKHAZAM = 65;
-  MACHOP = 66;
-  MACHOKE = 67;
-  MACHAMP = 68;
-  BELLSPROUT = 69;
-  WEEPINBELL = 70;
-  VICTREEBELL = 71;
-  TENTACOOL = 72;
-  TENTACRUEL = 73;
-  GEODUGE = 74;
-  GRAVELER = 75;
-  GOLEM = 76;
-  PONYTA = 77;
-  RAPIDASH = 78;
-  SLOWPOKE = 79;
-  SLOWBRO = 80;
-  MAGNEMITE = 81;
-  MAGNETON = 82;
-  FARFETCHD = 83;
-  DODUO = 84;
-  DODRIO = 85;
-  SEEL = 86;
-  DEWGONG = 87;
-  GRIMER = 88;
-  MUK = 89;
-  SHELLDER = 90;
-  CLOYSTER = 91;
-  GASTLY = 92;
-  HAUNTER = 93;
-  GENGAR = 94;
-  ONIX = 95;
-  DROWZEE = 96;
-  HYPNO = 97;
-  KRABBY = 98;
-  KINGLER = 99;
-  VOLTORB = 100;
-  ELECTRODE = 101;
-  EXEGGCUTE = 102;
-  EXEGGUTOR = 103;
-  CUBONE = 104;
-  MAROWAK = 105;
-  HITMONLEE = 106;
-  HITMONCHAN = 107;
-  LICKITUNG = 108;
-  KOFFING = 109;
-  WEEZING = 110;
-  RHYHORN = 111;
-  RHYDON = 112;
-  CHANSEY = 113;
-  TANGELA = 114;
-  KANGASKHAN = 115;
-  HORSEA = 116;
-  SEADRA = 117;
-  GOLDEEN = 118;
-  SEAKING = 119;
-  STARYU = 120;
-  STARMIE = 121;
-  MR_MIME = 122;
-  SCYTHER = 123;
-  JYNX = 124;
-  ELECTABUZZ = 125;
-  MAGMAR = 126;
-  PINSIR = 127;
-  TAUROS = 128;
-  MAGIKARP = 129;
-  GYARADOS = 130;
-  LAPRAS = 131;
-  DITTO = 132;
-  EEVEE = 133;
-  VAPOREON = 134;
-  JOLTEON = 135;
-  FLAREON = 136;
-  PORYGON = 137;
-  OMANYTE = 138;
-  OMASTAR = 139;
-  KABUTO = 140;
-  KABUTOPS = 141;
-  AERODACTYL = 142;
-  SNORLAX = 143;
-  ARTICUNO = 144;
-  ZAPDOS = 145;
-  MOLTRES = 146;
-  DRATINI = 147;
-  DRAGONAIR = 148;
-  DRAGONITE = 149;
-  MEWTWO = 150;
-  MEW = 151;
-}
-
-enum FortSponsor {
-  UNSET_SPONSOR = 0;
-  MCDONALDS = 1;
-  POKEMON_STORE = 2;
-}
-
-enum FortRenderingType {
-  DEFAULT = 0;
-  INTERNAL_TEST = 1;
-}
-
-enum ItemType {
-        ITEM_TYPE_NONE = 0;
-        ITEM_TYPE_POKEBALL = 1;
-        ITEM_TYPE_POTION = 2;
-        ITEM_TYPE_REVIVE = 3;
-        ITEM_TYPE_MAP = 4;
-        ITEM_TYPE_BATTLE = 5;
-        ITEM_TYPE_FOOD = 6;
-        ITEM_TYPE_CAMERA = 7;
-        ITEM_TYPE_DISK = 8;
-        ITEM_TYPE_INCUBATOR = 9;
-        ITEM_TYPE_INCENSE = 10;
-        ITEM_TYPE_XP_BOOST = 11;
-        ITEM_TYPE_INVENTORY_UPGRADE = 12;
-}
-
-enum ItemCategory {
-  ITEM_CATEGORY_NONE = 0;
-  ITEM_CATEGORY_POKEBALL = 1;
-  ITEM_CATEGORY_FOOD = 2;
-  ITEM_CATEGORY_MEDICINE = 3;
-  ITEM_CATEGORY_BOOST = 4;
-  ITEM_CATEGORY_UTILITES = 5;
-  ITEM_CATEGORY_CAMERA = 6;
-  ITEM_CATEGORY_DISK = 7;
-  ITEM_CATEGORY_INCUBATOR = 8;
-  ITEM_CATEGORY_INCENSE = 9;
-  ITEM_CATEGORY_XP_BOOST = 10;
-  ITEM_CATEGORY_INVENTORY_UPGRADE = 11;
-}
-
-enum ItemEffect {
-        ITEM_EFFECT_NONE = 0;
-        ITEM_EFFECT_CAP_NO_FLEE = 1000;
-        ITEM_EFFECT_CAP_NO_MOVEMENT = 1002;
-        ITEM_EFFECT_CAP_NO_THREAT = 1003;
-        ITEM_EFFECT_CAP_TARGET_MAX = 1004;
-        ITEM_EFFECT_CAP_TARGET_SLOW = 1005;
-        ITEM_EFFECT_CAP_CHANCE_NIGHT = 1006;
-        ITEM_EFFECT_CAP_CHANCE_TRAINER = 1007;
-        ITEM_EFFECT_CAP_CHANCE_FIRST_THROW = 1008;
-        ITEM_EFFECT_CAP_CHANCE_LEGEND = 1009;
-        ITEM_EFFECT_CAP_CHANCE_HEAVY = 1010;
-        ITEM_EFFECT_CAP_CHANCE_REPEAT = 1011;
-        ITEM_EFFECT_CAP_CHANCE_MULTI_THROW = 1012;
-        ITEM_EFFECT_CAP_CHANCE_ALWAYS = 1013;
-        ITEM_EFFECT_CAP_CHANCE_SINGLE_THROW = 1014;
-}
-
-enum ActivityType {
-  ACTIVITY_UNKNOWN = 0;
-  ACTIVITY_CATCH_POKEMON = 1;
-  ACTIVITY_CATCH_LEGEND_POKEMON = 2;
-  ACTIVITY_FLEE_POKEMON = 3;
-  ACTIVITY_DEFEAT_FORT = 4;
-  ACTIVITY_EVOLVE_POKEMON = 5;
-  ACTIVITY_HATCH_EGG = 6;
-  ACTIVITY_WALK_KM = 7;
-  ACTIVITY_POKEDEX_ENTRY_NEW = 8;
-  ACTIVITY_CATCH_FIRST_THROW = 9;
-  ACTIVITY_CATCH_NICE_THROW = 10;
-  ACTIVITY_CATCH_GREAT_THROW = 11;
-  ACTIVITY_CATCH_EXCELLENT_THROW = 12;
-  ACTIVITY_CATCH_CURVEBALL = 13;
-  ACTIVITY_CATCH_FIRST_CATCH_OF_DAY = 14;
-  ACTIVITY_CATCH_MILESTONE = 15;
-  ACTIVITY_TRAIN_POKEMON = 16;
-  ACTIVITY_SEARCH_FORT = 17;
-  ACTIVITY_RELEASE_POKEMON = 18;
-  ACTIVITY_HATCH_EGG_SMALL_BONUS = 19;
-  ACTIVITY_HATCH_EGG_MEDIUM_BONUS = 20;
-  ACTIVITY_HATCH_EGG_LARGE_BONUS = 21;
-  ACTIVITY_DEFEAT_GYM_DEFENDER = 22;
-  ACTIVITY_DEFEAT_GYM_LEADER = 23;
-}
-
-enum BadgeType {
-  BADGE_UNSET = 0;
-  BADGE_TRAVEL_KM = 1;
-  BADGE_POKEDEX_ENTRIES = 2;
-  BADGE_CAPTURE_TOTAL = 3;
-  BADGE_DEFEATED_FORT = 4;
-  BADGE_EVOLVED_TOTAL = 5;
-  BADGE_HATCHED_TOTAL = 6;
-  BADGE_ENCOUNTERED_TOTAL = 7;
-  BADGE_POKESTOPS_VISITED = 8;
-  BADGE_UNIQUE_POKESTOPS = 9;
-  BADGE_POKEBALL_THROWN = 10;
-  BADGE_BIG_MAGIKARP = 11;
-  BADGE_DEPLOYED_TOTAL = 12;
-  BADGE_BATTLE_ATTACK_WON = 13;
-  BADGE_BATTLE_TRAINING_WON = 14;
-  BADGE_BATTLE_DEFEND_WON = 15;
-  BADGE_PRESTIGE_RAISED = 16;
-  BADGE_PRESTIGE_DROPPED = 17;
-  BADGE_TYPE_NORMAL = 18;
-  BADGE_TYPE_FIGHTING = 19;
-  BADGE_TYPE_FLYING = 20;
-  BADGE_TYPE_POISON = 21;
-  BADGE_TYPE_GROUND = 22;
-  BADGE_TYPE_ROCK = 23;
-  BADGE_TYPE_BUG = 24;
-  BADGE_TYPE_GHOST = 25;
-  BADGE_TYPE_STEEL = 26;
-  BADGE_TYPE_FIRE = 27;
-  BADGE_TYPE_WATER = 28;
-  BADGE_TYPE_GRASS = 29;
-  BADGE_TYPE_ELECTRIC = 30;
-  BADGE_TYPE_PSYCHIC = 31;
-  BADGE_TYPE_ICE = 32;
-  BADGE_TYPE_DRAGON = 33;
-  BADGE_TYPE_DARK = 34;
-  BADGE_TYPE_FAIRY = 35;
-  BADGE_SMALL_RATTATA = 36;
-  BADGE_PIKACHU = 37;
-}
-
-enum HoloIapItemCategory {
-        IAP_CATEGORY_NONE = 0;
-        IAP_CATEGORY_BUNDLE = 1;
-        IAP_CATEGORY_ITEMS = 2;
-        IAP_CATEGORY_UPGRADES = 3;
-        IAP_CATEGORY_POKECOINS = 4;
-}
-
-enum CameraInterpolation {
-        CAM_INTERP_CUT = 0;
-        CAM_INTERP_LINEAR = 1;
-        CAM_INTERP_SMOOTH = 2;
-        CAM_INTERP_SMOOTH_ROT_LINEAR_MOVE = 3;
-        CAM_INTERP_DEPENDS = 4;
-}
-
-enum CameraTarget {
-        CAM_TARGET_ATTACKER = 0;
-        CAM_TARGET_ATTACKER_EDGE = 1;
-        CAM_TARGET_ATTACKER_GROUND = 2;
-        CAM_TARGET_DEFENDER = 3;
-        CAM_TARGET_DEFENDER_EDGE = 4;
-        CAM_TARGET_DEFENDER_GROUND = 5;
-        CAM_TARGET_ATTACKER_DEFENDER = 6;
-        CAM_TARGET_ATTACKER_DEFENDER_EDGE = 7;
-        CAM_TARGET_DEFENDER_ATTACKER = 8;
-        CAM_TARGET_DEFENDER_ATTACKER_EDGE = 9;
-        CAM_TARGET_ATTACKER_DEFENDER_MIRROR = 11;
-        CAM_TARGET_SHOULDER_ATTACKER_DEFENDER = 12;
-        CAM_TARGET_SHOULDER_ATTACKER_DEFENDER_MIRROR = 13;
-        CAM_TARGET_ATTACKER_DEFENDER_WORLD = 14;
-}
-
-enum PokemonType {
-  POKEMON_TYPE_NONE = 0;
-  POKEMON_TYPE_NORMAL = 1;
-  POKEMON_TYPE_FIGHTING = 2;
-  POKEMON_TYPE_FLYING = 3;
-  POKEMON_TYPE_POISON = 4;
-  POKEMON_TYPE_GROUND = 5;
-  POKEMON_TYPE_ROCK = 6;
-  POKEMON_TYPE_BUG = 7;
-  POKEMON_TYPE_GHOST = 8;
-  POKEMON_TYPE_STEEL = 9;
-  POKEMON_TYPE_FIRE = 10;
-  POKEMON_TYPE_WATER = 11;
-  POKEMON_TYPE_GRASS = 12;
-  POKEMON_TYPE_ELECTRIC = 13;
-  POKEMON_TYPE_PSYCHIC = 14;
-  POKEMON_TYPE_ICE = 15;
-  POKEMON_TYPE_DRAGON = 16;
-  POKEMON_TYPE_DARK = 17;
-  POKEMON_TYPE_FAIRY = 18;
-}
-
-enum PokemonMovementType {
-  MOVEMENT_STATIC = 0;
-  MOVEMENT_JUMP = 1;
-  MOVEMENT_VERTICAL = 2;
-  MOVEMENT_PSYCHIC = 3;
-  MOVEMENT_ELECTRIC = 4;
-  MOVEMENT_FLYING = 5;
-  MOVEMENT_HOVERING = 6;
-}
-
-enum PokemonClass {
-  NORMAL = 0;
-  LEGENDARY = 1;
-  MYTHIC = 2;
-}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/Payloads.proto b/PokemonGo/RocketAPI/Proto/Payloads.proto
deleted file mode 100644
index 3b71b5b..0000000
--- a/PokemonGo/RocketAPI/Proto/Payloads.proto
+++ /dev/null
@@ -1,909 +0,0 @@
-syntax = "proto3";
-
-package PokemonGo.RocketAPI.GeneratedCode;
-
-import "AllEnum.proto";
-
-message GetPlayerResponse {
-    int32 unknown1 = 1;
-    Profile profile = 2;
-}
-
-message Profile {
-  int64 creation_time = 1;
-  string username = 2;
-  AllEnum.TeamColor team = 5;
-  bytes tutorial = 7;
-  AvatarDetails avatar = 8;
-  int32 poke_storage = 9;
-  int32 item_storage = 10;
-  DailyBonus daily_bonus = 11;
-  bytes unknown12 = 12;
-  bytes unknown13 = 13;
-  repeated Currency currency = 14;
-}
-
-message DailyBonus {
-  int64 NextCollectTimestampMs = 1;
-  int64 NextDefenderBonusCollectTimestampMs = 2;
-}
-
-message Currency {
-  string type = 1;
-  int32 amount = 2;
-}
-
-message AvatarDetails {
-  int32 unknown2 = 2;
-  int32 unknown3 = 3;
-  int32 unknown9 = 9;
-  int32 unknown10 = 10;
-}
-
-message DownloadSettingsRequest {
-  string hash = 1;
-}
-
-message GetInventoryResponse {
-  bool success = 1;
-  InventoryDelta inventory_delta = 2;
-}
-
-message InventoryDelta {
-  int64 original_timestamp_ms = 1;
-  int64 new_timestamp_ms = 2;
-  repeated InventoryItem inventory_items = 3;
-}
-
-message InventoryItem {
-  int64 modified_timestamp_ms = 1;
-  int64 deleted_item_key = 2;
-  InventoryItemData inventory_item_data = 3;
-}
-
-message InventoryItemData {
-  PokemonData pokemon = 1;
-  Item item = 2;
-  PokedexEntry pokedex_entry = 3;
-  PlayerStats player_stats = 4;
-  PlayerCurrency player_currency = 5;
-  PlayerCamera player_camera = 6;
-  InventoryUpgrades inventory_upgrades = 7;
-  AppliedItems applied_items = 8;
-  EggIncubators egg_incubators = 9;
-  PokemonFamily pokemon_family = 10;
-}
-
-message Pokemon {
-  int32 id = 1;
-  AllEnum.PokemonId pokemon_type = 2;
-  int32 cp = 3;
-  int32 stamina = 4;
-  int32 stamina_max = 5;
-  AllEnum.PokemonMove move_1 = 6;
-  AllEnum.PokemonMove move_2 = 7;
-  int32 deployed_fort_id = 8;
-  string owner_name = 9;
-  bool is_egg = 10;
-  int32 egg_km_walked_target = 11;
-  int32 egg_km_walked_start = 12;
-  int32 origin = 14;
-  float height_m = 15;
-  float weight_kg = 16;
-  int32 individual_attack = 17;
-  int32 individual_defense = 18;
-  int32 individual_stamina = 19;
-  int32 cp_multiplier = 20;
-  int32 pokeball = 21;
-  uint64 captured_cell_id = 22;
-  int32 battles_attacked = 23;
-  int32 battles_defended = 24;
-  int32 egg_incubator_id = 25;
-  uint64 creation_time_ms = 26;
-  int32 num_upgrades = 27;
-  int32 additional_cp_multiplier = 28;
-  int32 favorite = 29;
-  string nickname = 30;
-  int32 from_fort = 31;
-}
-
-message Item {
-  AllEnum.ItemType item = 1;
-  int32 count = 2;
-  bool unseen = 3;
-}
-
-message PokedexEntry {
-  int32 pokedex_entry_number = 1;
-  int32 times_encountered = 2;
-  int32 times_captured = 3;
-  int32 evolution_stone_pieces = 4;
-  int32 evolution_stones = 5;
-}
-
-message PlayerStats {
-  int32 level = 1;
-  int64 experience = 2;
-  int64 prev_level_xp = 3;
-  int64 next_level_xp = 4;
-  float km_walked = 5;
-  int32 pokemons_encountered = 6;
-  int32 unique_pokedex_entries = 7;
-  int32 pokemons_captured = 8;
-  int32 evolutions = 9;
-  int32 poke_stop_visits = 10;
-  int32 pokeballs_thrown = 11;
-  int32 eggs_hatched = 12;
-  int32 big_magikarp_caught = 13;
-  int32 battle_attack_won = 14;
-  int32 battle_attack_total = 15;
-  int32 battle_defended_won = 16;
-  int32 battle_training_won = 17;
-  int32 battle_training_total = 18;
-  int32 prestige_raised_total = 19;
-  int32 prestige_dropped_total = 20;
-  int32 pokemon_deployed = 21;
-  bytes pokemon_caught_by_type = 22; // TODO: repeated PokemonType ??
-  int32 small_rattata_caught = 23;
-}
-
-message PlayerCurrency {
-  int32 gems = 1;
-}
-
-message PlayerCamera {
-  bool is_default_camera = 1;
-}
-
-message InventoryUpgrades {
-  repeated InventoryUpgrade inventory_upgrades = 1;
-}
-
-message InventoryUpgrade {
-  AllEnum.ItemType item = 1;
-  AllEnum.InventoryUpgradeType upgrade_type = 2;
-  int32 additional_storage = 3;
-}
-
-message AppliedItems {
-  AppliedItem item = 4;
-}
-
-message AppliedItem {
-  AllEnum.ItemId item_type = 1;
-  AllEnum.ItemType item_type_category = 2;
-  int64 expire_ms = 3;
-  int64 applied_ms = 4;
-}
-
-message EggIncubators {
-  EggIncubator egg_incubator = 1;
-}
-
-message EggIncubator {
-  string item_id = 1;
-  AllEnum.ItemType item_type = 2;
-  AllEnum.EggIncubatorType incubator_type = 3;
-  int32 uses_remaining = 4;
-  int64 pokemon_id = 5; // TODO: Check if is PokemonType
-  double start_km_walked = 6;
-  double target_km_walked = 7;
-}
-
-message PokemonFamily {
-  AllEnum.PokemonFamilyId family_id = 1;
-  int32 candy = 2;
-}
-
-message GetMapObjectsRequest {
-  bytes cell_id = 1;
-  bytes since_timestamp_ms = 2;
-  double latitude = 3;
-  double longitude = 4;
-}
-
-message GetMapObjectsResponse {
-  repeated MapCell map_cells = 1;
-  AllEnum.MapObjectsStatus status = 2;
-}
-
-message MapCell {
-  // S2 geographic area that the cell covers (http://s2map.com/) (https://code.google.com/archive/p/s2-geometry-library/)
-  uint64 s2_cell_id = 1;
-  int64 current_timestamp_ms = 2;
-  repeated FortData forts = 3;
-  repeated SpawnPoint spawn_points = 4;
-  repeated string deleted_objects = 6;
-  bool is_truncated_list = 7;
-  repeated FortSummary fort_summaries = 8;
-  repeated SpawnPoint decimated_spawn_points = 9;
-
-  // Pokemon within 2 steps or less.
-  repeated WildPokemon wild_pokemons = 5;
-  // Pokemon within 1 step or none.
-  repeated MapPokemon catchable_pokemons = 10;
-  // Pokemon farther away than 2 steps, but still in the area.
-  repeated NearbyPokemon nearby_pokemons = 11;
-}
-
-message FortData {
-  string id = 1;
-  int64 last_modified_timestamp_ms = 2;
-  double latitude = 3;
-  double longitude = 4;
-  bool enabled = 8;
-  AllEnum.FortType type = 9;
-
-  //// Fields related to gyms only
-
-  // Team that owns the gym
-  AllEnum.TeamColor owned_by_team = 5;
-
-  // Highest CP Pokemon at the gym
-  AllEnum.PokemonId guard_pokemon_id = 6;
-  int32 guard_pokemon_cp = 7;
-
-  // Prestigate / experience of the gym
-  int64 gym_points = 10;
-
-  // Whether someone is battling at the gym currently
-  bool is_in_battle = 11;
-
-  //// Fields related to pokestops only
-
-  // Timestamp when the pokestop can be activated again to get items / xp
-  int64 cooldown_complete_timestamp_ms = 14;
-
-  AllEnum.FortSponsor sponsor = 15;
-  AllEnum.FortRenderingType rendering_type = 16;
-
-  // Might represent the type of item applied to the pokestop, right now only lures can be applied
-  bytes active_fort_modifier = 12;
-  FortLureInfo lure_info = 13;
-}
-
-message FortLureInfo {
-  string fort_id = 1;
-  double unknown2 = 2;
-  AllEnum.PokemonId active_pokemon_id = 3;
-  int64 lure_expires_timestamp_ms = 4;
-}
-
-message SpawnPoint {
-  double latitude = 2;
-  double longitude = 3;
-}
-
-message FortSummary {
-  int32 fort_summary_id = 1;
-  int32 last_modified_timestamp_ms = 2;
-  int32 latitude = 3;
-  int32 longitude = 4;
-}
-
-message WildPokemon {
-  fixed64 encounter_id = 1;
-  int64 last_modified_timestamp_ms = 2;
-  double latitude = 3;
-  double longitude = 4;
-  string spawnpoint_id = 5;
-  PokemonData pokemon_data = 7;
-  int32 time_till_hidden_ms = 11;
-}
-
-message PokemonData {
-  fixed64 id = 1;
-  AllEnum.PokemonId pokemon_id = 2;
-  int32 cp = 3;
-  int32 stamina = 4;
-  int32 stamina_max = 5;
-  AllEnum.PokemonMove move_1 = 6;
-  AllEnum.PokemonMove move_2 = 7;
-  int32 deployed_fort_id = 8;
-  string owner_name = 9;
-  bool is_egg = 10;
-  int32 egg_km_walked_target = 11;
-  int32 egg_km_walked_start = 12;
-  int32 origin = 14;
-  float height_m = 15;
-  float weight_kg = 16;
-  int32 individual_attack = 17;
-  int32 individual_defense = 18;
-  int32 individual_stamina = 19;
-  int32 cp_multiplier = 20;
-  int32 pokeball = 21;
-  uint64 captured_cell_id = 22;
-  int32 battles_attacked = 23;
-  int32 battles_defended = 24;
-  int32 egg_incubator_id = 25;
-  uint64 creation_time_ms = 26;
-  int32 num_upgrades = 27;
-  int32 additional_cp_multiplier = 28;
-  int32 favorite = 29;
-  string nickname = 30;
-  int32 from_fort = 31;
-}
-
-message MapPokemon {
-  string spawnpoint_id = 1;
-  fixed64 encounter_id = 2;
-  AllEnum.PokemonId pokemon_id = 3;
-  // After this timestamp, the pokemon will be gone.
-  int64 expiration_timestamp_ms = 4;
-  double latitude = 5;
-  double longitude = 6;
-}
-
-message NearbyPokemon {
-  AllEnum.PokemonId pokemon_id = 1;
-  float distance_in_meters = 2;
-  fixed64 encounter_id = 3;
-}
-
-message DownloadSettingsResponse {
-  string error = 1;
-  string hash = 2;
-  GlobalSettings settings = 3;
-}
-
-message GlobalSettings {
-  FortSettings fort_settings = 2;
-  MapSettings map_settings = 3;
-  LevelSettings level_settings = 4;
-  InventorySettings inventory_settings = 5;
-  string minimum_client_version = 6;
-}
-
-message FortSettings {
-  double interaction_range_meters = 1;
-  int32 max_total_deployed_pokemon = 2;
-  int32 max_player_deployed_pokemon = 3;
-  double deploy_stamina_multiplier = 4;
-  double deploy_attack_multiplier = 5;
-  double far_interaction_range_meters = 6;
-}
-
-message MapSettings {
-  double pokemon_visible_range = 1;
-  double poke_nav_range_meters = 2;
-  double encounter_range_meters = 3;
-  float get_map_objects_min_refresh_seconds = 4;
-  float get_map_objects_max_refresh_seconds = 5;
-  float get_map_objects_min_distance_meters = 6;
-  string google_maps_api_key = 7;
-}
-
-message LevelSettings {
-  double trainer_cp_modifier = 2;
-  double trainer_difficulty_modifier = 3;
-}
-
-message InventorySettings {
-  int32 max_pokemon = 1;
-  int32 max_bag_items = 2;
-  int32 base_pokemon = 3;
-  int32 base_bag_items = 4;
-  int32 base_eggs = 5;
-}
-
-message PlayerUpdateRequest {
-  double latitude = 1;
-  double longitude = 2;
-}
-
-message PlayerUpdateResponse {
-  repeated WildPokemon wild_pokemons = 1;
-  repeated FortData forts = 2;
-  int32 forts_nearby = 3;
-}
-
-message DownloadItemTemplatesRequest {
-	// No message needed.
-}
-
-message DownloadItemTemplatesResponse {
-  bool success = 1;
-  repeated ItemTemplate item_templates = 2;
-  uint64 timestamp_ms = 3;
-
-  message ItemTemplate {
-    string template_id = 1;
-
-    PokemonSettings pokemon_settings = 2;
-    ItemSettings item_settings = 3;
-    MoveSettings move_settings = 4;
-    MoveSequenceSettings move_sequence_settings = 5;
-    TypeEffectiveSettings type_effective = 8;
-    BadgeSettings badge_settings = 10;
-    CameraSettings camera = 11;
-    PlayerLevelSettings player_level = 12;
-    GymLevelSettings gym_level = 13;
-    GymBattleSettings battle_settings = 14;
-    EncounterSettings encounter_settings = 15;
-    IapItemDisplay iap_item_display = 16;
-    IapSettings iap_settings = 17;
-    PokemonUpgradeSettings pokemon_upgrades = 18;
-    EquippedBadgeSettings equipped_badges = 19;
-  }
-}
-
-message UseItemCaptureRequest {
-  AllEnum.ItemId item_id = 1;
-  fixed64 encounter_id = 2;
-  string spawn_point_guid = 3;
-}
-
-message UseItemCaptureResponse {
-  bool success = 1;
-  double item_capture_mult = 2;
-  double item_flee_mult = 3;
-  bool stop_movement = 4;
-  bool stop_attack = 5;
-  bool target_max = 6;
-  bool target_slow = 7;
-}
-
-message ReleasePokemonRequest {
-  fixed64 pokemon_id = 1;
-}
-
-message ReleasePokemonResponse {
-  Result result = 1;
-  int32 candy_awarded = 2;
-
-  enum Result {
-    UNSET = 0;
-    SUCCESS = 1;
-    POKEMON_DEPLOYED = 2;
-    FAILED = 3;
-    ERROR_POKEMON_IS_EGG = 4;
-  }
-}
-
-message GetHatchedEggsRequest {
-  // No message needed.
-}
-
-// Confirm if this is correct, I think that it should be "repeated HatchedEgg hatched_eggs" or something like that.
-message GetHatchedEggsResponse {
-  bool success = 1;
-  repeated uint64 pokemon_id = 2 [packed=true]; // Might be POGOProtos.Enums.Pokemon
-  repeated int32 experience_awarded = 3;
-  repeated int32 candy_awarded = 4;
-  repeated int32 stardust_awarded = 5;
-}
-
-message FortSearchRequest {
-  string fort_id = 1;
-  double player_latitude = 2;
-  double player_longitude = 3;
-  double fort_latitude = 4;
-  double fort_longitude = 5;
-}
-
-message FortSearchResponse {
-  Result result = 1;
-  repeated ItemAward items_awarded = 2;
-  int32 gems_awarded = 3;
-  PokemonData pokemon_data_egg = 4;
-  int32 experience_awarded = 5;
-  int64 cooldown_complete_timestamp_ms = 6;
-  int32 chain_hack_sequence_number = 7;
-
-  message ItemAward {
-    AllEnum.ItemId item_id = 1;
-    int32 item_count = 2;
-  }
-
-  enum Result {
-    NO_RESULT_SET = 0;
-    SUCCESS = 1;
-    OUT_OF_RANGE = 2;
-    IN_COOLDOWN_PERIOD = 3;
-    INVENTORY_FULL = 4;
-  }
-}
-
-message FortDetailsRequest {
-  string fort_id = 1;
-  double latitude = 2;
-  double longitude = 3;
-}
-
-message FortDetailsResponse {
-  string fort_id = 1;
-  AllEnum.TeamColor team_color = 2;
-  PokemonData pokemon_data = 3;
-  string name = 4;
-  repeated string image_urls = 5;
-  int32 fp = 6;
-  int32 stamina = 7;
-  int32 max_stamina = 8;
-  AllEnum.FortType type = 9;
-  double latitude = 10;
-  double longitude = 11;
-  string description = 12;
-  repeated FortModifier modifiers = 13;
-}
-
-message FortModifier {
-  AllEnum.ItemId item_id = 1;
-  int64 expiration_timestamp_ms = 2;
-  string deployer_player_codename = 3;
-}
-
-message EncounterRequest {
-  fixed64 encounter_id = 1;
-  string spawnpoint_id = 2;
-  double player_latitude = 3;
-  double player_longitude = 4;
-}
-
-message EncounterResponse {
-  WildPokemon wild_pokemon = 1;
-  Background background = 2;
-  Status status = 3;
-  CaptureProbability capture_probability = 4;
-
-  enum Background {
-    PARK = 0;
-    DESERT = 1;
-  }
-
-  enum Status {
-    ENCOUNTER_ERROR = 0;
-    ENCOUNTER_SUCCESS = 1;
-    ENCOUNTER_NOT_FOUND = 2;
-    ENCOUNTER_CLOSED = 3;
-    ENCOUNTER_POKEMON_FLED = 4;
-    ENCOUNTER_NOT_IN_RANGE = 5;
-    ENCOUNTER_ALREADY_HAPPENED = 6;
-    POKEMON_INVENTORY_FULL = 7;
-  }
-}
-
-message CaptureProbability {
-  repeated AllEnum.ItemId pokeball_type = 1;
-  repeated float capture_probability = 2;
-  double reticle_difficulty_scale = 12;
-}
-
-message DiskEncounterRequest {
-  fixed64 encounter_id = 1;
-  string fort_id = 2;
-  double player_latitude = 3;
-  double player_longitude = 4;
-}
-
-message DiskEncounterResponse {
-  Result result = 1;
-  PokemonData pokemon_data = 2;
-  CaptureProbability capture_probability = 3;
-
-  enum Result {
-    UNKNOWN = 0;
-    SUCCESS = 1;
-    NOT_AVAILABLE = 2;
-    NOT_IN_RANGE = 3;
-    ENCOUNTER_ALREADY_FINISHED = 4;
-    POKEMON_INVENTORY_FULL = 5;
-  }
-}
-
-message CatchPokemonRequest {
-  fixed64 encounter_id = 1;
-  int32 pokeball = 2;
-  double normalized_reticle_size = 3;
-  string spawn_point_guid = 4;
-  bool hit_pokemon = 5;
-  double spin_modifier = 6;
-  double NormalizedHitPosition = 7;
-}
-
-message CatchPokemonResponse {
-  CatchStatus status = 1;
-  double miss_percent = 2;
-  uint64 captured_pokemon_id = 3;
-  CaptureScore scores = 4;
-
-  enum CatchStatus {
-    CATCH_ERROR = 0;
-    CATCH_SUCCESS = 1;
-    CATCH_ESCAPE = 2;
-    CATCH_FLEE = 3;
-    CATCH_MISSED = 4;
-  }
-}
-
-message CaptureScore {
-  repeated AllEnum.ActivityType activity_type = 1;
-  repeated int32 xp = 2;
-  repeated int32 candy = 3;
-  repeated int32 stardust = 4;
-}
-
-message CheckAwardedBadgesRequest {
-	// No message needed.
-}
-
-// Confirm if this is correct, I think that it should be "repeated AwardedBadge awarded_badges" or something like that.
-message CheckAwardedBadgesResponse {
-  bool success = 1;
-  repeated AllEnum.BadgeType awarded_badges = 2;
-  repeated int32 awarded_badge_levels = 3;
-}
-
-message EquippedBadgeSettings {
-  int64 equip_badge_cooldown_ms = 1;
-  repeated float catch_probability_bonus = 2;
-  repeated float flee_probability_bonus = 3;
-}
-
-message PokemonUpgradeSettings {
-  int32 upgrades_per_level = 1;
-  int32 allowed_levels_above_player = 2;
-  repeated int32 candy_cost = 3;
-  repeated int32 stardust_cost = 4;
-}
-
-message IapSettings {
-  int32 daily_bonus_coins = 1;
-  repeated int32 daily_defender_bonus_per_pokemon = 2;
-  int32 daily_defender_bonus_max_defenders = 3;
-  repeated string daily_defender_bonus_currency = 4;
-  int64 min_time_between_claims_ms = 5;
-  bool daily_bonus_enabled = 6;
-  bool daily_defender_bonus_enabled = 7;
-}
-
-message IapItemDisplay {
-  string sku = 1;
-  AllEnum.HoloIapItemCategory category = 2;
-  int32 sort_order = 3;
-  repeated AllEnum.ItemId item_ids = 4;
-  repeated int32 counts = 5;
-}
-
-message EncounterSettings {
-  float spin_bonus_threshold = 1;
-  float excellent_throw_threshold = 2;
-  float great_throw_threshold = 3;
-  float nice_throw_threshold = 4;
-  int32 milestone_threshold = 5;
-}
-
-message GymBattleSettings {
-  float energy_per_sec = 1;
-  float dodge_energy_cost = 2;
-  float retarget_seconds = 3;
-  float enemy_attack_interval = 4;
-  float attack_server_interval = 5;
-  float round_duration_seconds = 6;
-  float bonus_time_per_ally_seconds = 7;
-  int32 maximum_attackers_per_battle = 8;
-  float same_type_attack_bonus_multiplier = 9;
-  int32 maximum_energy = 10;
-  float energy_delta_per_health_lost = 11;
-  int32 dodge_duration_ms = 12;
-  int32 minimum_player_level = 13;
-  int32 swap_duration_ms = 14;
-}
-
-message GymLevelSettings {
-	repeated int32 required_experience = 1;
-	repeated int32 leader_slots = 2;
-	repeated int32 trainer_slots = 3;
-	repeated int32 search_roll_bonus = 4;
-}
-
-message PlayerLevelSettings {
-	repeated int32 rank_num = 1;
-	repeated int32 required_experience = 2;
-	repeated float cp_multiplier = 3;
-	int32 max_egg_player_level = 4;
-	int32 max_encounter_player_level = 5;
-}
-
-message CameraSettings {
-	string next_camera = 1;
-	repeated AllEnum.CameraInterpolation interpolation = 2;
-	repeated AllEnum.CameraTarget target_type = 3;
-	repeated float ease_in_speed = 4;
-	repeated float east_out_speed = 5;
-	repeated float duration_seconds = 6;
-	repeated float wait_seconds = 7;
-	repeated float transition_seconds = 8;
-	repeated float angle_degree = 9;
-	repeated float angle_offset_degree = 10;
-	repeated float pitch_degree = 11;
-	repeated float pitch_offset_degree = 12;
-	repeated float roll_degree = 13;
-	repeated float distance_meters = 14;
-	repeated float height_percent = 15;
-	repeated float vert_ctr_ratio = 16;
-}
-
-message BadgeSettings {
-  AllEnum.BadgeType badge_type = 1;
-  int32 badge_rank = 2;
-  repeated int32 targets = 3;
-}
-
-message TypeEffectiveSettings {
-  repeated float attack_scalar = 1;
-  AllEnum.PokemonType attack_type = 2;
-}
-
-message MoveSequenceSettings {
-  repeated string sequence = 1;
-}
-
-message MoveSettings {
-  AllEnum.PokemonMovementType movement_id = 1;
-  int32 animation_id = 2;
-  AllEnum.PokemonType pokemon_type = 3;
-  float power = 4;
-  float accuracy_chance = 5;
-  float critical_chance = 6;
-  float heal_scalar = 7;
-  float stamina_loss_scalar = 8;
-  int32 trainer_level_min = 9;
-  int32 trainer_level_max = 10;
-  string vfx_name = 11;
-  int32 duration_ms = 12;
-  int32 damage_window_start_ms = 13;
-  int32 damage_window_end_ms = 14;
-  int32 energy_delta = 15;
-}
-
-message PokemonSettings {
-  AllEnum.PokemonId pokemon_id = 1;
-  float model_scale = 3;
-  AllEnum.PokemonType type = 4;
-  AllEnum.PokemonType type_2 = 5;
-  CameraAttributes camera = 6;
-  EncounterAttributes encounter = 7;
-  StatsAttributes stats = 8;
-  repeated AllEnum.PokemonMove quick_moves = 9;
-  repeated AllEnum.PokemonMove cinematic_moves = 10;
-  repeated float animation_time = 11;
-  repeated AllEnum.PokemonId evolution_ids = 12;
-  int32 evolution_pips = 13;
-  AllEnum.PokemonClass class = 14;
-  float pokedex_height_m = 15;
-  float pokedex_weight_kg = 16;
-  AllEnum.PokemonId parent_pokemon_id = 17;
-  float height_std_dev = 18;
-  float weight_std_dev = 19;
-  float km_distance_to_hatch = 20;
-  AllEnum.PokemonFamilyId family_id = 21;
-  int32 candy_to_evolve = 22;
-}
-
-message CameraAttributes {
-  float disk_radius_m = 1;
-  float cylinder_radius_m = 2;
-  float cylinder_height_m = 3;
-  float cylinder_ground_m = 4;
-  float shoulder_mode_scale = 5;
-}
-
-message EncounterAttributes {
-  float base_capture_rate = 1;
-  float base_flee_rate = 2;
-  float collision_radius_m = 3;
-  float collision_height_m = 4;
-  float collision_head_radius_m = 5;
-  AllEnum.PokemonMovementType movement_type = 6;
-  float movement_timer_s = 7;
-  float jump_time_s = 8;
-  float attack_timer_s = 9;
-}
-
-message StatsAttributes {
-  int32 base_stamina = 1;
-  int32 base_attack = 2;
-  int32 base_defense = 3;
-  int32 dodge_energy_delta = 8;
-}
-
-message ItemSettings {
-  AllEnum.ItemId item_id = 1;
-  AllEnum.ItemType item_type = 2;
-  AllEnum.ItemCategory category = 3;
-  float drop_freq = 4;
-  int32 drop_trainer_level = 5;
-
-  // One of the below attributes will be set in the response, the other will be null.
-
-  PokeballAttributes pokeball = 6;
-  PotionAttributes potion = 7;
-  ReviveAttributes revive = 8;
-  BattleAttributes battle = 9;
-  FoodAttributes food = 10;
-  InventoryUpgradeAttributes inventory_upgrade = 11;
-  ExperienceBoostAttributes xp_boost = 12;
-  IncenseAttributes incense = 13;
-  EggIncubatorAttributes egg_incubator = 14;
-  FortModifierAttributes fort_modifier = 15;
-}
-
-message BattleAttributes {
-  float sta_percent = 1;
-}
-
-message EggIncubatorAttributes {
-  AllEnum.EggIncubatorType incubator_type = 1;
-  int32 uses = 2;
-  float distance_multiplier = 3;
-}
-
-message ExperienceBoostAttributes {
-  float xp_multiplier = 1;
-  int32 boost_duration_ms = 2;
-}
-
-message FoodAttributes {
-  repeated AllEnum.ItemEffect item_effect = 1;
-  repeated float item_effect_percent = 2;
-  float growth_percent = 3;
-}
-
-message FortModifierAttributes {
-  int32 modifier_lifetime_seconds = 1;
-  int32 troy_disk_num_pokemon_spawned = 2;
-}
-
-message IncenseAttributes {
-  int32 incense_lifetime_seconds = 1;
-  repeated AllEnum.PokemonType pokemon_type = 2;
-  float pokemon_incense_type_probability = 3;
-  int32 standing_time_between_encounters_seconds = 4;
-  int32 moving_time_between_encounter_seconds = 5;
-  int32 distance_required_for_shorter_interval_meters = 6;
-  int32 pokemon_attracted_length_sec = 7;
-}
-
-message InventoryUpgradeAttributes {
-  int32 additional_storage = 1;
-  AllEnum.InventoryUpgradeType upgrade_type = 2;
-}
-
-message PokeballAttributes {
-  AllEnum.ItemEffect item_effect = 1;
-  float capture_multi = 2;
-  float capture_multi_effect = 3;
-  float item_effect_mod = 4;
-}
-
-message PotionAttributes {
-  float sta_percent = 1;
-  int32 sta_amount = 2;
-}
-
-message ReviveAttributes {
-  float sta_percent = 1;
-}
-
-// POKEMON TRANSFER
-message TransferPokemon {
-    fixed64 PokemonId = 1;
-}
-
-message TransferPokemonOut {
-    int32 Status = 1;
-    int32 CandyAwarded = 2;
-}
-
-// EVOLVE
-message EvolvePokemon {
-    fixed64 PokemonId = 1;
-}
-
-
-message EvolvePokemonOut {
-    int32 Result = 1;
-    Pokemon EvolvedPokemon = 2;
-    int32 ExpAwarded = 3;
-    int32 CandyAwarded = 4;
-}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/Request.proto b/PokemonGo/RocketAPI/Proto/Request.proto
deleted file mode 100644
index 1f937bf..0000000
--- a/PokemonGo/RocketAPI/Proto/Request.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-syntax = "proto3";
-
-package PokemonGo.RocketAPI.GeneratedCode;
-
-message Request {
-  int32 unknown1 = 1;
-  int64 rpc_id = 3;
-  repeated Requests requests = 4;
-  Unknown6 unknown6 = 6;
-  fixed64 latitude = 7;
-  fixed64 longitude = 8;
-  fixed64 altitude = 9;
-  AuthInfo auth = 10;
-  UnknownAuth unknownauth = 11;
-  int64 unknown12 = 12;
-
-
-  message UnknownAuth {
-    bytes unknown71 = 1;
-    int64 timestamp = 2;
-    bytes unknown73 = 3;
-  }
-
-  message Requests {
-    int32 type = 1;
-    bytes message = 2;
-  }
-
-  message Unknown3 {
-    string unknown4 = 1;
-  }
-
-  message Unknown6 {
-    int32 unknown1 = 1;
-    Unknown2 unknown2 = 2;
-
-    message Unknown2 {
-      bytes unknown1 = 1;
-    }
-
-  }
-
-  message AuthInfo {
-    string provider = 1;
-    JWT token = 2;
-
-    message JWT {
-      string contents = 1;
-      int32 unknown13  = 2;
-    }
-  }
-	message PlayerUpdateProto {
-	fixed64 Lat = 1;
-	fixed64 Lng = 2;
-	}
-
-	message MapObjectsRequest
-	{
-		bytes cellIds = 1;
-		bytes unknown14 = 2;
-		fixed64 latitude = 3;
-		fixed64 longitude = 4;
-	}
-
-	 message FortSearchRequest
-	{
-		bytes Id = 1;
-		fixed64 PlayerLatDegrees = 2;
-		fixed64 PlayerLngDegrees = 3;
-		fixed64 FortLatDegrees = 4;
-		fixed64 FortLngDegrees = 5;
-	}
-
-	message FortDetailsRequest
-	{
-  		bytes Id = 1;
-		fixed64 Latitude = 2;
-		fixed64 Longitude = 3;
-	}
-
-	 message EncounterRequest {
-		 fixed64 EncounterId = 1;
-		 string SpawnpointId = 2;
-		 fixed64 PlayerLatDegrees = 3;
-		 fixed64 PlayerLngDegrees = 4;
-	}
-
-	 message CatchPokemonRequest {
-		fixed64 EncounterId = 1;
-		int32 Pokeball = 2;
-		fixed64 NormalizedReticleSize = 3;
-		string SpawnPointGuid = 4;
-		int32 HitPokemon = 5;
-		fixed64 SpinModifier = 6;
-		fixed64 NormalizedHitPosition = 7;
-	}
-
-	message SettingsGuid
-	{
-		bytes guid = 1;
-	}
-
-	message Time
-	{
-		int64 time = 1;
-	}
-
-}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/Response.proto b/PokemonGo/RocketAPI/Proto/Response.proto
deleted file mode 100644
index e2f3aa7..0000000
--- a/PokemonGo/RocketAPI/Proto/Response.proto
+++ /dev/null
@@ -1,29 +0,0 @@
-syntax = "proto3";
-
-package PokemonGo.RocketAPI.GeneratedCode;
-
-message Response {
-  int32 unknown1 = 1;
-  int64 unknown2 = 2;
-  string api_url = 3;
-  Unknown6 unknown6 = 6;
-  Auth auth = 7;
-  repeated bytes payload = 100;
-  string errorMessage = 101;
-
-  message Unknown6 {
-    int32 unknown1 = 1;
-    Unknown2 unknown2 = 2;
-
-    message Unknown2 {
-      bytes unknown1 = 1;
-    }
-
-  }
-
-  message Auth {
-    bytes unknown71 = 1;
-    int64 timestamp = 2;
-    bytes unknown73 = 3;
-  }
-}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/README.md b/PokemonGo/RocketAPI/README.md
new file mode 100644
index 0000000..80b7dda
--- /dev/null
+++ b/PokemonGo/RocketAPI/README.md
@@ -0,0 +1,2 @@
+# POGOProtos-0.31.0
+POGOProtos for 0.31.0 with signature included - for educational purposes only!
diff --git a/PokemonGo/RocketAPI/Rpc/BaseRpc.cs b/PokemonGo/RocketAPI/Rpc/BaseRpc.cs
new file mode 100644
index 0000000..bfe5cd0
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/BaseRpc.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using PokemonGo.RocketAPI.Enums;
+using PokemonGo.RocketAPI.Extensions;
+using PokemonGo.RocketAPI.Helpers;
+using POGOProtos.Networking.Envelopes;
+using POGOProtos.Networking.Requests;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class BaseRpc
+    {
+        protected Client _client;
+        protected RequestBuilder RequestBuilder => new RequestBuilder(_client.AuthToken, _client.AuthType, _client.CurrentLatitude, _client.CurrentLongitude, _client.CurrentAltitude, _client.Settings, _client.AuthTicket);
+        protected string ApiUrl => $"https://{_client.ApiUrl}/rpc";
+        protected BaseRpc(Client client)
+        {
+            _client = client;
+        }
+
+        protected async Task<TResponsePayload> PostProtoPayload<TRequest, TResponsePayload>(RequestType type, IMessage message) where TRequest : IMessage<TRequest>
+            where TResponsePayload : IMessage<TResponsePayload>, new()
+        {
+            var requestEnvelops = RequestBuilder.GetRequestEnvelope(type, message);
+            return await _client.PokemonHttpClient.PostProtoPayload<TRequest, TResponsePayload>(ApiUrl, requestEnvelops, _client.ApiFailure);
+        }
+
+        protected async Task<TResponsePayload> PostProtoPayload<TRequest, TResponsePayload>(RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+            where TResponsePayload : IMessage<TResponsePayload>, new()
+        {
+            return await _client.PokemonHttpClient.PostProtoPayload<TRequest, TResponsePayload>(ApiUrl, requestEnvelope, _client.ApiFailure);
+        }
+
+        protected async Task<Tuple<T1, T2>> PostProtoPayload<TRequest, T1, T2>(RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+            where T1 : class, IMessage<T1>, new()
+            where T2 : class, IMessage<T2>, new()
+        {
+            var responses = await PostProtoPayload<TRequest>(requestEnvelope, typeof (T1), typeof (T2));
+            return new Tuple<T1, T2>(responses[0] as T1, responses[1] as T2);
+        }
+
+        protected async Task<Tuple<T1, T2, T3>> PostProtoPayload<TRequest, T1, T2, T3>(RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+            where T1 : class, IMessage<T1>, new()
+            where T2 : class, IMessage<T2>, new()
+            where T3 : class, IMessage<T3>, new()
+        {
+            var responses = await PostProtoPayload<TRequest>(requestEnvelope, typeof(T1), typeof(T2), typeof(T3));
+            return new Tuple<T1, T2, T3>(responses[0] as T1, responses[1] as T2, responses[2] as T3);
+        }
+
+        protected async Task<Tuple<T1, T2, T3, T4>> PostProtoPayload<TRequest, T1, T2, T3, T4>(RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+            where T1 : class, IMessage<T1>, new()
+            where T2 : class, IMessage<T2>, new()
+            where T3 : class, IMessage<T3>, new()
+            where T4 : class, IMessage<T4>, new()
+        {
+            var responses = await PostProtoPayload<TRequest>(requestEnvelope, typeof(T1), typeof(T2), typeof(T3), typeof(T4));
+            return new Tuple<T1, T2, T3, T4>(responses[0] as T1, responses[1] as T2, responses[2] as T3, responses[3] as T4);
+        }
+        protected async Task<Tuple<T1, T2, T3, T4, T5>> PostProtoPayload<TRequest, T1, T2, T3, T4, T5>(RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+            where T1 : class, IMessage<T1>, new()
+            where T2 : class, IMessage<T2>, new()
+            where T3 : class, IMessage<T3>, new()
+            where T4 : class, IMessage<T4>, new()
+            where T5 : class, IMessage<T5>, new()
+        {
+            var responses = await PostProtoPayload<TRequest>(requestEnvelope, typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5));
+            return new Tuple<T1, T2, T3, T4, T5>(responses[0] as T1, responses[1] as T2, responses[2] as T3, responses[3] as T4, responses[3] as T5);
+        }
+
+        protected async Task<IMessage[]> PostProtoPayload<TRequest>(RequestEnvelope requestEnvelope, params Type[] responseTypes) where TRequest : IMessage<TRequest>
+        {
+            return await _client.PokemonHttpClient.PostProtoPayload<TRequest>(ApiUrl, requestEnvelope, _client.ApiFailure, responseTypes);
+        }
+
+        protected async Task<ResponseEnvelope> PostProto<TRequest>(RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+        {
+            return await _client.PokemonHttpClient.PostProto<TRequest>(ApiUrl, requestEnvelope);
+        }
+        protected async Task<ResponseEnvelope> PostProto<TRequest>(string url, RequestEnvelope requestEnvelope) where TRequest : IMessage<TRequest>
+        {
+            return await _client.PokemonHttpClient.PostProto<TRequest>(url, requestEnvelope);
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/Rpc/Download.cs b/PokemonGo/RocketAPI/Rpc/Download.cs
new file mode 100644
index 0000000..6389fdd
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Download.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using PokemonGo.RocketAPI.Helpers;
+using POGOProtos.Enums;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Download : BaseRpc
+    {
+        public Download(Client client) : base(client)
+        {
+        }
+        public async Task<DownloadSettingsResponse> GetSettings()
+        {
+            var message = new DownloadSettingsMessage
+            {
+                Hash = "05daf51635c82611d1aac95c0b051d3ec088a930"
+            };
+
+            return await PostProtoPayload<Request, DownloadSettingsResponse>(RequestType.DownloadSettings, message);
+        }
+
+        public async Task<DownloadItemTemplatesResponse> GetItemTemplates()
+        {
+            return await PostProtoPayload<Request, DownloadItemTemplatesResponse>(RequestType.DownloadItemTemplates, new DownloadItemTemplatesMessage());
+        }
+
+        public async Task<DownloadRemoteConfigVersionResponse> GetRemoteConfigVersion(uint appVersion, string deviceManufacturer, string deviceModel, string locale, Platform platform)
+        {
+            return await PostProtoPayload<Request, DownloadRemoteConfigVersionResponse>(RequestType.DownloadRemoteConfigVersion, new DownloadRemoteConfigVersionMessage()
+            {
+                AppVersion = appVersion,
+                DeviceManufacturer = deviceManufacturer,
+                DeviceModel = deviceModel,
+                Locale = locale,
+                Platform = platform
+            });
+        }
+
+        public async Task<GetAssetDigestResponse> GetAssetDigest(uint appVersion, string deviceManufacturer, string deviceModel, string locale, Platform platform)
+        {
+            return await PostProtoPayload<Request, GetAssetDigestResponse>(RequestType.GetAssetDigest, new GetAssetDigestMessage()
+            {
+                AppVersion = appVersion,
+                DeviceManufacturer = deviceManufacturer,
+                DeviceModel = deviceModel,
+                Locale = locale,
+                Platform = platform
+            });
+        }
+
+        public async Task<GetDownloadUrlsResponse> GetDownloadUrls(IEnumerable<string> assetIds)
+        {
+            return await PostProtoPayload<Request, GetDownloadUrlsResponse>(RequestType.GetDownloadUrls, new GetDownloadUrlsMessage()
+            {
+                AssetId = { assetIds }
+            });
+        }
+
+    }
+}
diff --git a/PokemonGo/RocketAPI/Rpc/Encounter.cs b/PokemonGo/RocketAPI/Rpc/Encounter.cs
new file mode 100644
index 0000000..539e22d
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Encounter.cs
@@ -0,0 +1,93 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using POGOProtos.Enums;
+using POGOProtos.Inventory.Item;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Encounter : BaseRpc
+    {
+        public Encounter(Client client) : base(client) { }
+
+        public async Task<EncounterResponse> EncounterPokemon(ulong encounterId, string spawnPointGuid)
+        {
+            var message = new EncounterMessage
+            {
+                EncounterId = encounterId,
+                SpawnPointId = spawnPointGuid,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, EncounterResponse>(RequestType.Encounter, message);
+        }
+
+        public async Task<UseItemCaptureResponse> UseCaptureItem(ulong encounterId, ItemId itemId, string spawnPointId)
+        {
+            var message = new UseItemCaptureMessage
+            {
+                EncounterId = encounterId,
+                ItemId = itemId,
+                SpawnPointId = spawnPointId
+            };
+
+            return await PostProtoPayload<Request, UseItemCaptureResponse>(RequestType.UseItemCapture, message);
+        }
+
+        public async Task<CatchPokemonResponse> CatchPokemon(ulong encounterId, string spawnPointGuid, ItemId pokeballItemId, double normalizedRecticleSize = 1.950, double spinModifier = 1, double normalizedHitPos = 1)
+        {
+            var message = new CatchPokemonMessage
+            {
+                EncounterId = encounterId,
+                Pokeball = pokeballItemId,
+                SpawnPointId = spawnPointGuid,
+                HitPokemon = true,
+                NormalizedReticleSize = normalizedRecticleSize,
+                SpinModifier = spinModifier,
+                NormalizedHitPosition = normalizedHitPos
+            };
+
+            return await PostProtoPayload<Request, CatchPokemonResponse>(RequestType.CatchPokemon, message);
+        }
+
+        public async Task<IncenseEncounterResponse> EncounterIncensePokemon(ulong encounterId, string encounterLocation)
+        {
+            var message = new IncenseEncounterMessage()
+            {
+                EncounterId = encounterId,
+                EncounterLocation = encounterLocation
+            };
+
+            return await PostProtoPayload<Request, IncenseEncounterResponse>(RequestType.IncenseEncounter, message);
+        }
+
+        public async Task<DiskEncounterResponse> EncounterLurePokemon(ulong encounterId, string fortId)
+        {
+            var message = new DiskEncounterMessage()
+            {
+                EncounterId = encounterId,
+                FortId = fortId,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, DiskEncounterResponse>(RequestType.DiskEncounter, message);
+        }
+
+        public async Task<EncounterTutorialCompleteResponse> EncounterTutorialComplete(PokemonId pokemonId)
+        {
+            var message = new EncounterTutorialCompleteMessage()
+            {
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, EncounterTutorialCompleteResponse>(RequestType.EncounterTutorialComplete, message);
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/Rpc/Fort.cs b/PokemonGo/RocketAPI/Rpc/Fort.cs
new file mode 100644
index 0000000..b2e06a4
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Fort.cs
@@ -0,0 +1,134 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using Google.Protobuf.Collections;
+using PokemonGo.RocketAPI;
+using PokemonGo.RocketAPI.Rpc;
+using POGOProtos.Data.Battle;
+using POGOProtos.Inventory.Item;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Fort : BaseRpc
+    {
+        public Fort(Client client) : base(client) { }
+
+        public async Task<FortDetailsResponse> GetFort(string fortId, double fortLatitude, double fortLongitude)
+        {
+            var message = new FortDetailsMessage
+            {
+                FortId = fortId,
+                Latitude = fortLatitude,
+                Longitude = fortLongitude
+            };
+
+            return await PostProtoPayload<Request, FortDetailsResponse>(RequestType.FortDetails, message);
+        }
+
+        public async Task<FortSearchResponse> SearchFort(string fortId, double fortLat, double fortLng)
+        {
+            var message = new FortSearchMessage
+            {
+                FortId = fortId,
+                FortLatitude = fortLat,
+                FortLongitude = fortLng,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, FortSearchResponse>(RequestType.FortSearch, message);
+        }
+
+        public async Task<AddFortModifierResponse> AddFortModifier(string fortId, ItemId modifierType)
+        {
+            var message = new AddFortModifierMessage()
+            {
+                FortId = fortId,
+                ModifierType = modifierType,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, AddFortModifierResponse>(RequestType.AddFortModifier, message);
+        }
+
+        public async Task<AttackGymResponse> AttackGym(string fortId, string battleId, List<BattleAction> battleActions, BattleAction lastRetrievedAction)
+        {
+            var message = new AttackGymMessage()
+            {
+                BattleId = battleId,
+                GymId = fortId,
+                LastRetrievedActions = lastRetrievedAction,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude,
+                AttackActions = { battleActions }
+            };
+
+            message.AttackActions.AddRange(battleActions);
+
+            return await PostProtoPayload<Request, AttackGymResponse>(RequestType.AttackGym, message);
+        }
+
+        public async Task<FortDeployPokemonResponse> FortDeployPokemon(string fortId, ulong pokemonId)
+        {
+            var message = new FortDeployPokemonMessage()
+            {
+                PokemonId = pokemonId,
+                FortId = fortId,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, FortDeployPokemonResponse>(RequestType.FortDeployPokemon, message);
+        }
+
+        public async Task<FortRecallPokemonResponse> FortRecallPokemon(string fortId, ulong pokemonId)
+        {
+            var message = new FortRecallPokemonMessage()
+            {
+                PokemonId = pokemonId,
+                FortId = fortId,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, FortRecallPokemonResponse>(RequestType.FortRecallPokemon, message);
+        }
+
+        public async Task<GetGymDetailsResponse> GetGymDetails(string gymId, double gymLat, double gymLng)
+        {
+            var message = new GetGymDetailsMessage()
+            {
+                GymId = gymId,
+                GymLatitude = gymLat,
+                GymLongitude = gymLng,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, GetGymDetailsResponse>(RequestType.GetGymDetails, message);
+        }
+
+        public async Task<StartGymBattleResponse> StartGymBattle(string gymId, ulong defendingPokemonId, IEnumerable<ulong> attackingPokemonIds)
+        {
+            var message = new StartGymBattleMessage()
+            {
+                GymId = gymId,
+                DefendingPokemonId = defendingPokemonId,
+                AttackingPokemonIds = { attackingPokemonIds},
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, StartGymBattleResponse>(RequestType.StartGymBattle, message);
+        }
+
+
+    }
+}
diff --git a/PokemonGo/RocketAPI/Rpc/Inventory.cs b/PokemonGo/RocketAPI/Rpc/Inventory.cs
new file mode 100644
index 0000000..ffe964b
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Inventory.cs
@@ -0,0 +1,159 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using POGOProtos.Enums;
+using POGOProtos.Inventory.Item;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Inventory : BaseRpc
+    {
+        public Inventory(Client client) : base(client)
+        {
+        }
+
+        public async Task<ReleasePokemonResponse> TransferPokemon(ulong pokemonId)
+        {
+            var message = new ReleasePokemonMessage
+            {
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, ReleasePokemonResponse>(RequestType.ReleasePokemon, message);
+        }
+
+        public async Task<EvolvePokemonResponse> EvolvePokemon(ulong pokemonId)
+        {
+            var message = new EvolvePokemonMessage
+            {
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, EvolvePokemonResponse>(RequestType.EvolvePokemon, message);
+        }
+
+        public async Task<UpgradePokemonResponse> UpgradePokemon(ulong pokemonId)
+        {
+            var message = new UpgradePokemonMessage()
+            {
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, UpgradePokemonResponse>(RequestType.UpgradePokemon, message);
+        }
+
+        public async Task<GetInventoryResponse> GetInventory()
+        {
+            return await PostProtoPayload<Request, GetInventoryResponse>(RequestType.GetInventory, new GetInventoryMessage());
+        }
+
+        public async Task<RecycleInventoryItemResponse> RecycleItem(ItemId itemId, int amount)
+        {
+            var message = new RecycleInventoryItemMessage
+            {
+                ItemId = itemId,
+                Count = amount
+            };
+
+            return await PostProtoPayload<Request, RecycleInventoryItemResponse>(RequestType.RecycleInventoryItem, message);
+        }
+
+        public async Task<UseItemXpBoostResponse> UseItemXpBoost()
+        {
+            var message = new UseItemXpBoostMessage()
+            {
+                ItemId = ItemId.ItemLuckyEgg
+            };
+
+            return await PostProtoPayload<Request, UseItemXpBoostResponse>(RequestType.UseItemXpBoost, message);
+        }
+
+        public async Task<UseItemEggIncubatorResponse> UseItemEggIncubator(string itemId, ulong pokemonId)
+        {
+            var message = new UseItemEggIncubatorMessage()
+            {
+                ItemId = itemId,
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, UseItemEggIncubatorResponse>(RequestType.UseItemEggIncubator, message);
+        }
+
+        public async Task<GetHatchedEggsResponse> GetHatchedEgg()
+        {
+            return await PostProtoPayload<Request, GetHatchedEggsResponse>(RequestType.GetHatchedEggs, new GetHatchedEggsMessage());
+        }
+
+        public async Task<UseItemPotionResponse> UseItemPotion(ItemId itemId, ulong pokemonId)
+        {
+            var message = new UseItemPotionMessage()
+            {
+                ItemId = itemId,
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, UseItemPotionResponse>(RequestType.UseItemPotion, message);
+        }
+
+        public async Task<UseItemEggIncubatorResponse> UseItemRevive(ItemId itemId, ulong pokemonId)
+        {
+            var message = new UseItemReviveMessage()
+            {
+                ItemId = itemId,
+                PokemonId = pokemonId
+            };
+
+            return await PostProtoPayload<Request, UseItemEggIncubatorResponse>(RequestType.UseItemEggIncubator, message);
+        }
+
+        public async Task<UseIncenseResponse> UseIncense(ItemId incenseType)
+        {
+            var message = new UseIncenseMessage()
+            {
+                IncenseType = incenseType
+            };
+
+            return await PostProtoPayload<Request, UseIncenseResponse>(RequestType.UseIncense, message);
+        }
+
+        public async Task<UseItemGymResponse> UseItemInGym(string gymId, ItemId itemId)
+        {
+            var message = new UseItemGymMessage()
+            {
+                ItemId = itemId,
+                GymId = gymId,
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, UseItemGymResponse>(RequestType.UseItemGym, message);
+        }
+
+        public async Task<NicknamePokemonResponse> NicknamePokemon(ulong pokemonId, string nickName)
+        {
+            var message = new NicknamePokemonMessage()
+            {
+                PokemonId = pokemonId,
+                Nickname = nickName
+            };
+
+            return await PostProtoPayload<Request, NicknamePokemonResponse>(RequestType.NicknamePokemon, message);
+        }
+
+        public async Task<SetFavoritePokemonResponse> SetFavoritePokemon(ulong pokemonId, bool isFavorite)
+        {
+            var message = new SetFavoritePokemonMessage()
+            {
+                PokemonId = pokemonId,
+                IsFavorite = isFavorite
+            };
+
+            return await PostProtoPayload<Request, SetFavoritePokemonResponse>(RequestType.SetFavoritePokemon, message);
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Rpc/Login.cs b/PokemonGo/RocketAPI/Rpc/Login.cs
new file mode 100644
index 0000000..921697e
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Login.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using PokemonGo.RocketAPI.Enums;
+using PokemonGo.RocketAPI.Exceptions;
+using PokemonGo.RocketAPI.Extensions;
+using PokemonGo.RocketAPI.Helpers;
+using PokemonGo.RocketAPI.Login;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public delegate void GoogleDeviceCodeDelegate(string code, string uri);
+    public class Login : BaseRpc
+    {
+        //public event GoogleDeviceCodeDelegate GoogleDeviceCodeEvent;
+        private ILoginType login;
+
+        public Login(Client client) : base(client)
+        {
+            login = SetLoginType(client.Settings);
+        }
+
+        private static ILoginType SetLoginType(ISettings settings)
+        {
+            switch (settings.AuthType)
+            {
+                case AuthType.Google:
+                    return new GoogleLogin(settings.GoogleUsername, settings.GooglePassword);
+                case AuthType.Ptc:
+                    return new PtcLogin(settings.PtcUsername, settings.PtcPassword);
+                default:
+                    throw new ArgumentOutOfRangeException(nameof(settings.AuthType), "Unknown AuthType");
+            }
+        }
+
+        public async Task DoLogin()
+        {
+            _client.AuthToken = await login.GetAccessToken().ConfigureAwait(false);
+            await SetServer().ConfigureAwait(false);
+        }
+
+        private async Task SetServer()
+        {
+            #region Standard intial request messages in right Order
+
+            var getPlayerMessage = new GetPlayerMessage();
+            var getHatchedEggsMessage = new GetHatchedEggsMessage();
+            var getInventoryMessage = new GetInventoryMessage
+            {
+                LastTimestampMs = DateTime.UtcNow.ToUnixTime()
+            };
+            var checkAwardedBadgesMessage = new CheckAwardedBadgesMessage();
+            var downloadSettingsMessage = new DownloadSettingsMessage
+            {
+                Hash = "05daf51635c82611d1aac95c0b051d3ec088a930"
+            };
+
+            #endregion
+
+            var serverRequest = RequestBuilder.GetInitialRequestEnvelope(
+                new Request
+                {
+                    RequestType = RequestType.GetPlayer,
+                    RequestMessage = getPlayerMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.GetHatchedEggs,
+                    RequestMessage = getHatchedEggsMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.GetInventory,
+                    RequestMessage = getInventoryMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.CheckAwardedBadges,
+                    RequestMessage = checkAwardedBadgesMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.DownloadSettings,
+                    RequestMessage = downloadSettingsMessage.ToByteString()
+                });
+
+
+            var serverResponse = await PostProto<Request>(Resources.RpcUrl, serverRequest);
+
+            if (serverResponse.AuthTicket == null)
+            {
+                _client.AuthToken = null;
+                throw new AccessTokenExpiredException();
+            }
+
+            _client.AuthTicket = serverResponse.AuthTicket;
+            _client.ApiUrl = serverResponse.ApiUrl;
+        }
+
+    }
+}
diff --git a/PokemonGo/RocketAPI/Rpc/Map.cs b/PokemonGo/RocketAPI/Rpc/Map.cs
new file mode 100644
index 0000000..6f40581
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Map.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using PokemonGo.RocketAPI.Extensions;
+using PokemonGo.RocketAPI.Helpers;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Map : BaseRpc
+    {
+        public Map(Client client) : base(client)
+        {
+        }
+
+        public async Task<Tuple<GetMapObjectsResponse, GetHatchedEggsResponse, GetInventoryResponse, CheckAwardedBadgesResponse, DownloadSettingsResponse>> GetMapObjects()
+        {
+            #region Messages
+
+            var getMapObjectsMessage = new GetMapObjectsMessage
+            {
+                CellId = { S2Helper.GetNearbyCellIds(_client.CurrentLongitude, _client.CurrentLatitude) },
+                SinceTimestampMs = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+                Latitude = _client.CurrentLatitude,
+                Longitude = _client.CurrentLongitude
+            };
+            var getHatchedEggsMessage = new GetHatchedEggsMessage();
+            var getInventoryMessage = new GetInventoryMessage
+            {
+                LastTimestampMs = DateTime.UtcNow.ToUnixTime()
+            };
+            var checkAwardedBadgesMessage = new CheckAwardedBadgesMessage();
+            var downloadSettingsMessage = new DownloadSettingsMessage
+            {
+                Hash = "05daf51635c82611d1aac95c0b051d3ec088a930"
+            };
+
+            #endregion
+
+            var request = RequestBuilder.GetRequestEnvelope(
+                new Request
+                {
+                    RequestType = RequestType.GetMapObjects,
+                    RequestMessage = getMapObjectsMessage.ToByteString()
+                },
+                new Request
+                {
+                    RequestType = RequestType.GetHatchedEggs,
+                    RequestMessage = getHatchedEggsMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.GetInventory,
+                    RequestMessage = getInventoryMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.CheckAwardedBadges,
+                    RequestMessage = checkAwardedBadgesMessage.ToByteString()
+                }, new Request
+                {
+                    RequestType = RequestType.DownloadSettings,
+                    RequestMessage = downloadSettingsMessage.ToByteString()
+                });
+            return await PostProtoPayload<Request, GetMapObjectsResponse, GetHatchedEggsResponse, GetInventoryResponse, CheckAwardedBadgesResponse, DownloadSettingsResponse>(request);
+        }
+
+        public async Task<GetIncensePokemonResponse> GetIncensePokemons()
+        {
+            var message = new GetIncensePokemonMessage()
+            {
+                PlayerLatitude = _client.CurrentLatitude,
+                PlayerLongitude = _client.CurrentLongitude
+            };
+
+            return await PostProtoPayload<Request, GetIncensePokemonResponse>(RequestType.GetIncensePokemon, message);
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/Rpc/Misc.cs b/PokemonGo/RocketAPI/Rpc/Misc.cs
new file mode 100644
index 0000000..5f48874
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Misc.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Misc : BaseRpc
+    {
+        public Misc(Client client) : base(client)
+        {
+        }
+
+
+        public async Task<ClaimCodenameResponse> ClaimCodename(string codename)
+        {
+            return
+                await
+                    PostProtoPayload<Request, ClaimCodenameResponse>(RequestType.ClaimCodename,
+                        new ClaimCodenameMessage()
+                        {
+                            Codename = codename
+                        });
+        }
+
+        public async Task<CheckCodenameAvailableResponse> CheckCodenameAvailable(string codename)
+        {
+            return
+                await
+                    PostProtoPayload<Request, CheckCodenameAvailableResponse>(RequestType.CheckCodenameAvailable,
+                        new CheckCodenameAvailableMessage()
+                        {
+                            Codename = codename
+                        });
+        }
+
+        public async Task<GetSuggestedCodenamesResponse> GetSuggestedCodenames()
+        {
+            return await PostProtoPayload<Request, GetSuggestedCodenamesResponse>(RequestType.GetSuggestedCodenames, new GetSuggestedCodenamesMessage());
+        }
+
+        public async Task<EchoResponse> SendEcho()
+        {
+            return await PostProtoPayload<Request, EchoResponse>(RequestType.Echo, new EchoMessage());
+        }
+
+        public async Task<EncounterTutorialCompleteResponse> MarkTutorialComplete()
+        {
+            return await PostProtoPayload<Request, EncounterTutorialCompleteResponse>(RequestType.MarkTutorialComplete, new MarkTutorialCompleteMessage());
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Rpc/Player.cs b/PokemonGo/RocketAPI/Rpc/Player.cs
new file mode 100644
index 0000000..42e413f
--- /dev/null
+++ b/PokemonGo/RocketAPI/Rpc/Player.cs
@@ -0,0 +1,115 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using PokemonGo.RocketAPI.Extensions;
+using PokemonGo.RocketAPI.Helpers;
+using POGOProtos.Data.Player;
+using POGOProtos.Enums;
+using POGOProtos.Networking.Requests;
+using POGOProtos.Networking.Requests.Messages;
+using POGOProtos.Networking.Responses;
+
+namespace PokemonGo.RocketAPI.Rpc
+{
+    public class Player : BaseRpc
+    {
+        public Player(Client client) : base(client)
+        {
+            _client = client;
+        }
+
+        public async Task<PlayerUpdateResponse> UpdatePlayerLocation(double latitude, double longitude, double altitude = 0.0)
+        {
+            SetCoordinates(latitude, longitude, altitude);
+            var message = new PlayerUpdateMessage
+            {
+                Latitude = _client.CurrentLatitude,
+                Longitude = _client.CurrentLongitude
+            };
+
+            var updatePlayerLocationRequestEnvelope = RequestBuilder.GetRequestEnvelope(
+                new Request
+                {
+                    RequestType = RequestType.PlayerUpdate,
+                    RequestMessage = message.ToByteString()
+                });
+
+            return await PostProtoPayload<Request, PlayerUpdateResponse>(updatePlayerLocationRequestEnvelope);
+        }
+
+        internal void SetCoordinates(double lat, double lng, double altitude)
+        {
+            _client.CurrentLatitude = lat;
+            _client.CurrentLongitude = lng;
+            _client.CurrentAltitude = altitude;
+        }
+
+        public async Task<GetPlayerResponse> GetPlayer()
+        {
+            return await PostProtoPayload<Request, GetPlayerResponse>(RequestType.GetPlayer, new GetPlayerMessage());
+        }
+
+        public async Task<GetPlayerProfileResponse> GetPlayerProfile(string playerName)
+        {
+            return await PostProtoPayload<Request, GetPlayerProfileResponse>(RequestType.GetPlayerProfile, new GetPlayerProfileMessage()
+            {
+                PlayerName = playerName
+            });
+        }
+
+        public async Task<CheckAwardedBadgesResponse> GetNewlyAwardedBadges()
+        {
+            return await PostProtoPayload<Request, CheckAwardedBadgesResponse>(RequestType.CheckAwardedBadges, new CheckAwardedBadgesMessage());
+        }
+
+        public async Task<CollectDailyBonusResponse> CollectDailyBonus()
+        {
+            return await PostProtoPayload<Request, CollectDailyBonusResponse>(RequestType.CollectDailyBonus, new CollectDailyBonusMessage());
+        }
+
+        public async Task<CollectDailyDefenderBonusResponse> CollectDailyDefenderBonus()
+        {
+            return await PostProtoPayload<Request, CollectDailyDefenderBonusResponse>(RequestType.CollectDailyDefenderBonus, new CollectDailyDefenderBonusMessage());
+        }
+
+        public async Task<EquipBadgeResponse> EquipBadge(BadgeType type)
+        {
+            return await PostProtoPayload<Request, EquipBadgeResponse>(RequestType.EquipBadge, new EquipBadgeMessage() { BadgeType = type });
+        }
+
+        public async Task<LevelUpRewardsResponse> GetLevelUpRewards(int level)
+        {
+            return await PostProtoPayload<Request, LevelUpRewardsResponse>(RequestType.LevelUpRewards, new LevelUpRewardsMessage()
+            {
+                Level = level
+            });
+        }
+
+        public async Task<SetAvatarResponse> SetAvatar(PlayerAvatar playerAvatar)
+        {
+            return await PostProtoPayload<Request, SetAvatarResponse>(RequestType.SetAvatar, new SetAvatarMessage()
+            {
+                PlayerAvatar = playerAvatar
+            });
+        }
+
+        public async Task<SetContactSettingsResponse> SetContactSetting(ContactSettings contactSettings)
+        {
+            return await PostProtoPayload<Request, SetContactSettingsResponse>(RequestType.SetContactSettings, new SetContactSettingsMessage()
+            {
+                ContactSettings = contactSettings
+            });
+        }
+
+        public async Task<SetPlayerTeamResponse> SetPlayerTeam(TeamColor teamColor)
+        {
+            return await PostProtoPayload<Request, SetPlayerTeamResponse>(RequestType.SetPlayerTeam, new SetPlayerTeamMessage()
+            {
+                Team = teamColor
+            });
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/Window/ApiFailureStrategy.cs b/PokemonGo/RocketAPI/Window/ApiFailureStrategy.cs
new file mode 100644
index 0000000..8caf9fa
--- /dev/null
+++ b/PokemonGo/RocketAPI/Window/ApiFailureStrategy.cs
@@ -0,0 +1,22 @@
+using PokemonGo.RocketAPI.Extensions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using POGOProtos.Networking.Envelopes;
+
+namespace PokemonGo.RocketAPI.Window
+{
+    class ApiFailureStrategy : IApiFailureStrategy
+    {
+        public async Task<ApiOperation> HandleApiFailure(RequestEnvelope request, ResponseEnvelope response)
+        {
+            return ApiOperation.Retry;
+        }
+
+        public void HandleApiSuccess(RequestEnvelope request, ResponseEnvelope response)
+        {
+        }
+    }
+}
diff --git a/PokemonGo/RocketAPI/Window/App.config b/PokemonGo/RocketAPI/Window/App.config
index 3842152..c5a5d8f 100644
--- a/PokemonGo/RocketAPI/Window/App.config
+++ b/PokemonGo/RocketAPI/Window/App.config
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
   <startup>
-    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
   </startup>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
@@ -22,11 +22,17 @@
     <!--Google E-mail-->
     <add key="Password" value="" />
     <!--E-mail Password-->
+    <add key="GoogleUsername" value="" />
+    <!--Google E-mail-->
+    <add key="GooglePassword" value="" />
+    <!--E-mail Password-->
     <add key="GoogleRefreshToken" value="" />
     <add key="DefaultLatitude" value="-36.714359" />
     <!--Default Viaduct Harbour, Auckland, New Zealand-->
     <add key="DefaultLongitude" value="174.747205" />
     <!--Default Viaduct Harbour, Auckland, New Zealand-->
+    <add key="DefaultAltitude" value="0.0" />
+    <!--Default Viaduct Harbour, Auckland, New Zealand-->
     <add key="LevelOutput" value="levelup" />
     <!--2 Modes: "time": Every XXX seconds and "levelup" every levelup-->
     <add key="LevelTimeInterval" value="1" />
@@ -47,25 +53,35 @@
     <!--transfer pokemon with CP less than this value if cp transfer type is selected. Whitelist in Program.cs-->
     <add key="TransferIVThreshold" value="0" />
     <!--transfer pokemon with IV less than this value if iv transfer type is selected. Whitelist in Program.cs-->
-    <add key="TravelSpeed" value="60"/>
+    <add key="TravelSpeed" value="60" />
     <!--The speed to travel in km/h-->
-    <add key="ImageSize" value="50"/>
+    <add key="ImageSize" value="50" />
     <!--PokeUi image size-->
-    <add key="CatchPokemon" value="true"/>
+    <add key="CatchPokemon" value="true" />
     <!--Only visit pokestop and collect items-->
     <add key="EvolveAllGivenPokemons" value="false" />
     <add key="ClientSettingsProvider.ServiceUri" value="" />
-
-    <add key="MaxItemPokeBall" value="100"/>
-    <add key="MaxItemGreatBall" value="100"/>
-    <add key="MaxItemUltraBall" value="100"/>
-    <add key="MaxItemMasterBall" value="200"/>
-    <add key="MaxItemRazzBerry" value="100"/>
-    <add key="MaxItemRevive" value="20"/>
-    <add key="MaxItemPotion" value="0"/>
-    <add key="MaxItemSuperPotion" value="0"/>
-    <add key="MaxItemHyperPotion" value="50"/>
-    <add key="MaxItemMaxPotion" value="100"/>
-
+    <add key="MaxItemPokeBall" value="100" />
+    <add key="MaxItemGreatBall" value="100" />
+    <add key="MaxItemUltraBall" value="100" />
+    <add key="MaxItemMasterBall" value="200" />
+    <add key="MaxItemRazzBerry" value="100" />
+    <add key="MaxItemRevive" value="20" />
+    <add key="MaxItemPotion" value="0" />
+    <add key="MaxItemSuperPotion" value="0" />
+    <add key="MaxItemHyperPotion" value="50" />
+    <add key="MaxItemMaxPotion" value="100" />
   </appSettings>
+  <system.web>
+    <membership defaultProvider="ClientAuthenticationMembershipProvider">
+      <providers>
+        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
+      </providers>
+    </membership>
+    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
+      <providers>
+        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
+      </providers>
+    </roleManager>
+  </system.web>
 </configuration>
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Window/LocationManager.cs b/PokemonGo/RocketAPI/Window/LocationManager.cs
index 6b6f3b5..f5b17e3 100644
--- a/PokemonGo/RocketAPI/Window/LocationManager.cs
+++ b/PokemonGo/RocketAPI/Window/LocationManager.cs
@@ -29,7 +29,7 @@ namespace PokemonGo.RocketAPI.Window
         {
             double waitTime = getDistance(lat, lng) / this.metersPerMillisecond;
             await Task.Delay((int)Math.Ceiling(waitTime));
-            await client.UpdatePlayerLocation(lat, lng);
+            await client.Player.UpdatePlayerLocation(lat, lng);
         }
     }

diff --git a/PokemonGo/RocketAPI/Window/MainForm.cs b/PokemonGo/RocketAPI/Window/MainForm.cs
index e330388..52fb1ef 100644
--- a/PokemonGo/RocketAPI/Window/MainForm.cs
+++ b/PokemonGo/RocketAPI/Window/MainForm.cs
@@ -13,11 +13,9 @@ using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using System.Xml;
-using AllEnum;
 using PokemonGo.RocketAPI.Enums;
 using PokemonGo.RocketAPI.Exceptions;
 using PokemonGo.RocketAPI.Extensions;
-using PokemonGo.RocketAPI.GeneratedCode;
 using System.Configuration;
 using GMap.NET;
 using GMap.NET.MapProviders;
@@ -27,6 +25,12 @@ using GMap.NET.WindowsForms.ToolTips;
 using System.Threading;
 using BrightIdeasSoftware;
 using PokemonGo.RocketAPI.Helpers;
+using POGOProtos.Map.Fort;
+using POGOProtos.Map.Pokemon;
+using POGOProtos.Data;
+using POGOProtos.Networking.Responses;
+using POGOProtos.Inventory.Item;
+using POGOProtos.Enums;

 namespace PokemonGo.RocketAPI.Window
 {
@@ -50,7 +54,7 @@ namespace PokemonGo.RocketAPI.Window
             InitializeComponent();
             synchronizationContext = SynchronizationContext.Current;
             ClientSettings = Settings.Instance;
-            Client.OnConsoleWrite += Client_OnConsoleWrite;
+            //Client.OnConsoleWrite += Client_OnConsoleWrite;
             Instance = this;
         }

@@ -100,7 +104,7 @@ namespace PokemonGo.RocketAPI.Window
             S2GMapDrawer.DrawS2Cells(S2Helper.GetNearbyCellIds(ClientSettings.DefaultLongitude, ClientSettings.DefaultLatitude), Instance.searchAreaOverlay);
         }

-        public static ISettings ClientSettings;
+        public static Settings ClientSettings;
         private static int Currentlevel = -1;
         private static int TotalExperience = 0;
         private static int TotalPokemon = 0;
@@ -205,9 +209,9 @@ namespace PokemonGo.RocketAPI.Window

         private async Task EvolvePokemons(Client client)
         {
-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var pokemons =
-                inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Pokemon)
+                inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PokemonData)
                     .Where(p => p != null && p?.PokemonId > 0);

             await EvolveAllGivenPokemons(client, pokemons);
@@ -220,19 +224,19 @@ namespace PokemonGo.RocketAPI.Window
                 var countOfEvolvedUnits = 0;
                 var xpCount = 0;

-                EvolvePokemonOut evolvePokemonOutProto;
+                EvolvePokemonResponse evolvePokemonOutProto;
                 do
                 {
-                    evolvePokemonOutProto = await client.EvolvePokemon(pokemon.Id);
+                    evolvePokemonOutProto = await client.Inventory.EvolvePokemon(pokemon.Id);
                     //todo: someone check whether this still works

-                    if (evolvePokemonOutProto.Result == 1)
+                    if (evolvePokemonOutProto.Result == EvolvePokemonResponse.Types.Result.Success)
                     {
                         countOfEvolvedUnits++;
-                        xpCount += evolvePokemonOutProto.ExpAwarded;
-                        TotalExperience += evolvePokemonOutProto.ExpAwarded;
+                        xpCount += evolvePokemonOutProto.ExperienceAwarded;
+                        TotalExperience += evolvePokemonOutProto.ExperienceAwarded;
                     }
-                } while (evolvePokemonOutProto.Result == 1);
+                } while (evolvePokemonOutProto.Result == EvolvePokemonResponse.Types.Result.Success);

                 if (countOfEvolvedUnits > 0)
                     ColoredConsoleWrite(Color.Cyan,
@@ -244,7 +248,7 @@ namespace PokemonGo.RocketAPI.Window

         private async void Execute()
         {
-            client = new Client(ClientSettings);
+            client = new Client(ClientSettings, new ApiFailureStrategy());
             this.locationManager = new LocationManager(client, ClientSettings.TravelSpeed);
             try
             {
@@ -258,14 +262,13 @@ namespace PokemonGo.RocketAPI.Window
                         break;
                 }

-                await client.Login();
-                await client.SetServer();
-                var profile = await client.GetProfile();
-                var settings = await client.GetSettings();
-                var mapObjects = await client.GetMapObjects();
-                var inventory = await client.GetInventory();
+                await client.Login.DoLogin();
+                var profile = await client.Player.GetPlayer();
+                var settings = await client.Download.GetSettings();
+                var mapObjects = await client.Map.GetMapObjects();
+                var inventory = await client.Inventory.GetInventory();
                 var pokemons =
-                    inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Pokemon)
+                    inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PokemonData)
                         .Where(p => p != null && p?.PokemonId > 0);

                 updateUserStatusBar(client);
@@ -285,11 +288,11 @@ namespace PokemonGo.RocketAPI.Window
                 }*/
                 string lat2 = System.Convert.ToString(ClientSettings.DefaultLatitude);
                 string longit2 = System.Convert.ToString(ClientSettings.DefaultLongitude);
-                ColoredConsoleWrite(Color.DarkGray, "Name: " + profile.Profile.Username);
-                ColoredConsoleWrite(Color.DarkGray, "Team: " + profile.Profile.Team);
-                if (profile.Profile.Currency.ToArray()[0].Amount > 0) // If player has any pokecoins it will show how many they have.
-                    ColoredConsoleWrite(Color.DarkGray, "Pokecoins: " + profile.Profile.Currency.ToArray()[0].Amount);
-                ColoredConsoleWrite(Color.DarkGray, "Stardust: " + profile.Profile.Currency.ToArray()[1].Amount + "\n");
+                ColoredConsoleWrite(Color.DarkGray, "Name: " + profile.PlayerData.Username);
+                ColoredConsoleWrite(Color.DarkGray, "Team: " + profile.PlayerData.Team);
+                if (profile.PlayerData.Currencies.ToArray()[0].Amount > 0) // If player has any pokecoins it will show how many they have.
+                    ColoredConsoleWrite(Color.DarkGray, "Pokecoins: " + profile.PlayerData.Currencies.ToArray()[0].Amount);
+                ColoredConsoleWrite(Color.DarkGray, "Stardust: " + profile.PlayerData.Currencies.ToArray()[1].Amount + "\n");
                 ColoredConsoleWrite(Color.DarkGray, "Latitude: " + ClientSettings.DefaultLatitude);
                 ColoredConsoleWrite(Color.DarkGray, "Longitude: " + ClientSettings.DefaultLongitude);
                 try
@@ -335,7 +338,8 @@ namespace PokemonGo.RocketAPI.Window
                 if (ClientSettings.EvolveAllGivenPokemons)
                     await EvolveAllGivenPokemons(client, pokemons);
                 if (ClientSettings.Recycler)
-                    client.RecycleItems(client);
+                    RecycleItems(client);
+                    //client.RecycleItems(client);

                 await Task.Delay(5000);
                 PrintLevel(client);
@@ -407,12 +411,12 @@ namespace PokemonGo.RocketAPI.Window

         private async Task ExecuteCatchAllNearbyPokemons(Client client)
         {
-            var mapObjects = await client.GetMapObjects();
+            var mapObjects = await client.Map.GetMapObjects();

-            var pokemons = mapObjects.MapCells.SelectMany(i => i.CatchablePokemons);
-            var inventory2 = await client.GetInventory();
+            var pokemons = mapObjects.Item1.MapCells.SelectMany(i => i.CatchablePokemons);
+            var inventory2 = await client.Inventory.GetInventory();
             var pokemons2 = inventory2.InventoryDelta.InventoryItems
-                .Select(i => i.InventoryItemData?.Pokemon)
+                .Select(i => i.InventoryItemData?.PokemonData)
                 .Where(p => p != null && p?.PokemonId > 0)
                 .ToArray();

@@ -436,10 +440,10 @@ namespace PokemonGo.RocketAPI.Window
                 else
                     pokemonName = Convert.ToString(pokemon.PokemonId);

-                await client.UpdatePlayerLocation(pokemon.Latitude, pokemon.Longitude);
+                await client.Player.UpdatePlayerLocation(pokemon.Latitude, pokemon.Longitude);
                 UpdatePlayerLocation(pokemon.Latitude, pokemon.Longitude);
                 UpdateMap();
-                var encounterPokemonResponse = await client.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnpointId);
+                var encounterPokemonResponse = await client.Encounter.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnPointId);
                 var pokemonCP = encounterPokemonResponse?.WildPokemon?.PokemonData?.Cp;
                 var pokemonIV = Math.Round(Perfect(encounterPokemonResponse?.WildPokemon?.PokemonData));
                 CatchPokemonResponse caughtPokemonResponse;
@@ -448,11 +452,11 @@ namespace PokemonGo.RocketAPI.Window
                 {
                     if (ClientSettings.RazzBerryMode == "cp")
                         if (pokemonCP > ClientSettings.RazzBerrySetting)
-                            await client.UseRazzBerry(client, pokemon.EncounterId, pokemon.SpawnpointId);
+                            await UseRazzBerry(client, pokemon.EncounterId, pokemon.SpawnPointId);
                     if (ClientSettings.RazzBerryMode == "probability")
                         if (encounterPokemonResponse.CaptureProbability.CaptureProbability_.First() < ClientSettings.RazzBerrySetting)
-                            await client.UseRazzBerry(client, pokemon.EncounterId, pokemon.SpawnpointId);
-                    caughtPokemonResponse = await client.CatchPokemon(pokemon.EncounterId, pokemon.SpawnpointId, pokemon.Latitude, pokemon.Longitude, MiscEnums.Item.ITEM_POKE_BALL, pokemonCP); ; //note: reverted from settings because this should not be part of settings but part of logic
+                            await UseRazzBerry(client, pokemon.EncounterId, pokemon.SpawnPointId);
+                    caughtPokemonResponse = await CatchPokemon(pokemon.EncounterId, pokemon.SpawnPointId, pokemon.Latitude, pokemon.Longitude, ItemId.ItemPokeBall, pokemonCP); ; //note: reverted from settings because this should not be part of settings but part of logic
                 } while (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchMissed || caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchEscape);

                 if (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchSuccess)
@@ -463,8 +467,9 @@ namespace PokemonGo.RocketAPI.Window
                         c = Color.Yellow;
                     }
                     ColoredConsoleWrite(c, $"We caught a {pokemonName} with {pokemonCP} CP and {pokemonIV}% IV");
-                    foreach (int xp in caughtPokemonResponse.Scores.Xp)
-                        TotalExperience += xp;
+                    //foreach (int xp in caughtPokemonResponse.CaptureAward.Xp)
+                    //    TotalExperience += xp;
+                    TotalExperience += caughtPokemonResponse.CaptureAward.Xp.Sum();
                     TotalPokemon += 1;
                 }
                 else
@@ -559,9 +564,9 @@ namespace PokemonGo.RocketAPI.Window

         private async Task ExecuteFarmingPokestopsAndPokemons(Client client)
         {
-            var mapObjects = await client.GetMapObjects();
+            var mapObjects = await client.Map.GetMapObjects();

-            FortData[] rawPokeStops = mapObjects.MapCells.SelectMany(i => i.Forts).Where(i => i.Type == FortType.Checkpoint && i.CooldownCompleteTimestampMs < DateTime.UtcNow.ToUnixTime()).ToArray();
+            FortData[] rawPokeStops = mapObjects.Item1.MapCells.SelectMany(i => i.Forts).Where(i => i.Type == FortType.Checkpoint && i.CooldownCompleteTimestampMs < DateTime.UtcNow.ToUnixTime()).ToArray();
             if (rawPokeStops == null || rawPokeStops.Count() <= 0)
             {
                 ColoredConsoleWrite(Color.Red, $"No PokeStops to visit here, please stop the bot and change your location.");
@@ -572,7 +577,7 @@ namespace PokemonGo.RocketAPI.Window
             ColoredConsoleWrite(Color.Cyan, $"Finding fastest route through all PokeStops..");
             LatLong startingLatLong = new LatLong(ClientSettings.DefaultLatitude, ClientSettings.DefaultLongitude);
             pokeStops = RouteOptimizer.Optimize(rawPokeStops, startingLatLong, pokestopsOverlay);
-            wildPokemons = mapObjects.MapCells.SelectMany(i => i.WildPokemons);
+            wildPokemons = mapObjects.Item1.MapCells.SelectMany(i => i.WildPokemons);
             if (!ForceUnbanning && !Stopping)
                 ColoredConsoleWrite(Color.Cyan, $"Visiting {pokeStops.Count()} PokeStops");

@@ -587,8 +592,8 @@ namespace PokemonGo.RocketAPI.Window
                 UpdatePlayerLocation(pokeStop.Latitude, pokeStop.Longitude);
                 UpdateMap();

-                var fortInfo = await client.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
-                var fortSearch = await client.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
+                var fortInfo = await client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
+                var fortSearch = await client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
                 StringWriter PokeStopOutput = new StringWriter();
                 PokeStopOutput.Write($"");
                 if (fortInfo.Name != string.Empty)
@@ -614,7 +619,7 @@ namespace PokemonGo.RocketAPI.Window
             FarmingStops = false;
             if (!ForceUnbanning && !Stopping)
             {
-                client.RecycleItems(client);
+                RecycleItems(client);
                 await ExecuteFarmingPokestopsAndPokemons(client);
             }
         }
@@ -644,13 +649,13 @@ namespace PokemonGo.RocketAPI.Window
                         UpdatePlayerLocation(pokeStop.Latitude, pokeStop.Longitude);
                         UpdateMap();

-                        var fortInfo = await client.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
+                        var fortInfo = await client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
                         if (fortInfo.Name != string.Empty)
                         {
                             ColoredConsoleWrite(Color.LightGreen, "Chosen PokeStop " + fortInfo.Name + " for force unban");
                             for (int i = 1; i <= 50; i++)
                             {
-                                var fortSearch = await client.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
+                                var fortSearch = await client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
                                 if (fortSearch.ExperienceAwarded == 0)
                                 {
                                     ColoredConsoleWrite(Color.LightGreen, "Attempt: " + i);
@@ -679,9 +684,9 @@ namespace PokemonGo.RocketAPI.Window

         }

-        private string GetFriendlyItemsString(IEnumerable<FortSearchResponse.Types.ItemAward> items)
+        private string GetFriendlyItemsString(IEnumerable<ItemAward> items)
         {
-            var enumerable = items as IList<FortSearchResponse.Types.ItemAward> ?? items.ToList();
+            var enumerable = items as IList<ItemAward> ?? items.ToList();

             if (!enumerable.Any())
                 return string.Empty;
@@ -701,9 +706,9 @@ namespace PokemonGo.RocketAPI.Window
                 unwantedPokemonTypes.Add((PokemonId)i);
             }

-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var pokemons = inventory.InventoryDelta.InventoryItems
-                .Select(i => i.InventoryItemData?.Pokemon)
+                .Select(i => i.InventoryItemData?.PokemonData)
                 .Where(p => p != null && p?.PokemonId > 0)
                 .ToArray();

@@ -735,7 +740,7 @@ namespace PokemonGo.RocketAPI.Window

                 if (pokemon.Favorite == 0)
                 {
-                    var transferPokemonResponse = await client.TransferPokemon(pokemon.Id);
+                    var transferPokemonResponse = await client.Inventory.TransferPokemon(pokemon.Id);

                     /*
                     ReleasePokemonOutProto.Status {
@@ -757,13 +762,13 @@ namespace PokemonGo.RocketAPI.Window
                     }
                     else
                         pokemonName = Convert.ToString(pokemon.PokemonId);
-                    if (transferPokemonResponse.Status == 1)
+                    if (transferPokemonResponse.Result == ReleasePokemonResponse.Types.Result.Success)
                     {
                         ColoredConsoleWrite(Color.Magenta, $"Transferred {pokemonName} with {pokemon.Cp} CP");
                     }
                     else
                     {
-                        var status = transferPokemonResponse.Status;
+                        var status = transferPokemonResponse.Result;

                         ColoredConsoleWrite(Color.Red, $"Somehow failed to transfer {pokemonName} with {pokemon.Cp} CP. " +
                                                  $"ReleasePokemonOutProto.Status was {status}");
@@ -778,9 +783,9 @@ namespace PokemonGo.RocketAPI.Window
         {

             //ColoredConsoleWrite(ConsoleColor.White, $"Check for duplicates");
-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var allpokemons =
-                inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Pokemon)
+                inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PokemonData)
                     .Where(p => p != null && p?.PokemonId > 0);

             var dupes = allpokemons.OrderBy(x => x.Cp).Select((x, i) => new { index = i, value = x })
@@ -794,7 +799,7 @@ namespace PokemonGo.RocketAPI.Window
                     var dubpokemon = dupes.ElementAt(i).ElementAt(j).value;
                     if (dubpokemon.Favorite == 0)
                     {
-                        var transfer = await client.TransferPokemon(dubpokemon.Id);
+                        var transfer = await client.Inventory.TransferPokemon(dubpokemon.Id);
                         string pokemonName;
                         if (ClientSettings.Language == "german")
                         {
@@ -817,9 +822,9 @@ namespace PokemonGo.RocketAPI.Window
         {

             //ColoredConsoleWrite(ConsoleColor.White, $"Check for duplicates");
-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var allpokemons =
-                inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Pokemon)
+                inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PokemonData)
                     .Where(p => p != null && p?.PokemonId > 0);

             var dupes = allpokemons.OrderBy(x => Perfect(x)).Select((x, i) => new { index = i, value = x })
@@ -833,7 +838,7 @@ namespace PokemonGo.RocketAPI.Window
                     var dubpokemon = dupes.ElementAt(i).ElementAt(j).value;
                     if (dubpokemon.Favorite == 0)
                     {
-                        var transfer = await client.TransferPokemon(dubpokemon.Id);
+                        var transfer = await client.Inventory.TransferPokemon(dubpokemon.Id);
                         string pokemonName;
                         if (ClientSettings.Language == "german")
                         {
@@ -879,9 +884,9 @@ namespace PokemonGo.RocketAPI.Window
                 //PokemonId.Dratini
             };

-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var pokemons = inventory.InventoryDelta.InventoryItems
-                                .Select(i => i.InventoryItemData?.Pokemon)
+                                .Select(i => i.InventoryItemData?.PokemonData)
                                 .Where(p => p != null && p?.PokemonId > 0)
                                 .ToArray();

@@ -908,7 +913,7 @@ namespace PokemonGo.RocketAPI.Window

         public async Task PrintLevel(Client client)
         {
-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var stats = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PlayerStats).ToArray();
             foreach (var v in stats)
                 if (v != null)
@@ -938,9 +943,9 @@ namespace PokemonGo.RocketAPI.Window

         public async Task updateUserStatusBar(Client client)
         {
-            var inventory = await client.GetInventory();
+            var inventory = await client.Inventory.GetInventory();
             var stats = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PlayerStats).ToArray();
-            var profile = await client.GetProfile();
+            var profile = await client.Player.GetPlayer();
             Int16 hoursLeft = 0; Int16 minutesLeft = 0; Int32 secondsLeft = 0; double xpSec = 0;
             foreach (var v in stats)
                 if (v != null)
@@ -967,7 +972,7 @@ namespace PokemonGo.RocketAPI.Window
                             hoursLeft++;
                         }
                     }
-                    SetStatusText(string.Format(profile.Profile.Username + " | Level: {0:0} - ({2:0} / {3:0}) | Runtime {1} | Stardust: {4:0}", v.Level, _getSessionRuntimeInTimeFormat(), (v.Experience - v.PrevLevelXp - XpDiff), (v.NextLevelXp - v.PrevLevelXp - XpDiff), profile.Profile.Currency.ToArray()[1].Amount) + " | XP/Hour: " + Math.Round(TotalExperience / GetRuntime()) + " | Pokemon/Hour: " + Math.Round(TotalPokemon / GetRuntime()) + " | NextLevel in: " + hoursLeft + ":" + minutesLeft + ":" + secondsLeft);
+                    SetStatusText(string.Format(profile.PlayerData.Username + " | Level: {0:0} - ({2:0} / {3:0}) | Runtime {1} | Stardust: {4:0}", v.Level, _getSessionRuntimeInTimeFormat(), (v.Experience - v.PrevLevelXp - XpDiff), (v.NextLevelXp - v.PrevLevelXp - XpDiff), profile.PlayerData.Currencies.ToArray()[1].Amount) + " | XP/Hour: " + Math.Round(TotalExperience / GetRuntime()) + " | Pokemon/Hour: " + Math.Round(TotalPokemon / GetRuntime()) + " | NextLevel in: " + hoursLeft + ":" + minutesLeft + ":" + secondsLeft);
                 }
             await Task.Delay(1000);
             updateUserStatusBar(client);
@@ -1151,12 +1156,12 @@ namespace PokemonGo.RocketAPI.Window
             {
                 try
                 {
-                    IEnumerable<Item> myItems = await client.GetItems(client);
-                    IEnumerable<Item> LuckyEggs = myItems.Where(i => (ItemId)i.Item_ == ItemId.ItemLuckyEgg);
-                    Item LuckyEgg = LuckyEggs.FirstOrDefault();
+                    IEnumerable<ItemData> myItems = await GetItems(client);
+                    IEnumerable<ItemData> LuckyEggs = myItems.Where(i => i.ItemId == ItemId.ItemLuckyEgg);
+                    ItemData LuckyEgg = LuckyEggs.FirstOrDefault();
                     if (LuckyEgg != null)
                     {
-                        var useItemXpBoostRequest = await client.UseItemXpBoost(ItemId.ItemLuckyEgg);
+                        var useItemXpBoostRequest = await client.Inventory.UseItemXpBoost();
                         ColoredConsoleWrite(Color.Green, $"Using a Lucky Egg, we have {LuckyEgg.Count} left.");
                         ColoredConsoleWrite(Color.Yellow, $"Lucky Egg Valid until: {DateTime.Now.AddMinutes(30).ToString()}");

@@ -1220,7 +1225,7 @@ namespace PokemonGo.RocketAPI.Window


         #region POKEMON LIST
-        private IEnumerable<PokemonFamily> families;
+        private IEnumerable<PokemonFamilyId> families;

         private void InitializePokemonForm()
         {
@@ -1244,9 +1249,10 @@ namespace PokemonGo.RocketAPI.Window
                 PokemonData pokemon = (PokemonData)args.Model;

                 var family = families
-                        .Where(i => (int)i.FamilyId <= (int)pokemon.PokemonId)
+                        .Where(i => (int)i <= (int)pokemon.PokemonId)
                         .First();
-                args.Text = $"You have {family.Candy} {((PokemonId)((int)family.FamilyId)).ToString()} Candy";
+
+                args.Text = $"You have {GetCandies(pokemon.PokemonId).Result} {((PokemonId)(family)).ToString()} Candy";
             };
         }

@@ -1255,22 +1261,29 @@ namespace PokemonGo.RocketAPI.Window
             return (Image)Properties.Resources.ResourceManager.GetObject("Pokemon_" + pokemonId);
         }

+        public async Task<int> GetCandies(PokemonId poke)
+        {
+            var inventory = await client.Inventory.GetInventory();
+            var templates = await client.Download.GetItemTemplates();
+            var pokemontemplate = templates.ItemTemplates.Select(i => i?.PokemonSettings).Where(i => i?.PokemonId == poke);
+            return inventory.InventoryDelta.InventoryItems.Select(i => i?.InventoryItemData?.Candy).Where(i => i?.FamilyId == pokemontemplate.SingleOrDefault().FamilyId).SingleOrDefault().Candy_;
+        }
+
         private async void ReloadPokemonList()
         {
             button1.Enabled = false;
             objectListView1.Enabled = false;

-            client2 = new Client(ClientSettings);
+            client2 = new Client(ClientSettings, new ApiFailureStrategy());
             try
             {
-                await client2.Login();
-                await client2.SetServer();
-                var inventory = await client2.GetInventory();
-                var pokemons = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Pokemon).Where(p => p != null && p?.PokemonId > 0).OrderByDescending(key => key.Cp);
+                await client2.Login.DoLogin();
+                var inventory = await client2.Inventory.GetInventory();
+                var pokemons = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PokemonData).Where(p => p != null && p?.PokemonId > 0).OrderByDescending(key => key.Cp);
                 families = inventory.InventoryDelta.InventoryItems
-                   .Select(i => i.InventoryItemData?.PokemonFamily)
-                   .Where(p => p != null && (int)p?.FamilyId > 0)
-                   .OrderByDescending(p => (int)p.FamilyId);
+                   .Select(i => i.InventoryItemData.Candy.FamilyId)
+                   .Where(p => p > 0)
+                   .OrderByDescending(p => p);

                 var prevTopItem = objectListView1.TopItemIndex;
                 objectListView1.SetObjects(pokemons);
@@ -1307,9 +1320,9 @@ namespace PokemonGo.RocketAPI.Window
         {
             if (MessageBox.Show($"Are you sure you want to transfer {pokemon.PokemonId.ToString()} with {pokemon.Cp} CP?", "Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
             {
-                var transferPokemonResponse = await client2.TransferPokemon(pokemon.Id);
+                var transferPokemonResponse = await client2.Inventory.TransferPokemon(pokemon.Id);

-                if (transferPokemonResponse.Status == 1)
+                if (transferPokemonResponse.Result == ReleasePokemonResponse.Types.Result.Success)
                 {
                     ColoredConsoleWrite(Color.Magenta, $"{pokemon.PokemonId} was transferred. {transferPokemonResponse.CandyAwarded} candy awarded");
                     ReloadPokemonList();
@@ -1323,9 +1336,9 @@ namespace PokemonGo.RocketAPI.Window

         private async void PowerUpPokemon(PokemonData pokemon)
         {
-            var evolvePokemonResponse = await client2.PowerUp(pokemon.Id);
+            var evolvePokemonResponse = await client2.Inventory.UpgradePokemon(pokemon.Id);

-            if (evolvePokemonResponse.Result == 1)
+            if (evolvePokemonResponse.Result == UpgradePokemonResponse.Types.Result.Success)
             {
                 ColoredConsoleWrite(Color.Magenta, $"{pokemon.PokemonId} successfully upgraded.");
                 ReloadPokemonList();
@@ -1338,11 +1351,11 @@ namespace PokemonGo.RocketAPI.Window

         private async void EvolvePokemon(PokemonData pokemon)
         {
-            var evolvePokemonResponse = await client2.EvolvePokemon(pokemon.Id);
+            var evolvePokemonResponse = await client2.Inventory.EvolvePokemon(pokemon.Id);

-            if (evolvePokemonResponse.Result == 1)
+            if (evolvePokemonResponse.Result == EvolvePokemonResponse.Types.Result.Success)
             {
-                ColoredConsoleWrite(Color.Magenta, $"{pokemon.PokemonId} successfully evolved into {evolvePokemonResponse.EvolvedPokemon.PokemonType}\n{evolvePokemonResponse.ExpAwarded} experience awarded\n{evolvePokemonResponse.CandyAwarded} candy awarded");
+                ColoredConsoleWrite(Color.Magenta, $"{pokemon.PokemonId} successfully evolved into {evolvePokemonResponse.EvolvedPokemonData.PokemonId}\n{evolvePokemonResponse.ExperienceAwarded} experience awarded\n{evolvePokemonResponse.CandyAwarded} candy awarded");
                 ReloadPokemonList();
             }
             else
@@ -1351,6 +1364,127 @@ namespace PokemonGo.RocketAPI.Window
             }
         }

+        public async Task<IEnumerable<ItemData>> GetItems(Client client)
+        {
+            var inventory = await client.Inventory.GetInventory();
+            return inventory.InventoryDelta.InventoryItems
+                .Select(i => i.InventoryItemData?.Item)
+                .Where(p => p != null);
+        }
+
+        public async Task<IEnumerable<ItemData>> GetItemsToRecycle(ISettings _settings, Client client)
+        {
+            Settings settings = (Settings)_settings;
+            var myItems = await GetItems(client);
+
+            return myItems
+                .Where(x => settings.ItemRecycleFilter.Any(f => f.Key == (x.ItemId) && x.Count > f.Value))
+                .Select(x => new ItemData { ItemId = x.ItemId, Count = x.Count - settings.ItemRecycleFilter.Single(f => f.Key == x.ItemId).Value, Unseen = x.Unseen });
+        }
+
+        public async Task RecycleItems(Client client)
+        {
+            var items = await GetItemsToRecycle(client.Settings, client);
+
+            foreach (var item in items)
+            {
+                var transfer = await client.Inventory.RecycleItem(item.ItemId, item.Count);
+                ColoredConsoleWrite(Color.DarkCyan, $"Recycled {item.Count}x {(item.ItemId).ToString().Substring(4)}");
+                await Task.Delay(500);
+            }
+            await Task.Delay(ClientSettings.RecycleItemsInterval * 1000);
+            RecycleItems(client);
+        }
+
+        public async Task UseRazzBerry(Client client, ulong encounterId, string spawnPointGuid)
+        {
+            IEnumerable<ItemData> myItems = await GetItems(client);
+            IEnumerable<ItemData> RazzBerries = myItems.Where(i => i.ItemId == ItemId.ItemRazzBerry);
+            ItemData RazzBerry = RazzBerries.FirstOrDefault();
+            if (RazzBerry != null)
+            {
+                UseItemCaptureResponse useRazzBerry = await client.Encounter.UseCaptureItem(encounterId,ItemId.ItemRazzBerry, spawnPointGuid);
+                ColoredConsoleWrite(Color.Green, $"Using a Razz Berry, we have {RazzBerry.Count} left");
+                await Task.Delay(2000);
+            }
+            else
+            {
+                ColoredConsoleWrite(Color.Red, $"You don't have any Razz Berry to use.");
+            }
+        }
+
+        public async Task<CatchPokemonResponse> CatchPokemon(ulong encounterId, string spawnPointGuid, double pokemonLat,
+            double pokemonLng, ItemId pokeball, int? pokemonCP)
+        {
+            return await client.Encounter.CatchPokemon(encounterId, spawnPointGuid, GetBestBall(pokemonCP).Result);
+        }
+
+        private async Task<ItemId> GetBestBall(int? pokemonCP)
+        {
+            var inventory = await client.Inventory.GetInventory();
+
+            var ballCollection = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Item)
+                .Where(p => p != null)
+                .GroupBy(i => i.ItemId)
+                .Select(kvp => new { ItemId = kvp.Key, Amount = kvp.Sum(x => x.Count) })
+                .Where(y => y.ItemId == ItemId.ItemPokeBall
+                            || y.ItemId == ItemId.ItemGreatBall
+                            || y.ItemId == ItemId.ItemUltraBall
+                            || y.ItemId == ItemId.ItemMasterBall);
+
+            var pokeBallsCount = ballCollection.Where(p => p.ItemId == ItemId.ItemPokeBall).
+                DefaultIfEmpty(new { ItemId = ItemId.ItemPokeBall, Amount = 0 }).FirstOrDefault().Amount;
+            var greatBallsCount = ballCollection.Where(p => p.ItemId == ItemId.ItemGreatBall).
+                DefaultIfEmpty(new { ItemId = ItemId.ItemGreatBall, Amount = 0 }).FirstOrDefault().Amount;
+            var ultraBallsCount = ballCollection.Where(p => p.ItemId == ItemId.ItemUltraBall).
+                DefaultIfEmpty(new { ItemId = ItemId.ItemUltraBall, Amount = 0 }).FirstOrDefault().Amount;
+            var masterBallsCount = ballCollection.Where(p => p.ItemId == ItemId.ItemMasterBall).
+                DefaultIfEmpty(new { ItemId = ItemId.ItemMasterBall, Amount = 0 }).FirstOrDefault().Amount;
+
+            // Use better balls for high CP pokemon
+            if (masterBallsCount > 0 && pokemonCP >= 1000)
+            {
+                ColoredConsoleWrite(Color.Green, $"Master Ball is being used");
+                return ItemId.ItemMasterBall;
+            }
+
+            if (ultraBallsCount > 0 && pokemonCP >= 600)
+            {
+                ColoredConsoleWrite(Color.Green, $"Ultra Ball is being used");
+                return ItemId.ItemUltraBall;
+            }
+
+            if (greatBallsCount > 0 && pokemonCP >= 350)
+            {
+                ColoredConsoleWrite(Color.Green, $"Great Ball is being used");
+                return ItemId.ItemGreatBall;
+            }
+
+            // If low CP pokemon, but no more pokeballs; only use better balls if pokemon are of semi-worthy quality
+            if (pokeBallsCount > 0)
+            {
+                ColoredConsoleWrite(Color.Green, $"Poke Ball is being used");
+                return ItemId.ItemPokeBall;
+            }
+            else if ((greatBallsCount < 40 && pokemonCP >= 200) || greatBallsCount >= 40)
+            {
+                ColoredConsoleWrite(Color.Green, $"Great Ball is being used");
+                return ItemId.ItemGreatBall;
+            }
+            else if (ultraBallsCount > 0 && pokemonCP >= 500)
+            {
+                ColoredConsoleWrite(Color.Green, $"Ultra Ball is being used");
+                return ItemId.ItemUltraBall;
+            }
+            else if (masterBallsCount > 0 && pokemonCP >= 700)
+            {
+                ColoredConsoleWrite(Color.Green, $"Master Ball is being used");
+                return ItemId.ItemMasterBall;
+            }
+
+            return ItemId.ItemPokeBall;
+        }
+
         private void button1_Click(object sender, EventArgs e)
         {
             ReloadPokemonList();
diff --git a/PokemonGo/RocketAPI/Window/PokeUi.cs b/PokemonGo/RocketAPI/Window/PokeUi.cs
index 3c162ab..3c8cb65 100644
--- a/PokemonGo/RocketAPI/Window/PokeUi.cs
+++ b/PokemonGo/RocketAPI/Window/PokeUi.cs
@@ -8,9 +8,9 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using PokemonGo.RocketAPI.Enums;
-using PokemonGo.RocketAPI.GeneratedCode;
 using System.Net;
 using System.IO;
+using POGOProtos.Data;

 namespace PokemonGo.RocketAPI.Window
 {
@@ -34,25 +34,24 @@ namespace PokemonGo.RocketAPI.Window
         {
             EnabledButton(false);

-            client = new Client(ClientSettings);
+            client = new Client(ClientSettings, new ApiFailureStrategy());

             try
             {

-                await client.Login();
+                await client.Login.DoLogin();

-                await client.SetServer();
-                var profile = await client.GetProfile();
-                var inventory = await client.GetInventory();
+                var profile = await client.Player.GetPlayer();
+                var inventory = await client.Inventory.GetInventory();
                 var pokemons =
                     inventory.InventoryDelta.InventoryItems
-                    .Select(i => i.InventoryItemData?.Pokemon)
+                    .Select(i => i.InventoryItemData?.PokemonData)
                         .Where(p => p != null && p?.PokemonId > 0)
                         .OrderByDescending(key => key.Cp);
                 var families = inventory.InventoryDelta.InventoryItems
-                    .Select(i => i.InventoryItemData?.PokemonFamily)
-                    .Where(p => p != null && (int)p?.FamilyId > 0)
-                    .OrderByDescending(p => (int)p.FamilyId);
+                    .Select(i => i.InventoryItemData?.Candy.FamilyId)
+                    .Where(p => p > 0)
+                    .OrderByDescending(p => p);


                 //listView1.ShowItemToolTips = true;
@@ -90,11 +89,10 @@ namespace PokemonGo.RocketAPI.Window
                     {
                         pokemonImage = GetPokemonImage((int)pokemon.PokemonId);
                     });
-
-                    var currentCandy = families
-                        .Where(i => (int)i.FamilyId <= (int)pokemon.PokemonId)
-                        .Select(f => f.Candy)
-                        .First();
+                    var inv = await client.Inventory.GetInventory();
+                    var templates = await client.Download.GetItemTemplates();
+                    var pokemonTemplate = templates.ItemTemplates.Select(i => i.PokemonSettings).Where(i => i.PokemonId == pokemon.PokemonId);
+                    var currentCandy = inv.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Candy).Where(i => i.FamilyId == pokemonTemplate.FirstOrDefault().FamilyId).FirstOrDefault().Candy_;
                     var currIv = Math.Round(Perfect(pokemon));


@@ -116,7 +114,7 @@ namespace PokemonGo.RocketAPI.Window
                     this.dataGridView1.Rows.Add(row);
                 }

-                this.Text = "PokeUi " + pokemons.Count<PokemonData>() + "/" + profile.Profile.PokeStorage;
+                this.Text = "PokeUi " + pokemons.Count<PokemonData>() + "/" + profile.PlayerData.MaxPokemonStorage;
                 EnabledButton(true);

             }
@@ -148,7 +146,7 @@ namespace PokemonGo.RocketAPI.Window
                 wc.DownloadFile("http://pokeapi.co/media/sprites/pokemon/" + pokemonId + ".png", @location);
             }

-            var imageSize = ClientSettings.ImageSize;
+            var imageSize = ((Settings)ClientSettings).ImageSize;

             if ((imageSize > 96) || (imageSize < 1)) // no bigger than orig size and no smaller than 1x1
                 imageSize = 50;
@@ -195,7 +193,7 @@ namespace PokemonGo.RocketAPI.Window

             if (MessageBox.Show(this, pokemon.PokemonId + " with " + pokemon.Cp + " CP thats " + Math.Round(Perfect(pokemon)) + "% perfect", "Are you sure you want to transfer?", MessageBoxButtons.OKCancel) == DialogResult.OK)
             {
-                var transfer = await client.TransferPokemon(pokemon.Id);
+                var transfer = await client.Inventory.TransferPokemon(pokemon.Id);
             }
             this.dataGridView1.Rows.Remove(this.dataGridView1.SelectedRows[0]);
         }
@@ -239,16 +237,16 @@ namespace PokemonGo.RocketAPI.Window
         {
             try
             {
-                var evolvePokemonResponse = await client.EvolvePokemon(pokemon.Id);
+                var evolvePokemonResponse = await client.Inventory.EvolvePokemon(pokemon.Id);
                 string message = "";
                 string caption = "";
                 MessageBoxButtons buttons = MessageBoxButtons.OK;
                 DialogResult result;

-                if (evolvePokemonResponse.Result == 1)
+                if (evolvePokemonResponse.Result == POGOProtos.Networking.Responses.EvolvePokemonResponse.Types.Result.Success)
                 {
-                    message = $"{pokemon.PokemonId} successfully evolved into {evolvePokemonResponse.EvolvedPokemon.PokemonType}\n{evolvePokemonResponse.ExpAwarded} experience awarded\n{evolvePokemonResponse.CandyAwarded} candy awarded";
-                    caption = $"{pokemon.PokemonId} evolved into {evolvePokemonResponse.EvolvedPokemon.PokemonType}";
+                    message = $"{pokemon.PokemonId} successfully evolved into {evolvePokemonResponse.EvolvedPokemonData.PokemonId}\n{evolvePokemonResponse.ExperienceAwarded} experience awarded\n{evolvePokemonResponse.CandyAwarded} candy awarded";
+                    caption = $"{pokemon.PokemonId} evolved into {evolvePokemonResponse.EvolvedPokemonData.PokemonId}";
                 }
                 else
                 {
@@ -270,13 +268,13 @@ namespace PokemonGo.RocketAPI.Window
         {
             try
             {
-                var transferPokemonResponse = await client.TransferPokemon(pokemon.Id);
+                var transferPokemonResponse = await client.Inventory.TransferPokemon(pokemon.Id);
                 string message = "";
                 string caption = "";
                 MessageBoxButtons buttons = MessageBoxButtons.OK;
                 DialogResult result;

-                if (transferPokemonResponse.Status == 1)
+                if (transferPokemonResponse.Result == POGOProtos.Networking.Responses.ReleasePokemonResponse.Types.Result.Success)
                 {
                     message = $"{pokemon.PokemonId} was transferred\n{transferPokemonResponse.CandyAwarded} candy awarded";
                     caption = $"{pokemon.PokemonId} transferred";
@@ -318,13 +316,13 @@ namespace PokemonGo.RocketAPI.Window
         {
             try
             {
-                var evolvePokemonResponse = await client.PowerUp(pokemon.Id);
+                var evolvePokemonResponse = await client.Inventory.UpgradePokemon(pokemon.Id);
                 string message = "";
                 string caption = "";
                 MessageBoxButtons buttons = MessageBoxButtons.OK;
                 DialogResult result;

-                if (evolvePokemonResponse.Result == 1)
+                if (evolvePokemonResponse.Result == POGOProtos.Networking.Responses.UpgradePokemonResponse.Types.Result.Success)
                 {
                     message = $"{pokemon.PokemonId} successfully upgraded.";
                     caption = $"{pokemon.PokemonId} upgraded";
diff --git a/PokemonGo/RocketAPI/Window/PokemonForm.cs b/PokemonGo/RocketAPI/Window/PokemonForm.cs
index c558040..8fa8d9b 100644
--- a/PokemonGo/RocketAPI/Window/PokemonForm.cs
+++ b/PokemonGo/RocketAPI/Window/PokemonForm.cs
@@ -28,17 +28,16 @@ namespace PokemonGo.RocketAPI.Window

         private async void Execute()
         {
-            var client = new Client(ClientSettings);
+            var client = new Client(ClientSettings, new ApiFailureStrategy());

             try
             {

-                await client.Login();
+                await client.Login.DoLogin();

-                await client.SetServer();
-                var inventory = await client.GetInventory();
+                var inventory = await client.Inventory.GetInventory();
                 var pokemons =
-                    inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.Pokemon)
+                    inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PokemonData)
                         .Where(p => p != null && p?.PokemonId > 0).OrderByDescending(key => key.Cp);


diff --git a/PokemonGo/RocketAPI/Window/PokemonGo.RocketAPI.Window.csproj b/PokemonGo/RocketAPI/Window/PokemonGo.RocketBot.csproj
similarity index 97%
rename from PokemonGo/RocketAPI/Window/PokemonGo.RocketAPI.Window.csproj
rename to PokemonGo/RocketAPI/Window/PokemonGo.RocketBot.csproj
index 9de227c..12b2531 100644
--- a/PokemonGo/RocketAPI/Window/PokemonGo.RocketAPI.Window.csproj
+++ b/PokemonGo/RocketAPI/Window/PokemonGo.RocketBot.csproj
@@ -9,8 +9,9 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>PokemonGo.RocketAPI.Window</RootNamespace>
     <AssemblyName>PokemonGo.RocketAPI.Window</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -56,6 +57,9 @@
       <HintPath>..\..\..\packages\ObjectListView.Official.2.9.1\lib\net20\ObjectListView.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="POGOProtos">
+      <HintPath>..\..\POGOProtos\bin\Debug\POGOProtos.dll</HintPath>
+    </Reference>
     <Reference Include="S2Geometry, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\..\..\packages\S2Geometry.1.0.3\lib\portable-net45+wp8+win8\S2Geometry.dll</HintPath>
       <Private>True</Private>
@@ -63,6 +67,7 @@
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Web.Extensions" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
@@ -74,6 +79,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ApiFailureStrategy.cs" />
     <Compile Include="LocationManager.cs" />
     <Compile Include="MainForm.cs">
       <SubType>Form</SubType>
@@ -148,12 +154,6 @@
   <ItemGroup>
     <None Include="App.config" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\PokemonGo.RocketAPI.csproj">
-      <Project>{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}</Project>
-      <Name>PokemonGo.RocketAPI</Name>
-    </ProjectReference>
-  </ItemGroup>
   <ItemGroup>
     <None Include="pokemonGo.ico">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -612,6 +612,17 @@
   <ItemGroup>
     <None Include="img\Pokemon_151.png" />
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PokemonGo.RocketAPI.csproj">
+      <Project>{05d2da44-1b8e-4cf7-94ed-4d52451cd095}</Project>
+      <Name>PokemonGo.RocketAPI</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\encrypt.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
        Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/PokemonGo/RocketAPI/Window/Program.cs b/PokemonGo/RocketAPI/Window/Program.cs
index 31d2a64..961d631 100644
--- a/PokemonGo/RocketAPI/Window/Program.cs
+++ b/PokemonGo/RocketAPI/Window/Program.cs
@@ -1,4 +1,5 @@
-using System;
+
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
@@ -17,6 +18,12 @@ namespace PokemonGo.RocketAPI.Window
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             Application.Run(new MainForm());
+
+            //Client client = new Client(new MySettings(), new ApiFailureStrategy());
+            //Console.write
+            //client.Login.DoLogin();
+
+            //Console.ReadLine();
         }
     }
 }
diff --git a/PokemonGo/RocketAPI/Window/Properties/Resources.Designer.cs b/PokemonGo/RocketAPI/Window/Properties/Resources.Designer.cs
index 540bcb6..3c1cf2a 100644
--- a/PokemonGo/RocketAPI/Window/Properties/Resources.Designer.cs
+++ b/PokemonGo/RocketAPI/Window/Properties/Resources.Designer.cs
@@ -1,10 +1,10 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
-//     此代码由工具生成。
-//     运行时版本:4.0.30319.42000
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
 //
-//     对此文件的更改可能会导致不正确的行为,并且如果
-//     重新生成代码,这些更改将会丢失。
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
 // </auto-generated>
 //------------------------------------------------------------------------------

@@ -13,12 +13,12 @@ namespace PokemonGo.RocketAPI.Window.Properties {


     /// <summary>
-    ///   一个强类型的资源类,用于查找本地化的字符串等。
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
     /// </summary>
-    // 此类是由 StronglyTypedResourceBuilder
-    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
-    // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
-    // (以 /str 作为命令选项),或重新生成 VS 项目。
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
     [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -33,7 +33,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   返回此类使用的缓存的 ResourceManager 实例。
+        ///   Returns the cached ResourceManager instance used by this class.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         internal static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   使用此强类型资源类,为所有资源查找
-        ///   重写当前线程的 CurrentUICulture 属性。
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         internal static global::System.Globalization.CultureInfo Culture {
@@ -61,7 +61,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_1 {
             get {
@@ -71,7 +71,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_10 {
             get {
@@ -81,7 +81,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_100 {
             get {
@@ -91,7 +91,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_101 {
             get {
@@ -101,7 +101,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_102 {
             get {
@@ -111,7 +111,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_103 {
             get {
@@ -121,7 +121,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_104 {
             get {
@@ -131,7 +131,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_105 {
             get {
@@ -141,7 +141,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_106 {
             get {
@@ -151,7 +151,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_107 {
             get {
@@ -161,7 +161,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_108 {
             get {
@@ -171,7 +171,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_109 {
             get {
@@ -181,7 +181,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_11 {
             get {
@@ -191,7 +191,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_110 {
             get {
@@ -201,7 +201,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_111 {
             get {
@@ -211,7 +211,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_112 {
             get {
@@ -221,7 +221,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_113 {
             get {
@@ -231,7 +231,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_114 {
             get {
@@ -241,7 +241,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_115 {
             get {
@@ -251,7 +251,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_116 {
             get {
@@ -261,7 +261,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_117 {
             get {
@@ -271,7 +271,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_118 {
             get {
@@ -281,7 +281,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_119 {
             get {
@@ -291,7 +291,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_12 {
             get {
@@ -301,7 +301,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_120 {
             get {
@@ -311,7 +311,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_121 {
             get {
@@ -321,7 +321,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_122 {
             get {
@@ -331,7 +331,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_123 {
             get {
@@ -341,7 +341,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_124 {
             get {
@@ -351,7 +351,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_125 {
             get {
@@ -361,7 +361,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_126 {
             get {
@@ -371,7 +371,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_127 {
             get {
@@ -381,7 +381,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_128 {
             get {
@@ -391,7 +391,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_129 {
             get {
@@ -401,7 +401,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_13 {
             get {
@@ -411,7 +411,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_130 {
             get {
@@ -421,7 +421,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_131 {
             get {
@@ -431,7 +431,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_132 {
             get {
@@ -441,7 +441,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_133 {
             get {
@@ -451,7 +451,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_134 {
             get {
@@ -461,7 +461,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_135 {
             get {
@@ -471,7 +471,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_136 {
             get {
@@ -481,7 +481,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_137 {
             get {
@@ -491,7 +491,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_138 {
             get {
@@ -501,7 +501,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_139 {
             get {
@@ -511,7 +511,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_14 {
             get {
@@ -521,7 +521,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_140 {
             get {
@@ -531,7 +531,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_141 {
             get {
@@ -541,7 +541,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_142 {
             get {
@@ -551,7 +551,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_143 {
             get {
@@ -561,7 +561,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_144 {
             get {
@@ -571,7 +571,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_145 {
             get {
@@ -581,7 +581,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_146 {
             get {
@@ -591,7 +591,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_147 {
             get {
@@ -601,7 +601,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_148 {
             get {
@@ -611,7 +611,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_149 {
             get {
@@ -621,7 +621,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_15 {
             get {
@@ -631,7 +631,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_150 {
             get {
@@ -641,7 +641,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_151 {
             get {
@@ -651,7 +651,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_16 {
             get {
@@ -661,7 +661,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_17 {
             get {
@@ -671,7 +671,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_18 {
             get {
@@ -681,7 +681,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_19 {
             get {
@@ -691,7 +691,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_2 {
             get {
@@ -701,7 +701,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_20 {
             get {
@@ -711,7 +711,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_21 {
             get {
@@ -721,7 +721,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_22 {
             get {
@@ -731,7 +731,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_23 {
             get {
@@ -741,7 +741,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_24 {
             get {
@@ -751,7 +751,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_25 {
             get {
@@ -761,7 +761,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_26 {
             get {
@@ -771,7 +771,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_27 {
             get {
@@ -781,7 +781,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_28 {
             get {
@@ -791,7 +791,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_29 {
             get {
@@ -801,7 +801,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_3 {
             get {
@@ -811,7 +811,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_30 {
             get {
@@ -821,7 +821,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_31 {
             get {
@@ -831,7 +831,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_32 {
             get {
@@ -841,7 +841,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_33 {
             get {
@@ -851,7 +851,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_34 {
             get {
@@ -861,7 +861,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_35 {
             get {
@@ -871,7 +871,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_36 {
             get {
@@ -881,7 +881,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_37 {
             get {
@@ -891,7 +891,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_38 {
             get {
@@ -901,7 +901,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_39 {
             get {
@@ -911,7 +911,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_4 {
             get {
@@ -921,7 +921,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_40 {
             get {
@@ -931,7 +931,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_41 {
             get {
@@ -941,7 +941,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_42 {
             get {
@@ -951,7 +951,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_43 {
             get {
@@ -961,7 +961,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_44 {
             get {
@@ -971,7 +971,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_45 {
             get {
@@ -981,7 +981,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_46 {
             get {
@@ -991,7 +991,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_47 {
             get {
@@ -1001,7 +1001,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_48 {
             get {
@@ -1011,7 +1011,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_49 {
             get {
@@ -1021,7 +1021,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_5 {
             get {
@@ -1031,7 +1031,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_50 {
             get {
@@ -1041,7 +1041,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_51 {
             get {
@@ -1051,7 +1051,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_52 {
             get {
@@ -1061,7 +1061,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_53 {
             get {
@@ -1071,7 +1071,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_54 {
             get {
@@ -1081,7 +1081,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_55 {
             get {
@@ -1091,7 +1091,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_56 {
             get {
@@ -1101,7 +1101,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_57 {
             get {
@@ -1111,7 +1111,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_58 {
             get {
@@ -1121,7 +1121,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_59 {
             get {
@@ -1131,7 +1131,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_6 {
             get {
@@ -1141,7 +1141,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_60 {
             get {
@@ -1151,7 +1151,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_61 {
             get {
@@ -1161,7 +1161,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_62 {
             get {
@@ -1171,7 +1171,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_63 {
             get {
@@ -1181,7 +1181,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_64 {
             get {
@@ -1191,7 +1191,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_65 {
             get {
@@ -1201,7 +1201,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_66 {
             get {
@@ -1211,7 +1211,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_67 {
             get {
@@ -1221,7 +1221,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_68 {
             get {
@@ -1231,7 +1231,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_69 {
             get {
@@ -1241,7 +1241,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_7 {
             get {
@@ -1251,7 +1251,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_70 {
             get {
@@ -1261,7 +1261,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_71 {
             get {
@@ -1271,7 +1271,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_72 {
             get {
@@ -1281,7 +1281,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_73 {
             get {
@@ -1291,7 +1291,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_74 {
             get {
@@ -1301,7 +1301,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_75 {
             get {
@@ -1311,7 +1311,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_76 {
             get {
@@ -1321,7 +1321,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_77 {
             get {
@@ -1331,7 +1331,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_78 {
             get {
@@ -1341,7 +1341,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_79 {
             get {
@@ -1351,7 +1351,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_8 {
             get {
@@ -1361,7 +1361,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_80 {
             get {
@@ -1371,7 +1371,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_81 {
             get {
@@ -1381,7 +1381,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_82 {
             get {
@@ -1391,7 +1391,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_83 {
             get {
@@ -1401,7 +1401,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_84 {
             get {
@@ -1411,7 +1411,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_85 {
             get {
@@ -1421,7 +1421,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_86 {
             get {
@@ -1431,7 +1431,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_87 {
             get {
@@ -1441,7 +1441,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_88 {
             get {
@@ -1451,7 +1451,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_89 {
             get {
@@ -1461,7 +1461,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_9 {
             get {
@@ -1471,7 +1471,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_90 {
             get {
@@ -1481,7 +1481,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_91 {
             get {
@@ -1491,7 +1491,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_92 {
             get {
@@ -1501,7 +1501,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_93 {
             get {
@@ -1511,7 +1511,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_94 {
             get {
@@ -1521,7 +1521,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_95 {
             get {
@@ -1531,7 +1531,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_96 {
             get {
@@ -1541,7 +1541,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_97 {
             get {
@@ -1551,7 +1551,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_98 {
             get {
@@ -1561,7 +1561,7 @@ namespace PokemonGo.RocketAPI.Window.Properties {
         }

         /// <summary>
-        ///   查找 System.Drawing.Bitmap 类型的本地化资源。
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
         internal static System.Drawing.Bitmap Pokemon_99 {
             get {
diff --git a/PokemonGo/RocketAPI/Window/Properties/Settings.Designer.cs b/PokemonGo/RocketAPI/Window/Properties/Settings.Designer.cs
index cd1bc5c..a960ac0 100644
--- a/PokemonGo/RocketAPI/Window/Properties/Settings.Designer.cs
+++ b/PokemonGo/RocketAPI/Window/Properties/Settings.Designer.cs
@@ -8,21 +8,17 @@
 // </auto-generated>
 //------------------------------------------------------------------------------

-namespace PokemonGo.RocketAPI.Window.Properties
-{
-
-
+namespace PokemonGo.RocketAPI.Window.Properties {
+
+
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
-    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
-    {
-
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
         private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
-        public static Settings Default
-        {
-            get
-            {
+
+        public static Settings Default {
+            get {
                 return defaultInstance;
             }
         }
diff --git a/PokemonGo/RocketAPI/Window/Resources/encrypt.dll b/PokemonGo/RocketAPI/Window/Resources/encrypt.dll
new file mode 100644
index 0000000..1565c46
Binary files /dev/null and b/PokemonGo/RocketAPI/Window/Resources/encrypt.dll differ
diff --git a/PokemonGo/RocketAPI/Window/RouteOptimizer.cs b/PokemonGo/RocketAPI/Window/RouteOptimizer.cs
index 8b4f343..ea03da0 100644
--- a/PokemonGo/RocketAPI/Window/RouteOptimizer.cs
+++ b/PokemonGo/RocketAPI/Window/RouteOptimizer.cs
@@ -1,6 +1,6 @@
 using GMap.NET;
 using GMap.NET.WindowsForms;
-using PokemonGo.RocketAPI.GeneratedCode;
+using POGOProtos.Map.Fort;
 using System;
 using System.Collections.Generic;
 using System.Linq;
diff --git a/PokemonGo/RocketAPI/Window/Settings.cs b/PokemonGo/RocketAPI/Window/Settings.cs
index 5bbbf9f..227a648 100644
--- a/PokemonGo/RocketAPI/Window/Settings.cs
+++ b/PokemonGo/RocketAPI/Window/Settings.cs
@@ -6,8 +6,8 @@ using System.Configuration;
 using System.Globalization;
 using System.Reflection;
 using System.Runtime.CompilerServices;
-using AllEnum;
 using PokemonGo.RocketAPI.Enums;
+using POGOProtos.Inventory.Item;

 #endregion

@@ -63,8 +63,6 @@ namespace PokemonGo.RocketAPI.Window

         public string PtcUsername => GetSetting() != string.Empty ? GetSetting() : "username";
         public string PtcPassword => GetSetting() != string.Empty ? GetSetting() : "password";
-        public string Email => GetSetting() != string.Empty ? GetSetting() : "Email";
-        public string Password => GetSetting() != string.Empty ? GetSetting() : "Password";

         public double DefaultLatitude
         {
@@ -97,7 +95,7 @@ namespace PokemonGo.RocketAPI.Window
         private int MaxItemHyperPotion => GetSetting() != string.Empty ? Convert.ToInt16(GetSetting()) : 500;
         private int MaxItemMaxPotion => GetSetting() != string.Empty ? Convert.ToInt16(GetSetting()) : 500;

-        ICollection<KeyValuePair<ItemId, int>> ISettings.ItemRecycleFilter => new[]
+        public ICollection<KeyValuePair<ItemId, int>> ItemRecycleFilter => new[]
         {
             new KeyValuePair<ItemId, int>(ItemId.ItemPokeBall, MaxItemPokeBall),
             new KeyValuePair<ItemId, int>(ItemId.ItemGreatBall, MaxItemGreatBall),
@@ -125,6 +123,205 @@ namespace PokemonGo.RocketAPI.Window
             set { SetSetting(value); }
         }

+        public double DefaultAltitude
+        {
+            get { return GetSetting() != string.Empty ? double.Parse(GetSetting(), CultureInfo.InvariantCulture) : 0.0; }
+            set { SetSetting(value); }
+        }
+
+        string ISettings.PtcPassword
+        {
+            get { return GetSetting() != string.Empty ? GetSetting() : "password"; }
+            set { SetSetting(value); }
+        }
+
+        string ISettings.PtcUsername
+        {
+            get { return GetSetting() != string.Empty ? GetSetting() : "username"; }
+            set { SetSetting(value); }
+        }
+
+        public string GoogleUsername
+        {
+            get { return GetSetting() != string.Empty ? GetSetting() : "username"; }
+            set { SetSetting(value); }
+        }
+
+        public string GooglePassword
+        {
+            get { return GetSetting() != string.Empty ? GetSetting() : "password"; }
+            set { SetSetting(value); }
+        }
+
+        public string DeviceId
+        {
+            get
+            {
+                return "529e8aa6201f78b5";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string AndroidBoardName
+        {
+            get
+            {
+                return "msm8994";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string AndroidBootloader
+        {
+            get
+            {
+                return "unknown";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string DeviceBrand
+        {
+            get
+            {
+                return "OnePlus";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string DeviceModel
+        {
+            get
+            {
+                return "OnePlus2";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string DeviceModelIdentifier
+        {
+            get
+            {
+                return "ONE A2003_24_160604";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string DeviceModelBoot
+        {
+            get
+            {
+                return "qcom";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string HardwareManufacturer
+        {
+            get
+            {
+                return "OnePlus";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string HardwareModel
+        {
+            get
+            {
+                return "ONE A2003";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string FirmwareBrand
+        {
+            get
+            {
+                return "OnePlus2";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string FirmwareTags
+        {
+            get
+            {
+                return "dev-keys";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string FirmwareType
+        {
+            get
+            {
+                return "user";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public string FirmwareFingerprint
+        {
+            get
+            {
+                return "OnePlus/OnePlus2/OnePlus2:6.0.1/MMB29M/1447840820:user/release-keys";
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
         private string GetSetting([CallerMemberName] string key = null)
         {
             return ConfigurationManager.AppSettings[key];
diff --git a/PokemonGo/RocketAPI/Window/SettingsForm.cs b/PokemonGo/RocketAPI/Window/SettingsForm.cs
index 8e5f588..f33bea2 100644
--- a/PokemonGo/RocketAPI/Window/SettingsForm.cs
+++ b/PokemonGo/RocketAPI/Window/SettingsForm.cs
@@ -26,8 +26,8 @@ namespace PokemonGo.RocketAPI.Window
             authTypeCb.Text = Settings.Instance.AuthType.ToString();
             if (authTypeCb.Text == "google")
             {
-                UserLoginBox.Text = Settings.Instance.Email.ToString();
-                UserPasswordBox.Text = Settings.Instance.Password.ToString();
+                UserLoginBox.Text = Settings.Instance.GoogleUsername.ToString();
+                UserPasswordBox.Text = Settings.Instance.GooglePassword.ToString();
             } else
             {
                 UserLoginBox.Text = Settings.Instance.PtcUsername.ToString();
@@ -80,8 +80,8 @@ namespace PokemonGo.RocketAPI.Window
             Settings.Instance.SetSetting(authTypeCb.Text, "AuthType");
             if (authTypeCb.Text == "google")
             {
-                Settings.Instance.SetSetting(UserLoginBox.Text, "Email");
-                Settings.Instance.SetSetting(UserPasswordBox.Text, "Password");
+                Settings.Instance.SetSetting(UserLoginBox.Text, "GoogleUsername");
+                Settings.Instance.SetSetting(UserPasswordBox.Text, "GooglePassword");
             } else
             {
                 Settings.Instance.SetSetting(UserLoginBox.Text, "PtcUsername");
diff --git a/PokemonGo/RocketAPI/app.config b/PokemonGo/RocketAPI/app.config
index 8460dd4..9701fae 100644
--- a/PokemonGo/RocketAPI/app.config
+++ b/PokemonGo/RocketAPI/app.config
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <configuration>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
@@ -6,6 +7,10 @@
         <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="C5" publicKeyToken="282361b99ded7e8e" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-2.4.5947.17248" newVersion="2.4.5947.17248" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
 </configuration>
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/packages.config b/PokemonGo/RocketAPI/packages.config
index 87ca41a..76414a0 100644
--- a/PokemonGo/RocketAPI/packages.config
+++ b/PokemonGo/RocketAPI/packages.config
@@ -1,12 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="C5" version="2.2.5073.27396" targetFramework="net45" />
+  <package id="C5" version="2.4.5947.17249" targetFramework="net45" />
   <package id="EnterpriseLibrary.TransientFaultHandling" version="6.0.1304.0" targetFramework="net45" />
   <package id="EnterpriseLibrary.TransientFaultHandling.Data" version="6.0.1304.1" targetFramework="net45" />
-  <package id="Google.Protobuf" version="3.0.0-beta3" targetFramework="net45" />
+  <package id="Google.Protobuf" version="3.0.0-beta4" targetFramework="net45" />
   <package id="Google.Protobuf.Tools" version="3.0.0-beta3" targetFramework="net45" />
+  <package id="GPSOAuthSharp" version="0.0.5" targetFramework="net45" />
   <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
   <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
-  <package id="S2Geometry" version="1.0.3" targetFramework="net45" />
+  <package id="POGOProtos" version="1.5.0" targetFramework="net45" />
+  <package id="S2Geometry" version="1.0.1" targetFramework="net45" />
+  <package id="System.Data.HashFunction.Core" version="1.8.2.2" targetFramework="net45" />
+  <package id="System.Data.HashFunction.Interfaces" version="1.0.0.2" targetFramework="net45" />
+  <package id="System.Data.HashFunction.xxHash" version="1.8.2.2" targetFramework="net45" />
   <package id="VarintBitConverter" version="1.0.0.0" targetFramework="net45" />
 </packages>
\ No newline at end of file
diff --git a/README.md b/README.md
index d691c82..0e3d298 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 [![Stories in Ready](https://badge.waffle.io/1461748123/Pokemon-Go-Rocket-API.svg?label=accepted&title=Accepted)](http://waffle.io/1461748123/Pokemon-Go-Rocket-API)
 [![Stories in Ready](https://badge.waffle.io/1461748123/Pokemon-Go-Rocket-API.svg?label=in%20progress&title=In Progress)](http://waffle.io/1461748123/Pokemon-Go-Rocket-API)
 [![Stories in Ready](https://badge.waffle.io/1461748123/Pokemon-Go-Rocket-API.png?label=ready&title=Ready)](https://waffle.io/1461748123/Pokemon-Go-Rocket-API)
-## Niantic's latest update change how data communicate between server and the client. Currently no bots are working. Please be patient and wait for our official announcement on our discrod channel.
+
 ## Official discord channel for user and developer discussions.
 * https://discord.gg/y6EU2qY

diff --git a/Pokemon Go Rocket API.sln b/RocketBot.sln
similarity index 51%
rename from Pokemon Go Rocket API.sln
rename to RocketBot.sln
index 13123b8..7259158 100644
--- a/Pokemon Go Rocket API.sln
+++ b/RocketBot.sln
@@ -1,26 +1,46 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
+VisualStudioVersion = 14.0.25123.0
 MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PokemonGo.RocketBot", "PokemonGo\RocketAPI\Window\PokemonGo.RocketBot.csproj", "{C85B9D78-9CA3-4830-84CD-6B69090B987F}"
+EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PokemonGo.RocketAPI", "PokemonGo\RocketAPI\PokemonGo.RocketAPI.csproj", "{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PokemonGo.RocketAPI.Window", "PokemonGo\RocketAPI\Window\PokemonGo.RocketAPI.Window.csproj", "{C85B9D78-9CA3-4830-84CD-6B69090B987F}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "POGOProtos", "PokemonGo\POGOProtos\POGOProtos.csproj", "{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
+		Debug|x86 = Debug|x86
 		Release|Any CPU = Release|Any CPU
+		Release|x86 = Release|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|Any CPU.Build.0 = Release|Any CPU
 		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Debug|x86.Build.0 = Debug|Any CPU
 		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Release|x86.ActiveCfg = Release|Any CPU
+		{C85B9D78-9CA3-4830-84CD-6B69090B987F}.Release|x86.Build.0 = Release|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|x86.ActiveCfg = Debug|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Debug|x86.Build.0 = Debug|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|Any CPU.Build.0 = Release|Any CPU
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|x86.ActiveCfg = Release|x86
+		{05D2DA44-1B8E-4CF7-94ED-4D52451CD095}.Release|x86.Build.0 = Release|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|x86.ActiveCfg = Debug|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Debug|x86.Build.0 = Debug|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|x86.ActiveCfg = Release|x86
+		{A03A7BB2-4F0B-467B-84B2-9A76E6AAE6FB}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
You may download the files in Public Git.