/*** Autogenerated by WIDL 9.11 from include/windows.applicationmodel.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_applicationmodel_h__
#define __windows_applicationmodel_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo ABI::Windows::ApplicationModel::IAppDisplayInfo
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IAppDisplayInfo;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs ABI::Windows::ApplicationModel::IEnteredBackgroundEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IEnteredBackgroundEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs ABI::Windows::ApplicationModel::ILeavingBackgroundEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ILeavingBackgroundEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage __x_ABI_CWindows_CApplicationModel_CIPackage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage ABI::Windows::ApplicationModel::IPackage
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage2 __x_ABI_CWindows_CApplicationModel_CIPackage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage2 ABI::Windows::ApplicationModel::IPackage2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage3 __x_ABI_CWindows_CApplicationModel_CIPackage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage3 ABI::Windows::ApplicationModel::IPackage3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatus __x_ABI_CWindows_CApplicationModel_CIPackageStatus;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus ABI::Windows::ApplicationModel::IPackageStatus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatus;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageId __x_ABI_CWindows_CApplicationModel_CIPackageId;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageId ABI::Windows::ApplicationModel::IPackageId
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageId;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata ABI::Windows::ApplicationModel::IPackageIdWithMetadata
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageIdWithMetadata;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatics __x_ABI_CWindows_CApplicationModel_CIPackageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics ABI::Windows::ApplicationModel::IPackageStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral ABI::Windows::ApplicationModel::ISuspendingDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ISuspendingDeferral;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs ABI::Windows::ApplicationModel::ISuspendingEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ISuspendingEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CISuspendingOperation __x_ABI_CWindows_CApplicationModel_CISuspendingOperation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation ABI::Windows::ApplicationModel::ISuspendingOperation
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ISuspendingOperation;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class AppDisplayInfo;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CAppDisplayInfo;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class EnteredBackgroundEventArgs;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CLeavingBackgroundEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CLeavingBackgroundEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class LeavingBackgroundEventArgs;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CLeavingBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CLeavingBackgroundEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CLeavingBackgroundEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CPackage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class Package;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CPackage __x_ABI_CWindows_CApplicationModel_CPackage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CPackage_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CPackageStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CPackageStatus_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class PackageStatus;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CPackageStatus __x_ABI_CWindows_CApplicationModel_CPackageStatus;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CPackageStatus_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CPackageId_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CPackageId_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class PackageId;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CPackageId __x_ABI_CWindows_CApplicationModel_CPackageId;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CPackageId_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CSuspendingDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CSuspendingDeferral_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class SuspendingDeferral;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CSuspendingDeferral __x_ABI_CWindows_CApplicationModel_CSuspendingDeferral;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CSuspendingDeferral_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CSuspendingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CSuspendingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class SuspendingEventArgs;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CSuspendingEventArgs __x_ABI_CWindows_CApplicationModel_CSuspendingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CSuspendingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CSuspendingOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CSuspendingOperation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            class SuspendingOperation;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CSuspendingOperation __x_ABI_CWindows_CApplicationModel_CSuspendingOperation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CSuspendingOperation_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CPackage __FIIterable_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CPackage __FIIterator_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CPackage __FIVectorView_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs ABI::Windows::Foundation::IEventHandler<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs ABI::Windows::Foundation::IEventHandler<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs ABI::Windows::Foundation::IEventHandler<ABI::Windows::ApplicationModel::SuspendingEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <windows.foundation.h>
#include <windows.storage.h>
#include <windows.system.h>
#include <windows.applicationmodel.activation.h>
#include <windows.applicationmodel.core.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CApplicationModel_CPackageVersion __x_ABI_CWindows_CApplicationModel_CPackageVersion;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            typedef struct PackageVersion PackageVersion;
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo ABI::Windows::ApplicationModel::IAppDisplayInfo
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IAppDisplayInfo;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs ABI::Windows::ApplicationModel::IEnteredBackgroundEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IEnteredBackgroundEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs ABI::Windows::ApplicationModel::ILeavingBackgroundEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ILeavingBackgroundEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage __x_ABI_CWindows_CApplicationModel_CIPackage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage ABI::Windows::ApplicationModel::IPackage
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage2 __x_ABI_CWindows_CApplicationModel_CIPackage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage2 ABI::Windows::ApplicationModel::IPackage2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackage3 __x_ABI_CWindows_CApplicationModel_CIPackage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackage3 ABI::Windows::ApplicationModel::IPackage3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatus __x_ABI_CWindows_CApplicationModel_CIPackageStatus;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus ABI::Windows::ApplicationModel::IPackageStatus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatus;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageId_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageId __x_ABI_CWindows_CApplicationModel_CIPackageId;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageId ABI::Windows::ApplicationModel::IPackageId
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageId;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata ABI::Windows::ApplicationModel::IPackageIdWithMetadata
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageIdWithMetadata;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CIPackageStatics __x_ABI_CWindows_CApplicationModel_CIPackageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics ABI::Windows::ApplicationModel::IPackageStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface IPackageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral ABI::Windows::ApplicationModel::ISuspendingDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ISuspendingDeferral;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs ABI::Windows::ApplicationModel::ISuspendingEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ISuspendingEventArgs;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CISuspendingOperation __x_ABI_CWindows_CApplicationModel_CISuspendingOperation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation ABI::Windows::ApplicationModel::ISuspendingOperation
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            interface ISuspendingOperation;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CPackage __FIIterable_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CPackage __FIIterator_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CPackage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CPackage __FIVectorView_1_Windows__CApplicationModel__CPackage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CPackage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Package* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            struct PackageVersion {
                UINT16 Major;
                UINT16 Minor;
                UINT16 Build;
                UINT16 Revision;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CApplicationModel_CPackageVersion {
    UINT16 Major;
    UINT16 Minor;
    UINT16 Build;
    UINT16 Revision;
};
#ifdef WIDL_using_Windows_ApplicationModel
#define PackageVersion __x_ABI_CWindows_CApplicationModel_CPackageVersion
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IAppDisplayInfo interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo, 0x1aeb1103, 0xe4d4, 0x41aa, 0xa4,0xf6, 0xc4,0xa2,0x76,0xe7,0x9e,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("1aeb1103-e4d4-41aa-a4f6-c4a276e79eac")
            IAppDisplayInfo : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Description(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetLogo(
                    struct Size size,
                    ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo, 0x1aeb1103, 0xe4d4, 0x41aa, 0xa4,0xf6, 0xc4,0xa2,0x76,0xe7,0x9e,0xac)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        TrustLevel *trustLevel);

    /*** IAppDisplayInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *GetLogo)(
        __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo *This,
        struct __x_ABI_CWindows_CFoundation_CSize size,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAppDisplayInfo methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetLogo(This,size,value) (This)->lpVtbl->GetLogo(This,size,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_AddRef(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_Release(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetIids(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAppDisplayInfo methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_DisplayName(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_Description(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,HSTRING *value) {
    return This->lpVtbl->get_Description(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetLogo(__x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo* This,struct __x_ABI_CWindows_CFoundation_CSize size,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->GetLogo(This,size,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IAppDisplayInfo IID___x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo
#define IAppDisplayInfoVtbl __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfoVtbl
#define IAppDisplayInfo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo
#define IAppDisplayInfo_QueryInterface __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_QueryInterface
#define IAppDisplayInfo_AddRef __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_AddRef
#define IAppDisplayInfo_Release __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_Release
#define IAppDisplayInfo_GetIids __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetIids
#define IAppDisplayInfo_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetRuntimeClassName
#define IAppDisplayInfo_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetTrustLevel
#define IAppDisplayInfo_get_DisplayName __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_DisplayName
#define IAppDisplayInfo_get_Description __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_get_Description
#define IAppDisplayInfo_GetLogo __x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_GetLogo
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIAppDisplayInfo_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IEnteredBackgroundEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs, 0xf722dcc2, 0x9827, 0x403d, 0xaa,0xed, 0xec,0xca,0x9a,0xc1,0x73,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("f722dcc2-9827-403d-aaed-ecca9ac17398")
            IEnteredBackgroundEventArgs : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                    ABI::Windows::Foundation::IDeferral **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs, 0xf722dcc2, 0x9827, 0x403d, 0xaa,0xed, 0xec,0xca,0x9a,0xc1,0x73,0x98)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This,
        TrustLevel *trustLevel);

    /*** IEnteredBackgroundEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IEnteredBackgroundEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IEnteredBackgroundEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetDeferral(__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IEnteredBackgroundEventArgs IID___x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs
#define IEnteredBackgroundEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgsVtbl
#define IEnteredBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs
#define IEnteredBackgroundEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_QueryInterface
#define IEnteredBackgroundEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_AddRef
#define IEnteredBackgroundEventArgs_Release __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_Release
#define IEnteredBackgroundEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetIids
#define IEnteredBackgroundEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetRuntimeClassName
#define IEnteredBackgroundEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetTrustLevel
#define IEnteredBackgroundEventArgs_GetDeferral __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_GetDeferral
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ILeavingBackgroundEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs, 0x39c6ec9a, 0xae6e, 0x46f9, 0xa0,0x7a, 0xcf,0xc2,0x3f,0x88,0x73,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("39c6ec9a-ae6e-46f9-a07a-cfc23f88733e")
            ILeavingBackgroundEventArgs : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                    ABI::Windows::Foundation::IDeferral **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs, 0x39c6ec9a, 0xae6e, 0x46f9, 0xa0,0x7a, 0xcf,0xc2,0x3f,0x88,0x73,0x3e)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This,
        TrustLevel *trustLevel);

    /*** ILeavingBackgroundEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILeavingBackgroundEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILeavingBackgroundEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetDeferral(__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_ILeavingBackgroundEventArgs IID___x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs
#define ILeavingBackgroundEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgsVtbl
#define ILeavingBackgroundEventArgs __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs
#define ILeavingBackgroundEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_QueryInterface
#define ILeavingBackgroundEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_AddRef
#define ILeavingBackgroundEventArgs_Release __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_Release
#define ILeavingBackgroundEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetIids
#define ILeavingBackgroundEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetRuntimeClassName
#define ILeavingBackgroundEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetTrustLevel
#define ILeavingBackgroundEventArgs_GetDeferral __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_GetDeferral
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IPackage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackage, 0x163c792f, 0xbd75, 0x413c, 0xbf,0x23, 0xb1,0xfe,0x7b,0x95,0xd8,0x25);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("163c792f-bd75-413c-bf23-b1fe7b95d825")
            IPackage : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Id(
                    ABI::Windows::ApplicationModel::IPackageId **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_InstalledLocation(
                    ABI::Windows::Storage::IStorageFolder **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsFramework(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Dependencies(
                    ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Package* > **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackage, 0x163c792f, 0xbd75, 0x413c, 0xbf,0x23, 0xb1,0xfe,0x7b,0x95,0xd8,0x25)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        TrustLevel *trustLevel);

    /*** IPackage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        __x_ABI_CWindows_CApplicationModel_CIPackageId **value);

    HRESULT (STDMETHODCALLTYPE *get_InstalledLocation)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        __x_ABI_CWindows_CStorage_CIStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_IsFramework)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Dependencies)(
        __x_ABI_CWindows_CApplicationModel_CIPackage *This,
        __FIVectorView_1_Windows__CApplicationModel__CPackage **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackage {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackage methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_InstalledLocation(This,value) (This)->lpVtbl->get_InstalledLocation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_IsFramework(This,value) (This)->lpVtbl->get_IsFramework(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage_get_Dependencies(This,value) (This)->lpVtbl->get_Dependencies(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage_Release(__x_ABI_CWindows_CApplicationModel_CIPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackage methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_Id(__x_ABI_CWindows_CApplicationModel_CIPackage* This,__x_ABI_CWindows_CApplicationModel_CIPackageId **value) {
    return This->lpVtbl->get_Id(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_InstalledLocation(__x_ABI_CWindows_CApplicationModel_CIPackage* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
    return This->lpVtbl->get_InstalledLocation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_IsFramework(__x_ABI_CWindows_CApplicationModel_CIPackage* This,boolean *value) {
    return This->lpVtbl->get_IsFramework(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage_get_Dependencies(__x_ABI_CWindows_CApplicationModel_CIPackage* This,__FIVectorView_1_Windows__CApplicationModel__CPackage **value) {
    return This->lpVtbl->get_Dependencies(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackage IID___x_ABI_CWindows_CApplicationModel_CIPackage
#define IPackageVtbl __x_ABI_CWindows_CApplicationModel_CIPackageVtbl
#define IPackage __x_ABI_CWindows_CApplicationModel_CIPackage
#define IPackage_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackage_QueryInterface
#define IPackage_AddRef __x_ABI_CWindows_CApplicationModel_CIPackage_AddRef
#define IPackage_Release __x_ABI_CWindows_CApplicationModel_CIPackage_Release
#define IPackage_GetIids __x_ABI_CWindows_CApplicationModel_CIPackage_GetIids
#define IPackage_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackage_GetRuntimeClassName
#define IPackage_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackage_GetTrustLevel
#define IPackage_get_Id __x_ABI_CWindows_CApplicationModel_CIPackage_get_Id
#define IPackage_get_InstalledLocation __x_ABI_CWindows_CApplicationModel_CIPackage_get_InstalledLocation
#define IPackage_get_IsFramework __x_ABI_CWindows_CApplicationModel_CIPackage_get_IsFramework
#define IPackage_get_Dependencies __x_ABI_CWindows_CApplicationModel_CIPackage_get_Dependencies
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackage_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPackage2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackage2, 0xa6612fb6, 0x7688, 0x4ace, 0x95,0xfb, 0x35,0x95,0x38,0xe7,0xaa,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("a6612fb6-7688-4ace-95fb-359538e7aa01")
            IPackage2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_PublisherDisplayName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Description(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Logo(
                    ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsResourcePackage(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsBundle(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_IsDevelopmentMode(
                    boolean *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackage2, 0xa6612fb6, 0x7688, 0x4ace, 0x95,0xfb, 0x35,0x95,0x38,0xe7,0xaa,0x01)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        TrustLevel *trustLevel);

    /*** IPackage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_PublisherDisplayName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Logo)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *get_IsResourcePackage)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsBundle)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsDevelopmentMode)(
        __x_ABI_CWindows_CApplicationModel_CIPackage2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackage2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackage2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_PublisherDisplayName(This,value) (This)->lpVtbl->get_PublisherDisplayName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Logo(This,value) (This)->lpVtbl->get_Logo(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsResourcePackage(This,value) (This)->lpVtbl->get_IsResourcePackage(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsBundle(This,value) (This)->lpVtbl->get_IsBundle(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsDevelopmentMode(This,value) (This)->lpVtbl->get_IsDevelopmentMode(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage2_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackage2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage2_Release(__x_ABI_CWindows_CApplicationModel_CIPackage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackage2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_DisplayName(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_PublisherDisplayName(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *value) {
    return This->lpVtbl->get_PublisherDisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Description(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,HSTRING *value) {
    return This->lpVtbl->get_Description(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Logo(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_Logo(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsResourcePackage(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,boolean *value) {
    return This->lpVtbl->get_IsResourcePackage(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsBundle(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,boolean *value) {
    return This->lpVtbl->get_IsBundle(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsDevelopmentMode(__x_ABI_CWindows_CApplicationModel_CIPackage2* This,boolean *value) {
    return This->lpVtbl->get_IsDevelopmentMode(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackage2 IID___x_ABI_CWindows_CApplicationModel_CIPackage2
#define IPackage2Vtbl __x_ABI_CWindows_CApplicationModel_CIPackage2Vtbl
#define IPackage2 __x_ABI_CWindows_CApplicationModel_CIPackage2
#define IPackage2_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackage2_QueryInterface
#define IPackage2_AddRef __x_ABI_CWindows_CApplicationModel_CIPackage2_AddRef
#define IPackage2_Release __x_ABI_CWindows_CApplicationModel_CIPackage2_Release
#define IPackage2_GetIids __x_ABI_CWindows_CApplicationModel_CIPackage2_GetIids
#define IPackage2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackage2_GetRuntimeClassName
#define IPackage2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackage2_GetTrustLevel
#define IPackage2_get_DisplayName __x_ABI_CWindows_CApplicationModel_CIPackage2_get_DisplayName
#define IPackage2_get_PublisherDisplayName __x_ABI_CWindows_CApplicationModel_CIPackage2_get_PublisherDisplayName
#define IPackage2_get_Description __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Description
#define IPackage2_get_Logo __x_ABI_CWindows_CApplicationModel_CIPackage2_get_Logo
#define IPackage2_get_IsResourcePackage __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsResourcePackage
#define IPackage2_get_IsBundle __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsBundle
#define IPackage2_get_IsDevelopmentMode __x_ABI_CWindows_CApplicationModel_CIPackage2_get_IsDevelopmentMode
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackage2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPackage3 interface
 */
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackage3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackage3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackage3, 0x5f738b61, 0xf86a, 0x4917, 0x93,0xd1, 0xf1,0xee,0x9d,0x3b,0x35,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("5f738b61-f86a-4917-93d1-f1ee9d3b35d9")
            IPackage3 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Status(
                    ABI::Windows::ApplicationModel::IPackageStatus **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_InstalledDate(
                    struct DateTime *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetAppListEntriesAsync(
                    ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > **operation) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackage3, 0x5f738b61, 0xf86a, 0x4917, 0x93,0xd1, 0xf1,0xee,0x9d,0x3b,0x35,0xd9)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        TrustLevel *trustLevel);

    /*** IPackage3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus **value);

    HRESULT (STDMETHODCALLTYPE *get_InstalledDate)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        struct __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *GetAppListEntriesAsync)(
        __x_ABI_CWindows_CApplicationModel_CIPackage3 *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **operation);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackage3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackage3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_get_InstalledDate(This,value) (This)->lpVtbl->get_InstalledDate(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackage3_GetAppListEntriesAsync(This,operation) (This)->lpVtbl->GetAppListEntriesAsync(This,operation)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage3_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackage3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackage3_Release(__x_ABI_CWindows_CApplicationModel_CIPackage3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackage3 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_get_Status(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,__x_ABI_CWindows_CApplicationModel_CIPackageStatus **value) {
    return This->lpVtbl->get_Status(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_get_InstalledDate(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,struct __x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_InstalledDate(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackage3_GetAppListEntriesAsync(__x_ABI_CWindows_CApplicationModel_CIPackage3* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **operation) {
    return This->lpVtbl->GetAppListEntriesAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackage3 IID___x_ABI_CWindows_CApplicationModel_CIPackage3
#define IPackage3Vtbl __x_ABI_CWindows_CApplicationModel_CIPackage3Vtbl
#define IPackage3 __x_ABI_CWindows_CApplicationModel_CIPackage3
#define IPackage3_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackage3_QueryInterface
#define IPackage3_AddRef __x_ABI_CWindows_CApplicationModel_CIPackage3_AddRef
#define IPackage3_Release __x_ABI_CWindows_CApplicationModel_CIPackage3_Release
#define IPackage3_GetIids __x_ABI_CWindows_CApplicationModel_CIPackage3_GetIids
#define IPackage3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackage3_GetRuntimeClassName
#define IPackage3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackage3_GetTrustLevel
#define IPackage3_get_Status __x_ABI_CWindows_CApplicationModel_CIPackage3_get_Status
#define IPackage3_get_InstalledDate __x_ABI_CWindows_CApplicationModel_CIPackage3_get_InstalledDate
#define IPackage3_GetAppListEntriesAsync __x_ABI_CWindows_CApplicationModel_CIPackage3_GetAppListEntriesAsync
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackage3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPackageStatus interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageStatus, 0x5fe74f71, 0xa365, 0x4c09, 0xa0,0x2d, 0x04,0x6d,0x52,0x5e,0xa1,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("5fe74f71-a365-4c09-a02d-046d525ea1da")
            IPackageStatus : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE VerifyIsOK(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NotAvailable(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_PackageOffline(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DataOffline(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Disabled(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NeedsRemediation(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_LicenseIssue(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Modified(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Tampered(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DependencyIssue(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Servicing(
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DeploymentInProgress(
                    boolean *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageStatus, 0x5fe74f71, 0xa365, 0x4c09, 0xa0,0x2d, 0x04,0x6d,0x52,0x5e,0xa1,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        TrustLevel *trustLevel);

    /*** IPackageStatus methods ***/
    HRESULT (STDMETHODCALLTYPE *VerifyIsOK)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_NotAvailable)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_PackageOffline)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_DataOffline)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Disabled)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_NeedsRemediation)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_LicenseIssue)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Modified)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Tampered)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_DependencyIssue)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Servicing)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_DeploymentInProgress)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatus *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageStatus {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageStatus methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_VerifyIsOK(This,value) (This)->lpVtbl->VerifyIsOK(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NotAvailable(This,value) (This)->lpVtbl->get_NotAvailable(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_PackageOffline(This,value) (This)->lpVtbl->get_PackageOffline(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DataOffline(This,value) (This)->lpVtbl->get_DataOffline(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Disabled(This,value) (This)->lpVtbl->get_Disabled(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NeedsRemediation(This,value) (This)->lpVtbl->get_NeedsRemediation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_LicenseIssue(This,value) (This)->lpVtbl->get_LicenseIssue(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Modified(This,value) (This)->lpVtbl->get_Modified(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Tampered(This,value) (This)->lpVtbl->get_Tampered(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DependencyIssue(This,value) (This)->lpVtbl->get_DependencyIssue(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Servicing(This,value) (This)->lpVtbl->get_Servicing(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DeploymentInProgress(This,value) (This)->lpVtbl->get_DeploymentInProgress(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatus_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatus_Release(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageStatus methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_VerifyIsOK(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->VerifyIsOK(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NotAvailable(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_NotAvailable(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_PackageOffline(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_PackageOffline(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DataOffline(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_DataOffline(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Disabled(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Disabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NeedsRemediation(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_NeedsRemediation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_LicenseIssue(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_LicenseIssue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Modified(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Modified(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Tampered(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Tampered(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DependencyIssue(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_DependencyIssue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Servicing(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_Servicing(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DeploymentInProgress(__x_ABI_CWindows_CApplicationModel_CIPackageStatus* This,boolean *value) {
    return This->lpVtbl->get_DeploymentInProgress(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageStatus IID___x_ABI_CWindows_CApplicationModel_CIPackageStatus
#define IPackageStatusVtbl __x_ABI_CWindows_CApplicationModel_CIPackageStatusVtbl
#define IPackageStatus __x_ABI_CWindows_CApplicationModel_CIPackageStatus
#define IPackageStatus_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageStatus_QueryInterface
#define IPackageStatus_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageStatus_AddRef
#define IPackageStatus_Release __x_ABI_CWindows_CApplicationModel_CIPackageStatus_Release
#define IPackageStatus_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetIids
#define IPackageStatus_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetRuntimeClassName
#define IPackageStatus_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageStatus_GetTrustLevel
#define IPackageStatus_VerifyIsOK __x_ABI_CWindows_CApplicationModel_CIPackageStatus_VerifyIsOK
#define IPackageStatus_get_NotAvailable __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NotAvailable
#define IPackageStatus_get_PackageOffline __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_PackageOffline
#define IPackageStatus_get_DataOffline __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DataOffline
#define IPackageStatus_get_Disabled __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Disabled
#define IPackageStatus_get_NeedsRemediation __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_NeedsRemediation
#define IPackageStatus_get_LicenseIssue __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_LicenseIssue
#define IPackageStatus_get_Modified __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Modified
#define IPackageStatus_get_Tampered __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Tampered
#define IPackageStatus_get_DependencyIssue __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DependencyIssue
#define IPackageStatus_get_Servicing __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_Servicing
#define IPackageStatus_get_DeploymentInProgress __x_ABI_CWindows_CApplicationModel_CIPackageStatus_get_DeploymentInProgress
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackageStatus_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPackageId interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageId, 0x1adb665e, 0x37c7, 0x4790, 0x99,0x80, 0xdd,0x7a,0xe7,0x4e,0x8b,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("1adb665e-37c7-4790-9980-dd7ae74e8bb2")
            IPackageId : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Name(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Version(
                    struct PackageVersion *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Architecture(
                    enum ProcessorArchitecture *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_ResourceId(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Publisher(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_PublisherId(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_FullName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_FamilyName(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageId, 0x1adb665e, 0x37c7, 0x4790, 0x99,0x80, 0xdd,0x7a,0xe7,0x4e,0x8b,0xb2)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        TrustLevel *trustLevel);

    /*** IPackageId methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Version)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        struct __x_ABI_CWindows_CApplicationModel_CPackageVersion *value);

    HRESULT (STDMETHODCALLTYPE *get_Architecture)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        enum __x_ABI_CWindows_CSystem_CProcessorArchitecture *value);

    HRESULT (STDMETHODCALLTYPE *get_ResourceId)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Publisher)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_PublisherId)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_FullName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_FamilyName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageId *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageId {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageId methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Version(This,value) (This)->lpVtbl->get_Version(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Architecture(This,value) (This)->lpVtbl->get_Architecture(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_ResourceId(This,value) (This)->lpVtbl->get_ResourceId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Publisher(This,value) (This)->lpVtbl->get_Publisher(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_PublisherId(This,value) (This)->lpVtbl->get_PublisherId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FullName(This,value) (This)->lpVtbl->get_FullName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FamilyName(This,value) (This)->lpVtbl->get_FamilyName(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageId_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageId* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageId_Release(__x_ABI_CWindows_CApplicationModel_CIPackageId* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageId methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Name(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Version(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,struct __x_ABI_CWindows_CApplicationModel_CPackageVersion *value) {
    return This->lpVtbl->get_Version(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Architecture(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,enum __x_ABI_CWindows_CSystem_CProcessorArchitecture *value) {
    return This->lpVtbl->get_Architecture(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_ResourceId(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_ResourceId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Publisher(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_Publisher(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_PublisherId(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_PublisherId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FullName(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_FullName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FamilyName(__x_ABI_CWindows_CApplicationModel_CIPackageId* This,HSTRING *value) {
    return This->lpVtbl->get_FamilyName(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageId IID___x_ABI_CWindows_CApplicationModel_CIPackageId
#define IPackageIdVtbl __x_ABI_CWindows_CApplicationModel_CIPackageIdVtbl
#define IPackageId __x_ABI_CWindows_CApplicationModel_CIPackageId
#define IPackageId_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageId_QueryInterface
#define IPackageId_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageId_AddRef
#define IPackageId_Release __x_ABI_CWindows_CApplicationModel_CIPackageId_Release
#define IPackageId_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageId_GetIids
#define IPackageId_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageId_GetRuntimeClassName
#define IPackageId_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageId_GetTrustLevel
#define IPackageId_get_Name __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Name
#define IPackageId_get_Version __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Version
#define IPackageId_get_Architecture __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Architecture
#define IPackageId_get_ResourceId __x_ABI_CWindows_CApplicationModel_CIPackageId_get_ResourceId
#define IPackageId_get_Publisher __x_ABI_CWindows_CApplicationModel_CIPackageId_get_Publisher
#define IPackageId_get_PublisherId __x_ABI_CWindows_CApplicationModel_CIPackageId_get_PublisherId
#define IPackageId_get_FullName __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FullName
#define IPackageId_get_FamilyName __x_ABI_CWindows_CApplicationModel_CIPackageId_get_FamilyName
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPackageIdWithMetadata interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata, 0x40577a7c, 0x0c9e, 0x443d, 0x90,0x74, 0x85,0x5f,0x5c,0xe0,0xa0,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("40577a7c-0c9e-443d-9074-855f5ce0a08d")
            IPackageIdWithMetadata : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_ProductId(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Author(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata, 0x40577a7c, 0x0c9e, 0x443d, 0x90,0x74, 0x85,0x5f,0x5c,0xe0,0xa0,0x8d)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        TrustLevel *trustLevel);

    /*** IPackageIdWithMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProductId)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Author)(
        __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageIdWithMetadata methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_ProductId(This,value) (This)->lpVtbl->get_ProductId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_Author(This,value) (This)->lpVtbl->get_Author(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_Release(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageIdWithMetadata methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_ProductId(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,HSTRING *value) {
    return This->lpVtbl->get_ProductId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_Author(__x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata* This,HSTRING *value) {
    return This->lpVtbl->get_Author(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageIdWithMetadata IID___x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata
#define IPackageIdWithMetadataVtbl __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadataVtbl
#define IPackageIdWithMetadata __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata
#define IPackageIdWithMetadata_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_QueryInterface
#define IPackageIdWithMetadata_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_AddRef
#define IPackageIdWithMetadata_Release __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_Release
#define IPackageIdWithMetadata_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetIids
#define IPackageIdWithMetadata_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetRuntimeClassName
#define IPackageIdWithMetadata_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_GetTrustLevel
#define IPackageIdWithMetadata_get_ProductId __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_ProductId
#define IPackageIdWithMetadata_get_Author __x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_get_Author
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackageIdWithMetadata_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPackageStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIPackageStatics, 0x4e534bdf, 0x2960, 0x4878, 0x97,0xa4, 0x96,0x24,0xde,0xb7,0x2f,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("4e534bdf-2960-4878-97a4-9624deb72f2d")
            IPackageStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Current(
                    ABI::Windows::ApplicationModel::IPackage **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIPackageStatics, 0x4e534bdf, 0x2960, 0x4878, 0x97,0xa4, 0x96,0x24,0xde,0xb7,0x2f,0x2d)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This,
        TrustLevel *trustLevel);

    /*** IPackageStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __x_ABI_CWindows_CApplicationModel_CIPackageStatics *This,
        __x_ABI_CWindows_CApplicationModel_CIPackage **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CIPackageStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPackageStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CIPackageStatics_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIPackageStatics_Release(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPackageStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIPackageStatics_get_Current(__x_ABI_CWindows_CApplicationModel_CIPackageStatics* This,__x_ABI_CWindows_CApplicationModel_CIPackage **value) {
    return This->lpVtbl->get_Current(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_IPackageStatics IID___x_ABI_CWindows_CApplicationModel_CIPackageStatics
#define IPackageStaticsVtbl __x_ABI_CWindows_CApplicationModel_CIPackageStaticsVtbl
#define IPackageStatics __x_ABI_CWindows_CApplicationModel_CIPackageStatics
#define IPackageStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CIPackageStatics_QueryInterface
#define IPackageStatics_AddRef __x_ABI_CWindows_CApplicationModel_CIPackageStatics_AddRef
#define IPackageStatics_Release __x_ABI_CWindows_CApplicationModel_CIPackageStatics_Release
#define IPackageStatics_GetIids __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetIids
#define IPackageStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetRuntimeClassName
#define IPackageStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIPackageStatics_GetTrustLevel
#define IPackageStatics_get_Current __x_ABI_CWindows_CApplicationModel_CIPackageStatics_get_Current
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CIPackageStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ISuspendingDeferral interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CISuspendingDeferral, 0x59140509, 0x8bc9, 0x4eb4, 0xb6,0x36, 0xda,0xbd,0xc4,0xf4,0x6f,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("59140509-8bc9-4eb4-b636-dabdc4f46f66")
            ISuspendingDeferral : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE Complete(
                    ) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral, 0x59140509, 0x8bc9, 0x4eb4, 0xb6,0x36, 0xda,0xbd,0xc4,0xf4,0x6f,0x66)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CISuspendingDeferralVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This,
        TrustLevel *trustLevel);

    /*** ISuspendingDeferral methods ***/
    HRESULT (STDMETHODCALLTYPE *Complete)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral *This);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CISuspendingDeferralVtbl;

interface __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CISuspendingDeferralVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISuspendingDeferral methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_Complete(This) (This)->lpVtbl->Complete(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_QueryInterface(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_AddRef(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_Release(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetIids(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISuspendingDeferral methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_Complete(__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral* This) {
    return This->lpVtbl->Complete(This);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_ISuspendingDeferral IID___x_ABI_CWindows_CApplicationModel_CISuspendingDeferral
#define ISuspendingDeferralVtbl __x_ABI_CWindows_CApplicationModel_CISuspendingDeferralVtbl
#define ISuspendingDeferral __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral
#define ISuspendingDeferral_QueryInterface __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_QueryInterface
#define ISuspendingDeferral_AddRef __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_AddRef
#define ISuspendingDeferral_Release __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_Release
#define ISuspendingDeferral_GetIids __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetIids
#define ISuspendingDeferral_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetRuntimeClassName
#define ISuspendingDeferral_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_GetTrustLevel
#define ISuspendingDeferral_Complete __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_Complete
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CISuspendingDeferral_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ISuspendingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs, 0x96061c05, 0x2dba, 0x4d08, 0xb0,0xbd, 0x2b,0x30,0xa1,0x31,0xc6,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("96061c05-2dba-4d08-b0bd-2b30a131c6aa")
            ISuspendingEventArgs : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_SuspendingOperation(
                    ABI::Windows::ApplicationModel::ISuspendingOperation **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs, 0x96061c05, 0x2dba, 0x4d08, 0xb0,0xbd, 0x2b,0x30,0xa1,0x31,0xc6,0xaa)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This,
        TrustLevel *trustLevel);

    /*** ISuspendingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SuspendingOperation)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISuspendingEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_get_SuspendingOperation(This,value) (This)->lpVtbl->get_SuspendingOperation(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISuspendingEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_get_SuspendingOperation(__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs* This,__x_ABI_CWindows_CApplicationModel_CISuspendingOperation **value) {
    return This->lpVtbl->get_SuspendingOperation(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_ISuspendingEventArgs IID___x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs
#define ISuspendingEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgsVtbl
#define ISuspendingEventArgs __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs
#define ISuspendingEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_QueryInterface
#define ISuspendingEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_AddRef
#define ISuspendingEventArgs_Release __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_Release
#define ISuspendingEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetIids
#define ISuspendingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetRuntimeClassName
#define ISuspendingEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_GetTrustLevel
#define ISuspendingEventArgs_get_SuspendingOperation __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_get_SuspendingOperation
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ISuspendingOperation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CISuspendingOperation, 0x9da4ca41, 0x20e1, 0x4e9b, 0x9f,0x65, 0xa9,0xf4,0x35,0x34,0x0c,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            MIDL_INTERFACE("9da4ca41-20e1-4e9b-9f65-a9f435340c3a")
            ISuspendingOperation : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                    ABI::Windows::ApplicationModel::ISuspendingDeferral **deferral) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Deadline(
                    struct DateTime *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation, 0x9da4ca41, 0x20e1, 0x4e9b, 0x9f,0x65, 0xa9,0xf4,0x35,0x34,0x0c,0x3a)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CISuspendingOperationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This,
        TrustLevel *trustLevel);

    /*** ISuspendingOperation methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This,
        __x_ABI_CWindows_CApplicationModel_CISuspendingDeferral **deferral);

    HRESULT (STDMETHODCALLTYPE *get_Deadline)(
        __x_ABI_CWindows_CApplicationModel_CISuspendingOperation *This,
        struct __x_ABI_CWindows_CFoundation_CDateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CISuspendingOperationVtbl;

interface __x_ABI_CWindows_CApplicationModel_CISuspendingOperation {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CISuspendingOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISuspendingOperation methods ***/
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetDeferral(This,deferral) (This)->lpVtbl->GetDeferral(This,deferral)
#define __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_get_Deadline(This,value) (This)->lpVtbl->get_Deadline(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_QueryInterface(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_AddRef(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_Release(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetIids(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISuspendingOperation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetDeferral(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This,__x_ABI_CWindows_CApplicationModel_CISuspendingDeferral **deferral) {
    return This->lpVtbl->GetDeferral(This,deferral);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_get_Deadline(__x_ABI_CWindows_CApplicationModel_CISuspendingOperation* This,struct __x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_Deadline(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel
#define IID_ISuspendingOperation IID___x_ABI_CWindows_CApplicationModel_CISuspendingOperation
#define ISuspendingOperationVtbl __x_ABI_CWindows_CApplicationModel_CISuspendingOperationVtbl
#define ISuspendingOperation __x_ABI_CWindows_CApplicationModel_CISuspendingOperation
#define ISuspendingOperation_QueryInterface __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_QueryInterface
#define ISuspendingOperation_AddRef __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_AddRef
#define ISuspendingOperation_Release __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_Release
#define ISuspendingOperation_GetIids __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetIids
#define ISuspendingOperation_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetRuntimeClassName
#define ISuspendingOperation_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetTrustLevel
#define ISuspendingOperation_GetDeferral __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_GetDeferral
#define ISuspendingOperation_get_Deadline __x_ABI_CWindows_CApplicationModel_CISuspendingOperation_get_Deadline
#endif /* WIDL_using_Windows_ApplicationModel */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CISuspendingOperation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.AppDisplayInfo
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_AppDisplayInfo_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_AppDisplayInfo_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_AppDisplayInfo[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','A','p','p','D','i','s','p','l','a','y','I','n','f','o',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_AppDisplayInfo[] = L"Windows.ApplicationModel.AppDisplayInfo";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_AppDisplayInfo[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','A','p','p','D','i','s','p','l','a','y','I','n','f','o',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_AppDisplayInfo_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.EnteredBackgroundEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_EnteredBackgroundEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_EnteredBackgroundEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_EnteredBackgroundEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','E','n','t','e','r','e','d','B','a','c','k','g','r','o','u','n','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_EnteredBackgroundEventArgs[] = L"Windows.ApplicationModel.EnteredBackgroundEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_EnteredBackgroundEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','E','n','t','e','r','e','d','B','a','c','k','g','r','o','u','n','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_EnteredBackgroundEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.ApplicationModel.LeavingBackgroundEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_LeavingBackgroundEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_LeavingBackgroundEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_LeavingBackgroundEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','L','e','a','v','i','n','g','B','a','c','k','g','r','o','u','n','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_LeavingBackgroundEventArgs[] = L"Windows.ApplicationModel.LeavingBackgroundEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_LeavingBackgroundEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','L','e','a','v','i','n','g','B','a','c','k','g','r','o','u','n','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_LeavingBackgroundEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.ApplicationModel.Package
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_Package_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_Package_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_Package[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Package[] = L"Windows.ApplicationModel.Package";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_Package[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_Package_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.PackageStatus
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_PackageStatus_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_PackageStatus_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_PackageStatus[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','S','t','a','t','u','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageStatus[] = L"Windows.ApplicationModel.PackageStatus";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageStatus[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','S','t','a','t','u','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_PackageStatus_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.PackageId
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_PackageId_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_PackageId_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_PackageId[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','I','d',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageId[] = L"Windows.ApplicationModel.PackageId";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_PackageId[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','P','a','c','k','a','g','e','I','d',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_PackageId_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.SuspendingDeferral
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_SuspendingDeferral_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_SuspendingDeferral_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingDeferral[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','S','u','s','p','e','n','d','i','n','g','D','e','f','e','r','r','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingDeferral[] = L"Windows.ApplicationModel.SuspendingDeferral";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingDeferral[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','S','u','s','p','e','n','d','i','n','g','D','e','f','e','r','r','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_SuspendingDeferral_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.SuspendingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_SuspendingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_SuspendingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','S','u','s','p','e','n','d','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingEventArgs[] = L"Windows.ApplicationModel.SuspendingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','S','u','s','p','e','n','d','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_SuspendingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.SuspendingOperation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_SuspendingOperation_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_SuspendingOperation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingOperation[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','S','u','s','p','e','n','d','i','n','g','O','p','e','r','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingOperation[] = L"Windows.ApplicationModel.SuspendingOperation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_SuspendingOperation[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','S','u','s','p','e','n','d','i','n','g','O','p','e','r','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_SuspendingOperation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::ApplicationModel::Package* > interface
 */
#ifndef ____FIIterable_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CApplicationModel__CPackage, 0x69ad6aa7, 0x0c49, 0x5f27, 0xa5,0xeb, 0xef,0x4d,0x59,0x46,0x7b,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("69ad6aa7-0c49-5f27-a5eb-ef4d59467b6d")
                IIterable<ABI::Windows::ApplicationModel::Package* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Package*, ABI::Windows::ApplicationModel::IPackage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CApplicationModel__CPackage, 0x69ad6aa7, 0x0c49, 0x5f27, 0xa5,0xeb, 0xef,0x4d,0x59,0x46,0x7b,0x6d)
#endif
#else
typedef struct __FIIterable_1_Windows__CApplicationModel__CPackageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::ApplicationModel::Package* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CApplicationModel__CPackage *This,
        __FIIterator_1_Windows__CApplicationModel__CPackage **value);

    END_INTERFACE
} __FIIterable_1_Windows__CApplicationModel__CPackageVtbl;

interface __FIIterable_1_Windows__CApplicationModel__CPackage {
    CONST_VTBL __FIIterable_1_Windows__CApplicationModel__CPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CApplicationModel__CPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::ApplicationModel::Package* > methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CPackage_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_QueryInterface(__FIIterable_1_Windows__CApplicationModel__CPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CApplicationModel__CPackage_AddRef(__FIIterable_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CApplicationModel__CPackage_Release(__FIIterable_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_GetIids(__FIIterable_1_Windows__CApplicationModel__CPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(__FIIterable_1_Windows__CApplicationModel__CPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_GetTrustLevel(__FIIterable_1_Windows__CApplicationModel__CPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::ApplicationModel::Package* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CApplicationModel__CPackage_First(__FIIterable_1_Windows__CApplicationModel__CPackage* This,__FIIterator_1_Windows__CApplicationModel__CPackage **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Package IID___FIIterable_1_Windows__CApplicationModel__CPackage
#define IIterable_PackageVtbl __FIIterable_1_Windows__CApplicationModel__CPackageVtbl
#define IIterable_Package __FIIterable_1_Windows__CApplicationModel__CPackage
#define IIterable_Package_QueryInterface __FIIterable_1_Windows__CApplicationModel__CPackage_QueryInterface
#define IIterable_Package_AddRef __FIIterable_1_Windows__CApplicationModel__CPackage_AddRef
#define IIterable_Package_Release __FIIterable_1_Windows__CApplicationModel__CPackage_Release
#define IIterable_Package_GetIids __FIIterable_1_Windows__CApplicationModel__CPackage_GetIids
#define IIterable_Package_GetRuntimeClassName __FIIterable_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName
#define IIterable_Package_GetTrustLevel __FIIterable_1_Windows__CApplicationModel__CPackage_GetTrustLevel
#define IIterable_Package_First __FIIterable_1_Windows__CApplicationModel__CPackage_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::ApplicationModel::Package* > interface
 */
#ifndef ____FIIterator_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CApplicationModel__CPackage, 0x0217f069, 0x025c, 0x5ee6, 0xa8,0x7f, 0xe7,0x82,0xe3,0xb6,0x23,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0217f069-025c-5ee6-a87f-e782e3b623ae")
                IIterator<ABI::Windows::ApplicationModel::Package* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Package*, ABI::Windows::ApplicationModel::IPackage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CApplicationModel__CPackage, 0x0217f069, 0x025c, 0x5ee6, 0xa8,0x7f, 0xe7,0x82,0xe3,0xb6,0x23,0xae)
#endif
#else
typedef struct __FIIterator_1_Windows__CApplicationModel__CPackageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::ApplicationModel::Package* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        __x_ABI_CWindows_CApplicationModel_CIPackage **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CApplicationModel__CPackage *This,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CIPackage **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CApplicationModel__CPackageVtbl;

interface __FIIterator_1_Windows__CApplicationModel__CPackage {
    CONST_VTBL __FIIterator_1_Windows__CApplicationModel__CPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::ApplicationModel::Package* > methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CPackage_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CPackage_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_QueryInterface(__FIIterator_1_Windows__CApplicationModel__CPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CApplicationModel__CPackage_AddRef(__FIIterator_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CApplicationModel__CPackage_Release(__FIIterator_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetIids(__FIIterator_1_Windows__CApplicationModel__CPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(__FIIterator_1_Windows__CApplicationModel__CPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetTrustLevel(__FIIterator_1_Windows__CApplicationModel__CPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::ApplicationModel::Package* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_get_Current(__FIIterator_1_Windows__CApplicationModel__CPackage* This,__x_ABI_CWindows_CApplicationModel_CIPackage **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_get_HasCurrent(__FIIterator_1_Windows__CApplicationModel__CPackage* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext(__FIIterator_1_Windows__CApplicationModel__CPackage* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CApplicationModel__CPackage_GetMany(__FIIterator_1_Windows__CApplicationModel__CPackage* This,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CIPackage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Package IID___FIIterator_1_Windows__CApplicationModel__CPackage
#define IIterator_PackageVtbl __FIIterator_1_Windows__CApplicationModel__CPackageVtbl
#define IIterator_Package __FIIterator_1_Windows__CApplicationModel__CPackage
#define IIterator_Package_QueryInterface __FIIterator_1_Windows__CApplicationModel__CPackage_QueryInterface
#define IIterator_Package_AddRef __FIIterator_1_Windows__CApplicationModel__CPackage_AddRef
#define IIterator_Package_Release __FIIterator_1_Windows__CApplicationModel__CPackage_Release
#define IIterator_Package_GetIids __FIIterator_1_Windows__CApplicationModel__CPackage_GetIids
#define IIterator_Package_GetRuntimeClassName __FIIterator_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName
#define IIterator_Package_GetTrustLevel __FIIterator_1_Windows__CApplicationModel__CPackage_GetTrustLevel
#define IIterator_Package_get_Current __FIIterator_1_Windows__CApplicationModel__CPackage_get_Current
#define IIterator_Package_get_HasCurrent __FIIterator_1_Windows__CApplicationModel__CPackage_get_HasCurrent
#define IIterator_Package_MoveNext __FIIterator_1_Windows__CApplicationModel__CPackage_MoveNext
#define IIterator_Package_GetMany __FIIterator_1_Windows__CApplicationModel__CPackage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::ApplicationModel::Package* > interface
 */
#ifndef ____FIVectorView_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CApplicationModel__CPackage, 0x0263c4d4, 0x195c, 0x5dc5, 0xa7,0xca, 0x68,0x06,0xce,0xca,0x42,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0263c4d4-195c-5dc5-a7ca-6806ceca420b")
                IVectorView<ABI::Windows::ApplicationModel::Package* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Package*, ABI::Windows::ApplicationModel::IPackage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CApplicationModel__CPackage, 0x0263c4d4, 0x195c, 0x5dc5, 0xa7,0xca, 0x68,0x06,0xce,0xca,0x42,0x0b)
#endif
#else
typedef struct __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::ApplicationModel::Package* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CIPackage **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        __x_ABI_CWindows_CApplicationModel_CIPackage *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CApplicationModel__CPackage *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CIPackage **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl;

interface __FIVectorView_1_Windows__CApplicationModel__CPackage {
    CONST_VTBL __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::ApplicationModel::Package* > methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CPackage_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_QueryInterface(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CPackage_AddRef(__FIVectorView_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CPackage_Release(__FIVectorView_1_Windows__CApplicationModel__CPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetIids(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetTrustLevel(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::ApplicationModel::Package* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetAt(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CIPackage **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_get_Size(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_IndexOf(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,__x_ABI_CWindows_CApplicationModel_CIPackage *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CPackage_GetMany(__FIVectorView_1_Windows__CApplicationModel__CPackage* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CIPackage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_Package IID___FIVectorView_1_Windows__CApplicationModel__CPackage
#define IVectorView_PackageVtbl __FIVectorView_1_Windows__CApplicationModel__CPackageVtbl
#define IVectorView_Package __FIVectorView_1_Windows__CApplicationModel__CPackage
#define IVectorView_Package_QueryInterface __FIVectorView_1_Windows__CApplicationModel__CPackage_QueryInterface
#define IVectorView_Package_AddRef __FIVectorView_1_Windows__CApplicationModel__CPackage_AddRef
#define IVectorView_Package_Release __FIVectorView_1_Windows__CApplicationModel__CPackage_Release
#define IVectorView_Package_GetIids __FIVectorView_1_Windows__CApplicationModel__CPackage_GetIids
#define IVectorView_Package_GetRuntimeClassName __FIVectorView_1_Windows__CApplicationModel__CPackage_GetRuntimeClassName
#define IVectorView_Package_GetTrustLevel __FIVectorView_1_Windows__CApplicationModel__CPackage_GetTrustLevel
#define IVectorView_Package_GetAt __FIVectorView_1_Windows__CApplicationModel__CPackage_GetAt
#define IVectorView_Package_get_Size __FIVectorView_1_Windows__CApplicationModel__CPackage_get_Size
#define IVectorView_Package_IndexOf __FIVectorView_1_Windows__CApplicationModel__CPackage_IndexOf
#define IVectorView_Package_GetMany __FIVectorView_1_Windows__CApplicationModel__CPackage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CApplicationModel__CPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > interface
 */
#ifndef ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x920c8b92, 0xd5ef, 0x5899, 0x87,0x76, 0x2a,0xd9,0x7a,0xca,0x6e,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("920c8b92-d5ef-5899-8776-2ad97aca6e1d")
                IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::Core::AppListEntry*, ABI::Windows::ApplicationModel::Core::IAppListEntry* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x920c8b92, 0xd5ef, 0x5899, 0x87,0x76, 0x2a,0xd9,0x7a,0xca,0x6e,0x1d)
#endif
#else
typedef struct __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl;

interface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry {
    CONST_VTBL __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetAt(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Size(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_IndexOf(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetMany(__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CCore_CIAppListEntry **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_AppListEntry IID___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IVectorView_AppListEntryVtbl __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl
#define IVectorView_AppListEntry __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IVectorView_AppListEntry_QueryInterface __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface
#define IVectorView_AppListEntry_AddRef __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef
#define IVectorView_AppListEntry_Release __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release
#define IVectorView_AppListEntry_GetIids __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids
#define IVectorView_AppListEntry_GetRuntimeClassName __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName
#define IVectorView_AppListEntry_GetTrustLevel __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel
#define IVectorView_AppListEntry_GetAt __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetAt
#define IVectorView_AppListEntry_get_Size __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Size
#define IVectorView_AppListEntry_IndexOf __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_IndexOf
#define IVectorView_AppListEntry_GetMany __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs, 0xe0739c32, 0xfc14, 0x5361, 0xa8,0xb3, 0x08,0x09,0x69,0x9f,0xbc,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("e0739c32-fc14-5361-a8b3-0809699fbcbd")
            IEventHandler<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs*, ABI::Windows::ApplicationModel::IEnteredBackgroundEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs, 0xe0739c32, 0xfc14, 0x5361, 0xa8,0xb3, 0x08,0x09,0x69,0x9f,0xbc,0xbd)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs *This);

    /*** IEventHandler<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgsVtbl;

interface __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs {
    CONST_VTBL __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs* > methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_QueryInterface(__FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_AddRef(__FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_Release(__FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::ApplicationModel::EnteredBackgroundEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_Invoke(__FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CApplicationModel_CIEnteredBackgroundEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_EnteredBackgroundEventArgs IID___FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs
#define IEventHandler_EnteredBackgroundEventArgsVtbl __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgsVtbl
#define IEventHandler_EnteredBackgroundEventArgs __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs
#define IEventHandler_EnteredBackgroundEventArgs_QueryInterface __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_QueryInterface
#define IEventHandler_EnteredBackgroundEventArgs_AddRef __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_AddRef
#define IEventHandler_EnteredBackgroundEventArgs_Release __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_Release
#define IEventHandler_EnteredBackgroundEventArgs_Invoke __FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CApplicationModel__CEnteredBackgroundEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs, 0x9b6171c2, 0xabb2, 0x5194, 0xaf,0xc0, 0xce,0xf1,0x67,0xc4,0x24,0xeb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9b6171c2-abb2-5194-afc0-cef167c424eb")
            IEventHandler<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs*, ABI::Windows::ApplicationModel::ILeavingBackgroundEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs, 0x9b6171c2, 0xabb2, 0x5194, 0xaf,0xc0, 0xce,0xf1,0x67,0xc4,0x24,0xeb)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs *This);

    /*** IEventHandler<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgsVtbl;

interface __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs {
    CONST_VTBL __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs* > methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_QueryInterface(__FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_AddRef(__FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_Release(__FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::ApplicationModel::LeavingBackgroundEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_Invoke(__FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CApplicationModel_CILeavingBackgroundEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_LeavingBackgroundEventArgs IID___FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs
#define IEventHandler_LeavingBackgroundEventArgsVtbl __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgsVtbl
#define IEventHandler_LeavingBackgroundEventArgs __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs
#define IEventHandler_LeavingBackgroundEventArgs_QueryInterface __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_QueryInterface
#define IEventHandler_LeavingBackgroundEventArgs_AddRef __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_AddRef
#define IEventHandler_LeavingBackgroundEventArgs_Release __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_Release
#define IEventHandler_LeavingBackgroundEventArgs_Invoke __FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CApplicationModel__CLeavingBackgroundEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::ApplicationModel::SuspendingEventArgs* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs, 0x338579bf, 0x1a35, 0x5cc4, 0xa6,0x22, 0xa6,0xf3,0x84,0xfd,0x89,0x2c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("338579bf-1a35-5cc4-a622-a6f384fd892c")
            IEventHandler<ABI::Windows::ApplicationModel::SuspendingEventArgs* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::SuspendingEventArgs*, ABI::Windows::ApplicationModel::ISuspendingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs, 0x338579bf, 0x1a35, 0x5cc4, 0xa6,0x22, 0xa6,0xf3,0x84,0xfd,0x89,0x2c)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs *This);

    /*** IEventHandler<ABI::Windows::ApplicationModel::SuspendingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgsVtbl;

interface __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs {
    CONST_VTBL __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::ApplicationModel::SuspendingEventArgs* > methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_QueryInterface(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_AddRef(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_Release(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::ApplicationModel::SuspendingEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_Invoke(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CApplicationModel_CISuspendingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_SuspendingEventArgs IID___FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs
#define IEventHandler_SuspendingEventArgsVtbl __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgsVtbl
#define IEventHandler_SuspendingEventArgs __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs
#define IEventHandler_SuspendingEventArgs_QueryInterface __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_QueryInterface
#define IEventHandler_SuspendingEventArgs_AddRef __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_AddRef
#define IEventHandler_SuspendingEventArgs_Release __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_Release
#define IEventHandler_SuspendingEventArgs_Invoke __FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0xd3bcf8a0, 0x3538, 0x5dae, 0x98,0xd7, 0x1f,0x2a,0xb8,0x8c,0x3f,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("d3bcf8a0-3538-5dae-98d7-1f2ab88c3f01")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0xd3bcf8a0, 0x3538, 0x5dae, 0x98,0xd7, 0x1f,0x2a,0xb8,0x8c,0x3f,0x01)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl;

interface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry {
    CONST_VTBL __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_put_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetResults(__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVectorView_AppListEntry IID___FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperation_IVectorView_AppListEntryVtbl __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl
#define IAsyncOperation_IVectorView_AppListEntry __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperation_IVectorView_AppListEntry_QueryInterface __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface
#define IAsyncOperation_IVectorView_AppListEntry_AddRef __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef
#define IAsyncOperation_IVectorView_AppListEntry_Release __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release
#define IAsyncOperation_IVectorView_AppListEntry_GetIids __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetIids
#define IAsyncOperation_IVectorView_AppListEntry_GetRuntimeClassName __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetRuntimeClassName
#define IAsyncOperation_IVectorView_AppListEntry_GetTrustLevel __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetTrustLevel
#define IAsyncOperation_IVectorView_AppListEntry_put_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_put_Completed
#define IAsyncOperation_IVectorView_AppListEntry_get_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_get_Completed
#define IAsyncOperation_IVectorView_AppListEntry_GetResults __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x51c74372, 0x9452, 0x57ce, 0x92,0x70, 0x76,0x20,0x09,0xfb,0xfe,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("51c74372-9452-57ce-9270-762009fbfe4d")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry, 0x51c74372, 0x9452, 0x57ce, 0x92,0x70, 0x76,0x20,0x09,0xfb,0xfe,0x4d)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::Core::AppListEntry* >* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Invoke(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVectorView_AppListEntry IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntryVtbl __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntryVtbl
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_QueryInterface
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_AddRef __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_AddRef
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_Release __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Release
#define IAsyncOperationCompletedHandler_IVectorView_AppListEntry_Invoke __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CApplicationModel__CCore__CAppListEntry_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_applicationmodel_h__ */
