Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/ios.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarinofaggiana <marino@marinofaggiana.com>2019-05-22 14:13:22 +0300
committermarinofaggiana <marino@marinofaggiana.com>2019-05-22 14:13:22 +0300
commit2fdc67bb8e7e926792dbbc31370075d5187ea129 (patch)
treeb4a72db66d55522a5bea8d195d6b2f61ed83f19b /Libraries external
parentd69c09fc7abd99528e96ff51f14dd5fa7bd48704 (diff)
test
Diffstat (limited to 'Libraries external')
-rwxr-xr-xLibraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/FIRAnalyticsConnectorbin0 -> 493216 bytes
-rwxr-xr-xLibraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/Modules/module.modulemap10
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/FirebaseAnalyticsbin0 -> 507576 bytes
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h62
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics.h132
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIREventNames.h407
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRParameterNames.h532
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h17
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h5
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseAnalytics.framework/Modules/module.modulemap11
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/FirebaseCorebin0 -> 1325816 bytes
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h56
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRApp.h127
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRConfiguration.h52
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRLoggerLevel.h38
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIROptions.h116
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FirebaseCore.h21
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseCore.framework/Modules/module.modulemap6
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnosticsbin0 -> 2903344 bytes
-rwxr-xr-xLibraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/Modules/module.modulemap7
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/FirebaseInstanceIDbin0 -> 4068872 bytes
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FIRInstanceID.h320
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h17
-rw-r--r--Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Modules/module.modulemap6
-rwxr-xr-xLibraries external/Firebase/Analytics/GoogleAppMeasurement.framework/GoogleAppMeasurementbin0 -> 24449648 bytes
-rwxr-xr-xLibraries external/Firebase/Analytics/GoogleAppMeasurement.framework/Modules/module.modulemap10
-rw-r--r--Libraries external/Firebase/Analytics/GoogleUtilities.framework/GoogleUtilitiesbin0 -> 1985992 bytes
-rw-r--r--Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerCodes.h36
-rw-r--r--Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerLevel.h35
-rw-r--r--Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULNSData+zlib.h49
-rw-r--r--Libraries external/Firebase/Analytics/GoogleUtilities.framework/Modules/module.modulemap8
-rw-r--r--Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb.h593
-rw-r--r--Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_common.h42
-rw-r--r--Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_decode.h175
-rw-r--r--Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_encode.h170
-rw-r--r--Libraries external/Firebase/Analytics/nanopb.framework/Modules/module.modulemap5
-rw-r--r--Libraries external/Firebase/Analytics/nanopb.framework/nanopbbin0 -> 190304 bytes
37 files changed, 3065 insertions, 0 deletions
diff --git a/Libraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/FIRAnalyticsConnector b/Libraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/FIRAnalyticsConnector
new file mode 100755
index 000000000..1898de6ce
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/FIRAnalyticsConnector
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/Modules/module.modulemap
new file mode 100755
index 000000000..270ad21f1
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FIRAnalyticsConnector.framework/Modules/module.modulemap
@@ -0,0 +1,10 @@
+framework module FIRAnalyticsConnector {
+ export *
+ module * { export * }
+ link "sqlite3"
+ link "z"
+ link framework "Security"
+ link framework "StoreKit"
+ link framework "SystemConfiguration"
+ link framework "UIKit"
+}
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/FirebaseAnalytics b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/FirebaseAnalytics
new file mode 100755
index 000000000..635a34781
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/FirebaseAnalytics
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h
new file mode 100755
index 000000000..d499af668
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h
@@ -0,0 +1,62 @@
+#import <Foundation/Foundation.h>
+
+#import "FIRAnalytics.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Provides App Delegate handlers to be used in your App Delegate.
+ *
+ * To save time integrating Firebase Analytics in an application, Firebase Analytics does not
+ * require delegation implementation from the AppDelegate. Instead this is automatically done by
+ * Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App
+ * Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting
+ * it to NO, and adding the methods in this category to corresponding delegation handlers.
+ *
+ * To handle Universal Links, you must return YES in
+ * [UIApplicationDelegate application:didFinishLaunchingWithOptions:].
+ */
+@interface FIRAnalytics (AppDelegate)
+
+/**
+ * Handles events related to a URL session that are waiting to be processed.
+ *
+ * For optimal use of Firebase Analytics, call this method from the
+ * [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler]
+ * method of the app delegate in your app.
+ *
+ * @param identifier The identifier of the URL session requiring attention.
+ * @param completionHandler The completion handler to call when you finish processing the events.
+ * Calling this completion handler lets the system know that your app's user interface is
+ * updated and a new snapshot can be taken.
+ */
++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier
+ completionHandler:(nullable void (^)(void))completionHandler;
+
+/**
+ * Handles the event when the app is launched by a URL.
+ *
+ * Call this method from [UIApplicationDelegate application:openURL:options:] &#40;on iOS 9.0 and
+ * above&#41;, or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] &#40;on
+ * iOS 8.x and below&#41; in your app.
+ *
+ * @param url The URL resource to open. This resource can be a network resource or a file.
+ */
++ (void)handleOpenURL:(NSURL *)url;
+
+/**
+ * Handles the event when the app receives data associated with user activity that includes a
+ * Universal Link (on iOS 9.0 and above).
+ *
+ * Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app
+ * delegate (on iOS 9.0 and above).
+ *
+ * @param userActivity The activity object containing the data associated with the task the user
+ * was performing.
+ */
++ (void)handleUserActivity:(id)userActivity;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
new file mode 100755
index 000000000..afb9f820b
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
@@ -0,0 +1,132 @@
+#import <Foundation/Foundation.h>
+
+#import "FIREventNames.h"
+#import "FIRParameterNames.h"
+#import "FIRUserPropertyNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// The top level Firebase Analytics singleton that provides methods for logging events and setting
+/// user properties. See <a href="http://goo.gl/gz8SLz">the developer guides</a> for general
+/// information on using Firebase Analytics in your apps.
+NS_SWIFT_NAME(Analytics)
+@interface FIRAnalytics : NSObject
+
+/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have
+/// the same parameters. Up to 500 event names are supported. Using predefined events and/or
+/// parameters is recommended for optimal reporting.
+///
+/// The following event names are reserved and cannot be used:
+/// <ul>
+/// <li>ad_activeview</li>
+/// <li>ad_click</li>
+/// <li>ad_exposure</li>
+/// <li>ad_impression</li>
+/// <li>ad_query</li>
+/// <li>adunit_exposure</li>
+/// <li>app_clear_data</li>
+/// <li>app_remove</li>
+/// <li>app_update</li>
+/// <li>error</li>
+/// <li>first_open</li>
+/// <li>in_app_purchase</li>
+/// <li>notification_dismiss</li>
+/// <li>notification_foreground</li>
+/// <li>notification_open</li>
+/// <li>notification_receive</li>
+/// <li>os_update</li>
+/// <li>screen_view</li>
+/// <li>session_start</li>
+/// <li>user_engagement</li>
+/// </ul>
+///
+/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or
+/// underscores. The name must start with an alphabetic character. Some event names are
+/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_",
+/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are
+/// case-sensitive and that logging two events whose names differ only in case will result in
+/// two distinct events.
+/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has
+/// no parameters. Parameter names can be up to 40 characters long and must start with an
+/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString
+/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are
+/// supported. NSString parameter values can be up to 100 characters long. The "firebase_",
+/// "google_", and "ga_" prefixes are reserved and should not be used for parameter names.
++ (void)logEventWithName:(NSString *)name
+ parameters:(nullable NSDictionary<NSString *, id> *)parameters
+ NS_SWIFT_NAME(logEvent(_:parameters:));
+
+/// Sets a user property to a given value. Up to 25 user property names are supported. Once set,
+/// user property values persist throughout the app lifecycle and across sessions.
+///
+/// The following user property names are reserved and cannot be used:
+/// <ul>
+/// <li>first_open_time</li>
+/// <li>last_deep_link_referrer</li>
+/// <li>user_id</li>
+/// </ul>
+///
+/// @param value The value of the user property. Values can be up to 36 characters long. Setting the
+/// value to nil removes the user property.
+/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters
+/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and
+/// "ga_" prefixes are reserved and should not be used for user property names.
++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name
+ NS_SWIFT_NAME(setUserProperty(_:forName:));
+
+/// Sets the user ID property. This feature must be used in accordance with
+/// <a href="https://www.google.com/policies/privacy">Google's Privacy Policy</a>
+///
+/// @param userID The user ID to ascribe to the user of this app on this device, which must be
+/// non-empty and no more than 256 characters long. Setting userID to nil removes the user ID.
++ (void)setUserID:(nullable NSString *)userID;
+
+/// Sets the current screen name, which specifies the current visual context in your app. This helps
+/// identify the areas in your app where users spend their time and how they interact with your app.
+/// Must be called on the main thread.
+///
+/// Note that screen reporting is enabled automatically and records the class name of the current
+/// UIViewController for you without requiring you to call this method. If you implement
+/// viewDidAppear in your UIViewController but do not call [super viewDidAppear:], that screen class
+/// will not be automatically tracked. The class name can optionally be overridden by calling this
+/// method in the viewDidAppear callback of your UIViewController and specifying the
+/// screenClassOverride parameter. setScreenName:screenClass: must be called after
+/// [super viewDidAppear:].
+///
+/// If your app does not use a distinct UIViewController for each screen, you should call this
+/// method and specify a distinct screenName each time a new screen is presented to the user.
+///
+/// The screen name and screen class remain in effect until the current UIViewController changes or
+/// a new call to setScreenName:screenClass: is made.
+///
+/// @param screenName The name of the current screen. Should contain 1 to 100 characters. Set to nil
+/// to clear the current screen name.
+/// @param screenClassOverride The name of the screen class. Should contain 1 to 100 characters. By
+/// default this is the class name of the current UIViewController. Set to nil to revert to the
+/// default class name.
++ (void)setScreenName:(nullable NSString *)screenName
+ screenClass:(nullable NSString *)screenClassOverride;
+
+/// Sets whether analytics collection is enabled for this app on this device. This setting is
+/// persisted across app sessions. By default it is enabled.
+///
+/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection.
++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
+
+/// Sets the interval of inactivity in seconds that terminates the current session. The default
+/// value is 1800 seconds (30 minutes).
+///
+/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current
+/// session terminates.
++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval;
+
+/// The unique ID for this instance of the application.
++ (NSString *)appInstanceID;
+
+/// Clears all analytics data for this instance from the device and resets the app instance ID.
+/// FIRAnalyticsConfiguration values will be reset to the default values.
++ (void)resetAnalyticsData;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIREventNames.h
new file mode 100755
index 000000000..c70c53e25
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIREventNames.h
@@ -0,0 +1,407 @@
+/// @file FIREventNames.h
+///
+/// Predefined event names.
+///
+/// An Event is an important occurrence in your app that you want to measure. You can report up to
+/// 500 different types of Events per app and you can associate up to 25 unique parameters with each
+/// Event type. Some common events are suggested below, but you may also choose to specify custom
+/// Event types that are associated with your specific app. Each event type is identified by a
+/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric
+/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_",
+/// "google_", and "ga_" prefixes are reserved and should not be used.
+
+#import <Foundation/Foundation.h>
+
+/// Add Payment Info event. This event signifies that a user has submitted their payment information
+/// to your app.
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) =
+ @"add_payment_info";
+
+/// E-Commerce Add To Cart event. This event signifies that an item was added to a cart for
+/// purchase. Add this event to a funnel with kFIREventEcommercePurchase to gauge the effectiveness
+/// of your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must
+/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
+/// accurately. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// <li>@c kFIRParameterItemName (NSString)</li>
+/// <li>@c kFIRParameterItemCategory (NSString)</li>
+/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
+/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
+/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
+/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart";
+
+/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist.
+/// Use this event to identify popular gift items in your app. Note: If you supply the
+/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency
+/// parameter so that revenue metrics can be computed accurately. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// <li>@c kFIRParameterItemName (NSString)</li>
+/// <li>@c kFIRParameterItemCategory (NSString)</li>
+/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
+/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// </ul>
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) =
+ @"add_to_wishlist";
+
+/// App Open event. By logging this event when an App becomes active, developers can understand how
+/// often users leave and return during the course of a Session. Although Sessions are automatically
+/// reported, this event can provide further clarification around the continuous engagement of
+/// app-users.
+static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open";
+
+/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of
+/// checking out. Add this event to a funnel with your kFIREventEcommercePurchase event to gauge the
+/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue
+/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue
+/// metrics can be computed accurately. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
+/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
+/// hotel bookings</li>
+/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
+/// hotel bookings</li>
+/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
+/// for travel bookings</li>
+/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
+/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
+/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
+/// </ul>
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) =
+ @"begin_checkout";
+
+/// Campaign Detail event. Log this event to supply the referral details of a re-engagement
+/// campaign. Note: you must supply at least one of the required parameters kFIRParameterSource,
+/// kFIRParameterMedium or kFIRParameterCampaign. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterSource (NSString)</li>
+/// <li>@c kFIRParameterMedium (NSString)</li>
+/// <li>@c kFIRParameterCampaign (NSString)</li>
+/// <li>@c kFIRParameterTerm (NSString) (optional)</li>
+/// <li>@c kFIRParameterContent (NSString) (optional)</li>
+/// <li>@c kFIRParameterAdNetworkClickID (NSString) (optional)</li>
+/// <li>@c kFIRParameterCP1 (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) =
+ @"campaign_details";
+
+/// Checkout progress. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterCheckoutOption (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventCheckoutProgress NS_SWIFT_NAME(AnalyticsEventCheckoutProgress) =
+ @"checkout_progress";
+
+/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log
+/// this along with @c kFIREventSpendVirtualCurrency to better understand your virtual economy.
+/// Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterVirtualCurrencyName (NSString)</li>
+/// <li>@c kFIRParameterValue (signed 64-bit integer or double as NSNumber)</li>
+/// </ul>
+static NSString *const kFIREventEarnVirtualCurrency
+ NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency";
+
+/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note:
+/// This is different from the in-app purchase event, which is reported automatically for App
+/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also
+/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
+/// accurately. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
+/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
+/// <li>@c kFIRParameterLocation (NSString) (optional)</li>
+/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
+/// hotel bookings</li>
+/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
+/// hotel bookings</li>
+/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
+/// for travel bookings</li>
+/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
+/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
+/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
+/// </ul>
+static NSString *const kFIREventEcommercePurchase NS_SWIFT_NAME(AnalyticsEventEcommercePurchase) =
+ @"ecommerce_purchase";
+
+/// Generate Lead event. Log this event when a lead has been generated in the app to understand the
+/// efficacy of your install and re-engagement campaigns. Note: If you supply the
+/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency
+/// parameter so that revenue metrics can be computed accurately. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// </ul>
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) =
+ @"generate_lead";
+
+/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use
+/// this event to analyze how popular certain groups or social features are in your app. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterGroupID (NSString)</li>
+/// </ul>
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group";
+
+/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can
+/// help you gauge the level distribution of your userbase and help you identify certain levels that
+/// are difficult to pass. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterLevel (signed 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterCharacter (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up";
+
+/// Login event. Apps with a login feature can report this event to signify that a user has logged
+/// in.
+static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login";
+
+/// Post Score event. Log this event when the user posts a score in your gaming app. This event can
+/// help you understand how users are actually performing in your game and it can help you correlate
+/// high scores with certain audiences or behaviors. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterScore (signed 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterLevel (signed 64-bit integer as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCharacter (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score";
+
+/// Present Offer event. This event signifies that the app has presented a purchase offer to a user.
+/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge
+/// your conversion process. Note: If you supply the @c kFIRParameterValue parameter, you must
+/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
+/// accurately. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// <li>@c kFIRParameterItemName (NSString)</li>
+/// <li>@c kFIRParameterItemCategory (NSString)</li>
+/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
+/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// </ul>
+static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresentOffer) =
+ @"present_offer";
+
+/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded.
+/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
+/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
+/// Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventPurchaseRefund NS_SWIFT_NAME(AnalyticsEventPurchaseRefund) =
+ @"purchase_refund";
+
+/// Remove from cart event. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// <li>@c kFIRParameterItemName (NSString)</li>
+/// <li>@c kFIRParameterItemCategory (NSString)</li>
+/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
+/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
+/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
+/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
+/// </ul>
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) =
+ @"remove_from_cart";
+
+/// Search event. Apps that support search features can use this event to contextualize search
+/// operations by supplying the appropriate, corresponding parameters. This event can help you
+/// identify the most popular content in your app. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterSearchTerm (NSString)</li>
+/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
+/// hotel bookings</li>
+/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
+/// hotel bookings</li>
+/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
+/// for travel bookings</li>
+/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
+/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
+/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
+/// </ul>
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search";
+
+/// Select Content event. This general purpose event signifies that a user has selected some content
+/// of a certain type in an app. The content can be any object in your app. This event can help you
+/// identify popular content and categories of content in your app. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterContentType (NSString)</li>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// </ul>
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) =
+ @"select_content";
+
+/// Set checkout option. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)</li>
+/// <li>@c kFIRParameterCheckoutOption (NSString)</li>
+/// </ul>
+static NSString *const kFIREventSetCheckoutOption NS_SWIFT_NAME(AnalyticsEventSetCheckoutOption) =
+ @"set_checkout_option";
+
+/// Share event. Apps with social features can log the Share event to identify the most viral
+/// content. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterContentType (NSString)</li>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// </ul>
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share";
+
+/// Sign Up event. This event indicates that a user has signed up for an account in your app. The
+/// parameter signifies the method by which the user signed up. Use this event to understand the
+/// different behaviors between logged in and logged out users. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterSignUpMethod (NSString)</li>
+/// </ul>
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up";
+
+/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can
+/// help you identify which virtual goods are the most popular objects of purchase. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterItemName (NSString)</li>
+/// <li>@c kFIRParameterVirtualCurrencyName (NSString)</li>
+/// <li>@c kFIRParameterValue (signed 64-bit integer or double as NSNumber)</li>
+/// </ul>
+static NSString *const kFIREventSpendVirtualCurrency
+ NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency";
+
+/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use
+/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this
+/// process and move on to the full app experience.
+static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) =
+ @"tutorial_begin";
+
+/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding
+/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your
+/// on-boarding process.
+static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) =
+ @"tutorial_complete";
+
+/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your
+/// game. Since achievements generally represent the breadth of a gaming experience, this event can
+/// help you understand how many users are experiencing all that your game has to offer. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterAchievementID (NSString)</li>
+/// </ul>
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) =
+ @"unlock_achievement";
+
+/// View Item event. This event signifies that some content was shown to the user. This content may
+/// be a product, a webpage or just a simple image or text. Use the appropriate parameters to
+/// contextualize the event. Use this event to discover the most popular items viewed in your app.
+/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
+/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
+/// Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterItemID (NSString)</li>
+/// <li>@c kFIRParameterItemName (NSString)</li>
+/// <li>@c kFIRParameterItemCategory (NSString)</li>
+/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
+/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
+/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
+/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
+/// <li>@c kFIRParameterFlightNumber (NSString) (optional) for travel bookings</li>
+/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
+/// for travel bookings</li>
+/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
+/// travel bookings</li>
+/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
+/// travel bookings</li>
+/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
+/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
+/// <li>@c kFIRParameterSearchTerm (NSString) (optional) for travel bookings</li>
+/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
+/// </ul>
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item";
+
+/// View Item List event. Log this event when the user has been presented with a list of items of a
+/// certain category. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterItemCategory (NSString)</li>
+/// </ul>
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) =
+ @"view_item_list";
+
+/// View Search Results event. Log this event when the user has been presented with the results of a
+/// search. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterSearchTerm (NSString)</li>
+/// </ul>
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) =
+ @"view_search_results";
+
+/// Level Start event. Log this event when the user starts a new level. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterLevelName (NSString)</li>
+/// </ul>
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) =
+ @"level_start";
+
+/// Level End event. Log this event when the user finishes a level. Params:
+///
+/// <ul>
+/// <li>@c kFIRParameterLevelName (NSString)</li>
+/// <li>@c kFIRParameterSuccess (NSString)</li>
+/// </ul>
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end";
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
new file mode 100755
index 000000000..ad9fff71f
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
@@ -0,0 +1,532 @@
+/// @file FIRParameterNames.h
+///
+/// Predefined event parameter names.
+///
+/// Params supply information that contextualize Events. You can associate up to 25 unique Params
+/// with each Event type. Some Params are suggested below for certain common Events, but you are
+/// not limited to these. You may supply extra Params for suggested Events or custom Params for
+/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric
+/// characters and underscores ("_"), and must start with an alphabetic character. Param values can
+/// be up to 100 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and
+/// should not be used.
+
+#import <Foundation/Foundation.h>
+
+/// Game achievement ID (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterAchievementID : @"10_matches_won",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) =
+ @"achievement_id";
+
+/// Ad Network Click ID (NSString). Used for network-specific click IDs which vary in format.
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterAdNetworkClickID : @"1234567",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterAdNetworkClickID
+ NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid";
+
+/// The store or affiliation from which this transaction occurred (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterAffiliation : @"Google Store",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) =
+ @"affiliation";
+
+/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to
+/// capture campaign information, otherwise can be populated by developer. Highly Recommended
+/// (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCampaign : @"winter_promotion",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) =
+ @"campaign";
+
+/// Character used in game (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCharacter : @"beat_boss",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) =
+ @"character";
+
+/// The checkout step (1..N) (unsigned 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCheckoutStep : @"1",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCheckoutStep NS_SWIFT_NAME(AnalyticsParameterCheckoutStep) =
+ @"checkout_step";
+
+/// Some option on a step in an ecommerce flow (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCheckoutOption : @"Visa",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCheckoutOption
+ NS_SWIFT_NAME(AnalyticsParameterCheckoutOption) = @"checkout_option";
+
+/// Campaign content (NSString).
+static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content";
+
+/// Type of content selected (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterContentType : @"news article",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) =
+ @"content_type";
+
+/// Coupon code for a purchasable item (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCoupon : @"zz123",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon";
+
+/// Campaign custom parameter (NSString). Used as a method of capturing custom data in a campaign.
+/// Use varies by network.
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCP1 : @"custom_data",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1";
+
+/// The name of a creative used in a promotional spot (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCreativeName : @"Summer Sale",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) =
+ @"creative_name";
+
+/// The name of a creative slot (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCreativeSlot : @"summer_banner2",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) =
+ @"creative_slot";
+
+/// Purchase currency in 3-letter <a href="http://en.wikipedia.org/wiki/ISO_4217#Active_codes">
+/// ISO_4217</a> format (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterCurrency : @"USD",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) =
+ @"currency";
+
+/// Flight or Travel destination (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterDestination : @"Mountain View, CA",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) =
+ @"destination";
+
+/// The arrival date, check-out date or rental end date for the item. This should be in
+/// YYYY-MM-DD format (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterEndDate : @"2015-09-14",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date";
+
+/// Flight number for travel events (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterFlightNumber : @"ZZ800",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) =
+ @"flight_number";
+
+/// Group/clan/guild ID (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterGroupID : @"g1",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id";
+
+/// Index of an item in a list (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterIndex : @(1),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index";
+
+/// Item brand (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemBrand : @"Google",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) =
+ @"item_brand";
+
+/// Item category (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemCategory : @"t-shirts",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) =
+ @"item_category";
+
+/// Item ID (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemID : @"p7654",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id";
+
+/// The Google <a href="https://developers.google.com/places/place-id">Place ID</a> (NSString) that
+/// corresponds to the associated item. Alternatively, you can supply your own custom Location ID.
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemLocationID
+ NS_SWIFT_NAME(AnalyticsParameterItemLocationID) = @"item_location_id";
+
+/// Item name (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemName : @"abc",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) =
+ @"item_name";
+
+/// The list in which the item was presented to the user (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemList : @"Search Results",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemList NS_SWIFT_NAME(AnalyticsParameterItemList) =
+ @"item_list";
+
+/// Item variant (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterItemVariant : @"Red",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) =
+ @"item_variant";
+
+/// Level in game (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterLevel : @(42),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level";
+
+/// Location (NSString). The Google <a href="https://developers.google.com/places/place-id">Place ID
+/// </a> that corresponds to the associated event. Alternatively, you can supply your own custom
+/// Location ID.
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterLocation : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) =
+ @"location";
+
+/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended
+/// (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterMedium : @"email",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium";
+
+/// Number of nights staying at hotel (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterNumberOfNights : @(3),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterNumberOfNights
+ NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights";
+
+/// Number of passengers traveling (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterNumberOfPassengers : @(11),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterNumberOfPassengers
+ NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers";
+
+/// Number of rooms for travel events (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterNumberOfRooms : @(2),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) =
+ @"number_of_rooms";
+
+/// Flight or Travel origin (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterOrigin : @"Mountain View, CA",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin";
+
+/// Purchase price (double as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterPrice : @(1.0),
+/// kFIRParameterCurrency : @"USD", // e.g. $1.00 USD
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price";
+
+/// Purchase quantity (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterQuantity : @(1),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) =
+ @"quantity";
+
+/// Score in game (signed 64-bit integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterScore : @(4200),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score";
+
+/// The search string/keywords used (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterSearchTerm : @"periodic table",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) =
+ @"search_term";
+
+/// Shipping cost (double as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterShipping : @(9.50),
+/// kFIRParameterCurrency : @"USD", // e.g. $9.50 USD
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) =
+ @"shipping";
+
+/// Sign up method (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterSignUpMethod : @"google",
+/// // ...
+/// };
+/// </pre>
+///
+/// <b>This constant has been deprecated. Use Method constant instead.</b>
+static NSString *const kFIRParameterSignUpMethod NS_SWIFT_NAME(AnalyticsParameterSignUpMethod) =
+ @"sign_up_method";
+
+/// A particular approach used in an operation; for example, "facebook" or "email" in the context
+/// of a sign_up or login event. (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterMethod : @"google",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method";
+
+/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban
+/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your
+/// property. Highly recommended (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterSource : @"InMobi",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source";
+
+/// The departure date, check-in date or rental start date for the item. This should be in
+/// YYYY-MM-DD format (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterStartDate : @"2015-09-14",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) =
+ @"start_date";
+
+/// Tax amount (double as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterTax : @(1.0),
+/// kFIRParameterCurrency : @"USD", // e.g. $1.00 USD
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax";
+
+/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword
+/// (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterTerm : @"game",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term";
+
+/// A single ID for a ecommerce group transaction (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterTransactionID : @"ab7236dd9823",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) =
+ @"transaction_id";
+
+/// Travel class (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterTravelClass : @"business",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) =
+ @"travel_class";
+
+/// A context-specific numeric value which is accumulated automatically for each event type. This is
+/// a general purpose parameter that is useful for accumulating a key metric that pertains to an
+/// event. Examples include revenue, distance, time and points. Value should be specified as signed
+/// 64-bit integer or double as NSNumber. Notes: Values for pre-defined currency-related events
+/// (such as @c kFIREventAddToCart) should be supplied using double as NSNumber and must be
+/// accompanied by a @c kFIRParameterCurrency parameter. The valid range of accumulated values is
+/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the
+/// corresponding @c kFIRParameterCurrency parameter, or supplying an invalid
+/// <a href="https://goo.gl/qqX3J2">currency code</a> for conversion events will cause that
+/// conversion to be omitted from reporting.
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterValue : @(3.99),
+/// kFIRParameterCurrency : @"USD", // e.g. $3.99 USD
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value";
+
+/// Name of virtual currency type (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterVirtualCurrencyName : @"virtual_currency_name",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterVirtualCurrencyName
+ NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name";
+
+/// The name of a level in a game (NSString).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterLevelName : @"room_1",
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) =
+ @"level_name";
+
+/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (unsigned
+/// integer as NSNumber).
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterSuccess : @(1),
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success";
+
+/// Indicates that the associated event should either extend the current session
+/// or start a new session if no session was active when the event was logged.
+/// Specify YES to extend the current session or to start a new session; any
+/// other value will not extend or start a session.
+/// <pre>
+/// NSDictionary *params = @{
+/// kFIRParameterExtendSession : @YES,
+/// // ...
+/// };
+/// </pre>
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) =
+ @"extend_session";
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h
new file mode 100755
index 000000000..f50707fa1
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h
@@ -0,0 +1,17 @@
+/// @file FIRUserPropertyNames.h
+///
+/// Predefined user property names.
+///
+/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can
+/// later analyze different behaviors of various segments of your userbase. You may supply up to 25
+/// unique UserProperties per app, and you can use the name and value of your choosing for each one.
+/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and
+/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to
+/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not
+/// be used.
+
+#import <Foundation/Foundation.h>
+
+/// The method used to sign in. For example, "google", "facebook" or "twitter".
+static NSString *const kFIRUserPropertySignUpMethod
+ NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method";
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h
new file mode 100755
index 000000000..ed7588a6b
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h
@@ -0,0 +1,5 @@
+#import "FIRAnalytics+AppDelegate.h"
+#import "FIRAnalytics.h"
+#import "FIREventNames.h"
+#import "FIRParameterNames.h"
+#import "FIRUserPropertyNames.h"
diff --git a/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Modules/module.modulemap
new file mode 100755
index 000000000..6118e372e
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseAnalytics.framework/Modules/module.modulemap
@@ -0,0 +1,11 @@
+framework module FirebaseAnalytics {
+ umbrella header "FirebaseAnalytics.h"
+ export *
+ module * { export * }
+ link "sqlite3"
+ link "z"
+ link framework "Security"
+ link framework "StoreKit"
+ link framework "SystemConfiguration"
+ link framework "UIKit"
+}
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/FirebaseCore b/Libraries external/Firebase/Analytics/FirebaseCore.framework/FirebaseCore
new file mode 100644
index 000000000..cd934d5b0
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/FirebaseCore
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h
new file mode 100644
index 000000000..add4a38ee
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * This class provides configuration fields for Firebase Analytics.
+ */
+NS_SWIFT_NAME(AnalyticsConfiguration)
+DEPRECATED_MSG_ATTRIBUTE("Use these methods directly on the `Analytics` class.")
+@interface FIRAnalyticsConfiguration : NSObject
+
+/**
+ * Returns the shared instance of FIRAnalyticsConfiguration.
+ */
++ (FIRAnalyticsConfiguration *)sharedInstance NS_SWIFT_NAME(shared());
+
+/**
+ * Deprecated.
+ * Sets the minimum engagement time in seconds required to start a new session. The default value
+ * is 10 seconds.
+ */
+- (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval
+ DEPRECATED_MSG_ATTRIBUTE(
+ "Sessions are started immediately. More information at https://bit.ly/2FU46av");
+
+/**
+ * Sets the interval of inactivity in seconds that terminates the current session. The default
+ * value is 1800 seconds (30 minutes).
+ */
+- (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval;
+
+/**
+ * Sets whether analytics collection is enabled for this app on this device. This setting is
+ * persisted across app sessions. By default it is enabled.
+ */
+- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRApp.h b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRApp.h
new file mode 100644
index 000000000..e0dd6d692
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRApp.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+@class FIROptions;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** A block that takes a BOOL and has no return value. */
+typedef void (^FIRAppVoidBoolCallback)(BOOL success) NS_SWIFT_NAME(FirebaseAppVoidBoolCallback);
+
+/**
+ * The entry point of Firebase SDKs.
+ *
+ * Initialize and configure FIRApp using +[FIRApp configure]
+ * or other customized ways as shown below.
+ *
+ * The logging system has two modes: default mode and debug mode. In default mode, only logs with
+ * log level Notice, Warning and Error will be sent to device. In debug mode, all logs will be sent
+ * to device. The log levels that Firebase uses are consistent with the ASL log levels.
+ *
+ * Enable debug mode by passing the -FIRDebugEnabled argument to the application. You can add this
+ * argument in the application's Xcode scheme. When debug mode is enabled via -FIRDebugEnabled,
+ * further executions of the application will also be in debug mode. In order to return to default
+ * mode, you must explicitly disable the debug mode with the application argument -FIRDebugDisabled.
+ *
+ * It is also possible to change the default logging level in code by calling setLoggerLevel: on
+ * the FIRConfiguration interface.
+ */
+NS_SWIFT_NAME(FirebaseApp)
+@interface FIRApp : NSObject
+
+/**
+ * Configures a default Firebase app. Raises an exception if any configuration step fails. The
+ * default app is named "__FIRAPP_DEFAULT". This method should be called after the app is launched
+ * and before using Firebase services. This method is thread safe and contains synchronous file I/O
+ * (reading GoogleService-Info.plist from disk).
+ */
++ (void)configure;
+
+/**
+ * Configures the default Firebase app with the provided options. The default app is named
+ * "__FIRAPP_DEFAULT". Raises an exception if any configuration step fails. This method is thread
+ * safe.
+ *
+ * @param options The Firebase application options used to configure the service.
+ */
++ (void)configureWithOptions:(FIROptions *)options NS_SWIFT_NAME(configure(options:));
+
+/**
+ * Configures a Firebase app with the given name and options. Raises an exception if any
+ * configuration step fails. This method is thread safe.
+ *
+ * @param name The application's name given by the developer. The name should should only contain
+ Letters, Numbers and Underscore.
+ * @param options The Firebase application options used to configure the services.
+ */
+// clang-format off
++ (void)configureWithName:(NSString *)name
+ options:(FIROptions *)options NS_SWIFT_NAME(configure(name:options:));
+// clang-format on
+
+/**
+ * Returns the default app, or nil if the default app does not exist.
+ */
++ (nullable FIRApp *)defaultApp NS_SWIFT_NAME(app());
+
+/**
+ * Returns a previously created FIRApp instance with the given name, or nil if no such app exists.
+ * This method is thread safe.
+ */
++ (nullable FIRApp *)appNamed:(NSString *)name NS_SWIFT_NAME(app(name:));
+
+/**
+ * Returns the set of all extant FIRApp instances, or nil if there are no FIRApp instances. This
+ * method is thread safe.
+ */
+@property(class, readonly, nullable) NSDictionary<NSString *, FIRApp *> *allApps;
+
+/**
+ * Cleans up the current FIRApp, freeing associated data and returning its name to the pool for
+ * future use. This method is thread safe.
+ */
+- (void)deleteApp:(FIRAppVoidBoolCallback)completion;
+
+/**
+ * FIRApp instances should not be initialized directly. Call +[FIRApp configure],
+ * +[FIRApp configureWithOptions:], or +[FIRApp configureWithNames:options:] directly.
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * Gets the name of this app.
+ */
+@property(nonatomic, copy, readonly) NSString *name;
+
+/**
+ * Gets a copy of the options for this app. These are non-modifiable.
+ */
+@property(nonatomic, copy, readonly) FIROptions *options;
+
+/**
+ * Gets or sets whether automatic data collection is enabled for all products. Defaults to `YES`
+ * unless `FirebaseDataCollectionDefaultEnabled` is set to `NO` in your app's Info.plist. This value
+ * is persisted across runs of the app so that it can be set once when users have consented to
+ * collection.
+ */
+@property(nonatomic, readwrite, getter=isDataCollectionDefaultEnabled)
+ BOOL dataCollectionDefaultEnabled;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRConfiguration.h b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRConfiguration.h
new file mode 100644
index 000000000..b88fcaf9f
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRConfiguration.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+#import "FIRAnalyticsConfiguration.h"
+#import "FIRLoggerLevel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * This interface provides global level properties that the developer can tweak, and the singleton
+ * of the Firebase Analytics configuration class.
+ */
+NS_SWIFT_NAME(FirebaseConfiguration)
+@interface FIRConfiguration : NSObject
+
+/** Returns the shared configuration object. */
+@property(class, nonatomic, readonly) FIRConfiguration *sharedInstance NS_SWIFT_NAME(shared);
+
+/** The configuration class for Firebase Analytics. */
+@property(nonatomic, readwrite)
+ FIRAnalyticsConfiguration *analyticsConfiguration DEPRECATED_MSG_ATTRIBUTE(
+ "Use the methods available here directly on the `Analytics` class.");
+
+/**
+ * Sets the logging level for internal Firebase logging. Firebase will only log messages
+ * that are logged at or below loggerLevel. The messages are logged both to the Xcode
+ * console and to the device's log. Note that if an app is running from AppStore, it will
+ * never log above FIRLoggerLevelNotice even if loggerLevel is set to a higher (more verbose)
+ * setting.
+ *
+ * @param loggerLevel The maximum logging level. The default level is set to FIRLoggerLevelNotice.
+ */
+- (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRLoggerLevel.h b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRLoggerLevel.h
new file mode 100644
index 000000000..dca3aa0b0
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIRLoggerLevel.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Note that importing GULLoggerLevel.h will lead to a non-modular header
+// import error.
+
+/**
+ * The log levels used by internal logging.
+ */
+typedef NS_ENUM(NSInteger, FIRLoggerLevel) {
+ /** Error level, matches ASL_LEVEL_ERR. */
+ FIRLoggerLevelError = 3,
+ /** Warning level, matches ASL_LEVEL_WARNING. */
+ FIRLoggerLevelWarning = 4,
+ /** Notice level, matches ASL_LEVEL_NOTICE. */
+ FIRLoggerLevelNotice = 5,
+ /** Info level, matches ASL_LEVEL_INFO. */
+ FIRLoggerLevelInfo = 6,
+ /** Debug level, matches ASL_LEVEL_DEBUG. */
+ FIRLoggerLevelDebug = 7,
+ /** Minimum log level. */
+ FIRLoggerLevelMin = FIRLoggerLevelError,
+ /** Maximum log level. */
+ FIRLoggerLevelMax = FIRLoggerLevelDebug
+} NS_SWIFT_NAME(FirebaseLoggerLevel);
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIROptions.h b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIROptions.h
new file mode 100644
index 000000000..87a01ddc7
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FIROptions.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * This class provides constant fields of Google APIs.
+ */
+NS_SWIFT_NAME(FirebaseOptions)
+@interface FIROptions : NSObject <NSCopying>
+
+/**
+ * Returns the default options. The first time this is called it synchronously reads
+ * GoogleService-Info.plist from disk.
+ */
++ (nullable FIROptions *)defaultOptions NS_SWIFT_NAME(defaultOptions());
+
+/**
+ * An iOS API key used for authenticating requests from your app, e.g.
+ * @"AIzaSyDdVgKwhZl0sTTTLZ7iTmt1r3N2cJLnaDk", used to identify your app to Google servers.
+ */
+@property(nonatomic, copy, nullable) NSString *APIKey NS_SWIFT_NAME(apiKey);
+
+/**
+ * The bundle ID for the application. Defaults to `[[NSBundle mainBundle] bundleID]` when not set
+ * manually or in a plist.
+ */
+@property(nonatomic, copy) NSString *bundleID;
+
+/**
+ * The OAuth2 client ID for iOS application used to authenticate Google users, for example
+ * @"12345.apps.googleusercontent.com", used for signing in with Google.
+ */
+@property(nonatomic, copy, nullable) NSString *clientID;
+
+/**
+ * The tracking ID for Google Analytics, e.g. @"UA-12345678-1", used to configure Google Analytics.
+ */
+@property(nonatomic, copy, nullable) NSString *trackingID;
+
+/**
+ * The Project Number from the Google Developer's console, for example @"012345678901", used to
+ * configure Google Cloud Messaging.
+ */
+@property(nonatomic, copy) NSString *GCMSenderID NS_SWIFT_NAME(gcmSenderID);
+
+/**
+ * The Project ID from the Firebase console, for example @"abc-xyz-123".
+ */
+@property(nonatomic, copy, nullable) NSString *projectID;
+
+/**
+ * The Android client ID used in Google AppInvite when an iOS app has its Android version, for
+ * example @"12345.apps.googleusercontent.com".
+ */
+@property(nonatomic, copy, nullable) NSString *androidClientID;
+
+/**
+ * The Google App ID that is used to uniquely identify an instance of an app.
+ */
+@property(nonatomic, copy) NSString *googleAppID;
+
+/**
+ * The database root URL, e.g. @"http://abc-xyz-123.firebaseio.com".
+ */
+@property(nonatomic, copy, nullable) NSString *databaseURL;
+
+/**
+ * The URL scheme used to set up Durable Deep Link service.
+ */
+@property(nonatomic, copy, nullable) NSString *deepLinkURLScheme;
+
+/**
+ * The Google Cloud Storage bucket name, e.g. @"abc-xyz-123.storage.firebase.com".
+ */
+@property(nonatomic, copy, nullable) NSString *storageBucket;
+
+/**
+ * Initializes a customized instance of FIROptions from the file at the given plist file path. This
+ * will read the file synchronously from disk.
+ * For example,
+ * NSString *filePath =
+ * [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
+ * FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
+ * Returns nil if the plist file does not exist or is invalid.
+ */
+- (nullable instancetype)initWithContentsOfFile:(NSString *)plistPath;
+
+/**
+ * Initializes a customized instance of FIROptions with required fields. Use the mutable properties
+ * to modify fields for configuring specific services.
+ */
+// clang-format off
+- (instancetype)initWithGoogleAppID:(NSString *)googleAppID
+ GCMSenderID:(NSString *)GCMSenderID
+ NS_SWIFT_NAME(init(googleAppID:gcmSenderID:));
+// clang-format on
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FirebaseCore.h b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FirebaseCore.h
new file mode 100644
index 000000000..fa26f694b
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Headers/FirebaseCore.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRAnalyticsConfiguration.h"
+#import "FIRApp.h"
+#import "FIRConfiguration.h"
+#import "FIRLoggerLevel.h"
+#import "FIROptions.h"
diff --git a/Libraries external/Firebase/Analytics/FirebaseCore.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Modules/module.modulemap
new file mode 100644
index 000000000..c33728f0a
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCore.framework/Modules/module.modulemap
@@ -0,0 +1,6 @@
+framework module FirebaseCore {
+umbrella header "FirebaseCore.h"
+export *
+module * { export * }
+ link framework "Foundation"
+}
diff --git a/Libraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics b/Libraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics
new file mode 100755
index 000000000..784272dbc
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/Modules/module.modulemap
new file mode 100755
index 000000000..ce076e0a1
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseCoreDiagnostics.framework/Modules/module.modulemap
@@ -0,0 +1,7 @@
+framework module FirebaseCoreDiagnostics {
+ export *
+ module * { export * }
+ link "z"
+ link framework "Security"
+ link framework "SystemConfiguration"
+}
diff --git a/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/FirebaseInstanceID b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/FirebaseInstanceID
new file mode 100644
index 000000000..48634b57a
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/FirebaseInstanceID
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FIRInstanceID.h b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FIRInstanceID.h
new file mode 100644
index 000000000..d95995acf
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FIRInstanceID.h
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class FIRInstanceIDResult;
+/**
+ * @memberof FIRInstanceID
+ *
+ * The scope to be used when fetching/deleting a token for Firebase Messaging.
+ */
+FOUNDATION_EXPORT NSString *const kFIRInstanceIDScopeFirebaseMessaging
+ NS_SWIFT_NAME(InstanceIDScopeFirebaseMessaging);
+
+#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
+/**
+ * Called when the system determines that tokens need to be refreshed.
+ * This method is also called if Instance ID has been reset in which
+ * case, tokens and FCM topic subscriptions also need to be refreshed.
+ *
+ * Instance ID service will throttle the refresh event across all devices
+ * to control the rate of token updates on application servers.
+ */
+FOUNDATION_EXPORT const NSNotificationName kFIRInstanceIDTokenRefreshNotification
+ NS_SWIFT_NAME(InstanceIDTokenRefresh);
+#else
+/**
+ * Called when the system determines that tokens need to be refreshed.
+ * This method is also called if Instance ID has been reset in which
+ * case, tokens and FCM topic subscriptions also need to be refreshed.
+ *
+ * Instance ID service will throttle the refresh event across all devices
+ * to control the rate of token updates on application servers.
+ */
+FOUNDATION_EXPORT NSString *const kFIRInstanceIDTokenRefreshNotification
+ NS_SWIFT_NAME(InstanceIDTokenRefreshNotification);
+#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
+
+/**
+ * @related FIRInstanceID
+ *
+ * The completion handler invoked when the InstanceID token returns. If
+ * the call fails we return the appropriate `error code` as described below.
+ *
+ * @param token The valid token as returned by InstanceID backend.
+ *
+ * @param error The error describing why generating a new token
+ * failed. See the error codes below for a more detailed
+ * description.
+ */
+typedef void (^FIRInstanceIDTokenHandler)(NSString *__nullable token, NSError *__nullable error)
+ NS_SWIFT_NAME(InstanceIDTokenHandler);
+
+/**
+ * @related FIRInstanceID
+ *
+ * The completion handler invoked when the InstanceID `deleteToken` returns. If
+ * the call fails we return the appropriate `error code` as described below
+ *
+ * @param error The error describing why deleting the token failed.
+ * See the error codes below for a more detailed description.
+ */
+typedef void (^FIRInstanceIDDeleteTokenHandler)(NSError *error)
+ NS_SWIFT_NAME(InstanceIDDeleteTokenHandler);
+
+/**
+ * @related FIRInstanceID
+ *
+ * The completion handler invoked when the app identity is created. If the
+ * identity wasn't created for some reason we return the appropriate error code.
+ *
+ * @param identity A valid identity for the app instance, nil if there was an error
+ * while creating an identity.
+ * @param error The error if fetching the identity fails else nil.
+ */
+typedef void (^FIRInstanceIDHandler)(NSString *__nullable identity, NSError *__nullable error)
+ NS_SWIFT_NAME(InstanceIDHandler);
+
+/**
+ * @related FIRInstanceID
+ *
+ * The completion handler invoked when the app identity and all the tokens associated
+ * with it are deleted. Returns a valid error object in case of failure else nil.
+ *
+ * @param error The error if deleting the identity and all the tokens associated with
+ * it fails else nil.
+ */
+typedef void (^FIRInstanceIDDeleteHandler)(NSError *__nullable error)
+ NS_SWIFT_NAME(InstanceIDDeleteHandler);
+
+/**
+ * @related FIRInstanceID
+ *
+ * The completion handler invoked when the app identity and token are fetched. If the
+ * identity wasn't created for some reason we return the appropriate error code.
+ *
+ * @param result The result containing an identity for the app instance and a valid token,
+ * nil if there was an error while creating the result.
+ * @param error The error if fetching the identity or token fails else nil.
+ */
+typedef void (^FIRInstanceIDResultHandler)(FIRInstanceIDResult *__nullable result,
+ NSError *__nullable error)
+ NS_SWIFT_NAME(InstanceIDResultHandler);
+
+/**
+ * Public errors produced by InstanceID.
+ */
+typedef NS_ENUM(NSUInteger, FIRInstanceIDError) {
+ // Http related errors.
+
+ /// Unknown error.
+ FIRInstanceIDErrorUnknown = 0,
+
+ /// Auth Error -- GCM couldn't validate request from this client.
+ FIRInstanceIDErrorAuthentication = 1,
+
+ /// NoAccess -- InstanceID service cannot be accessed.
+ FIRInstanceIDErrorNoAccess = 2,
+
+ /// Timeout -- Request to InstanceID backend timed out.
+ FIRInstanceIDErrorTimeout = 3,
+
+ /// Network -- No network available to reach the servers.
+ FIRInstanceIDErrorNetwork = 4,
+
+ /// OperationInProgress -- Another similar operation in progress,
+ /// bailing this one.
+ FIRInstanceIDErrorOperationInProgress = 5,
+
+ /// InvalidRequest -- Some parameters of the request were invalid.
+ FIRInstanceIDErrorInvalidRequest = 7,
+} NS_SWIFT_NAME(InstanceIDError);
+
+/**
+ * A class contains the results of InstanceID and token query.
+ */
+NS_SWIFT_NAME(InstanceIDResult)
+@interface FIRInstanceIDResult : NSObject <NSCopying>
+
+/**
+ * An instanceID uniquely identifies the app instance.
+ */
+@property(nonatomic, readonly, copy) NSString *instanceID;
+
+/*
+ * Returns a Firebase Messaging scoped token for the firebase app.
+ */
+@property(nonatomic, readonly, copy) NSString *token;
+
+@end
+
+/**
+ * Instance ID provides a unique identifier for each app instance and a mechanism
+ * to authenticate and authorize actions (for example, sending an FCM message).
+ *
+ * Once an InstanceID is generated, the library periodically sends information about the
+ * application and the device where it's running to the Firebase backend. To stop this. see
+ * `[FIRInstanceID deleteIDWithHandler:]`.
+ *
+ * Instance ID is long lived but, may be reset if the device is not used for
+ * a long time or the Instance ID service detects a problem.
+ * If Instance ID is reset, the app will be notified via
+ * `kFIRInstanceIDTokenRefreshNotification`.
+ *
+ * If the Instance ID has become invalid, the app can request a new one and
+ * send it to the app server.
+ * To prove ownership of Instance ID and to allow servers to access data or
+ * services associated with the app, call
+ * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`.
+ */
+NS_SWIFT_NAME(InstanceID)
+@interface FIRInstanceID : NSObject
+
+/**
+ * FIRInstanceID.
+ *
+ * @return A shared instance of FIRInstanceID.
+ */
++ (instancetype)instanceID NS_SWIFT_NAME(instanceID());
+
+/**
+ * Unavailable. Use +instanceID instead.
+ */
+- (instancetype)init __attribute__((unavailable("Use +instanceID instead.")));
+
+#pragma mark - Tokens
+
+/**
+ * Returns a result of app instance identifier InstanceID and a Firebase Messaging scoped token.
+ * param handler The callback handler invoked when an app instanceID and a default token
+ * are generated and returned. If instanceID and token fetching fail for some
+ * reason the callback is invoked with nil `result` and the appropriate error.
+ */
+- (void)instanceIDWithHandler:(FIRInstanceIDResultHandler)handler;
+
+/**
+ * Returns a Firebase Messaging scoped token for the firebase app.
+ *
+ * @return Returns the stored token if the device has registered with Firebase Messaging, otherwise
+ * returns nil.
+ */
+- (nullable NSString *)token __deprecated_msg("Use instanceIDWithHandler: instead.");
+
+/**
+ * Returns a token that authorizes an Entity (example: cloud service) to perform
+ * an action on behalf of the application identified by Instance ID.
+ *
+ * This is similar to an OAuth2 token except, it applies to the
+ * application instance instead of a user.
+ *
+ * This is an asynchronous call. If the token fetching fails for some reason
+ * we invoke the completion callback with nil `token` and the appropriate
+ * error.
+ *
+ * This generates an Instance ID if it does not exist yet, which starts periodically sending
+ * information to the Firebase backend (see `[FIRInstanceID getIDWithHandler:]`).
+ *
+ * Note, you can only have one `token` or `deleteToken` call for a given
+ * authorizedEntity and scope at any point of time. Making another such call with the
+ * same authorizedEntity and scope before the last one finishes will result in an
+ * error with code `OperationInProgress`.
+ *
+ * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler:
+ *
+ * @param authorizedEntity Entity authorized by the token.
+ * @param scope Action authorized for authorizedEntity.
+ * @param options The extra options to be sent with your token request. The
+ * value for the `apns_token` should be the NSData object
+ * passed to the UIApplicationDelegate's
+ * `didRegisterForRemoteNotificationsWithDeviceToken` method.
+ * The value for `apns_sandbox` should be a boolean (or an
+ * NSNumber representing a BOOL in Objective C) set to true if
+ * your app is a debug build, which means that the APNs
+ * device token is for the sandbox environment. It should be
+ * set to false otherwise. If the `apns_sandbox` key is not
+ * provided, an automatically-detected value shall be used.
+ * @param handler The callback handler which is invoked when the token is
+ * successfully fetched. In case of success a valid `token` and
+ * `nil` error are returned. In case of any error the `token`
+ * is nil and a valid `error` is returned. The valid error
+ * codes have been documented above.
+ */
+- (void)tokenWithAuthorizedEntity:(NSString *)authorizedEntity
+ scope:(NSString *)scope
+ options:(nullable NSDictionary *)options
+ handler:(FIRInstanceIDTokenHandler)handler;
+
+/**
+ * Revokes access to a scope (action) for an entity previously
+ * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`.
+ *
+ * This is an asynchronous call. Call this on the main thread since InstanceID lib
+ * is not thread safe. In case token deletion fails for some reason we invoke the
+ * `handler` callback passed in with the appropriate error code.
+ *
+ * Note, you can only have one `token` or `deleteToken` call for a given
+ * authorizedEntity and scope at a point of time. Making another such call with the
+ * same authorizedEntity and scope before the last one finishes will result in an error
+ * with code `OperationInProgress`.
+ *
+ * @param authorizedEntity Entity that must no longer have access.
+ * @param scope Action that entity is no longer authorized to perform.
+ * @param handler The handler that is invoked once the unsubscribe call ends.
+ * In case of error an appropriate error object is returned
+ * else error is nil.
+ */
+- (void)deleteTokenWithAuthorizedEntity:(NSString *)authorizedEntity
+ scope:(NSString *)scope
+ handler:(FIRInstanceIDDeleteTokenHandler)handler;
+
+#pragma mark - Identity
+
+/**
+ * Asynchronously fetch a stable identifier that uniquely identifies the app
+ * instance. If the identifier has been revoked or has expired, this method will
+ * return a new identifier.
+ *
+ * Once an InstanceID is generated, the library periodically sends information about the
+ * application and the device where it's running to the Firebase backend. To stop this. see
+ * `[FIRInstanceID deleteIDWithHandler:]`.
+ *
+ * @param handler The handler to invoke once the identifier has been fetched.
+ * In case of error an appropriate error object is returned else
+ * a valid identifier is returned and a valid identifier for the
+ * application instance.
+ */
+- (void)getIDWithHandler:(FIRInstanceIDHandler)handler NS_SWIFT_NAME(getID(handler:));
+
+/**
+ * Resets Instance ID and revokes all tokens.
+ *
+ * This method also triggers a request to fetch a new Instance ID and Firebase Messaging scope
+ * token. Please listen to kFIRInstanceIDTokenRefreshNotification when the new ID and token are
+ * ready.
+ *
+ * This stops the periodic sending of data to the Firebase backend that began when the Instance ID
+ * was generated. No more data is sent until another library calls Instance ID internally again
+ * (like FCM, RemoteConfig or Analytics) or user explicitly calls Instance ID APIs to get an
+ * Instance ID and token again.
+ */
+- (void)deleteIDWithHandler:(FIRInstanceIDDeleteHandler)handler NS_SWIFT_NAME(deleteID(handler:));
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h
new file mode 100644
index 000000000..78c9ef161
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstanceID.h"
diff --git a/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Modules/module.modulemap
new file mode 100644
index 000000000..791fd4641
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/FirebaseInstanceID.framework/Modules/module.modulemap
@@ -0,0 +1,6 @@
+framework module FirebaseInstanceID {
+umbrella header "FirebaseInstanceID.h"
+export *
+module * { export * }
+ link framework "Security"
+}
diff --git a/Libraries external/Firebase/Analytics/GoogleAppMeasurement.framework/GoogleAppMeasurement b/Libraries external/Firebase/Analytics/GoogleAppMeasurement.framework/GoogleAppMeasurement
new file mode 100755
index 000000000..cbc6b5df9
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleAppMeasurement.framework/GoogleAppMeasurement
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/GoogleAppMeasurement.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/GoogleAppMeasurement.framework/Modules/module.modulemap
new file mode 100755
index 000000000..b66fb6459
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleAppMeasurement.framework/Modules/module.modulemap
@@ -0,0 +1,10 @@
+framework module GoogleAppMeasurement {
+ export *
+ module * { export * }
+ link "sqlite3"
+ link "z"
+ link framework "Security"
+ link framework "StoreKit"
+ link framework "SystemConfiguration"
+ link framework "UIKit"
+}
diff --git a/Libraries external/Firebase/Analytics/GoogleUtilities.framework/GoogleUtilities b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/GoogleUtilities
new file mode 100644
index 000000000..7941a7d9a
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/GoogleUtilities
Binary files differ
diff --git a/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerCodes.h b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerCodes.h
new file mode 100644
index 000000000..b71c03797
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerCodes.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+typedef NS_ENUM(NSInteger, GULSwizzlerMessageCode) {
+ // App Delegate Swizzling.
+ kGULSwizzlerMessageCodeAppDelegateSwizzling000 = 1000, // I-SWZ001000
+ kGULSwizzlerMessageCodeAppDelegateSwizzling001 = 1001, // I-SWZ001001
+ kGULSwizzlerMessageCodeAppDelegateSwizzling002 = 1002, // I-SWZ001002
+ kGULSwizzlerMessageCodeAppDelegateSwizzling003 = 1003, // I-SWZ001003
+ kGULSwizzlerMessageCodeAppDelegateSwizzling004 = 1004, // I-SWZ001004
+ kGULSwizzlerMessageCodeAppDelegateSwizzling005 = 1005, // I-SWZ001005
+ kGULSwizzlerMessageCodeAppDelegateSwizzling006 = 1006, // I-SWZ001006
+ kGULSwizzlerMessageCodeAppDelegateSwizzling007 = 1007, // I-SWZ001007
+ kGULSwizzlerMessageCodeAppDelegateSwizzling008 = 1008, // I-SWZ001008
+ kGULSwizzlerMessageCodeAppDelegateSwizzling009 = 1009, // I-SWZ001009
+ kGULSwizzlerMessageCodeAppDelegateSwizzling010 = 1010, // I-SWZ001010
+ kGULSwizzlerMessageCodeAppDelegateSwizzling011 = 1011, // I-SWZ001011
+ kGULSwizzlerMessageCodeAppDelegateSwizzling012 = 1012, // I-SWZ001012
+ kGULSwizzlerMessageCodeAppDelegateSwizzling013 = 1013, // I-SWZ001013
+
+ // Method Swizzling.
+ kGULSwizzlerMessageCodeMethodSwizzling000 = 2000, // I-SWZ002000
+};
diff --git a/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerLevel.h b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerLevel.h
new file mode 100644
index 000000000..81ff212d7
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULLoggerLevel.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The log levels used by internal logging.
+ */
+typedef NS_ENUM(NSInteger, GULLoggerLevel) {
+ /** Error level, matches ASL_LEVEL_ERR. */
+ GULLoggerLevelError = 3,
+ /** Warning level, matches ASL_LEVEL_WARNING. */
+ GULLoggerLevelWarning = 4,
+ /** Notice level, matches ASL_LEVEL_NOTICE. */
+ GULLoggerLevelNotice = 5,
+ /** Info level, matches ASL_LEVEL_INFO. */
+ GULLoggerLevelInfo = 6,
+ /** Debug level, matches ASL_LEVEL_DEBUG. */
+ GULLoggerLevelDebug = 7,
+ /** Minimum log level. */
+ GULLoggerLevelMin = GULLoggerLevelError,
+ /** Maximum log level. */
+ GULLoggerLevelMax = GULLoggerLevelDebug
+} NS_SWIFT_NAME(GoogleLoggerLevel);
diff --git a/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULNSData+zlib.h b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULNSData+zlib.h
new file mode 100644
index 000000000..36f94a709
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Headers/GULNSData+zlib.h
@@ -0,0 +1,49 @@
+// Copyright 2018 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <Foundation/Foundation.h>
+
+/// This is a copy of Google Toolbox for Mac library to avoid creating an extra framework.
+
+// NOTE: For 64bit, none of these apis handle input sizes >32bits, they will return nil when given
+// such data. To handle data of that size you really should be streaming it rather then doing it all
+// in memory.
+
+@interface NSData (GULGzip)
+
+/// Returns an data as the result of decompressing the payload of |data|.The data to decompress must
+/// be a gzipped payloads.
++ (NSData *)gul_dataByInflatingGzippedData:(NSData *)data error:(NSError **)error;
+
+/// Returns an compressed data with the result of gzipping the payload of |data|. Uses the default
+/// compression level.
++ (NSData *)gul_dataByGzippingData:(NSData *)data error:(NSError **)error;
+
+FOUNDATION_EXPORT NSString *const GULNSDataZlibErrorDomain;
+FOUNDATION_EXPORT NSString *const GULNSDataZlibErrorKey; // NSNumber
+FOUNDATION_EXPORT NSString *const GULNSDataZlibRemainingBytesKey; // NSNumber
+
+typedef NS_ENUM(NSInteger, GULNSDataZlibError) {
+ GULNSDataZlibErrorGreaterThan32BitsToCompress = 1024,
+ // An internal zlib error.
+ // GULNSDataZlibErrorKey will contain the error value.
+ // NSLocalizedDescriptionKey may contain an error string from zlib.
+ // Look in zlib.h for list of errors.
+ GULNSDataZlibErrorInternal,
+ // There was left over data in the buffer that was not used.
+ // GULNSDataZlibRemainingBytesKey will contain number of remaining bytes.
+ GULNSDataZlibErrorDataRemaining
+};
+
+@end
diff --git a/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Modules/module.modulemap
new file mode 100644
index 000000000..ca7d94b9c
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/GoogleUtilities.framework/Modules/module.modulemap
@@ -0,0 +1,8 @@
+framework module GoogleUtilities {
+umbrella header "GoogleUtilities.h"
+export *
+module * { export * }
+ link framework "Security"
+ link framework "SystemConfiguration"
+ link "z"
+}
diff --git a/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb.h b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb.h
new file mode 100644
index 000000000..174a84b17
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb.h
@@ -0,0 +1,593 @@
+/* Common parts of the nanopb library. Most of these are quite low-level
+ * stuff. For the high-level interface, see pb_encode.h and pb_decode.h.
+ */
+
+#ifndef PB_H_INCLUDED
+#define PB_H_INCLUDED
+
+/*****************************************************************
+ * Nanopb compilation time options. You can change these here by *
+ * uncommenting the lines, or on the compiler command line. *
+ *****************************************************************/
+
+/* Enable support for dynamically allocated fields */
+/* #define PB_ENABLE_MALLOC 1 */
+
+/* Define this if your CPU / compiler combination does not support
+ * unaligned memory access to packed structures. */
+/* #define PB_NO_PACKED_STRUCTS 1 */
+
+/* Increase the number of required fields that are tracked.
+ * A compiler warning will tell if you need this. */
+/* #define PB_MAX_REQUIRED_FIELDS 256 */
+
+/* Add support for tag numbers > 255 and fields larger than 255 bytes. */
+/* #define PB_FIELD_16BIT 1 */
+
+/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */
+/* #define PB_FIELD_32BIT 1 */
+
+/* Disable support for error messages in order to save some code space. */
+/* #define PB_NO_ERRMSG 1 */
+
+/* Disable support for custom streams (support only memory buffers). */
+/* #define PB_BUFFER_ONLY 1 */
+
+/* Switch back to the old-style callback function signature.
+ * This was the default until nanopb-0.2.1. */
+/* #define PB_OLD_CALLBACK_STYLE */
+
+
+/******************************************************************
+ * You usually don't need to change anything below this line. *
+ * Feel free to look around and use the defined macros, though. *
+ ******************************************************************/
+
+
+/* Version of the nanopb library. Just in case you want to check it in
+ * your own program. */
+#define NANOPB_VERSION nanopb-0.3.9.1
+
+/* Include all the system headers needed by nanopb. You will need the
+ * definitions of the following:
+ * - strlen, memcpy, memset functions
+ * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t
+ * - size_t
+ * - bool
+ *
+ * If you don't have the standard header files, you can instead provide
+ * a custom header that defines or includes all this. In that case,
+ * define PB_SYSTEM_HEADER to the path of this file.
+ */
+#ifdef PB_SYSTEM_HEADER
+#include PB_SYSTEM_HEADER
+#else
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+
+#ifdef PB_ENABLE_MALLOC
+#include <stdlib.h>
+#endif
+#endif
+
+/* Macro for defining packed structures (compiler dependent).
+ * This just reduces memory requirements, but is not required.
+ */
+#if defined(PB_NO_PACKED_STRUCTS)
+ /* Disable struct packing */
+# define PB_PACKED_STRUCT_START
+# define PB_PACKED_STRUCT_END
+# define pb_packed
+#elif defined(__GNUC__) || defined(__clang__)
+ /* For GCC and clang */
+# define PB_PACKED_STRUCT_START
+# define PB_PACKED_STRUCT_END
+# define pb_packed __attribute__((packed))
+#elif defined(__ICCARM__) || defined(__CC_ARM)
+ /* For IAR ARM and Keil MDK-ARM compilers */
+# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)")
+# define PB_PACKED_STRUCT_END _Pragma("pack(pop)")
+# define pb_packed
+#elif defined(_MSC_VER) && (_MSC_VER >= 1500)
+ /* For Microsoft Visual C++ */
+# define PB_PACKED_STRUCT_START __pragma(pack(push, 1))
+# define PB_PACKED_STRUCT_END __pragma(pack(pop))
+# define pb_packed
+#else
+ /* Unknown compiler */
+# define PB_PACKED_STRUCT_START
+# define PB_PACKED_STRUCT_END
+# define pb_packed
+#endif
+
+/* Handly macro for suppressing unreferenced-parameter compiler warnings. */
+#ifndef PB_UNUSED
+#define PB_UNUSED(x) (void)(x)
+#endif
+
+/* Compile-time assertion, used for checking compatible compilation options.
+ * If this does not work properly on your compiler, use
+ * #define PB_NO_STATIC_ASSERT to disable it.
+ *
+ * But before doing that, check carefully the error message / place where it
+ * comes from to see if the error has a real cause. Unfortunately the error
+ * message is not always very clear to read, but you can see the reason better
+ * in the place where the PB_STATIC_ASSERT macro was called.
+ */
+#ifndef PB_NO_STATIC_ASSERT
+#ifndef PB_STATIC_ASSERT
+#define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1];
+#define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER)
+#define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##LINE##COUNTER
+#endif
+#else
+#define PB_STATIC_ASSERT(COND,MSG)
+#endif
+
+/* Number of required fields to keep track of. */
+#ifndef PB_MAX_REQUIRED_FIELDS
+#define PB_MAX_REQUIRED_FIELDS 64
+#endif
+
+#if PB_MAX_REQUIRED_FIELDS < 64
+#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64).
+#endif
+
+/* List of possible field types. These are used in the autogenerated code.
+ * Least-significant 4 bits tell the scalar type
+ * Most-significant 4 bits specify repeated/required/packed etc.
+ */
+
+typedef uint_least8_t pb_type_t;
+
+/**** Field data types ****/
+
+/* Numeric types */
+#define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */
+#define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */
+#define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */
+#define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */
+#define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */
+
+/* Marker for last packable field type. */
+#define PB_LTYPE_LAST_PACKABLE 0x04
+
+/* Byte array with pre-allocated buffer.
+ * data_size is the length of the allocated PB_BYTES_ARRAY structure. */
+#define PB_LTYPE_BYTES 0x05
+
+/* String with pre-allocated buffer.
+ * data_size is the maximum length. */
+#define PB_LTYPE_STRING 0x06
+
+/* Submessage
+ * submsg_fields is pointer to field descriptions */
+#define PB_LTYPE_SUBMESSAGE 0x07
+
+/* Extension pseudo-field
+ * The field contains a pointer to pb_extension_t */
+#define PB_LTYPE_EXTENSION 0x08
+
+/* Byte array with inline, pre-allocated byffer.
+ * data_size is the length of the inline, allocated buffer.
+ * This differs from PB_LTYPE_BYTES by defining the element as
+ * pb_byte_t[data_size] rather than pb_bytes_array_t. */
+#define PB_LTYPE_FIXED_LENGTH_BYTES 0x09
+
+/* Number of declared LTYPES */
+#define PB_LTYPES_COUNT 0x0A
+#define PB_LTYPE_MASK 0x0F
+
+/**** Field repetition rules ****/
+
+#define PB_HTYPE_REQUIRED 0x00
+#define PB_HTYPE_OPTIONAL 0x10
+#define PB_HTYPE_REPEATED 0x20
+#define PB_HTYPE_ONEOF 0x30
+#define PB_HTYPE_MASK 0x30
+
+/**** Field allocation types ****/
+
+#define PB_ATYPE_STATIC 0x00
+#define PB_ATYPE_POINTER 0x80
+#define PB_ATYPE_CALLBACK 0x40
+#define PB_ATYPE_MASK 0xC0
+
+#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK)
+#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK)
+#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK)
+
+/* Data type used for storing sizes of struct fields
+ * and array counts.
+ */
+#if defined(PB_FIELD_32BIT)
+ typedef uint32_t pb_size_t;
+ typedef int32_t pb_ssize_t;
+#elif defined(PB_FIELD_16BIT)
+ typedef uint_least16_t pb_size_t;
+ typedef int_least16_t pb_ssize_t;
+#else
+ typedef uint_least8_t pb_size_t;
+ typedef int_least8_t pb_ssize_t;
+#endif
+#define PB_SIZE_MAX ((pb_size_t)-1)
+
+/* Data type for storing encoded data and other byte streams.
+ * This typedef exists to support platforms where uint8_t does not exist.
+ * You can regard it as equivalent on uint8_t on other platforms.
+ */
+typedef uint_least8_t pb_byte_t;
+
+/* This structure is used in auto-generated constants
+ * to specify struct fields.
+ * You can change field sizes if you need structures
+ * larger than 256 bytes or field tags larger than 256.
+ * The compiler should complain if your .proto has such
+ * structures. Fix that by defining PB_FIELD_16BIT or
+ * PB_FIELD_32BIT.
+ */
+PB_PACKED_STRUCT_START
+typedef struct pb_field_s pb_field_t;
+struct pb_field_s {
+ pb_size_t tag;
+ pb_type_t type;
+ pb_size_t data_offset; /* Offset of field data, relative to previous field. */
+ pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */
+ pb_size_t data_size; /* Data size in bytes for a single item */
+ pb_size_t array_size; /* Maximum number of entries in array */
+
+ /* Field definitions for submessage
+ * OR default value for all other non-array, non-callback types
+ * If null, then field will zeroed. */
+ const void *ptr;
+} pb_packed;
+PB_PACKED_STRUCT_END
+
+/* Make sure that the standard integer types are of the expected sizes.
+ * Otherwise fixed32/fixed64 fields can break.
+ *
+ * If you get errors here, it probably means that your stdint.h is not
+ * correct for your platform.
+ */
+#ifndef PB_WITHOUT_64BIT
+PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE)
+PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE)
+#endif
+
+/* This structure is used for 'bytes' arrays.
+ * It has the number of bytes in the beginning, and after that an array.
+ * Note that actual structs used will have a different length of bytes array.
+ */
+#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; pb_byte_t bytes[n]; }
+#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes))
+
+struct pb_bytes_array_s {
+ pb_size_t size;
+ pb_byte_t bytes[1];
+};
+typedef struct pb_bytes_array_s pb_bytes_array_t;
+
+/* This structure is used for giving the callback function.
+ * It is stored in the message structure and filled in by the method that
+ * calls pb_decode.
+ *
+ * The decoding callback will be given a limited-length stream
+ * If the wire type was string, the length is the length of the string.
+ * If the wire type was a varint/fixed32/fixed64, the length is the length
+ * of the actual value.
+ * The function may be called multiple times (especially for repeated types,
+ * but also otherwise if the message happens to contain the field multiple
+ * times.)
+ *
+ * The encoding callback will receive the actual output stream.
+ * It should write all the data in one call, including the field tag and
+ * wire type. It can write multiple fields.
+ *
+ * The callback can be null if you want to skip a field.
+ */
+typedef struct pb_istream_s pb_istream_t;
+typedef struct pb_ostream_s pb_ostream_t;
+typedef struct pb_callback_s pb_callback_t;
+struct pb_callback_s {
+#ifdef PB_OLD_CALLBACK_STYLE
+ /* Deprecated since nanopb-0.2.1 */
+ union {
+ bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg);
+ bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg);
+ } funcs;
+#else
+ /* New function signature, which allows modifying arg contents in callback. */
+ union {
+ bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg);
+ bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
+ } funcs;
+#endif
+
+ /* Free arg for use by callback */
+ void *arg;
+};
+
+/* Wire types. Library user needs these only in encoder callbacks. */
+typedef enum {
+ PB_WT_VARINT = 0,
+ PB_WT_64BIT = 1,
+ PB_WT_STRING = 2,
+ PB_WT_32BIT = 5
+} pb_wire_type_t;
+
+/* Structure for defining the handling of unknown/extension fields.
+ * Usually the pb_extension_type_t structure is automatically generated,
+ * while the pb_extension_t structure is created by the user. However,
+ * if you want to catch all unknown fields, you can also create a custom
+ * pb_extension_type_t with your own callback.
+ */
+typedef struct pb_extension_type_s pb_extension_type_t;
+typedef struct pb_extension_s pb_extension_t;
+struct pb_extension_type_s {
+ /* Called for each unknown field in the message.
+ * If you handle the field, read off all of its data and return true.
+ * If you do not handle the field, do not read anything and return true.
+ * If you run into an error, return false.
+ * Set to NULL for default handler.
+ */
+ bool (*decode)(pb_istream_t *stream, pb_extension_t *extension,
+ uint32_t tag, pb_wire_type_t wire_type);
+
+ /* Called once after all regular fields have been encoded.
+ * If you have something to write, do so and return true.
+ * If you do not have anything to write, just return true.
+ * If you run into an error, return false.
+ * Set to NULL for default handler.
+ */
+ bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension);
+
+ /* Free field for use by the callback. */
+ const void *arg;
+};
+
+struct pb_extension_s {
+ /* Type describing the extension field. Usually you'll initialize
+ * this to a pointer to the automatically generated structure. */
+ const pb_extension_type_t *type;
+
+ /* Destination for the decoded data. This must match the datatype
+ * of the extension field. */
+ void *dest;
+
+ /* Pointer to the next extension handler, or NULL.
+ * If this extension does not match a field, the next handler is
+ * automatically called. */
+ pb_extension_t *next;
+
+ /* The decoder sets this to true if the extension was found.
+ * Ignored for encoding. */
+ bool found;
+};
+
+/* Memory allocation functions to use. You can define pb_realloc and
+ * pb_free to custom functions if you want. */
+#ifdef PB_ENABLE_MALLOC
+# ifndef pb_realloc
+# define pb_realloc(ptr, size) realloc(ptr, size)
+# endif
+# ifndef pb_free
+# define pb_free(ptr) free(ptr)
+# endif
+#endif
+
+/* This is used to inform about need to regenerate .pb.h/.pb.c files. */
+#define PB_PROTO_HEADER_VERSION 30
+
+/* These macros are used to declare pb_field_t's in the constant array. */
+/* Size of a structure member, in bytes. */
+#define pb_membersize(st, m) (sizeof ((st*)0)->m)
+/* Number of entries in an array. */
+#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0]))
+/* Delta from start of one member to the start of another member. */
+#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2))
+/* Marks the end of the field list */
+#define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0}
+
+/* Macros for filling in the data_offset field */
+/* data_offset for first field in a message */
+#define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1))
+/* data_offset for subsequent fields */
+#define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2))
+/* data offset for subsequent fields inside an union (oneof) */
+#define PB_DATAOFFSET_UNION(st, m1, m2) (PB_SIZE_MAX)
+/* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */
+#define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \
+ ? PB_DATAOFFSET_FIRST(st, m1, m2) \
+ : PB_DATAOFFSET_OTHER(st, m1, m2))
+
+/* Required fields are the simplest. They just have delta (padding) from
+ * previous field end, and the size of the field. Pointer is used for
+ * submessages and default values.
+ */
+#define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \
+ fd, 0, pb_membersize(st, m), 0, ptr}
+
+/* Optional fields add the delta to the has_ variable. */
+#define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
+ fd, \
+ pb_delta(st, has_ ## m, m), \
+ pb_membersize(st, m), 0, ptr}
+
+#define PB_SINGULAR_STATIC(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
+ fd, 0, pb_membersize(st, m), 0, ptr}
+
+/* Repeated fields have a _count field and also the maximum number of entries. */
+#define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \
+ fd, \
+ pb_delta(st, m ## _count, m), \
+ pb_membersize(st, m[0]), \
+ pb_arraysize(st, m), ptr}
+
+/* Allocated fields carry the size of the actual data, not the pointer */
+#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \
+ fd, 0, pb_membersize(st, m[0]), 0, ptr}
+
+/* Optional fields don't need a has_ variable, as information would be redundant */
+#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \
+ fd, 0, pb_membersize(st, m[0]), 0, ptr}
+
+/* Same as optional fields*/
+#define PB_SINGULAR_POINTER(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \
+ fd, 0, pb_membersize(st, m[0]), 0, ptr}
+
+/* Repeated fields have a _count field and a pointer to array of pointers */
+#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \
+ fd, pb_delta(st, m ## _count, m), \
+ pb_membersize(st, m[0]), 0, ptr}
+
+/* Callbacks are much like required fields except with special datatype. */
+#define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \
+ fd, 0, pb_membersize(st, m), 0, ptr}
+
+#define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \
+ fd, 0, pb_membersize(st, m), 0, ptr}
+
+#define PB_SINGULAR_CALLBACK(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \
+ fd, 0, pb_membersize(st, m), 0, ptr}
+
+#define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \
+ fd, 0, pb_membersize(st, m), 0, ptr}
+
+/* Optional extensions don't have the has_ field, as that would be redundant.
+ * Furthermore, the combination of OPTIONAL without has_ field is used
+ * for indicating proto3 style fields. Extensions exist in proto2 mode only,
+ * so they should be encoded according to proto2 rules. To avoid the conflict,
+ * extensions are marked as REQUIRED instead.
+ */
+#define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \
+ 0, \
+ 0, \
+ pb_membersize(st, m), 0, ptr}
+
+#define PB_OPTEXT_POINTER(tag, st, m, fd, ltype, ptr) \
+ PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr)
+
+#define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \
+ PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr)
+
+/* The mapping from protobuf types to LTYPEs is done using these macros. */
+#define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT
+#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES
+#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64
+#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT
+#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT
+#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32
+#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64
+#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32
+#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT
+#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT
+#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE
+#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32
+#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64
+#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT
+#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT
+#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING
+#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT
+#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT
+#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION
+#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES
+
+/* This is the actual macro used in field descriptions.
+ * It takes these arguments:
+ * - Field tag number
+ * - Field type: BOOL, BYTES, DOUBLE, ENUM, UENUM, FIXED32, FIXED64,
+ * FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64
+ * SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION
+ * - Field rules: REQUIRED, OPTIONAL or REPEATED
+ * - Allocation: STATIC, CALLBACK or POINTER
+ * - Placement: FIRST or OTHER, depending on if this is the first field in structure.
+ * - Message name
+ * - Field name
+ * - Previous field name (or field name again for first field)
+ * - Pointer to default value or submsg fields.
+ */
+
+#define PB_FIELD(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
+ PB_ ## rules ## _ ## allocation(tag, message, field, \
+ PB_DATAOFFSET_ ## placement(message, field, prevfield), \
+ PB_LTYPE_MAP_ ## type, ptr)
+
+/* Field description for repeated static fixed count fields.*/
+#define PB_REPEATED_FIXED_COUNT(tag, type, placement, message, field, prevfield, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | PB_LTYPE_MAP_ ## type, \
+ PB_DATAOFFSET_ ## placement(message, field, prevfield), \
+ 0, \
+ pb_membersize(message, field[0]), \
+ pb_arraysize(message, field), ptr}
+
+/* Field description for oneof fields. This requires taking into account the
+ * union name also, that's why a separate set of macros is needed.
+ */
+#define PB_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \
+ fd, pb_delta(st, which_ ## u, u.m), \
+ pb_membersize(st, u.m), 0, ptr}
+
+#define PB_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \
+ fd, pb_delta(st, which_ ## u, u.m), \
+ pb_membersize(st, u.m[0]), 0, ptr}
+
+#define PB_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
+ PB_ONEOF_ ## allocation(union_name, tag, message, field, \
+ PB_DATAOFFSET_ ## placement(message, union_name.field, prevfield), \
+ PB_LTYPE_MAP_ ## type, ptr)
+
+#define PB_ANONYMOUS_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \
+ fd, pb_delta(st, which_ ## u, m), \
+ pb_membersize(st, m), 0, ptr}
+
+#define PB_ANONYMOUS_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \
+ fd, pb_delta(st, which_ ## u, m), \
+ pb_membersize(st, m[0]), 0, ptr}
+
+#define PB_ANONYMOUS_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
+ PB_ANONYMOUS_ONEOF_ ## allocation(union_name, tag, message, field, \
+ PB_DATAOFFSET_ ## placement(message, field, prevfield), \
+ PB_LTYPE_MAP_ ## type, ptr)
+
+/* These macros are used for giving out error messages.
+ * They are mostly a debugging aid; the main error information
+ * is the true/false return value from functions.
+ * Some code space can be saved by disabling the error
+ * messages if not used.
+ *
+ * PB_SET_ERROR() sets the error message if none has been set yet.
+ * msg must be a constant string literal.
+ * PB_GET_ERROR() always returns a pointer to a string.
+ * PB_RETURN_ERROR() sets the error and returns false from current
+ * function.
+ */
+#ifdef PB_NO_ERRMSG
+#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream)
+#define PB_GET_ERROR(stream) "(errmsg disabled)"
+#else
+#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg))
+#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)")
+#endif
+
+#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false
+
+#endif
diff --git a/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_common.h b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_common.h
new file mode 100644
index 000000000..60b3d3749
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_common.h
@@ -0,0 +1,42 @@
+/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c.
+ * These functions are rarely needed by applications directly.
+ */
+
+#ifndef PB_COMMON_H_INCLUDED
+#define PB_COMMON_H_INCLUDED
+
+#include "pb.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Iterator for pb_field_t list */
+struct pb_field_iter_s {
+ const pb_field_t *start; /* Start of the pb_field_t array */
+ const pb_field_t *pos; /* Current position of the iterator */
+ unsigned required_field_index; /* Zero-based index that counts only the required fields */
+ void *dest_struct; /* Pointer to start of the structure */
+ void *pData; /* Pointer to current field value */
+ void *pSize; /* Pointer to count/has field */
+};
+typedef struct pb_field_iter_s pb_field_iter_t;
+
+/* Initialize the field iterator structure to beginning.
+ * Returns false if the message type is empty. */
+bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct);
+
+/* Advance the iterator to the next field.
+ * Returns false when the iterator wraps back to the first field. */
+bool pb_field_iter_next(pb_field_iter_t *iter);
+
+/* Advance the iterator until it points at a field with the given tag.
+ * Returns false if no such field exists. */
+bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
+
diff --git a/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_decode.h b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_decode.h
new file mode 100644
index 000000000..398b24a08
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_decode.h
@@ -0,0 +1,175 @@
+/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c.
+ * The main function is pb_decode. You also need an input stream, and the
+ * field descriptions created by nanopb_generator.py.
+ */
+
+#ifndef PB_DECODE_H_INCLUDED
+#define PB_DECODE_H_INCLUDED
+
+#include "pb.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Structure for defining custom input streams. You will need to provide
+ * a callback function to read the bytes from your storage, which can be
+ * for example a file or a network socket.
+ *
+ * The callback must conform to these rules:
+ *
+ * 1) Return false on IO errors. This will cause decoding to abort.
+ * 2) You can use state to store your own data (e.g. buffer pointer),
+ * and rely on pb_read to verify that no-body reads past bytes_left.
+ * 3) Your callback may be used with substreams, in which case bytes_left
+ * is different than from the main stream. Don't use bytes_left to compute
+ * any pointers.
+ */
+struct pb_istream_s
+{
+#ifdef PB_BUFFER_ONLY
+ /* Callback pointer is not used in buffer-only configuration.
+ * Having an int pointer here allows binary compatibility but
+ * gives an error if someone tries to assign callback function.
+ */
+ int *callback;
+#else
+ bool (*callback)(pb_istream_t *stream, pb_byte_t *buf, size_t count);
+#endif
+
+ void *state; /* Free field for use by callback implementation */
+ size_t bytes_left;
+
+#ifndef PB_NO_ERRMSG
+ const char *errmsg;
+#endif
+};
+
+/***************************
+ * Main decoding functions *
+ ***************************/
+
+/* Decode a single protocol buffers message from input stream into a C structure.
+ * Returns true on success, false on any failure.
+ * The actual struct pointed to by dest must match the description in fields.
+ * Callback fields of the destination structure must be initialized by caller.
+ * All other fields will be initialized by this function.
+ *
+ * Example usage:
+ * MyMessage msg = {};
+ * uint8_t buffer[64];
+ * pb_istream_t stream;
+ *
+ * // ... read some data into buffer ...
+ *
+ * stream = pb_istream_from_buffer(buffer, count);
+ * pb_decode(&stream, MyMessage_fields, &msg);
+ */
+bool pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);
+
+/* Same as pb_decode, except does not initialize the destination structure
+ * to default values. This is slightly faster if you need no default values
+ * and just do memset(struct, 0, sizeof(struct)) yourself.
+ *
+ * This can also be used for 'merging' two messages, i.e. update only the
+ * fields that exist in the new message.
+ *
+ * Note: If this function returns with an error, it will not release any
+ * dynamically allocated fields. You will need to call pb_release() yourself.
+ */
+bool pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);
+
+/* Same as pb_decode, except expects the stream to start with the message size
+ * encoded as varint. Corresponds to parseDelimitedFrom() in Google's
+ * protobuf API.
+ */
+bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);
+
+/* Same as pb_decode_delimited, except that it does not initialize the destination structure.
+ * See pb_decode_noinit
+ */
+bool pb_decode_delimited_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);
+
+/* Same as pb_decode, except allows the message to be terminated with a null byte.
+ * NOTE: Until nanopb-0.4.0, pb_decode() also allows null-termination. This behaviour
+ * is not supported in most other protobuf implementations, so pb_decode_delimited()
+ * is a better option for compatibility.
+ */
+bool pb_decode_nullterminated(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);
+
+#ifdef PB_ENABLE_MALLOC
+/* Release any allocated pointer fields. If you use dynamic allocation, you should
+ * call this for any successfully decoded message when you are done with it. If
+ * pb_decode() returns with an error, the message is already released.
+ */
+void pb_release(const pb_field_t fields[], void *dest_struct);
+#endif
+
+
+/**************************************
+ * Functions for manipulating streams *
+ **************************************/
+
+/* Create an input stream for reading from a memory buffer.
+ *
+ * Alternatively, you can use a custom stream that reads directly from e.g.
+ * a file or a network socket.
+ */
+pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize);
+
+/* Function to read from a pb_istream_t. You can use this if you need to
+ * read some custom header data, or to read data in field callbacks.
+ */
+bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);
+
+
+/************************************************
+ * Helper functions for writing field callbacks *
+ ************************************************/
+
+/* Decode the tag for the next field in the stream. Gives the wire type and
+ * field tag. At end of the message, returns false and sets eof to true. */
+bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof);
+
+/* Skip the field payload data, given the wire type. */
+bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type);
+
+/* Decode an integer in the varint format. This works for bool, enum, int32,
+ * int64, uint32 and uint64 field types. */
+#ifndef PB_WITHOUT_64BIT
+bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest);
+#else
+#define pb_decode_varint pb_decode_varint32
+#endif
+
+/* Decode an integer in the varint format. This works for bool, enum, int32,
+ * and uint32 field types. */
+bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest);
+
+/* Decode an integer in the zig-zagged svarint format. This works for sint32
+ * and sint64. */
+#ifndef PB_WITHOUT_64BIT
+bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest);
+#else
+bool pb_decode_svarint(pb_istream_t *stream, int32_t *dest);
+#endif
+
+/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to
+ * a 4-byte wide C variable. */
+bool pb_decode_fixed32(pb_istream_t *stream, void *dest);
+
+#ifndef PB_WITHOUT_64BIT
+/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to
+ * a 8-byte wide C variable. */
+bool pb_decode_fixed64(pb_istream_t *stream, void *dest);
+#endif
+
+/* Make a limited-length substream for reading a PB_WT_STRING field. */
+bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream);
+bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_encode.h b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_encode.h
new file mode 100644
index 000000000..8bf78dd53
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/nanopb.framework/Headers/pb_encode.h
@@ -0,0 +1,170 @@
+/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c.
+ * The main function is pb_encode. You also need an output stream, and the
+ * field descriptions created by nanopb_generator.py.
+ */
+
+#ifndef PB_ENCODE_H_INCLUDED
+#define PB_ENCODE_H_INCLUDED
+
+#include "pb.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Structure for defining custom output streams. You will need to provide
+ * a callback function to write the bytes to your storage, which can be
+ * for example a file or a network socket.
+ *
+ * The callback must conform to these rules:
+ *
+ * 1) Return false on IO errors. This will cause encoding to abort.
+ * 2) You can use state to store your own data (e.g. buffer pointer).
+ * 3) pb_write will update bytes_written after your callback runs.
+ * 4) Substreams will modify max_size and bytes_written. Don't use them
+ * to calculate any pointers.
+ */
+struct pb_ostream_s
+{
+#ifdef PB_BUFFER_ONLY
+ /* Callback pointer is not used in buffer-only configuration.
+ * Having an int pointer here allows binary compatibility but
+ * gives an error if someone tries to assign callback function.
+ * Also, NULL pointer marks a 'sizing stream' that does not
+ * write anything.
+ */
+ int *callback;
+#else
+ bool (*callback)(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
+#endif
+ void *state; /* Free field for use by callback implementation. */
+ size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */
+ size_t bytes_written; /* Number of bytes written so far. */
+
+#ifndef PB_NO_ERRMSG
+ const char *errmsg;
+#endif
+};
+
+/***************************
+ * Main encoding functions *
+ ***************************/
+
+/* Encode a single protocol buffers message from C structure into a stream.
+ * Returns true on success, false on any failure.
+ * The actual struct pointed to by src_struct must match the description in fields.
+ * All required fields in the struct are assumed to have been filled in.
+ *
+ * Example usage:
+ * MyMessage msg = {};
+ * uint8_t buffer[64];
+ * pb_ostream_t stream;
+ *
+ * msg.field1 = 42;
+ * stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
+ * pb_encode(&stream, MyMessage_fields, &msg);
+ */
+bool pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);
+
+/* Same as pb_encode, but prepends the length of the message as a varint.
+ * Corresponds to writeDelimitedTo() in Google's protobuf API.
+ */
+bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);
+
+/* Same as pb_encode, but appends a null byte to the message for termination.
+ * NOTE: This behaviour is not supported in most other protobuf implementations, so pb_encode_delimited()
+ * is a better option for compatibility.
+ */
+bool pb_encode_nullterminated(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);
+
+/* Encode the message to get the size of the encoded data, but do not store
+ * the data. */
+bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct);
+
+/**************************************
+ * Functions for manipulating streams *
+ **************************************/
+
+/* Create an output stream for writing into a memory buffer.
+ * The number of bytes written can be found in stream.bytes_written after
+ * encoding the message.
+ *
+ * Alternatively, you can use a custom stream that writes directly to e.g.
+ * a file or a network socket.
+ */
+pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize);
+
+/* Pseudo-stream for measuring the size of a message without actually storing
+ * the encoded data.
+ *
+ * Example usage:
+ * MyMessage msg = {};
+ * pb_ostream_t stream = PB_OSTREAM_SIZING;
+ * pb_encode(&stream, MyMessage_fields, &msg);
+ * printf("Message size is %d\n", stream.bytes_written);
+ */
+#ifndef PB_NO_ERRMSG
+#define PB_OSTREAM_SIZING {0,0,0,0,0}
+#else
+#define PB_OSTREAM_SIZING {0,0,0,0}
+#endif
+
+/* Function to write into a pb_ostream_t stream. You can use this if you need
+ * to append or prepend some custom headers to the message.
+ */
+bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
+
+
+/************************************************
+ * Helper functions for writing field callbacks *
+ ************************************************/
+
+/* Encode field header based on type and field number defined in the field
+ * structure. Call this from the callback before writing out field contents. */
+bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field);
+
+/* Encode field header by manually specifing wire type. You need to use this
+ * if you want to write out packed arrays from a callback field. */
+bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number);
+
+/* Encode an integer in the varint format.
+ * This works for bool, enum, int32, int64, uint32 and uint64 field types. */
+#ifndef PB_WITHOUT_64BIT
+bool pb_encode_varint(pb_ostream_t *stream, uint64_t value);
+#else
+bool pb_encode_varint(pb_ostream_t *stream, uint32_t value);
+#endif
+
+/* Encode an integer in the zig-zagged svarint format.
+ * This works for sint32 and sint64. */
+#ifndef PB_WITHOUT_64BIT
+bool pb_encode_svarint(pb_ostream_t *stream, int64_t value);
+#else
+bool pb_encode_svarint(pb_ostream_t *stream, int32_t value);
+#endif
+
+/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */
+bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size);
+
+/* Encode a fixed32, sfixed32 or float value.
+ * You need to pass a pointer to a 4-byte wide C variable. */
+bool pb_encode_fixed32(pb_ostream_t *stream, const void *value);
+
+#ifndef PB_WITHOUT_64BIT
+/* Encode a fixed64, sfixed64 or double value.
+ * You need to pass a pointer to a 8-byte wide C variable. */
+bool pb_encode_fixed64(pb_ostream_t *stream, const void *value);
+#endif
+
+/* Encode a submessage field.
+ * You need to pass the pb_field_t array and pointer to struct, just like
+ * with pb_encode(). This internally encodes the submessage twice, first to
+ * calculate message size and then to actually write it out.
+ */
+bool pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/Libraries external/Firebase/Analytics/nanopb.framework/Modules/module.modulemap b/Libraries external/Firebase/Analytics/nanopb.framework/Modules/module.modulemap
new file mode 100644
index 000000000..5d98024f5
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/nanopb.framework/Modules/module.modulemap
@@ -0,0 +1,5 @@
+framework module nanopb {
+umbrella header "nanopb.h"
+export *
+module * { export * }
+}
diff --git a/Libraries external/Firebase/Analytics/nanopb.framework/nanopb b/Libraries external/Firebase/Analytics/nanopb.framework/nanopb
new file mode 100644
index 000000000..b2a02e812
--- /dev/null
+++ b/Libraries external/Firebase/Analytics/nanopb.framework/nanopb
Binary files differ