// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_PUBLIC_MOJOM_CRASH_CRASH_MEMORY_METRICS_REPORTER_MOJOM_FORWARD_H_
#define THIRD_PARTY_BLINK_PUBLIC_MOJOM_CRASH_CRASH_MEMORY_METRICS_REPORTER_MOJOM_FORWARD_H_





#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"



#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace blink {
namespace mojom {
class CrashMemoryMetricsReporter;

// @generated_from: blink.mojom.CrashMemoryMetricsReporter
using CrashMemoryMetricsReporterPtr = mojo::InterfacePtr<CrashMemoryMetricsReporter>;
using CrashMemoryMetricsReporterPtrInfo = mojo::InterfacePtrInfo<CrashMemoryMetricsReporter>;
using ThreadSafeCrashMemoryMetricsReporterPtr =
    mojo::ThreadSafeInterfacePtr<CrashMemoryMetricsReporter>;

// @generated_from: blink.mojom.CrashMemoryMetricsReporter
using CrashMemoryMetricsReporterRequest = mojo::InterfaceRequest<CrashMemoryMetricsReporter>;

// @generated_from: blink.mojom.CrashMemoryMetricsReporter
using CrashMemoryMetricsReporterAssociatedPtr =
    mojo::AssociatedInterfacePtr<CrashMemoryMetricsReporter>;
using ThreadSafeCrashMemoryMetricsReporterAssociatedPtr =
    mojo::ThreadSafeAssociatedInterfacePtr<CrashMemoryMetricsReporter>;
using CrashMemoryMetricsReporterAssociatedPtrInfo =
    mojo::AssociatedInterfacePtrInfo<CrashMemoryMetricsReporter>;

// @generated_from: blink.mojom.CrashMemoryMetricsReporter
using CrashMemoryMetricsReporterAssociatedRequest =
    mojo::AssociatedInterfaceRequest<CrashMemoryMetricsReporter>;




}  // namespace mojom
}  // namespace blink

#endif  // THIRD_PARTY_BLINK_PUBLIC_MOJOM_CRASH_CRASH_MEMORY_METRICS_REPORTER_MOJOM_FORWARD_H_

/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMTM0MSwgImJlZ2luIjogMTMxMiwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogImJsaW5rLm1vam9tLkNyYXNoTWVtb3J5TWV0cmljc1Jl
cG9ydGVyIn19LCB7ImVuZCI6IDE3NDcsICJiZWdpbiI6IDE3MjEsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJibGluay5tb2pvbS5DcmFzaE1lbW9yeU1ldHJpY3NS
ZXBvcnRlciJ9fV0sICJ0eXBlIjogImt5dGhlMCJ9
*/